5.4.15.RaspberryPiとヘッドセットをBluetooth接続する

RaspberryPi zeroとヘッドセットをBluetooth接続します。今回は下記のヘッドセットをRaspberryPi zeroと接続します。

■Mpow 078 Bluetooth ヘッドセット(マイク付)

1)各種ライブラリのインストール

まずは、terminalを起動し、下記のコマンドを使って各種ライブラリをインストールしてください。

■Bluetoothのライブラリ                     sudo apt-get install pi-bluetooth

■bluemanをインストール、GUIにてペアリングを行うライブラリ                  sudo apt-get install blueman

■PluseAudioでBluetoothと内部機構を連携するライブラリ      sudo apt install pulseaudio-module-bluetooth

■PulseAudio Volume Control                   (Pulse Audioを利用した音器量調整機能)                sudo apt-get install pavucontrol

2)デバイスのペアリング

3)対象デバイスに対しての設定

ヘッドセット以外のマイク、スピーカーのデバイスをOFFにします。

4)プログラムの修正

【TextToSpeech_Jtalk.py】

赤枠の「os.system(“aplay -D plughw:”+ str(cardno) + ” ” + filename)」から「os.system(“aplay “+ filename)」に修正します。

カード番号を指定する事でデバイスを選択してましたが、Bluetooth接続によってカード番号を指定しなくてもデフォルトがヘッドセットになります。

カード番号を指定したら今まで通りのデバイスが使用できます。

5)テストする

録音のコマンド、再生のコマンドを使ってヘッドセットのマイクで録音ができ、ヘッドセットのスピーカーで再生するか確認しましょう。

■録音のコマンド

arecord test.wav

■再生のコマンド

aplay test.wav

 

 

 

5.4.12.アラーム機能の追加

アラーム機能を作成します。

時刻を設定すると、直近の設定した時刻になると「時間です。」とお知らせする機能です。

今後は、時間になると音楽を再生したり、録音した音声ファイルを再生したりとアラーム機能を充実させていきますが、まずは、基本的な時間になるとお知らせしてくれる機能を作成します。

プログラムの流れとしては、下記のフローチャートの通りです。(flgチェックの分岐でalarm以外の分岐は省いています。)

1)Dialogflowの設定

下記の表に従ってIntentesとEntitiesを作成してください。

2)修正および作成するプログラム以下の通りです。

①[BrainAction.py](既存)

②[NagoRobo_Main.py](既存)

③[TextToDate.py](新規)

④[Alarm.py](新規)

⑤[AlarmList.json](新規)

3)TextToDate.pyについて

アラームのセットは音声で行います。処理ステップとして音声はテキスト化されます。想定している音声の時刻は「12時15分」といった形式となります。プログラムでは、アラームの時刻を日付型で取り扱いますが、「12時15分」という形式のデータを日付型のデータに直接変換する関数がpythonでは用意されていません。そのため、この形式のデータを日付型へ変換する為のプログラムを用意しています。

例:12時15分

      ⇩ 変換

  12:15:00               ⇦ 日付型データ

TextToDate.py

※TextToDate.pyはフローチャートの黄緑のボックスの処理になります。

4)AlarmList.jsonについて

設定された時刻データは「AlarmList.json」にjson形式にて登録していきます。

AlarmList.json

4)Alarm.pyについて

Alarm.pyはアラーム機能の核となるプログラムです。

「アラームセット」、「指定した時間のアラームデータの削除」、「指定したシーケンスNOのアラームデータの削除」、「指定した時刻のアラームデータのシーケンス番号の配列を返す」、「アラームチェック」の5つの関数を作成しています。

 

Alarm.pyはフローチャートのピンクのボックスの処理になります。

 

※「アラームセット」と発声し、アラームを設定した時間に「時間です。」とロボット発声したら成功です。

前の投稿/次の投稿/メニューページへ戻る

5.4.8.1.会話をGoogle SpreadSheetへ記録する

Google Cloud PlatformのAPIを使ってロボットとの会話をGoogleのSpreadSheetへ記録するプログラムを作成します。

1)APIの有効化

まずは、Google Cloud PlatformのAPIを有効化しましょう。今回のプログラムには2つのAPIを使います。下記の2点を有効化してください。

 ・Google Drive API

・Google Sheets API

2)Google SpreadSheetを作成する

Google SpreadSheetを作成してください。

まずは適当な名前を付けてください。今回は「RegConversation」とします。

3)作成したSpreadSheetをAPIを使ってプログラムから操作できるように共有化する

「共有」クリックし、「他のユーザーと共有」の画面を起動してください。

 

