Top/Devel/電子工作/irMagician/赤外線学習リモコンR2-D2

赤外線学習リモコンR2-D2 の変更点はてなブックマーク


#ref(r2d2.jpg,right,around,33.3%)
夏は暑い。

~
外が暑い中を帰ってきて、自宅も暑いとうんざりする。~
帰宅途中にエアコンをオンにできたらいいのに。~
…そうだ!R2-D2に頼もう!~
ということで、赤外線で色々な機器を操作するR2-D2を作ることに。~

~

今回は、外出先からはスマホのアプリで自宅の家電を操作できるように、~
自宅ではR2-D2に話しかけることで家電を操作できるようにします。

~

いわゆるホームオートメーションシステム、あるいはホームコントローラーと呼ばれるような仕組みです。~
最近で言えば、鬼奴が帰らないことで有名なやつですね。

~
これまで、下記のように色々な赤外線学習リモコンを作ってきましたが、いずれも今一歩という感じでしたので、~
今回は非常に便利で安価な小型赤外線モジュール[[irMagician>../]]と小型コンピュータ[[Raspberry Pi>Devel/電子工作/RaspberryPi]]を使って作ってみることにしました。
-[[Devel/電子工作/トラ技付録78K0 USBマイコン基板/赤外線学習リモコンR2-D2]]
-[[Devel/電子工作/Arduino/赤外線学習リモコンR2-D2]]
-[[Devel/電子工作/RaspberryPi/赤外線学習リモコン]]
-[[Devel/電子工作/RaspberryPi/ホームオートメーションシステム]]

#clear
#ref(irmagician.jpg,right,around,33.3%)
#youtube(bldDCwuLSd0)

#vine(enbvmiTj53Q)

#clear

-関連~
[[Devel/電子工作/赤外線でONOFFできるUSBコネクタ]]

