Alexaで動くロボットを作ろう in Alexa Day 2019 カリキュラム

Alexa Day 2019で開催された親子ワークショップ「Alexaで動くロボットを作ろう」の親側のAlexaスキルを作成する手順書です。

https://alexaday2019.aajug.jp/session/49/

必要なものを揃えれば自宅でも構築できます。


# タイムスケジュール

| 時間      　|       内容 |
|:-----------|:------------------|
| 13:00-13:15|挨拶/ワークショップの説明|
| 13:20-15:00| 子)PLEN:bit組み立て<br>親)Alexaスマートホームスキル作成|
| 15:00-15:10|休憩|
| 15:10-16:30|Micro:bit/PLEN:bit親子プログラミング|
| 16:30-17:00|自由時間|


# 登場人物

|用語|説明|
|:-----------|:------------------|
|Alexa|Amazonが開発したAIアシスタント。|
|Echo|Alexaを呼び出すためのAmazonが販売しているデバイス。今日はEcho dotを使います。|
|スマートホームスキル|「Alexa、暖房をつけて」や「Alexa、温度を25度にして」とかスキルの呼び出し名なしで自然に呼びかけができるスキル。（Notカスタムスキル）|
|Node-RED|ブラウザ上で部品(ノード)をつなぐ操作だけでノンプログラミングでアプリケーション開発ができる開発環境|
|Node-RED Alexa Home Skill Bridge|AlexaとNode-REDをいい感じに繋いでくれるサービス。|
|Micro:bit|イギリスの放送局BBCが中心となって開発した教育用の小型コンピューターボード|
|PLEN:bit|Micro:bitで制御可能なメイドイン大阪なロボット|
|MakeCodeエディター|Microsoftが提供している、ブロックまたはJavaScriptを使ってmicro:bitを簡単にプログラミングできる開発環境|

# 構成図

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/101b9b25-4619-8ed5-36b6-8360a72491f2.png)



# 皆さんの手元にあるもの
Echo Dot（レンタル）
Raspberry Pi 3 B（レンタル）
Raspbian Stretch with desktop 2018-11-13 -> SDカードにインストール済み (SDカードは持ち帰りOKです)
 - Node.js8系（10系だとBLE周りがうまく動かない不具合あり）
 - Node-RED(node-red-contrib-generic-bleとnode-red-contrib-alexa-home-skillのノードを追加インストール済み)
PLEN:bit (子供たちが作ります/購入する方はお持ち帰りいただけます)

PLEN:bitはこちらから購入可能です
https://plen.jp/wp/shop/

# Node-RED Alexa Home Skill Bridge登録

AlexaとNode-REDを繋いでくれるサービスです。
https://alexa-node-red.bm.hardill.me.uk/ からユーザー登録を行います。
画面上部のRegisterをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/de37f525-d1ad-cbd6-62ce-851edec60389.png)

ユーザー名、メールアドレス、パスワードを入力して登録をします。入力した情報はNode-REDで入力する必要があるので忘れないようにしておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52904/b9ff72cc-539b-809c-6d62-0383b48cea56.png)


登録できるとログインした状態となります。（認証メールなどはなし）
Devicesをクリックし、デバイスの登録を行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/56ad3bf9-999d-e590-4fc1-eaa44fa13da3.png)

Add Deviceをクリックして、デバイス（PLEN:Bitへの命令）を登録します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/7dea0cf0-f296-a6a6-20c1-c4330e6248c4.png)

最初に前進させるための命令を作成します。
- NameとDescriptionに「前進」と入力します。
- Onにチェックをします。
入力したらOKをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/a86a7813-dd4f-79c7-44a2-fc236ada722d.png)

これで前進する命令が作成されました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/04ae25fe-620b-3b65-f143-7d6e47739f13.png)


同様にパタパタの命令を作成してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/6f897674-e038-35ae-10b0-9044d0d59799.png)

前進とパタパタの２つの命令が作成できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/9f7d07bf-e512-82fa-8385-bdde0b59a35d.png)

これでNode-RED Alexa Home Skill Bridgeの設定は完了です。


# Alexaアプリのダウンロード&セットアップ