次にサービスキーのclient_emailのアドレスを入力してください。共有先として追加してください。サービスキーのclient_emailはjsonデータを展開すると記載されています。

先ほど作成したSpreadSheetを開き、下記の通りに項目を入力してください。Sheet名「InformationSheet」です。また、図と同じセルにLatestSheetとLatestRowを入力し、値を初期値は0としておきます。

LatestSheet:Sheet数を管理します。現在のSheetの枚数を記録していきます。(InformationSheetは枚数に含まれません)

LatestRow:行数を管理します。行数はSheetごとに管理するのではなく全てのSheetを通して行数を数えます。

 

4)SpreadSheetに会話データを追加するプログラムの仕様

会話のデータを追加するプログラムを作成します。プログラムの簡単な仕様としては

①InformationSheetのLatestSheetの値を確認し、数が0枚なら「data1」というSheetを追加。(Sheetの追加と同時に5列1行のセルを追加しカラム名を入力する。)

②LatestRowの値が前回のSheetの追加から1000行増えていると新たにSheetを追加して記録をする

③次に発話された内容のテキストをカラムの項目ごとに記録する(ユーザー/ロボットともに)

※Sheet名は「data2」、「data3」・・・と追加

 

5)ライブラリをインストール

sudo pip3 install gspread

sudo pip3 install oauth2client

6)プログラムの作成

[TalkToRecord_Google.py]

プログラム上のS_sheetにURLに含まれているIDを入力します。URL上に表示されています。

赤線部分の「d/」から「/」の間がIDです。

合わせてGoogleサービスキーも入力します。これでプログラムが完成しました。

実行し、作成したSpreadSheetに会話の内容が記録できれば完成です。

前の投稿/次の投稿/メニューページへ戻る

5.4.8.2.TalkToRecord_Google.pyをBrainAction.pyへ組み込む

前回、作成したTalkToRecord_Google.pyをBrainAction.pyへ組み込み会話の記録ができるようにしていきます。また、Google SpreadSheetのIDをKeylist.jsonへ追加し、NagoRobo_Main.py起動時に取得する形にするので、NagoRobo_Main.pyの修正も行います。

1)Keylist.jsonにGoogle SpreadSheetのIDを追加する

2)NagoRobo_Main.pyを修正する

3)BrainAction.pyへ組み込む

上記の手順で進めていきます。

1)Keylist.jsonにGoogle SpreadSheetのIDを追加する

下記の図の通り、Keylist.jsonに前回の章で確認したURLに含まれているIDを追加してくさだい。

2)NagoRobo_Main.pyを修正する

[NagoRobo_Main.py]

インスタンスの生成の所で下記の図の赤線部分を追記してください。

 

3)BrainAction.pyへ組み込む

BrainAction.pyへ組み込む準備ができましたので、TalkToRecord_Google.pyのプログラムを組み込んでいきます。

[BrainAction.py]

赤文字の追加部分を記載してください。Google SpreadSheetへアクセスする為のURLに含まれているIDを引き渡す処理をします。

プログラムの#—追加—#のとコメントされている個所にTalkToRecord_Google.pyの関数を呼び出す処理を追加記載しています。ユーザー、AIの発話毎に関数を呼び出しています。

これでBrainAction.pyへの組み込みが完了しました。NagoRobo_Main.pyを実行し、会話の記録ができるか確認してください。

前の投稿/次の投稿/メニューページへ戻る

5.3.1.2.写真を撮ってその情報を発話するプログラム

今回は、写真を撮ってその情報を発話するプログラムを作成します。

このプログラムを作成する為に写真情報を取得するプログラムを作成していきます。Google Cloud PlatformにてVisionのAPIを有効化してください。

また、写真情報は英語で取得されるので、以前作成したTranslate_Google.pyのプログラムを和訳もできるように修正していきます。

[写真情報を取得機能作成(VisionToText_Google.py)]

ライブラリのインストール

sudo pip3 install –upgrade google-cloud-vision

※upgradeの前のハイフンは2つです。

sudo pip3 install oauth2client

ライブラリのインストールが終了したらプログラムを作成していきます。

[VisionToText_Google.py]

Google Cloud Platformで取得したサービスキーを入力します。

下記のコマンドでプログラムを実行してください。

sudo python3 VisionToText_Google.py

写真情報のレスポンスが返ってきたら成功です。

[翻訳機能の修正(Translate_Google.py)]

現在は、Translate_Google.pyは英訳しかできませんが、和訳もできるように言語を引数としてセットし、多言語翻訳ができるようにしていきます。