*必要なもの
**ハードウェア
|項目|説明|h
|[[Raspberry Pi>Devel/電子工作/RaspberryPi]]|名刺サイズの超小型コンピュータ。Linuxなどが動作する。|
|[[irMagician>../]]|Windows、Mac OS X、Linux、Androidなどで使える小型赤外線リモコンアダプタ。|
|microUSBケーブル|Raspberry PiとirMagicianを接続するため。&br;今回は[[TIMELY 好きな位置に固定できるフレキシブル型USB2.0ケーブル 60cm TM-microUSB-F>http://www.amazon.co.jp/exec/obidos/ASIN/B00G4TS55S/cubic9com-22]]を使用しました。|
|USBマイク|音声コマンドで操作できるようにするため。&br;今回は[[PLANEX USBオーディオ変換アダプタ PL-US35AP>http://www.amazon.co.jp/exec/obidos/ASIN/B001A1PR4M/cubic9com-22]]と[[SANWA SUPPLY フラット型PCマイク MM-MC23>http://www.amazon.co.jp/exec/obidos/ASIN/B007WSKGIE/cubic9com-22]]を組み合わせました。&br;なるべく無指向性を選んだ方がよいかと思います。|
|セルフパワーUSBハブ|Raspberry Piの電源は弱いので、USB機器の安定動作のために使用。今回は[[iBUFFALO USB2.0ハブ BSH4A01BK>http://www.amazon.co.jp/exec/obidos/ASIN/B001QS17WA/cubic9com-22]]を使いました。|
|WiFiドングル|Raspberry Piの通信は有線LANなので、WiFiドングルがあると配線が一本減って便利。今回は[[PLANEX GW-USNano2>http://www.amazon.co.jp/exec/obidos/ASIN/B004AP8QLQ/cubic9com-22]]を使いました。|
|[[Star Wars Bank R2-D2>http://www.amazon.co.jp/exec/obidos/ASIN/B002OED6UQ/cubic9com-22]]|上記を格納するケースとして使用。|
#amazon(B00CBWMXVE,left)
#amazon(B00G4TS55S,left)
#amazon(B007WSKGIE,left)
#amazon(B001A1PR4M,left)
#amazon(B001QS17WA,left)
#amazon(B004AP8QLQ,left)
#amazon(B002OED6UQ,left)
#clear

**ソフトウェア
|項目|説明|h
|[[Julius>http://julius.osdn.jp/]]|大語彙連続音声認識エンジン。音声コマンドを認識するために使用します。|
|&ref(r2d2_20140604.tar.gz,,赤外線学習リモコンR2-D2一式);|私が実装した赤外線送信HTTPサーバと音声コマンド式HTTPクライアントなどのPythonスクリプトです。Raspberry Pi上で動作させます。|
|&ref(SampleAndroidApp_20140604.zip,,HTTPクライアントアプリ for Androidソースコード);|上記赤外線送信サーバ用のHTTPクライアントアプリのソースコードです。Androidスマホ上で動作します。|


*手順
次の手順で進めます。
+[[Raspberry PiへのOSのインストールやWiFiドングルのセットアップなどの初期設定>#raspi]]
+[[irMagicianのセットアップと動作確認>#irmagician]]
+[[Raspberry PiにGETリクエストすると赤外線信号が送信されるようなHTTPサーバの準備 >#server]]
+[[前述のHTTPサーバにGETリクエストするHTTPクライアントアプリ for Androidの準備>#android]]
+[[日本語音声認識環境の準備>#julius]]
+[[Raspberry Piに話しかけると、前述のHTTPサーバにGETリクエストするHTTPクライアントの準備>#client]]
+[[Star Wars Bank R2-D2へのハードウェアの格納>#r2d2]]

**1.Raspberry PiへのOSのインストールやWiFiドングルのセットアップなどの初期設定 [#raspi]
#amazon(B00CBWMXVE)
[[こちら>Devel/電子工作/RaspberryPi/Raspbianのインストール]]をご覧ください。
#clear

**2.irMagicianのセットアップと動作確認 [#irmagician]
#ref(irmagician.jpg,right,around,33.3%)
+irMagicianをRaspberry PiにmicroUSBケーブルで接続する。
+シリアル接続して動作確認する。(詳細は[[こちら>../]]を参照)
#clear

**3.Raspberry PiにGETリクエストすると赤外線信号が送信されるようなHTTPサーバの準備 [#server]
http://【Raspberry PiのIPアドレス】/【予め赤外線信号を記録したファイル】 にGETリクエストを送ると、任意の赤外線信号を送信できるようにします。
+Raspberry PiにirMagicianを接続します。
+あらかじめ次のようにしてpySerialをインストールしておきます。
 sudo aptitude install python-serial
+irMagicianの公式ページの[[「取得したデータの保存 (Save)」Pythonスクリプト>http://www.omiya-giken.com/?page_id=1231]]で赤外線信号をJSON形式でファイルに保存します。~
(下記ではexample.jsonに保存したとして説明します)
+前述のr2d2.tar.gzから下記のPythonスクリプトを取り出す。
#code(python,nonumber,nooutline,noicon,irMagicianHTTPServer.py)
+irMagicianHTTPServer.pyを実行する。
+ウェブブラウザからJSON形式の赤外線信号ファイルを次のようにリクエストすると赤外線信号が送信されるかどうかを確認する。~
("192.168.0.100"はRaspberry PiのプライベートIPアドレスに読み替えてください。また、"example.json"部分は前述のJSONファイルです。)
 http://192.168.0.100:8000/example.json
+irMagicianHTTPServer.pyを停止する。

~
ポート番号は適宜変えたほうがよいでしょう。

**4.前述のHTTPサーバにGETリクエストするHTTPクライアントアプリ for Androidの準備 [#android]
#ref(r2d2athome.png,right,around,20%)
+Raspberry Piの上記HTTPサーバが使っているポートのみを外部に公開する。~
(NECのルータの場合は「ポートマッピング」、バッファローの場合は「アドレス変換」などと呼ばれています。)
+ウェブブラウザからJSON形式の赤外線信号ファイルを次のようにリクエストすると赤外線信号が送信されるかどうかを確認する。~
("172.16.0.1"はRaspberry PiのパブリックIPアドレスに読み替えてください。また、"example.json"部分は前述のJSONファイルです。)
 http://172.16.0.1:8000/example.json
+前述のSampleAndroidApp.zipを解凍する。
+res\xml\pref.xmlのIPアドレスを自宅のRaspberry PiのパブリックIPアドレスに書き換える。~
(これがデフォルトのIPアドレスになります。)
+src\com\cubic9\android\r2d2athome\Main.javaのSSIDを自宅のWiFiのSSIDに書き換える。
+src\com\cubic9\android\r2d2athome\Main.javaのHOME_IPを自宅のRaspberry PiのプライベートIPアドレスに書き換える。~
(一部のルータではLAN側からルータにアクセスすると、ポートマッピングが働かないため、前述のSSIDで接続しているときは、こちらで設定したIPアドレスを使用するようにしています。)
+apkをexportする。
+Androidスマホにインストールする。~
(Playストアには公開せず、ファイル転送してインストールしましょう。[[AirDroid>https://play.google.com/store/apps/details?hl=ja&id=com.sand.airdroid]]を使うと便利です。)
+アプリを起動する。
+IPアドレスの設定をする。~
(上記pref.xmlで設定したIPアドレスを上書きする形になります。)
+アプリのボタンを押すと赤外線信号が送信されるかどうかを確認する。

**5.日本語音声認識環境の準備 [#julius]
#ref(julius.png,right,around,nothumb,50%)
[[こちら>Devel/電子工作/RaspberryPi/日本語音声認識]]をご覧ください。

**6.Raspberry Piに話しかけると、前述のHTTPサーバにGETリクエストするHTTPクライアントの準備 [#client]
+前述のr2d2.tar.gzから下記のcommand.yomiを取り出す。
#code(,nonumber,nooutline,noicon,command.yomi)
+ご家庭の環境に合わせて適宜カスタマイズする。
+yomi2voca.plでcommand.dicに変換する。(詳細は[[こちら>Devel/電子工作/RaspberryPi/日本語音声認識]]を参照)
+前述のr2d2.tar.gzからhomeautomation.jconfを取り出す。
+command.dicとhomeautomation.jconfをJuliusの実行ディレクトリに移動する。
+前述のr2d2.tar.gzから下記のPythonスクリプトを取り出す。
#code(python,nonumber,nooutline,noicon,HomeAutomationWithVoiceCommand.py)
+ご家庭の機器環境に合わせて適宜カスタマイズする。~
(command.dicの単語とJSONファイルを対応付けるようにします)
+前述のr2d2.tar.gzからstart_ha.shとstop_ha.shを取り出す。
+screenコマンドを実行する。
+start_ha.shを実行し、Julius、HTTPサーバ、HTTPクライアントの順で起動する。
+command.yomiで登録した単語を発し、irMagicianの緑LEDが点灯し、機器側が反応することを確認する。
+Ctrl+a dでscreenをデタッチする。

~
上記ではscreenで起動しデタッチすることでログアウト後も実行され続けるようにしていますが、安定動作するようになったらstart_ha.shをinsservできるような起動スクリプトにするとよいかもしれません。

**7.Star Wars Bank R2-D2へのハードウェアの格納 [#r2d2]
#amazon(B002OED6UQ)
上記ハードウェアをお好みでStar Wars Bank R2-D2に格納してください。


**8.電飾で飾り付ける。
下記を参照のこと。

[[Devel/電子工作/RaspberryPi/マイコン内蔵LED]]

~
~

以上で完成です!!おつかれさまでした :)
#clear

*今後の展望
-誤認識が多いので、Juliusのモジュールモードで表示される単語信頼度(CM)があるしきい値に達さない限り赤外線を送信しないようにする。
-R2-D2にLEDなどの電飾をつける。
-R2-D2の頭の部分が回転するようにする。
-R2-D2にプロジェクタを内蔵する。

*Tips
**機器が部屋のいろいろな所に散らばっていて赤外線が届かない
#rakuten(http://hb.afl.rakuten.co.jp/hgc/12a26f27.ade62820.12a26f28.3e7f65ba/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fdonya%2f67404%2f%3fscid%3daf_link_tbl&m=http%3a%2f%2fm.rakuten.co.jp%2fdonya%2fi%2f10923665%2f,http://hbb.afl.rakuten.co.jp/hgb/?pc=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fdonya%2fcabinet%2fitem13%2f67404-0.jpg%3f_ex%3d128x128&m=http%3a%2f%2fthumbnail.image.rakuten.co.jp%2f%400_mall%2fdonya%2fcabinet%2fitem13%2f67404-0.jpg%3f_ex%3d80x80,right,赤外線リモコンベンダー)
[[上海問屋の赤外線リモコンベンダーDN-IRB530>http://hb.afl.rakuten.co.jp/hgc/12a26f27.ade62820.12a26f28.3e7f65ba/?pc=http%3a%2f%2fitem.rakuten.co.jp%2fdonya%2f67404%2f%3fscid%3daf_link_tbl&m=http%3a%2f%2fm.rakuten.co.jp%2fdonya%2fi%2f10923665%2f]]などの赤外線リモコン信号中継器を買うとよいかもしれません。
#clear

**普通の電気プラグがある機器のコンセントも操作したい
#amazon(B0013L6ACM)
[[オーム電気 リモコンコンセントOCR-05 07-0155>http://www.amazon.co.jp/exec/obidos/ASIN/B0013L6ACM/cubic9com-2]]を買うとよいかもしれません。
#clear

**電灯も操作したい
#amazon(B0013L6ACC)
[[オーム電気 天井照明器具専用 リモコンスイッチOCR-04 07-0154>http://www.amazon.co.jp/exec/obidos/ASIN/B0013L6ACC/cubic9com-22]]を買うとよいかもしれません。
#clear


**そもそもRaspberry Piとか持ってないんだけど…
#amazon(B00H91KK26)

そんなあなたのために既製品が色々あります。
-[[BroadLink eRemote-3 RM-Pro>http://www.amazon.co.jp/exec/obidos/ASIN/B00NTLOKO4/cubic9com-22]]
-[[ラトックシステム REX-BTIREX1>http://www.amazon.co.jp/exec/obidos/ASIN/B00LAKEIN4/cubic9com-22]]
-[[IRKit>http://www.amazon.co.jp/exec/obidos/ASIN/B00H91KK26/cubic9com-22]]
-[[rti技研 Future Home Controller>http://rti-giken.jp/]] : 声でも操作できます。

*コメント等ありましたらどうぞ :)
#pcomment(,10,reply)

*参考
-[[KURO-RSとJuliusで家電をコントロールしてみた : アシアルブログ>http://blog.asial.co.jp/879]]
-[[20.19. SimpleHTTPServer ― 簡潔な HTTP リクエストハンドラ ― Python 2.7ja1 documentation>http://docs.python.jp/2/library/simplehttpserver.html]]

*関連
-[[Devel/電子工作/トラ技付録78K0 USBマイコン基板/赤外線学習リモコンR2-D2]]
-[[Devel/電子工作/Arduino/赤外線学習リモコンR2-D2]]
-[[Devel/電子工作/RaspberryPi/赤外線学習リモコン]]
-[[Devel/電子工作/RaspberryPi/ホームオートメーションシステム]]

*Amazon
#amazon(487311537X,left)
#amazon(B00E9LM8LK,left)
#amazon(B00AXVHQLC,left)
差分 一覧