以下を参考にスマートフォンにAlexaアプリをダウンロードし、お手元のEcho dotをセットアップしてください。
https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201602060
https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201994280

「Alexa,今何時？」と聞いて反応があればセットアップ成功です。


# AlexaにNode-REDスキルの設定

AlexaアプリでNode-REDスキルを設定します。
Alexaアプリを開いて、左のメニューから「スキル・ゲーム」を選択します。
<img width="375" alt="IMG_8751.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/f610081f-7c08-ed58-10c9-a8a5e8c41efc.png">


右上の検索ボタンをクリックします。
<img width="375" alt="IMG_8752.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/d5ab23ce-25fd-43b3-ffc3-d5f2fbe807b6.png">

「nodered」と入力して検索をクリックします。
<img width="375" alt="IMG_8753.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/64c77325-f633-ff83-f196-75505240aeec.png">

Node-REDというスキルが表示されるのでクリックします。
<img width="375" alt="IMG_8754.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/3c484043-02ec-b263-71a9-73b001777d35.png">

スキルを有効にします。
<img width="375" alt="IMG_8755.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/44fcfdb7-6e41-a972-6454-b27c68ecb73b.png">

Node-RED Alexa Home Skill Bridgeのログイン情報を入力する画面となるので、ログイン情報を入力します。
<img width="375" alt="IMG_8756.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/90e84e64-047e-5053-c8ec-3249af4671f6.png">

正常にリンクされると成功画面が表示されますので、完了を押してAlexaアプリに戻ります。
<img width="375" alt="IMG_8757.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/30ac82c6-1319-6511-b4d6-4374802c997c.png">

端末を検出する画面になるので、「端末を検出」をクリックします。
<img width="375" alt="IMG_8758.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/7e56d162-8b7c-e68d-8c31-df5fca52209d.png">

検出まで少し時間がかかります。
<img width="375" alt="IMG_8760.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/53c21611-d5b0-e68d-a497-b8e1ac848aeb.png">

検出が終わるとNode-RED Alexa Home Skill Bridgeに登録したデバイスが検出されるので、「デバイスを選択します」をクリックします。

<img width="375" alt="IMG_8761.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/74dff366-1986-4139-dc72-3cc2bccfb001.png">

先ほど作成した前進を選択します。
<img width="375" alt="IMG_8762.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/795438bb-af44-f937-cbed-bde9497caac4.png">

グループを選択をクリックします。
<img width="375" alt="IMG_8763.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/38917a58-4dd4-587a-6d40-5c42c665040d.png">

カスタムグループを作成を選択します。
<img width="375" alt="IMG_8764.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/393e3f88-8e1e-a232-bcba-5581fba9dfbf.png">

PLENbitというグループを作成します。
<img width="375" alt="IMG_8765.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/b7ce5c16-57e0-ab4a-a737-a02ab0b5cc03.png">

これでPLENbitというグループ内に前進が登録されました。
<img width="375" alt="IMG_8767.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/65b88487-7897-c6d8-f15c-34722247ec27.png">

同じ手順でパタパタも登録してください。
<img width="375" alt="IMG_8768.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/5db8991b-cf62-7723-0f13-8fe610d62526.png">

登録したグループ、デバイスは画面下のメニューに「デバイス」から確認できます。

<img width="375" alt="IMG_8770.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/25371a62-e511-6c29-47ea-c798050f8e12.png">

次にAlexaに呼びかけた時に設定した命令を実行するために、定型アクションを設定します。左のメニューから「定型アクション」を開きます。
<img width="375" alt="IMG_8772.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/749ff1b9-143b-1f57-2f53-cabd7b1015f6.png">

マイ定型アクションを開き右上の追加ボタンをクリックします。
<img width="375" alt="IMG_8771.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/9ee0c69f-40b8-5559-5a8f-8f68b6e4dbff.png">

ここから実行条件とアクションを設定します。
<img width="375" alt="IMG_8773.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/029329a8-8392-4185-9cd6-31c264bfd29d.png">

実行条件は開始フレーズを設定します。
<img width="375" alt="IMG_8774.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/107ae34a-ec1c-e50b-a642-9d8dc8409677.png">

前進させるためのフレーズとして、「アレクサ、ロボットを歩かせて」と設定します。
<img width="375" alt="IMG_8775.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/9b53fe21-8a93-5076-745d-b339bddc167a.png">