ライブラリのインストールは「5.2.7.4.翻訳する(Google)」の章でインストール済みです。

では、プログラムを修正していきます。

[Translate_Google.py]

Google Cloud Platformで取得したサービスキーを入力します。

引数に「ja」をセットし、「This is a pen」を和訳してみます。実行コマンドは下記の通りです。

sudo python3 Translate_Google.py

[プログラムを組み合わせて、写真を撮ってその情報を発話するプログラムの作成]

写真情報取得のプログラムの作成と翻訳のプログラムの修正が完了したので、プログラムを組み合わせて、写真を撮ってその情報を発話するプログラムを作成していきます。

※写真を撮るプログラムは「5.3.1.1.写真を撮る機能の作成」の章で作った「takeapicture.py」のプログラムを使います。

[AnalysisImageToSpeech_Google.py]

Google Cloud Platformで取得したサービスキーを入力します。

では、プログラムを実行してみましょう。下記のコマンドで実行できます。

sudo python3 AnalysisImageToSpeech_Google.py

レスポンスが返ってきたら成功です。

前の投稿/次の投稿/メニューページへ戻る

5.4.7.各種API利用時のキー情報をファイルで管理する

各種API機能を利用するためには、セキュリティ確保のためにキー情報の取得とプログラムでの利用が必要となっています。現在は、このキー情報をプログラムの中に直接記述していることから、プログラムのメンテナンス性やセキュリティの観点から課題となっています。

今回、このキー情報を効率的に管理し、且つ将来的にセキュリティの向上を容易にするために、キー情報を管理するキーリスト(json形式)を作成し、プログラム起動時にキーリストを読み込んでキー情報を取得するようにプログラムを修正します。これによりキー情報の管理を効率化する事ができます。

今回管理するキー情報としては

・Google サービスキー

・DialogFolw Client Access Token

・docomo APIキー及びappId

となります。

キー情報をファイルで管理する為に以下の手順で修正を行います。

1)GConversation_docomo.pyの修正

2)QA_docomo.pyの修正

3)keylist.json(json形式)の作成

4)NagoRobo_Main.pyの修正

5)BrainAction.pyの修正

 

1)GConversation_docomo.pyの修正

GConversation_docomo.pyの修正を行います。今まではappIdをプログラムに直接記載してましたが、appIdを引数にセットし実行するように修正します。

[GConversation_docomo.py]

2)QA_docomo.pyの修正

QA_docomo.pyのプログラムもGConversation_docomo.pyと同様にappIdを引数としてセットするように修正します。

[QA_docomo.py]

3)keylist.jsonの作成(json形式)

[keylist.json]

コメントをGoogle サービスキー、DialogFolw Client Access Token、docomo APIキーに書き替えてください。

また、keylist.jsonはプログラムが配置されているフォルダへ保管してください。

4)NagoRobo_Main.pyの修正

[NagoRobo_Main.py]

赤い下線のライブラリのインポート処理を追記します。

「ここから–ここまで」の処理を修正する

これでNagoRobo_Main.pyを実行するとkeylist.jsonを確認し、キーをkeylist.jsonから取得するようになります。また、keylist.jsonに「Id_docomo」というキーネームがなければGetMyappId.pyの関数を呼び出し、appIdを自動取得します。1度、appIdを取得すれば次回の起動時にはGetMyappId.pyの呼び出しは行いません。

5)BrainAction.pyの修正

BrainAction.pyはGConversation_docomo.pyとQA_docomo.pyの関数の呼び出し時に引数にappIdをセットするように修正を行います。

プロパティの処理の「ここから₋₋ここまで」の部分を追記します。appIdをNagoRobo_Main.pyから受けとる処理です。

[BrainAction.py]

赤い下線部分に第三引数としてappIdを追記します。

先ほど同様にQA_docomo.pyの関数の呼び出しの際にも赤い下線部分に第三引数としてappIdをセットします。

 

これですべてのプログラムの修正が完了しました。NagoRobo_Main.pyを実行し、問題なく動けば完成です。

※docomoのappIdを取得するプログラムGetMyappId.pyについては「5.4.1.自然対話:雑談機能の追加」をご参照ください。

前の投稿/次の投稿/メニューページへ戻る

5.3.5.全体的に形を整える

ロボットの基本的な機能ができてきたので、今までに作成してきた機能(目、耳、口、足、手)をつなぎ合わせて、実際にロボットを作成してみます。ここで作成するロボットが完成形というわけではありませんが、全ての機能を組み合わせて問題なくロボットが動くか確かめます。

[ロボットの胴体をつくる]

