【ボイスロボプロジェクト第7話】AmazonEchoで音声操作できるロボット開発プロジェクト!~ラズベリーパイとAWS IoTの送受信~

2018.11.14

smartio編集部のナガシマです。普段はバックエンドを担当しています。

記事執筆は超絶苦手です。大変読みにくくなっているかもしれないのでご容赦ください。

第1話から読んでいる方はわかると思いますが、「ボイスロボプロジェクト」は下記の目的を掲げて、まじめに取り組んでいます!

ボイスロボプロジェクトの目的

・音声で操作できるロボットを作りたい
・ロボットで音声操作のバトルをしたい
・メーカーのロボットを音声操作できる装置を作りたい

第6話では、通信の送受信の中継を担ってくれる「AWS IoT」を使い「ラズベリーパイ」で通信の接続が出来るようにしました。例を挙げると、メールの送受信でいうところの送信だけです。現状は、データの受信ができていない状態なので、受信できるようにしていきます。

ロボットプロジェクトの図解

下記画像はロボットの音声操作ができるようになるまでのステップを簡潔にまとめた図解となります。

図解

今日やることは上記図解の「2:AWS IoT」と「3:ラズベリーパイ」のデータ送受信の制作と送受信のテストです。これが出来るようになると、AWS IoTを中継してデータの送受信ができるようになります。

今回は、「ラズベリーパイからAWS IoTに接続依頼とデータ送信」と「AWS IoTからラズベリーパイへのデータを受信」のやり取りを作り、データの送受信が出来るようにします。

これまでのプロジェクトに関する記事は、下記リンクから見れますのでどうぞご覧ください。

まずは前述に記載した「ラズベリーパイからAWS IoTに接続依頼とデータ送信」の部分から作っていきます。

今回は、基本的にラズベリーパイでコード作成のお話になります。コードの作成が終わったら、データの送受信のテストです。今日はこんな感じで進行していきます。

1.「ラズベリーパイからAWS IoTに接続依頼とデータ送信」の作成

まず、どこの部分を作るかと言うと図解の「➀publish」です。

publishでは、2つの役割を作ります。1つは「ラズベリーパイからAWS IoTに接続するためのコード」で、もう1つは「ラズベリーパイからAWS IoTにデータを送るコード」です。

作る内容はわかったと思うので、これからコードの作成に入ります。

AWS PUBLISH

上記コードの説明ですが、難しいことは省き簡単に解説しておきます。

  • 1行目の「var awsIoT = ・・・」から始まる部分は「AWS IoT Device SDK」を使う宣言です。
  • 赤枠は、AWS IoTに接続するために必要なコードです。ここでは証明書のパス指定とclientID・hostの設定をします。「host:(灰色).amazon.com」の灰色部分には、AWS IoTで設定したエンドポイントを入力です。clientIDは適当な名前を付けて大丈夫です。
  • 黄色の枠は、送るデータの内容になります。今回は、「alexa」と記述しています。
  • 緑枠は、AWS IoTに接続成功した際に実行される場所です。青枠は、データを送る処理の記述になります。青枠内にある「led」はトピックと呼ばれるもので、送り先と紐づけるためのものです。このトピックの名前は任意の名前で構いません。「led」の隣にある「resource」には、黄色枠で決めた送る内容を入力です。
  • 19行目以降のコード内容は、Ctrl + C が入力された場合のイベント処理です。イベントの実行内容は、プロセスの停止、つまり実行停止のコマンドです。

コードの入力が完了したら、ファイル名を「publish.js」にして保存しました。保存先は「/home/pi/python_test」です。

file path

以上で、ラズベリーパイからAWS IoTに接続依頼とデータ送信の作成は完了です。次は、データを受信する部分の作成に入ります。

2.「AWS IoTからラズベリーパイへのデータを受信」の作成

