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

②ブレッドボード

②サーボモータ

④電池

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

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

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

5.3.4.手を作る

ロボットの手となる、基本的な機能を作成します。

ロボットの手にはサーボモータを使います。5.3.2.足を作ると同じように音声で「手を上げる」、「手を下げる」、「手を振る」をできるようにしていきます。

サーボモーターとは、DCモータのように連続的に回転してタイヤなどを動かすモータとは異なり、指定した角度に軸を回転させるモータになります。

例えば、90度の角度で回転させると腕を挙げるような挙動を表現でき、90度と0度に交互に動かすと腕を振っているように見えます。

その角度の指示をRaspberry Piからの信号により制御します。サーボモータの制御信号としてはpwm制御という方式にて実現します。

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

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

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

上記の手順で手を作っていきます。

 

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

 

5.3.2.3.足の部品を組み立てて動かす

前回の章で音声でDCモーターを操作するプログラムが完成しました。今回はDCモーターにギアを取り付けて実際に走らせます。

1)ギアを組み立てる

使用するギアは5.3.2で紹介した「タミヤ ダブルギア」を使います。

※ギア比が1番大きいDタイプを組み立てました。ギア比が大きければスピードは落ちますが、重いものを運ぶことができます

※組み立て方法は説明書で確認してください。

2)RasberryPiやブレッドボードなどを載せる台を作る

※ギアと取り付ける台の作成方法は同じでなくても大丈夫です。(参考までに2枚の段ボール(22㎝×10㎝)と発泡スチロール(10㎝×5㎝)を使用しました。)

 

3)すべての部品を接続して組み立てる

上記まで作成した足となるギアや土台と頭脳となるrasberryPiとブレッドボードを載せての動作テストを行います。(スピーカー、Webカメラ、バッテリー(RaspberryPiの電源)、電池などすべて載せてください。)

全てのパーツを足に載せたら前章でDCモーターを音声で動かした時のようにジャンパー線の接続を行ってください。

前から見ると上記のような形になります。

 

4)動作テスト

では、NagoRobo_Main.pyのプログラムを実行し、発声にてロボットを動かしてみてください。

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

5.3.2.2.motor_drv.pyをBrainAction.pyへ組み込む

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

 

1)Dialogflowの修正

①Entities/action_selfの追加

動きを制御するEntityとして前後/左右のEntityを登録します。

このEntityはIntentに登録した際に利用し、動きを制御するキーワードとしてプログラムで利用することから、取り扱いしやすいように英語表記で登録します。synonymsは日本語を含めて通常通り登録しておきます。

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

~Training phrasesを追加します。

足の動きの指示は赤枠の部分となります。「下げてください」、「上げてください」、「振ってください」は手の動きとなります。手を作るの章でプログラムを作成しますが、先に登録していても問題ありません。

~Response登録します。

正常にフレーズが認識された場合には、「了解しました。」と返すようにします。

 

2)BrainAction.pyの修正

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

①モーター制御のプログラムを利用できるように、motor_drv.pyのインポート処理を追加します。

➁BrainAction.pyの下記の部分を修正します。(仮置きしていたプログラムを今回のDialogflowの登録に合わせて修正しています。)

修正前

修正後

NagoRobo_Main.pyを動かし、「前進」「右」「左」などのDialogflowに登録しているフレーズを言って、「了解しました。」とロボットが発声し、モーターが動いていることが確認できればOKです。

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

5.3.2.1.DCモーターを動かす

足としてタイヤを動かすためにDCモーターを使います。

Raspberry Piから、DCモータを制御するために、モータドライバを経由してDCモータに接続。制御プログラムを実行することでモーターを動かせるようにします。各部品はブレッドボードとジャンパー線を利用して接続します。

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

【Raspberry Pi側】

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

【ブレッドボード側】

ジャンパー線を下図の通りに接続します。P4、P15などのPがついている番号はRaspberry Piのピンの番号(GPIOの番号ではありません)です。

※電池、DCモータ、抵抗をを下記のように表しています。

ブレッドボード上の配線が左右対になるようにモータードライブの差し込みは同じ向きにします。

Raspberry Pi側とブレッドボード側のジャンパー線それぞれに、Raspberry Piのピンの番号や、モーターの左右、電池の+/-をタグ付けしておくと接続が簡単です。

Raspberry Pi側の線とブレッドボード側の線の色は合わせてください。Raspberry Pi側のジャンパー線とブレッドボード側のジャンパー線を接続の際にわかりやすくなります。

ジャンパー線を全て接続するとこのようになります。ちょっと複雑に見えますが、それぞれの配線にタグ貼ることで再接続する時にスムーズに接続できるようにしています。

2)プログラムを作成します

モーターを動かすために必要なライブラリをインストールしてください。

sudo pip3 install wiringpi

[motor_drv.py]

プログラムを実行し、2つのモーターが回ればOKです。

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

5.3.2.足を作る

ロボットの足となる、基本的な機能を作成します。

ロボットの足のはDCモータとタイヤで実現し、そのタイヤを操作するプログラムを作成します。最終的には音声で前進、後退、左、右へ移動できるようにします。

1.DCモーターを動かす

2.motor_drv.pyをBrainAction.pyへ組み込む

3.足の部品を組み立てて動かす

事前に下記の材料を用意してください。

①タイヤ(前輪用)

②後輪

③ギア(タミヤ ダブルギアボックス/DCモーター(FA-130RA-2270) 付)

④乾電池ボックス

⑤単3電池 4本

⑥ジャンパー線

⑦ブレッドボード

⑧セラミックコンデンサー0.1μF50V2.54mm 2個

⑨抵抗  5.1KΩ 2個

⑩バッテリー(5V/2A)

⑪モータードライバ(TA7291P) 2個

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