ロボットの胴体の中にRaspberry Pi、ブレッドボード、電池等をセットしていきます。今回は胴体の材料に1㍑のペットボトルと段ボールを使って作成しました。胴体は同じように作成する必要はありませんが、足を作るの章で作成した足の台に載せる事の出来る大きさで、なるべく軽い素材で作るようにしてください。

[胴体に頭脳をセットする]

1)下記の図の通りにRaspberryPi、DCモーターのブレッドボード、サーボモータのブレッドボード、電池、サーボモータをセットしていきます。また、セットする際にジャンパー線をペットボトルにあけた穴に通します。

※ジャンパー線を通すときにDCモーター①と②、サーボモータ①、②のジャンパー線を左右で分けて通すようにします。

全てペットボトルの胴体に詰め込むと下記の図のような形になります。

2)次にジャンパー線をつなぎます。ブレッドボード側のジャンパー線とRaspberryPi側のジャンパー線をつなぎます。シールで目印をつけているので差し込み先を確認せずとも接続できます。

※DCモーターへつなぐジャンパー線は足へセットする際に接続してください。

電池はDCモーターとサーボモータで共有して使っています。各ブレッドボードの電池へつなげるジャンパー線を電池の線に下記の図の用に接続します。

電池の線にDCモーター、サーボーモータの両方の線が接続された状態です。

[ロボットを組み立てる]

ロボットの足に各パーツを載せていきます。足に胴体を載せたらDCモーターとDCモーターのブレッドボードから出ているジャンパー線を接続してください。

サーボモータには腕と分かるようにストローをセットしました。

後は、スピーカーをRaspberryPiにセットすれば完了です。

正面から見るとこんな感じ

雰囲気を出すために顔を付けてみました。

プロトタイプ、第1弾はこんな感じです。

後は、RaspberryPiの電源を入れて動作確認してみましょう。

NagoRobo_Main.pyを起動し、喋る、移動するができれば成功です。

前の投稿/次の投稿/メニューページへ戻る

5.3.4.3.sevo.pyをBrainAction.pyへ組み込む

Raspberry Piからサーボモータを制御できるようになりましたのでこのプログラムをBrainAction.pyに組み込みます。

 

1)Dialogflowの修正

①Entities/action_selfの追加

動きを制御するEntityとして、腕の各操作のEntityを登録します。

 

②Intents/Action_Selfへのフレーズの追加

Training phrases を追加します。

手の動きの指示は赤枠の部分となります。5.3.2.2.の章で先に登録している場合は、この部分は飛ばしてください。

これでDialogflowの修正が完了しました。

 

2)BrainAction.pyの修正

[BrainAction.py]

Dialogflowの修正に伴い、プログラムの修正を行います。

 
①サーボモータ制御のプログラムを利用できるように、servo.pyのインポート処理を追加します。
 
 
②BrainAction.pyの下記の部分を修正します。
 
【修正前】
 
【修正後】
 
NagoRobo_Main.pyを動かし、「下げてください」「上げてください」「振ってください」などのDialogflowに登録しているフレーズを言って、「了解しました。」とロボットが発声し、サーボモータが動いていることが確認できればOKです。
 
 
 

5.3.4.2.サーボモータを動かす(プログラム作成)

次は、RaspberryPiからサーボモータを操作できるようにプログラムを作成します。

[プログラムの作成]

[servo.py]

プログラム実行し、2つのサーボモータが動けばOKです。(電池を接続してからプログラムを実行します。)

 

前の投稿/次の投稿/メニューページへ戻る

5.3.4.1.サーボモータを動かす(配線/回路作成)

手を動かすためにサーボモーターを使います。

各部品はブレッドボードとジャンパー線を利用して接続します。

 

両手を動かすイメージで2つのサーボモーターを制御します。

用意するものとして

①サーボモータ(SG90) 2個(両腕)

②ブレッドボード

③ジャンパー線 数本

④抵抗 5.1kΩ  2個

⑤サーボモータ用電池(単三) 4本 及び電池ケース(写真無し)

 

1)Raspberry Pi、ブレッドボードにジャンパー線を接続します。

【Raspberry Pi側】

ジャンパー線を下図の通りに接続します。

[ブレッドボード側]

ジャンパー線と抵抗を下図の通りに接続します。

2)各パーツとブレッドボードを接続する

①Raspberry pi

②ブレッドボード

②サーボモータ

④電池

①~④の各パーツをブレッドボードを中心として接続してください。

各パーツを接続するとこのようになります。

前の投稿/次の投稿/メニューページへ戻る