2016年3月31日木曜日

irMagician と GrovePi でIoTリモコン - ハードウェア準備編 -

 今回のがらくたはDexter Industries社の「GrovePi」です。



 現在、販売されているのは「GrovePi+」という新型になっていて、自分の手元には新旧一つずつあるのですが、今回使っているのは古いタイプの「GrovePi」(ATMegaがDIPタイプ)です。



 このGrovePi(+)ですが、手に入れては見たものの、割りとすぎに飽きてしまい、放置されていました・・・。だって、あんまり動きがないので・・・。
 なんでまた、飽きて放置されていたGrovePiを引っ張り出してきたかというと、なんとなく久しぶりに学習リモコンを作ってみようかなと思いついたわけです。以前にArduinoで作ったことはあったんだけどPCにUSB接続して使う形態だったのでPCの電源を切っていると、(例えば)エアコンのスイッチを入れるのにまずPCを起動するっていう・・・リモコン普通に探せばいいじゃんってなってしまう展開でした。まあ、実用的なものを作るつもりはこれっぽっちも無いわけですが、Raspberry Pi 3 発売直前でRSコンポーネントとかでRaspberry Pi 2が値引き販売していたので、つい買ってしまい、なにか使いみちがないかと考えたところ、Raspberry Piなら電源入れっぱなしにして、学習リモコンとかその他IoTハブ的な感じで、家の中なら音声認識や無線LAN経由のタブレット操作で、家の外からもVPNでスマホなどで色々コントロールできると面白いんじゃないかってことで。
 で、使ってないGrovePiに白羽の矢が立ち、はじめはGroveの赤外線リモコンモジュールを使って、lircというLinuxで学習リモコンするときに定番らしいソフトで実現するつもりでしたが、日本のエアコン等の複雑(長い)で独自プロトコルな信号は再現できない場合がある(NEC/家製協/SONYフォーマット等のある程度決められたフォーマットを前提にしているため、独自の信号形式だと上手く行かないことがる)らしく、ネットで学習リモコンについて調べていたところ、大宮技研さんの「irMagician」というのを見つけました。このirMagicianはリモコン信号を時分割したOn/Off信号として記録するため、信号フォーマットによらずに比較的柔軟に色々なリモコン信号に対応できるらしいです。そこで、途中までGrovePiで進めてきたのをirMagicianを採用する方向に変更しました。

 準備したハード構成としては、下写真のような感じです。


 Raspberry Pi のUSBコネクタに、Juliusで音声認識させるための USBマイク と irMagician を接続してあります。irMagicain は Raspberry Pi からは CDC-ACMつまりシリアルポート(ttyACM0等)として認識されます。

 irMagician の本体は、GrovePiのケース(旧タイプのBrickPiのケースを使用しています。)に固定した中華安パン・チルトカメラ台に両面テープで貼り付けて、カメラとともにサーボで方向をコントロールできるようにしました。



 ところが、ここで困ったことが一つ発覚、Groveシリーズ(元のArduino)ではサーボの制御もできるので、GrovePiでも当然できると思っていたのですが、GrovePiのドキュメントを見ると「サーボは対象外、ノイズとか面倒だから」となっていて、GrovePiでのサーボ制御が出来ないことが判明しました。しかたがないので、Raspberry Pi の UART (GPIOのTx,Rx)ポートにレベル変換をかましてGrovePi上にPISER(Pi の UART)端子というのが出ているので、このPISER端子にArduino(Sainsmartの互換機)を接続して、Arduino経由でパン・チルトのサーボを制御するようにしました。


 なんか、強引ですが、とりあえずパン・チルト駆動はできました。Arduino側のサーボコントロールプログラムは、サーボの向きを変える時だけPWM信号を出力して、あとは信号出力を停止しておくようにしました。乗っているものがRaspberry PiカメラモジュールとirMagicianだけなので、常にトルク(制御)を掛けておかなくてもサーボの向きが変わってしまう(重さで下を向くとか)ことは無いので、常にPWMをかけておく無駄と「チーッ」という発信音がサーボからたまに出るのを防ぐことが出来ます。

 irMagician に関しては、とりあえず、部屋の証明のOn/Off と Panasonic のエアコンのOn/Off は動作確認できました。Panasonicのエアコンに関しては、リモコン側に状態を持っている(リモコンの電源OnOffボタンを押すたびに本体とは関係なくリモコン側の画面・ステータスが変わる)ことに今回はじめて気が付きました。たまに、電池切れかけの時などにエアコンが反応していないのにリモコン側はスイッチがOnになったことになっていて、あれっ?て思ったことがあったんですが、今までは全く気が付かない(というか考えていなかった)でいました。たしかに、本体とリモコンが相互通信でもしないかぎり、それぞれに状態を持っていているんだから、それがずれることだってあるでしょうよと、妙に納得しました。

 ちなみに irMagician の使い方については 大宮技研さんのこの辺りの情報とか、netbuffaloさんのこちらとかこちらを参考にさせていただきました。特に、Raspberry Pi 上でリモコン信号をキャプチャ、再生、ファイル保存をするpythonのプログラムをまんま利用させてもらっています。ありがとうございます。

 また、折角なので、追加で PIRモーションセンサも追加しました。


 サーボやirMagic、各Groveセンサはサンプルプログラム等で単体の動作は一通り確認できました。Raspberry Piカメラモジュールもここらへんを参考にmjpg-streamerでブラウザから画像が見れるようになりました。あとはリモコン信号の登録、Julius音声認識の辞書設定、ブラウザ操作のための仕組み構築といったあたりですが、最後のブラウザ操作でGPIOをどんな仕組みでやるか検討中です。GrovePi が pythonのサンプルが豊富なので pythonのtornado でやるか、node.js でやるか(一応GrovePiに node.js用のライブラリも提供されているみたいですが、サンプルが少ないので、どっちの知識も薄い自分的には python のほうがとっつきやすそう。)