実行させるアクションは。スマートホームを選択します。
<img width="375" alt="IMG_8776.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/252c4bbd-46c1-0259-585c-43f7a7554aab.png">

デバイスをコントロールを選択します。
<img width="375" alt="IMG_8777.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/eb7baedd-832f-7a96-a7da-0ae196f23ea7.png">

実行させるデバイスとして、「前進」を選択します。
<img width="375" alt="IMG_8778.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/43cb5a8a-5f45-8037-252b-672ed82d5e96.png">

これで、「アレクサ、ロボットを歩かせて」と呼びかけると、「前進」の命令が送られることになります。
<img width="375" alt="IMG_8779.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/a1364489-5d5f-ba0a-60fe-3ef065a6ea0d.png">

保存ボタンを押して設定を保存します。
<img width="375" alt="IMG_8780.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/3aa53099-c89c-d9d9-d1f6-673399af8aed.png">

Alexaに声をかけなくてもフレーズ右側の再生ボタンを押すことでアクションを実行させることもできます。
<img width="375" alt="IMG_8781.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/52904/00c69539-a40d-b99d-487e-c49a08f26ddc.png">

前進と同様の手順で、
「アレクサ、ロボットをパタパタさせて」と呼びかけると、「パタパタ」のアクションが実行されるように設定をしてください。

<img width="375" alt="IMG_D3FAE493B90B-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/52904/b423bde6-61c5-c11e-0aa5-6ad5e13db448.jpeg">

これで、Alexa側のスキルの設定は完了です。

# Raspberry Pi & Node-REDの設定を行います。

Raspberry Piを電源をONにして１、２分経つとNode-REDへアクセスできます。

http://[IPアドレス]:1880/
へアクセスをするとNode-REDの画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/ed90d2e8-379e-7a70-2fde-07cee7469d18.png)

左のメニューから「Alexa home」ノードをフローに展開します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/04e2964c-10bd-e36d-d4db-24e3bdffa84c.png)


「Alexa home」ノードをダブルクリックし、Account右側の編集ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/d1ad2644-c2dd-5748-32a2-325c9c877234.png)


Node-RED Alexa Home Skill Bridgeのログイン情報を入力して、「Add」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/b4a5dc11-0ba0-dcd1-c4de-1b144bfa95bb.png)


DeviceにNode-RED Alexa Home Skill Bridgeで登録したデバイスが表示されます。（うまく更新されない場合は一度Doneを押して一度設定を閉じて再度「Alexa home」ノードを開いてみてください。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/ee9a457a-1ba7-aa5f-1e7a-d289b67655aa.png)

次にFunctionからfunctionノードを展開します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/e2802c65-1054-e926-31f2-5392e9c632dc.png)

functionノードをクリックして、Nameに「1:前進」と入力します。
Functionには以下のコードを入力します。
`6e400003b5a3f393e0a9e50e24dcca9e`は今回ロボットへ命令を送信する際にロボット側のBluetoothのインターフェイスIDになります。
`313a`は、`1:`をhex形式に変換した文字列です。
入力後Doneをクリックします。