次に作る場所は、図解の「➁subscribe」です。subscribeには、3つの役割を作ります。1つ目は「ラズベリーパイからAWS IoTに接続するためのコード」で、2つ目が「AWS IoTからのデータをラズベリーパイで受け取るコード」、最後の3つ目が「受け取ったデータを読み取るコード」です。

AWS SUBSCRIBE
  • 赤枠に関しては、図解「➀publish」で説明した内容と同じです。
  • 青枠は、AWS IoTに接続成功した際に実行するコードを書く場所です。緑枠は、データを受け取る処理の記述になります。緑枠内にある「led」は、「publish」で設定したものと紐づけるために同じ名前にしています。
  • 黄枠は、「publish」から受け取ったデータの内容を確認できる場所です。黄枠内の「function(topic,payload)」の「topic」には、「➀publish」で設定した「led」が入ってきます。また、「topic」の隣の「payload」には、「➀publish」で設定した「resource」が入っています。
  • 20行目以降のコード内容は、Ctrl + C が入力された場合のイベント処理です。イベントの実行内容は、プロセスの停止、つまり実行停止のコマンドです。

コードの入力が完了したら、ファイル名を「subscribe-4.js」にして保存しました。保存先は「➀publish」で説明した場所と同じで「/home/pi/python_test」です。

以上で、AWS IoTからラズベリーパイへのデータを受信の作成は完了です。次は、データの送受信のテストをやっていきます。

3.ラズベリーパイとAWS IoTのデータ送受信テスト

ここからは先ほど作った2つのファイルを使って、データの送受信テストです。テストのやり方は簡単で、まず2つのターミナル(コマンド入力画面)を開きます。

1つ目のターミナルでは、作成した「subscribe-4.js」のファイルがある階層へ移動します。移動は「cd python_test」を入力してENTERです。

次に、データの受け取り状態が出来るようにしていきます。方法は、「node subscribe-4.js」を入力してENTERを押すだけです。ターミナルに「connect subscribe」と表示されればOKです。ここまで作業できたら、一旦ストップです。次に、2つ目のターミナルを扱っていきます。

AWS SUBSCRIBE

2つ目のターミナルも、1つ目と同じように「publish.js」のファイルがある階層へ移動です。

次に、データの送信が出来るようにしていきます。方法は、「node publish.js」を入力してENTERを押すだけ。ターミナルに「connect」と表示されればOKです。ここまで作業できたら、一旦ストップしましょう。

AWS SUBSCRIBE

上記のコマンド入力後に、2つ目のターミナル「subscribe-4.js」を確認して「connect message led alexa」と表示されれば成功です。

AWS SUBSCRIBE

ヤッター!!うまくデータの送受信が出来るようになりました。これで、データの受け取りは完璧です。

次に、やることはコントローラーを動かすためのリレーボードの設定です。

4.「ラズベリーパイとリレーボードの接続」及び「接続テスト用のコード作成(リレーボード編)」

ラズベリーパイとリレーボードの接続

これから行うことは図解の「3:ラズベリーパイ」と「4:リレーボード」の部分です。

リレーボードについて、わからない方もいると思うので、簡単に説明しておきます。役割を例えるなら、スイッチのONとOFFを切り替えてくれるものです。今回購入したリレーボードには、ONOFFを切り替える機器が8個備わっています。次ステップの話になりますが、このONOFF機能を使ってコントローラーのボタンに指示を送りロボットを操作するのです。

接続方法は、下記画像の赤枠にあるリレーボードの「PIN」に配線プラグを差し込み、下記画像のオレンジ枠にあるラズベリーパイの「GPIO PIN」の部分にも配線プラグを差し込むだけです。

raspberrypi relayboard

以上で接続の作業は完了ですw後、ラズベリーパイの「GPIO PIN」とリレーボードの「PIN」について把握しておく必要があるので、下記画像を見て確認しておきましょう。

raspberrypi relayboard

リレーボードを制御するには、リレーボードの条件に合わせないと動作しないので注意が必要です。

