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

2018.11.2

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

第5弾でも伝えておきます。超絶苦手な記事執筆を行います。もう1度言いますが、超絶苦手ですので、読みにくくてもご容赦ください。

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

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

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

前回ラズベリーパイとブレッドボードを使ってLEDを点灯できるようになりました。現状は、ラズベリーパイ上でコマンドを入力して実行しないと操作できません。このままでは、アマゾンエコーでロボットを音声操作することはできないので、音声操作でラズベリーパイを動かせるようにしていきます。

じゃあ、どうやってアマゾンエコーからラズベリーパイを動かすかというと、アマゾンのAWSサービス「AWS IoT (IoT Core)」というものを使って動作させるのです。

「AWS IoT (IoT Core)」を使うことでアマゾンエコーからの指示をラズベリーパイが受け取れる仕組みを作ることが出来ます。詳しいは説明は今回省略。

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

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

図解

今日やることは、上記図解の「2:AWS IoT」と「3:ラズベリーパイ」を使って通信が出来るようにしていきます。これが出来るようになると、AWS IoTとラズベリーパイの間でやりとりが可能になります。

やり取りの流れは、まずラズベリーパイからAWS IoTに接続の依頼です。その後、AWS IoTからラズベリーパイへ接続後のお知らせを受け取ることができます。

raspberrypi-awsiot

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

さっそく、AWS IoTを使おうと思いますがその前に準備するものがあります。

これらは済ませておきましょう。で、今からすることは、ラズベリーパイをAWS IoTに登録です。

1.ラズベリーパイをAWS IoTに登録

それでは、アマゾンのAWSにログインして、AWS IoTのページへ移動します。AWS IoTへは、検索窓に「iot core」と入力して「IoT Core」を押す。もしくは、画面下にあるIoTカテゴリの赤枠「IoT Core」から移動できます。

AWS IoT

まずはポリシーの設定からです。

ポリシーの設定

AWS IoT画面の左側にある「安全性」→「ポリシー」をクリックし「ポリシーの作成」を押します。

policy-setting

入力内容は下記です。すべての項目に入力後、「作成」ボタンをクリックです。

  • 名前: RaspberryPiPolicy 
  • アクション: iot:* 
  • リソースARN: * 
  • 効果: 許可 
policy-setting

以上でポリシーの設定は完了です。

デバイス登録と証明書の作成

AWS IoT画面の左側にある「管理」→「モノ」をクリックし「モノの登録」を押します。

device-setting

ここでは、ラズベリーパイを1つ登録するだけので「単一のモノを作成する」を登録です。

device-setting

「Thing Registryにデバイスを追加」画面では、モノの名前に「RaspberryPi」と入力するだけ。他は、何も変更せずに画面下の「次へ」を押します。

device-setting

「モノに証明書を追加」の画面では、項目「1-Click証明書作成(推奨)」の「証明書の作成」をクリックです。

device-setting

「証明書が作成されました」の画面になるので、すべての項目をダウンロードです。ダウンロードしたファイルは後で、使うのでフォルダにまとめておきましょう。あと、左側に「AWS IoTのルートCAダウンロード」とありますが、こちらはAWS公式の証明書ページへ移動になります。このページは残したまま、移動しましょう。

device-setting

移動後、画面中央ぐらいにある「RSA 2048 ビットキー: Amazon ルート CA 1」をクリックすると文字がずらっと並んでいるのですべてコピーしてテキストに保存です。今回ファイル名は「VeriSign.pem」にしました。

device-setting

ダウンロードしたファイルはそれぞれ以下のように名前を変更しました。

  • ルートCA:VeriSign.Class.crt
  • 証明書:MyRaspberryPi.cert.pem
  • プライベートキー:MyRaspberryPi.private.key
  • パブリックキー:MyRaspberryPi.public.key

「証明書が作成されました!」の画面に戻り、「有効化」のボタンを押して、「ポリシーのアタッチ」を押します。

これらをWindowsでダウンロードした場合は、ラズベリーパイ上で使うので、ラズベリーパイにファイルを移動させましょう。ファイルの移動は、USBでもいいし、SNSツールなどを利用して大丈夫です。ラズベリーパイで上記の作業を行った方は、ラズベリパイーのダウンロードフォルダにファイルが保存されます。

画面が切り替わり「モノにポリシーを追加」画面では先ほど作成したポリシーにチェックを入れて「モノの登録」をクリックです。

device-setting

すべての登録が終わったので、AWS IoTに接続する際に必要なラズベリーパイのエンドポイントを確認しに行きます。まずは、AWS IoT画面の左側にある「管理」→「モノ」を押して「RaspberryPi」をクリックです。

endpoint

次に、左側の「操作」を押すと、赤枠部分のエンドポイントが表示されます。この内容は後で使うのでテキストにメモしておきましょう。

endpoint

先ほどダウンロードしたファイルは、第5話で作った「python_test」ディレクトリに移す必要があります。なので、ここからはラズベリーパイを起動します。

起動後、まずファイルを「python_test」に移動。その後に、「python_test」の中に「certs」ディレクトリを作り、その中にダウンロードしたファイルを入れます。参考程度に下記画像のような階層になっていれば大丈夫です。

