1. はじめに
Raspberry Pi用OSの最新RaspbianにはNode-REDがバンドルされて、Node-REDでの開発が可能です。
本投稿では、一から構築する場合の手順として、Rasbian OSの導入からNode-REDのバージョンアップ、Watsonノードの追加について手順をまとめました。
Watsonには、
(1)Watson Congnitive
(2)Watson Analytics
(3)Watson IoT
があり、最新RaspbianにはWatson IoTが提供されています。ただし、正常動作しない場合がありましたので、Node-Red,Watson IoTを最新した上で、Watson Cognitiveノードを追加しました。
2. 構成
(1)Raspberry Pi2 Model B
(2)Raspbian OS 2017年1月現在での最新版
(3)無線子機USB接続 Buffalo WLI-UC-GNME
3. Raspbian関連のインストール
インストール方法は、
・「RAWイメージ」
・「NOOBS」
の2つの方法がありますが、今回は「RAWイメージ」でインストールしました。
3-1. 書込みツールのダウンロード
RAWディスクイメージをmicroSDに書き込むツールは、「Win32 Disk Imager」を使用。
ダウンロードサイト:
http://sourceforge.net/projects/win32diskimager/
3-2.Raspbianのダウンロード
ダウンロードサイト:
https://www.raspberrypi.org/downloads/raspbian/
Raspbian Jessie with PIXELダウンロード
ダウンロードファイル「2017-01-11-raspbian-jessie.zip」
3-3.RaspbianをmicroSDへ書込み
書込みに使用するWindowsPC側での操作です。
・microSDをWindowsPCで認識させる。
「Win32 Disk Imager」起動
①ダウンロードファイルを解凍したイメージファイル「2017-01-11-raspbian-jessie.img」
②PCで認識したmicroSDのドライブ
③書き込みます。
microSDカードを抜いて、Raspberry Piに挿入してから起動します。
3-4.Raspbianの基本設定
電源、ディスプレイ、キーボード、マウス、無線子機を接続して、電源ON。
OSの選択。
OS:Rasbian 、言語:日本語、キーボード:JPを選択。
OS起動後、サービスとネットワーク、サウンドの設定を行います。
「Preferances」⇒「Raspberry Pi Configuration」
ここでは、SSH, VNC, Serial, 1-WareをEnableに設定しました。
「OK」
3-5.Raspbianを最新にする
Raspianの最新バージョン(Raspbian Jessie)ではすでにNode-REDとWatson IoTが提供されていますが、一度すべてを更新します。
sudo apt-get -y update ⏎
念のため、パッケージ構成の変更のあとに従ってアップグレードします。
これをしないとNode-RED実行時に正常動作しない場合がありました。
sudo apt-get dist-upgrade
3-6.Raspbianに日本語環境をインストール
日本語を表示・入力できるようにします。
sudo apt-get install jfbterm
sudo apt-get install ibus-anthy
再起動します。
3-7.音声再生用ALSAライブラリをインストール
今回、音声をイヤホンジャック経由で鳴らしたいので、ALSAライブラリーを
インストールします。
sudo apt-get install libasound2-dev
3-7.Raspbianにnpmをインストール
Raspbianにnpmが当然入っていると思ってましたが、入っていないのでインストール。
sudo apt-get install npm
3-8.RaspbianのNode-REDを最新にする
下記コマンドで現在のバージョンを確認。
sudo node -v
現在、V0.10.29 がインストールされていました。
このバージョンではNode-RED起動時やWatson Cognitiveノードを追加する際、エラーになりますのでバージョンアップします。
http://nodered.org/docs/hardware/raspberrypi.html
の”Upgrading”を参照してください。
sudo update-nodejs-and-nodered
Node-REDを起動すると~/.node-redディレクトリーが自動的に作成されます。
ディレクトリーがない場合は、一度Node-REDを起動し自動作成するか、手作業で作成してください。
cd ~/.node-red
Node-REDのノードを再構築します。
sudo npm rebuild
アップグレードマニュアルに記述がありましたので、とりあえず実行します。
sudo npm ls --depth=0
バージョンの確認
sudo node -v
V4.7.2にバージョンアップされました。
3-9.初期状態のノード確認
初期状態でインストールされているノードを確認します。
Node-REDの開始。
cd ~/.node-red
sudo node-red-start
Raspberry Pi のIPアドレスは”192.168.1.12”です。
クライアントPCよりポート番号”1880”を指定し、アクセスします。
http://192.168.1.12:1880/
正常動作が確認できました。尚登録されているノード一覧は下記。
入力、出力に”Watson IoT”ノードがあります。
Node-REDを終了します。
cd ~/.node-red
sudo node-red-stop
4. Watson Cognitiveノードの追加
ノードやフロー情報は下記サイトで確認できます。
http://flows.nodered.org/
Watson関連のノード情報は、
http://flows.nodered.org/node/node-red-node-watson
にあります。
RaspberryのWatsonノードを追加します。
cd ~/.node-red
sudo npm install node-red-node-watson
Node-REDを起動して追加されたノードを確認します。
Watson Cognitive関連のノードが追加されているのが確認できました。
これを使用して簡単なプログラムを作成したいと思います。
5. 簡単なサンプルプログラム
Rasberry PiのCPU温度を取得し、”Text to Speech"で音声ファイルに変換したものを、Rasberry Piのイヤホンで再生する非常に簡単なプログラムです。
5-1. 使用するBluemixサービス
Bluemixの下記2つのサービスを使用します。
・Internet of Things Platform
・Watson Text to Speech
5-1-1. Internet of Things Platformの登録
Bluemixのカタログより、”Internet of Things Platform”を選択。
ここでは、名前:"Raspberry-DevType" 、説明:”My Raspberry Device”としました。⇒「次へ」
ここでは、モデル:"Raspberry Pi 2Model B"としました。⇒「次へ」
ここでは、デバイスID:”RaspberryPi2-001”としました。⇒「次へ」
以上で作成完了。
構成をメモします。
組織 ID :e6vifg
デバイス・タイプ:Raspberry-DevType
デバイス ID :Raspberrypi2-001
認証方式 :token
認証トークン :(7BrB3rp&93E5aW8gi
5-1-2. Watson Text to Speechの登録
Bluemixカタログより、Watson Text to Speechを選択。
ここでは、サービス名:”Text to Speech-el”、資格情報名:”Credentials-1”はシステムでアサインされたのを使用しました。⇒「作成」
「サービス資格情報」⇒「資格情報の表示 」
資格情報をメモします。
{
"url": "https://stream.watsonplatform.net/text-to-speech/api",
"password": "FrFi27YxDMr8",
"username": "1e629837-2c6d-4b0c-8b73-91fa127521db"
}
以上で登録完了です。
5-2. サンプルプログラム
Raspberry PiのCPU温度を取得し、"Text to Speech"で音声ファイルにしたものを、Rasberry Piのイヤホンから音を再生します。
また同時に、Bluemixの"Internet of Things Platform"のダッシュボードにイベントを書き込みます。
5-2-1. timestamp(入力:inject)
5-2-2. CPU温度の入手(その他:exec)
Raspberry Piのコマンド ”vcgencmd" とCPUの温度を取得するパラメータ" measure_temp" を使ってCPU温度を入手します。
vcgencmd
CPU温度以外の情報も色々取得できます。
http://elinux.org/RPI_vcgencmd_usage
5-2-3. 入手したCPU温度の整形(機能:function)
"vcgencmd measure_temp"コマンド実行の結果は、”temp=47.6'C”といったフォーマットで出力されますので、これを数字だけの”47.6”に整形します。
msg.payload = {"d":{"temp":msg.payload.replace("temp=","").replace("'C\n","")}};
return msg;
5-2-4. msg.payload(出力:debug)
5-2-5. イベントを登録(出力:Watson IoT)
Bluemixの"Internet of Things Platform"のダッシュボードにイベントを書き込みます。
「5-1-1. Internet of Things Platformの登録」でメモした構成を登録します。
・組織 ID :e6vifg
・デバイス・タイプ:Raspberry-DevType
・デバイス ID :Raspberrypi2-001
・認証方式 :token
・認証トークン :(7BrB3rp&93E5aW8gi
5-2-6. テキストメッセージ作成(機能:function)
"vcgencmd measure_temp"コマンド実行の結果を数値だけ抜き出し、”現在のラズベリーパイのCPU温度は" " 度です。"といったメッセージを付けて成形します。
msg.payload = "現在のラズベリーパイのCPU温度は" + msg.payload.replace("temp=","").replace("'C\n","") + " 度です。";
return msg;
5-2-7. Text to Speech(IBM_Watson:Text to Speech)
「 5-1-2. Watson Text to Speechの登録」で入手した資格情報を登録します。
・"password": "FrFi27YxDMr8",
・"username": "1e629837-2c6d-4b0c-8b73-91fa127521db"
ここでは、日本語を選択しました。
5-2-8. Speechメッセージの引き渡し(機能:function)
msg.payload = msg.speech;
return msg;
5-2-9. WAVファイル書込み(ストレージ:file)
Rspberry Piの ”/home/pi/temp/speech.wav”に音声ファイルを保存します。
5-2-10. WAVファイル読込み(ストレージ:file)
デバッグ目的で追加しましたが、このノードは必要ないです。(あっても特に問題ない。)
Rspberry Piの ”/home/pi/temp/speech.wav”の音声ファイルを読込ます。
5-2-11. 音声出力(その他:exec)
Raspberry Piのコマンド ”aplay" と音声ファイル” /home/pi/temp/speech.wav"で音声を出力します。
5-3. プログラムの実行
timestampノードの左端(矢印のところ)をクリックすると、プログラムが動き出します。
5-4. Blumixの "Internet of Things Platform" ダッシュボードでの情報確認
6.おわりに
音声が出ない場合、デフォルトではサウンド出力先は自動判別になっていますが、強制的にラインに変更する、下記コマンドを実行してみてください。
amixer cset numid=3 1
また、
https://www.raspberrypi.org/documentation/configuration/audio-config.md
が参考になります。
JSON形式のサンプルプログラムフローを下記に貼り付けます。
「読込み」⇒「クリップボード」からインポートできます。
[{"id":"3342d0f3.3ecb9","type":"inject","z":"9fe2dbf9.ca9c88","name":"","topic":"","payload":"","payloadType":"date","repeat":"10","crontab":"","once":false,"x":105,"y":88,"wires":[["a8a36520.f85e98"]]},{"id":"a8a36520.f85e98","type":"exec","z":"9fe2dbf9.ca9c88","command":"vcgencmd","addpay":false,"append":"measure_temp","useSpawn":"","timer":"","name":"CPU温度の入手","x":297,"y":91.5,"wires":[["ca961fc1.0b5c1","dc56eab7.0559f8"],[],[]]},{"id":"982e136.59a0af","type":"debug","z":"9fe2dbf9.ca9c88","name":"","active":true,"console":"false","complete":"payload","x":858,"y":81.5,"wires":[]},{"id":"ca961fc1.0b5c1","type":"function","z":"9fe2dbf9.ca9c88","name":"入手したCPU温度の整形","func":"msg.payload = {\"d\":{\"temp\":msg.payload.replace(\"temp=\",\"\").replace(\"'C\\n\",\"\")}};\nreturn msg;","outputs":1,"noerr":0,"x":544,"y":81,"wires":[["982e136.59a0af","b008a017.de52a"]]},{"id":"b008a017.de52a","type":"wiotp out","z":"9fe2dbf9.ca9c88","authType":"d","qs":"false","qsDeviceId":"","deviceKey":"da074a04.5d72d8","deviceType":"","deviceId":"","event":"event","format":"json","name":"イベントを登録","x":868,"y":154.5,"wires":[]},{"id":"3601997e.99ad56","type":"watson-text-to-speech","z":"9fe2dbf9.ca9c88","name":"Text to Speech","lang":"ja-JP","langhidden":"ja-JP","voice":"ja-JP_EmiVoice","voicehidden":"en-US_LisaVoice","format":"audio/wav","password":"FrFi27YxDMr8","x":795.5,"y":258.3499755859375,"wires":[["3525b7e5.88ccb8"]]},{"id":"dc56eab7.0559f8","type":"function","z":"9fe2dbf9.ca9c88","name":"テキストメッセージ作成","func":"msg.payload = \"現在のラズベリーパイのCPU温度は\" + msg.payload.replace(\"temp=\",\"\").replace(\"'C\\n\",\"\") + \" 度です。\";\nreturn msg;","outputs":1,"noerr":0,"x":541.5,"y":259.4499816894531,"wires":[["3601997e.99ad56"]]},{"id":"3525b7e5.88ccb8","type":"function","z":"9fe2dbf9.ca9c88","name":"Speechメッセージの引き渡し","func":"msg.payload = msg.speech;\nreturn msg;","outputs":1,"noerr":0,"x":622.5,"y":383.4499816894531,"wires":[["2224815b.a605be"]]},{"id":"d3ee5d85.8bc71","type":"file in","z":"9fe2dbf9.ca9c88","name":"WAVファイル読込み","filename":"/home/pi/temp/speech.wav","format":"","x":834.5,"y":493.75,"wires":[["65a90d38.7c16a4"]]},{"id":"65a90d38.7c16a4","type":"exec","z":"9fe2dbf9.ca9c88","command":"aplay /home/pi/temp/speech.wav","addpay":true,"append":"","useSpawn":"","timer":"","name":"音声出力","x":1085.5,"y":497.54998779296875,"wires":[[],[],[]]},{"id":"2224815b.a605be","type":"file in","z":"9fe2dbf9.ca9c88","name":"WAVファイル書込み","filename":"/home/pi/temp/speech.wav","format":"","x":567.5,"y":495.75,"wires":[["d3ee5d85.8bc71"]]},{"id":"da074a04.5d72d8","type":"wiotp-credentials","z":"","name":"","org":"e6vifg","devType":"Raspberry-DevType","devId":"Raspberrypi2-001"}]