リレーボードのリレー番号1番のONOFFを制御するには、ラズベリーパイのGPIO PIN 4番を制御しないといけません。なので、コードを書く際は、リレーボードのリレー番号とラズベリーパイのGPIO PIN番号を確認しながら作成することになります。

次にやることは、「publish.js」からの指示でリレーボードが動作するコードの作成です。

接続テスト用のコード作成(リレーボード編)

コードの作成ですが、まずは先ほど作った「subscribe-4.js」の内容をコピーして、新しくファイルを作ります。ここでは、ファイル名を「subscribe-3.js」にしました。作成後、リレーボードが動作するようにコード内容を修正していきます。

コードが長くなりましたので分割して説明していきます。ここも、難しいことは省き簡単に解説しておきます。

gpio bord code
  • 1行目と赤枠のコード内容は、「subscribe-4.js」のコード説明でした内容と同じです。
  • 3行目の「fs = ・・・」の部分は、ラズベリーパイのファイルの読み書きをできるようにするための宣言です。
  • 4行目の「sleep = ・・・」の部分は、待ち時間を利用できるようにするための宣言です。
  • 6行目の「pin1 = 4」の部分は、ラズベリーパイのGPIO番号の宣言です。ここでは「4」で設定しました。
gpio bord code
  • 青枠の部分は、データ受け取り後の内容を確認できる場所です。ここにリレーボードを制御する仕組みのコードを入れていきます。
  • まずは、オレンジ枠の「setup」。ここでは、ラズベリーパイで使用するGPIO番号の使用許可と出力設定をします。
  • コード中にある「sleep.sleep(1)」は、処理の待機時間になります。「sleep」の設定をしておかないと、処理が止まったりして正しく実行されないので、処理の間に入れていきます。
  • 緑枠の「on」は、ラズベリーパイのGPIO番号の出力を「on」にする場所です。コードの「fs.・・・’/value’, 1)」の数字を「1」にすることで「on」の状態になります。
  • 黄枠は、1.5秒後に処理を実行させる内容です。黄枠内にある、処理も1.5秒後に実行されます。
  • 黄枠内の「off」は、ラズベリーパイのGPIO番号の出力を「off」にする場所です。コードの「fs.・・・’/value’, 0)」の数字を「0」にすることで「off」の状態になります。
  • 黄枠内の「mukouka」は、ラズベリーパイのGPIO番号の使用許可を無効化します。この処理を忘れてしまったら、面倒なことになるので気を付けましょう。
gpio bord code
47行目以降のコード内容は、「subscribe-4.js」のコード説明でした内容と同じです。

以上で、コードの作成はこれで完了です。後は、作成した「subscribe-3.js」が正しく動作するかのチェックテストになります。

5.ラズベリーパイとAWS IoTのデータ送受信テスト(リレーボード編)

テストのやり方は、上記「ラズベリーパイとAWS IoTのデータ送受信テスト」で行った方法とほとんど変わりはありません。

手順の説明は今回は省きます。流れに関しては、下記画像になります。

AWS SUBSCRIBE AWS SUBSCRIBE AWS SUBSCRIBE

問題なく実行されれば、コードで指定したラズベリーパイの番号でリレーボードの番号が光り「カチッ」となります。

led pika

おしっ!!リレーボードのLEDが光ったので問題なくリレーボードも動いてますね。これで、リレーボードの制御も応用できます。

まだまだ書くことはありますが、ここら辺がキリ良いので今日はここまでとします。

6.あとがき

今回、記事にしたソースコードの部分はわりとサクッと書いて、テストもバシッとできたので時間も掛からずにできました!

逆にスパッとできたときは本当にこれでいいのか・・・?っと思いますが、おそらく大丈夫でしょう。。。

残りはスマートホームスキルの作成、リレーボードとコントローラーの接続の2つです。次回で最終章になりそうかなと思います。