device-setting

以上でAWS IoTにラズベリーパイのデバイス登録が終わりました。次に、ラズベリーパイとAWS IoTの接続する際に使うツールのインストール・ファイルの作成です。

2.AWS IoTに接続する為に必要なツールのインストール

ここからラズベリーパイとAWS IoTの接続になるのですが、先にいくつかラズベリーパイにインストールしておくべきツール・ファイルがあるので、先にそっちからやっていきます。

なので、ラズベリーパイの画面を開き、ターミナル画面を出します。

ツールの導入は、ターミナルを使ってコマンドを入力です。下記のコマンドを上から順にやっていけば大丈夫です。

ラズベリーパイのパッケージ情報を最新にする

  • sudo apt-get update
  • sudo apt-get upgrade
  • sudo reboot

npmをインストール

  • sudo apt-get install npm

※もし、npmのインストールに失敗した場合は、下記のコマンドを入力すれば大丈夫です。僕はこの方法で解決しました。

  • npm cache clean
  • npm uninstall npm -g
  • sudo npm install npm@latest -g
  • npm update -g npm

上記のコマンドを入力しても、npmのインストールができない場合は下記のコマンド入力です。おおよそ、この方法で出来るはずです。これで解決できなかった場合は、他の方法を探るしかないです。

  • sudo aptitude install npm

次のインストール作業をするときは、階層を第5話で作った「python_test」フォルダにします。

kaisou-chnage

第5話の記事を確認したい方はボイスロボプロジェクト第5話をご確認ください。

Nodeリポジトリをインストール

  • sudo apt-get install curl
  • sudo curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash –

Nodejsをインストール

  • sudo apt-get install -y nodejs

※もし、nodejsのインストールに失敗した場合は、下記のコマンドを入力すれば大丈夫です。僕はこの方法で解決しました。

  • sudo apt-get remove –purge nodejs (インストールに失敗した nodejs を削除)
  • sudo apt-get install -y nodejs

package.jsonファイルの作成

  • npm init

AWS IoT Device SDK for JavaScriptをインストール

  • sudo npm install aws-iot-device-sdk

以上で、今回使うツールのインストール作業は完了です。npmのインストールがうまくできず悩まされて大変でしたが、何とかインストールできました。

次は、AWS IoTを使ってラズベリーパイと接続できるかテストする為のコードを作成します。

3.AWS IoTに接続・テスト

AWS IoTとラズベリパイーを接続するためのコード作成

今回は、「nodejs」という言語でコードを書いていきます。ごちゃごちゃ説明すると分かりにくくなると思うので、コードの大まかな内容だけ説明します。詳しい内容は書きませんので、ご了承ください。

まずは、赤枠から説明します。ここでは、AWS IoTに登録したデバイス情報を登録する部分です。次に青枠は、ラズベリパイーがAWS IoTに接続するためのコードで、緑枠の部分はコメントが表示される部分です。

device-connect

AWS IoTとラズベリパイーの接続テスト

作成したコードを実行するときは、下記のコマンドをターミナルに入力して「ENTER」です。

  • cd python_test
  • node iot_publish.js

コマンド入力実行後、問題なく接続ができた場合は、ターミナルにコメントが表示されます。

device-connect

キターーーー!!問題なくラズパイへ接続できました。

記事にすると、あっという間に終わりますが、実はここまで作るのにちょっと時間が掛かりました。ターミナルにコメントが表示されるまでの間は脳みそが爆発しそうなときもありました。

ここまでくれば、後はスマートホームスキルとラズベリーパイを制御するコードの作成、ロボットのコントローラを動かすリレーボードの設定ができればロボットの音声操作はできるぞ!!うぉ~、と叫びながら目は真っ赤でした(笑)

まだまだ続くのですが、長くなるので一旦ここで終わりとします。

3.あとがき

実は、めちゃくちゃ躓いた部分がありまして、それは証明書とソースコードの作成です。ページに飛んで証明書ファイルをダウンロードするだけなんですけど、どの証明書を使っていいのかわからず、悩みました。しかも、nodejsでAWS IoTにつなげるソースコードの書き方もわからなかったので試行錯誤しながら探り探りでコードを書きテストしながら、つなげる方法を見つけました。

参考サイトにはいろいろな方法でソースコードが書かれているので、どの方法が正しいのかわからず時間が掛かりました。でも、今回が初めてなので今度何かするときはある程度問題の場所を予測できるようにはなったな。

証明書については、クラスメソッドの清野さんにどのファイルを使ったらいいのか教えていただきました。本当に助かりました!まさか、証明書が悪いとは。。。いろいろ困難はありましたが出来て良かったです。

今回で、ロボットの音声操作は第6話になります。こんなに長くなるとは思っていませんでした。しかも、今からやるところがメインだと思うので、ここからもっと踏ん張って進めて行くことになります。

この次は今までやったこのないスマートホームスキルの作成に入っていきますが、作ったスキルがちゃんと動くか心配です。

僕はラズベリーパイの扱いに関しては初心者なので、間違いがありましたら、ご指摘お願いします。