```
msg.payload =
{
	"6e400003b5a3f393e0a9e50e24dcca9e": "313a"
}
return msg;
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/708fdead-0a4c-69cc-7af0-1be271d57e66.png)

「前進」ノードと「1:前進」ノードを接続します。これで、Node-RED Alexa Home Skill Bridgeで前進が呼び出されると「1:前進」ノードが実行されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/ad508037-573c-1726-9198-00a7d9fc5ab6.png)

outputのdebugノードを展開して、「1:前進」ノードと接続します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/1b4e7adb-e0d8-79a9-8c87-19447e5babb9.png)



同様の手順で「2:パタパタ」も作成してください。
Alexa homeノードのNode-RED Alexa Home Skill Bridgeアカウントは、「1:前進」で登録したものを選択してください。
同一アカウントを複数登録してしまうと、Node-RED Alexa Home Skill Bridgeとの通信が不安定になってしまいます。


パタパタのfunctionは以下になります。「2:」のhex変換をペイロードに付与します。

```
msg.payload =
{
	"6e400003b5a3f393e0a9e50e24dcca9e": "323a"
}
return msg;
```

「1:前進」で作成したdebugノードに接続します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/2e91d7f3-67c7-c35c-5a48-a11adc2c66c5.png)

デバッグ画面が表示されていない場合は、右上のメニュー -> view -> Debug messages をクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/7e330994-98e0-ac9d-a4f7-cc268e381eec.png)

これで、Node-REDの設定は完了です。
右上のDeployをクリックして設定を反映させてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/dbdb6dcf-1567-436d-fccf-76a8ef6940c6.png)

Alexaアプリから定型アクションを呼び出すとdebugにメッセージが送信されることを確認してください。

<img width="375" alt="IMG_D3FAE493B90B-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/52904/b423bde6-61c5-c11e-0aa5-6ad5e13db448.jpeg">

デバッグ画面に、それぞれのアクションに応じたJSONが表示されることを確認してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/f1b50982-5d89-bf5d-353a-e160180faeb1.png)



これで、Alexaからラズパイ上のNode-REDまで通信ができるようになりました。




# Micro:bitのプログラミング

PLEN:bitを制御しているMicro:bitのプログラミングは、 MakeCodeエディターを使って行います。

MakeCodeエディター
https://makecode.microbit.org/#

プログラムの転送の仕方
https://microbit.org/ja/guide/quick/


# PLEN:bitのプログラミング

ここからはお子さんが作ったPLEN:bitを操作していきます。

今回AlexaからPLEN:Bitを動かすために使うコードはこちらになります。

https://makecode.microbit.org/_PmYXcgA2Ja31

ブラウザで開きhexファイルをダウンロードし、各自のMicro:bitに転送を行ってください。

ここでは

1-起動時に変数をリセットしてBLEを起動する。
2-BLEで「1:」や「2:」などのデータを受け取ったらコロンの前までを変数に入れる。
3-変数に応じて、PLEN：Bitの動きを変える

ということをしています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/c9f9e308-9e03-1a9b-cc03-72ef85380442.png)

転送がうまくできているとPLEN:bitの電源を入れた際に「Hello!」と表示されます。
なお、Micro:bit上の編集ボタンを押すとカスタマイズができます。


#PLEN:bitとの接続

Raspberry PiからBluetoothでPLEN:bitを操作するために、
Node-REDをブラウザから開き、Bluetoothの接続を追加していきます。

outputメニュー内のGeneric BLEノードを展開し、ノードをダブルクリックします。(InputではなくOutputです)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/739da3a0-f4ab-155d-4e4d-6a99af0e66d0.png)

NameにPlenbitと入力し、BLEの編集ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/7d9f07a7-9516-2a84-c7c0-0a7b10f2e9a5.png)

「Select from scan result」をチェックして、自身のPLEN:bitのMACアドレスを選択し、Addをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/c8873c85-7a2d-d884-2027-a191cf48cb68.png)

microbitが設定されたことを確認して、Doneをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/9900728f-816e-b53d-d762-2ba7f35769ae.png)


右上のDeployをクリックして設定を反映させます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/52904/d10ab314-a25c-e02a-a17b-61ef7d1259be.png)

これでEcho(Alexa)からロボットを動かす準備が完了しました。

「アレクサ、ロボットを歩かせて」
「アレクサ、ロボットをパタパタさせて」
とEchoにロボットを動かす指示をしてみてください。

時間のある方は、追加の命令を設定してみたり、呼び出し方を変えてみたり、自由にカスタマイズしてみてください。


# ヒント
- 命令をした時に020エラーとなったり、変な動きになったりする場合はPLEN:bitのバッテリーが少ない可能性があります。充電しても改善しない場合は、Micro:bitのメモリが足りていない可能性があるので、Micro:bitのコードを減らしてみてください。
- Alexaに話しかけるときはゆっくりはっきり話すのがポイントです。それでもうまく認識してくれないときは、スマートホームスキルの呼び出し文章を少し変えてみるといいかもしれません。
- 当日お配りしたRaspberry Piへのログインは、 ` ユーザー：pi/パスワード：alexaday `でログインできます。（sshおよびVNCでリモートログイン可能です。 `ssh pi@raspberrypi.local` ）