smartio編集部のナガシマです。普段はバックエンドを担当しています。
記事執筆は超絶苦手です。大変読みにくくなっているかもしれないのでご容赦ください。
第1話から読んでいる方はわかると思いますが、「ボイスロボプロジェクト」は下記の目的を掲げて、まじめに取り組んでいます!
ボイスロボプロジェクトの目的
・音声で操作できるロボットを作りたい ・ロボットで音声操作のバトルをしたい ・メーカーのロボットを音声操作できる装置を作りたい
第7話では、「AWS IoT」を使い「ラズベリーパイ」でデータの送受信が出来るようにしました。例を挙げると、メールの送信と受信です。現状、ラズベリーパイからAWS IoTにデータ送信できているので、今日はAlexaからAWS IoTにデータ送信してロボットを音声操作できるようにしていきます。
ロボットプロジェクトの図解
下記画像はロボットの音声操作ができるようになるまでのステップを簡潔にまとめた図解となります。
今日やること、まず上記図解の「1:Lambda」と「2:AWS IoT」と「3:ラズベリーパイ」を使ってLambdaの作成とスキルを使った送受信です。これが出来るようになると、Alexaからのデータを受け取れるようになります。その後に、「4:リレーボード」と「5:コントローラー」の設定もします。
第3話で話したんですが、「アレクサ、前進!」でロボットを前に進ませたいので、今回のプロジェクトではAlexaスキルを「スマートホームスキル」で作成し音声操作していきます。
すべての準備が整ったら、リレーボードとコントローラーを接続です。接続完了後に、Amazon Echo(実機)を使いAlexaに話しかけてロボットの音声操作をします!!
今回は、「AlexaからのデータをAWS IoTが受け取り、そのデータをラズベリーパイへ送りコントローラーを制御する仕組み」を制作していきます。
これまでのプロジェクトに関する記事は、下記リンクから見れますのでどうぞご覧ください。
- ロボットの音声操作開発プロジェクト
この記事の目次クリックすると該当箇所へ飛べます。
今回は、3つのサービス「Amazon開発者コンソール」「Alexa開発者コンソール」「AWS(アマゾンウェブサービス)」を使って作業することになるので、WEBサイトを行ったり来たりします。それに加えて、ラズベリーパイでの作業もありますので、やる事は満載です。
まずは、「Alexa開発者コンソール」でスマートホームスキルの作成からです。
1.スマートホームスキルの作成
WEBブラウザでAlexa開発者コンソールを開き、ログインすると画面右側に「スキルの作成」ボタンがあるので押します。
次画面では、スキルの名前とデフォルトの言語、スキルのモデル選択が表示されるので、入力して画面右上にある「スキルを作成」を選択です。
ここでは、スキル名に「AlexaRobotSkill」と入力し、言語は「日本語(日本)」にして、モデルは「スマートホーム」を選択しました。
「スマートホーム」の画面にあるスキルID「amzn1・・・」は後で使うので、メモ張か何かにコピペしておきましょう。
ここから先は、LambdaのARNがないと次へ進めないので、一旦ここで作業をストップです。WEBページは開いておいたままにしておいてください。
2.AWSでLambdaの作成とコードの編集
Lambdaの作成
ここからは、AWSサービスを使っての作業になります。WEBブラウザでAWSを開き、「Lambda」を選択です。
ダッシュボードの画面で「関数の作成」を押して関数を作っていきます。関数の画面でも、「関数の作成」を押して作成可能です。
関数の作成の画面では、「設計図」を選択。今回は、この設計図にある「alexa-smart-home-skill-adapter」を使います。使い方は、 設計図のフィルターの追加に「alexa-smart-home-skill-adapter」を入力です。入力後、画面下に「alexa-smart-home-skill-adapter」のテンプレート枠が現れるので、クリックします。そして、画面右下の「設定」ボタンを選択です。
基本情報の入力画面になるので、名前・ロール・アプリケーションIDの入力していきます。名前には「robotSmartHome」、ロールは既存のロールを選択して「robotSmartrole」を選びました。既存のロール「robotSmartrole」は第6話で作成しています。
Alexa Smart Home トリガーのアプリケーションIDには、前にメモ帳に残したスキルIDを入力です。あと「トリガーの有効化」にチェックするのを忘れないようにしてください。
画面中央にあるLambda 関数のコードは、今は何も扱わずにそのままにしておいて大丈夫です。そして、画面下までスクロールすると「関数の作成」があるので選択します。
選択後、画面はrobotSmartHomeのLambda設定に切り替わります。この画面で、まず確認することは「Alexa Smart Home」と「AWS IoT」の項目が有るか無いかをチェックです。2つの項目があれば大丈夫です。次は、「関数コード」でコードの編集作業に入ります。
以上で、lambdaの関数作成は終わりです。ここからは、コードの編集をカタカタですw
Lambdaの関数コードの編集
関数コードの編集は、画面の赤枠部分「index.js」のコードを編集していきます。
スマートホームスキル用のコードを作っていくのですが、どう書けばいいのかわからなかったので、いろいろな参考サイトを見て回りましたw
いろいろ調べた結果、スマートホームスキルをつくるときは、まずデバイス(ラズベリーパイ)をどのような方法で動かしたいのか決めないといけません。今回は、ロボットなのでそれに近しい照明・電球を操作する形で作っていこうと思います。
「index.js」のコード内容が長くなったため、6つに分割してコードの説明をしておきます。今回も、難しいことは省き簡単に説明しておきます。
コードに関しては、なるほど、そうなんだ~レベルで理解してもらえれば幸いです。
-
- 1行目は、今回使うAWSサービスの宣言です。
- 2行目は、エンドポイントの宣言です。エンドポイントは、AWS IoTの管理画面で確認しておきましょう。
- 4行目の「exports.handler・・・」は、スマートホームスキルが実行されるときに1番初めに呼ばれる場所です。
- 赤枠は、スキルに命令・リクエストが来たとき、そのリクエスト内容がどの行動に該当するのか確認する場所です。ここでは「デバイスを探して」や「電気を点けて」 「電気の明るさを10%にして」などの発言内容を確認して、次に動作させるコードへ移動します。
-
- 26行目からは、「デバイスを探して」と呼び出された時に、実行される処理になります。これで「電気をつけて」などに対応できることを Alexa に伝えることができます。対応する部分は、別で実装する必要があります。
- 赤枠は、登録するデバイス機器の情報を入力する場所です。ここで登録した内容は、Alexaアプリで後に確認できます。
- 青枠は、電気のONOFF情報を設定する場所です。
- 緑枠は、電気の明るさ情報を設定する場所です。
- 黄枠は、赤枠・青枠・緑枠で設定したコードを元に処理を実行する場所です。
赤枠の項目内容について
- 「endpointId」は機器のID名(任意での入力)
- 「friendlyName」はユーザーが呼ぶ名称(任意での入力)
- 「descripttion」はユーザーが呼ぶ名称・他の言い方(任意での入力)
- 「manufacturerName」は企業名・団体名(任意での入力)
- 「displayCategories」はデバイス表示のカテゴリー名
-
- 71行目からは、「電気の明るさを〇%にして」と呼び出された時に、実行される処理になります。
- 赤枠は、取得したリクエスト情報を使えるように設定する場所。
- 青枠は、デバイスのIDを確認する場所。
- 緑枠は、電気の明るさ情報を確認する場所です。
- 黄枠は、レスポンス情報をラズベリーパイへ送る処理です。ここでは、104行目の「sendResponce(・・・」の処理がはじまります。この時、コード➄の157行目へ移動し処理が行われます。処理完了後、コード➂の103行目に戻り、「submit・・・」の処理がはじまります。
-
- 110行目からは、「電気を点けて」「電気を消して」と呼び出された時に、実行される処理になります。
- 赤枠は、取得したリクエスト情報を使えるように設定する場所。
- 青枠は、デバイスのIDを確認する場所。
- 緑枠は、電気のONとOFFの情報を確認する場所です。
- オレンジ枠は、レスポンス情報をラズベリーパイへ送る処理です。ここでは、149行目の「sendResponce(・・・」の処理がはじまります。この時、コード➄の157行目へ移動し処理が行われます。処理完了後、コード➃の148行目に戻り、「submit・・・」の処理がはじまります。
-
- 157行目からは、Alexaからのレスポンス情報をラズベリーパイへ送るために内容をまとめる処理です。
- 赤枠は、レスポンスの結果情報をまとめる場所。
- 180行目は、まとめたレスポンス情報を使って処理が終わると、コード➅の183行目へ移動します。
-
- 183行目からは、Alexaから受け取ったレスポンス情報をJSON化してラズベリーパイへ送る処理になります。
- 赤枠は、レスポンスの結果情報をJSON化(データの構造をJOSNに変換)する場所です。
- 青枠は、JSON化したレスポンス情報(データ)をラズベリーパイへ送ります。
エンドポイントには、ラズベリーパイのエンドポイントを入力です。メモし忘れた方は、AWSサービスのAWS IoTでエンドポイントを確認することが出来ます。
上記のコードを「index.js」に入力したら、画面右上の「保存」を忘れずに押してください。後、「保存」の上にあるARN「arn:・・・・」をコピーしてメモ帳か何かに保存しておいてください。
以上で、lambdaのコード作成・編集は完了です。ここで一旦、AWSサービスのlambdaでの作業は終了になります。
3.スマートホームスキルのデフォルトのエンドポイント設定
ここからはAlexa開発者コンソールで作業していきます。スマートホームの設定画面で、先ほどコピーしたARNを「デフォルトのエンドポイント」へ張り付けて、「保存」を押します。
最後に、画面下にある「アカウントリンクを設定」を押して次へ移動です。ここで、一旦作業をストップします。WEB画面は開いたままにしておいて大丈夫です。
4.Amazon開発者コンソールでセキュリティの作成・設定
今度は、Amazon開発者コンソールを開いて作業していきます。画面上にある「Login with Amazon」を選択すると、画面中央に「セキュリティプロファイルを新規作成」が表示されるのでクリックです。
次画面へ飛ぶと、文字化け祭りwwwwなんじゃこりゃとなりましたが、こういう時は画面下にある言語切り替えを押して「英語(English)」にします。これで文字化けは解消され英語での表記に切り替わるので、ここに入力していきましょう。
4つ項目がありますが、今回は必須項目の「Security Profile Name」「Security Profile Description」「Consent Privacy Notice URL」に入力しました。ここでは、「Security Profile Name」「Security Profile Description」のどちらとも「RobotSmartHome」と入力しました。「Consent Privacy Notice URL」は、「個人のサイト」を入力しました。すべての入力が終わりましたら、画面右下にある「Save」をクリックです。
画面中央に「Login with Amazon successfully enabled ・・・」と表示されれば成功です。
後、「Show Client ID and Client Secret」を押して、IDとSecretの情報を忘れずに確認してメモ帳に保存しておきましょう。
以上で、Amazon開発者コンソールでのセキュリティの作成・設定は完了です。
5.Alexa開発者コンソールでアカウントリンクの設定
Alexa開発者コンソールの画面へ戻ります。アカウントリンク画面の項目に入力です。入力内容に関しては画像の下にまとめています。
- 認証画面のURl:https://www.amazon.com/ap/oa?redirect_url=[リダイレクト先のURL]
- アクセストークンのURl:https://api.amazon.com/auth/o2/token
- クライアントID:メモ帳に保存しておいた「Client ID」
- クライアントシークレット:メモ帳に保存しておいた「Client Secret」
- クライアントの認可方法:HTTP Basic認証(推奨)
- スコープ:profile(※スコープの追加を押して編集)
項目の入力が完了後、画面右上の「保存」を押します。問題なく保存出来たら、画面上部に「Success! Your・・・」が表示されます。
以上で、Alexa開発者コンソールでの作業は終わりです。
6.Amazon開発者コンソールでリダイレクト先URLの設定
次は、Amazon開発者コンソールでの設定になります。まず、画面上部の「Login with Amazon」をクリックして「Amazonでログイン」の画面へ移動です。
「管理する」の項目に歯車のマークボタンがあるので、カーソルを当てるとポップアップで設定項目が現れます。ここでは「ウェブ設定」を選択です。
セキュリティプロファイル管理の画面では、「許可された返信URL」を設定していきます。設定方法は、画面右下にある「編集」をクリックです。
許可された返信URLに入力する内容は、先ほど「認証画面のURl」で設定する際に使った「リダイレクト先のURL」です。
「許可された返信URL」に入力後、画面右下の「保存」を押します。以上で、Amazon開発者コンソールでの作業は終了です。
次にやることは、Amazon Echo(実機)でラズベリーパイを操作です。ラズベリーパイを操作できるようにするには、Alexaアプリを使ってスマートホームスキルの設定を行わないと使えません。
7.Alexaアプリでスマートホームスキルの有効化・設定
ここから先はAlexaアプリを使っての作業になります。アプリ起動後、画面右下の上下矢印をクリックです。デバイスの設定画面では、下にスクロールすると「スマートホームスキル」が表示されるので選択します。
スマートホームスキルのスキル一覧に作成した「AlexaRobotSkill」が表示されていれば成功です。このスキル一覧にある「AlexaRobotSkill」を選択すると、AlexaRobotSkillの設定画面になり「有効にする」ボタンが出てきますので、押して有効化します。次画面ではアマゾンエコーを設定した時と同じアカウントを入力してログインを押します。
ログイン後、端末の検出画面になるので「端末の検出」ボタンを押して、登録していきます。次画面では「デバイスを検出しています…」と表示されるので、登録が完了するまで待ちです。デバイスの登録が済むと、「完了」と表示されるので選択します。
デバイスの検出ができなかった場合は、スマートホームスキルで設定した「Lambda」のコードに問題があるかもしれません。
以上で、スマートホームスキルの有効化と設定は完了です。ここまでくれば、アレクサからの指示でラズベリーパイを操作することが出来るようになります。
でも、まだコントローラーを操作するためのコードがラズベリーパイにはないので、コードを作成していきます。
8.コントローラーを操作するための「subscribe」ファイルの作成
ここからはラズベリーパイでコントローラーを操作するためのコード作成です。コードの作成は、第7話で作成した「subscribe.js」の内容を使います。第7話で作成したコードは少し改良すればコントローラーを操作することが出来るようになるので、「subscribe.js」の内容を使うことにしました。
後、ロボットを操作するのに使うボタンは今のところ12個あるので、それぞれのボタンの条件分けを「電気のONOFF」と「電気の明るさ(〇%)」で操作できるようにコードを作っていきます。
例えば、ロボットを前進させるボタンは、「電気をON」の発言で操作できるようにすることができます。
「subscribe」のコードも長くなったので、5つに分割してコードの説明をします。ここも難しいことは省き簡単に説明しておきます。
-
- 赤枠に関しては、「AWS IoT SDK」や「ファイルの読み込み」、「一旦停止」が使えるようにするための宣言です。
- 赤枠はコントローラーのボタンの配置場所を保存するための宣言です。
- 18行目はコマンド(cmdo)データを保存する場所です。(例:電気のON、電気の明るさ調節)
- 19行目はパラメータ(para)データを保存する場所です。(例:on、off、10%など)
- 20行目はアクション(action)データを保存する場所です。(例:ボタン操作は1つなのか、それとも2つなのかを確認するためのデータ)
- 青枠は、AWS IoTを使うために必要な宣言です。
- 緑枠は、デバイスがAWS IoTからのデータを受け取れる状態にする場所です。
- 35行目からは、AWS IoTから受け取ったデータを分析し、分析データを元にラズベリーパイでどのGPIOを制御するかを決める場所です。
- 黄色枠は、受け取ったデータを扱いやすいように変換(JSON変換)する場所です。
-
- 水色枠は、受け取ったデータが「電気の明るさ調節」の時に行われる処理です。この場所で、各条件にあった動作させるGPIO番号を決めます。
-
- ここも、受け取ったデータが「電気の明るさ調節」の時に行われる処理の部分です。各動きに合わせた、GPIO番号を決めています。
-
- 赤枠は、受け取ったデータが「電気のONOFF」の時に行われる処理です。この場所で電気がONなのかOFFなのかを確認後、動作させるGPIO番号を決めます。
-
- 186行目~237行目は、コントローラーの操作がボタン1つで動作する物なのか、それともボタン2つで動作する物なのかを分別して、それぞれに対応したGPIOの制御をします。
以上で、「subscribe.js」の修正作業は完了です。このコードによって、ラズベリーパイでコントローラーを操作できるようになります。
これからやる事は、コントローラーとリレーボードの接続です。
9.コントローラーとリレーボードの接続
ラズベリーパイとリレーボードの接続はできているので、リレーボードとコントローラーを接続です。
ここでコントローラーの改造に関していくつか注意点があります。
無線で接続するコントローラーを改造することは電波法に抵触する可能性があります。 ざっくり言うと改造はOKですが、電波を飛ばすとアウトです。ですので
注意点
※公共の電波に影響が出ないように個人の趣味の範囲で行うこと。 ※改造したコントローラを絶対に公共の場で使用しない。 電波の利用ルールに関する内容は、総務省の電波利用ホームページに詳しく記載されています。
上記の注意点を踏まえたうえで、自己責任で行いましょう。
まずは、ロボットを操作するコントローラーを分解して、各ボタンに配線を施していきます。次に、コントローラーの基盤を裏返しにして、各ボタンに配線をはんだ付けです。そして、はんだ付けが終わったら、コントローラーに取り付けた線をリレーボードに接続していきます。
今回使ったリレーボードは簡単に配線が出来るねじ止めタイプのモノでしたので、線を差す差込口のネジを緩めて線を差し込み、ネジ止めをするだけでした。
以上で、コントローラーとリレーボードの接続は完了です。
10.Amazon Echoを使ってロボットの音声操作
ロボットを音声操作するための準備はすべて整いました!後は、Amazon Echo(実機)に話しかけて、問題なく動作するかチェックです。
アレクサに話す前に、ラズベリーパイでターミナル(コマンド入力画面)を開き、以下のコマンドを打って、アレクサからのデータをラズベリーパイが受け取れる状態にしておきましょう。
- cd python_test
- node subscribe.js
今回は、ラズベリーパイを「電気」のデバイスと仮定してスマートホームスキルで動作するように作りました。それでは、さっそく正しく実行してくれるかやってみます。
まずは「アレクサ、電気を点けて!」と言いました。
・・・カチッ!・・・シャカ!シャカ!シャカ!!
やったぞ!ロボットを音声操作で操作することができました。
今度は、Alexaアプリの定型アクションを使ってロボットを操作です。定型アクションを使えば、自分で決めた言葉でデバイスを操作できるようになります。
なので、「アレクサ、前進!」でロボットが前に進むように定型アクションを設定しました。
早速、アレクサに話してみます!
おおお!!定型アクションも問題なく動作しました!!下は動作した時の動画です。いや~、いつ見てもこの時の興奮は忘れられないですw
やってやったぞ!
— ながちゃん@Smartio😊 (@nagasmartio88) 2018年11月9日
音声ロボット🤖
アマゾンエコーを使ってロボットを操作できるようにしてしまった😆😆😆
まずは全身w
あ!
前進ww#アマゾンエコー #ロボット pic.twitter.com/aJeK8COgSk
10.あとがき
ロボットの音声操作!やってやりましたよ!
正直、今回のボイスロボプロジェクトはちゃんと完成させることはできるのか不安で仕方ありませんでした。なぜかというと、ラズベリーパイやAWS IoT、スマートホームスキルなど今まで扱ったことのない題材を使ってのプロジェクトだったので本当にできんのか!?っと思いつつ制作しました・・・。それでも、自分には出来るっと言い聞かせて無事にやり遂げました!
ボイスロボプロジェクトの制作は、とても時間が掛かりましたがいろいろな情報を吸収することが出来ました。まずロボットを音声操作する仕組みについてはどのような機器が必要なのか、どの言語で作ればいいのか、デバイスはラズベリーパイが制御しやすいのか、などなどたくさんの知識を知る機会になりました。
蓄えた知識は、アウトプットすることが大事!なので、何かしら個人的に開発してみようと思います。もし、ガジェットの開発をするってなったときはいろいろなアドバイスを言うことが出来るようになったと思います(ハード開発素人ですがw)。
初めてのスマートホームスキル作成なので間違ってることを言ってるかもしれません。その時は、ご指摘お願いします。