Top/Blog/2014-12-06

2014-12-06 の変更点はてなブックマーク


**&tag(Devel);家電を赤外線で操作するR2-D2を作った話 [#i3d7db88f]

どうも、[[きゅーこん>https://twitter.com/cubic9com]]と申します。

~

この記事は、[[おうちハック Advent Calendar 2014>http://qiita.com/advent-calendar/2014/ouch-hack]]の6日目の記事です。

昨日は[[ミクミンP>https://twitter.com/ksasao]]さんの[[「TWE-Lite DIP でおうちモニタリング」>http://qiita.com/ksasao/items/1a221843894fdb57677b]]でした。

低消費電力でワイヤレスなマイコンは、おうちハックと大変相性が良さそうなので、僕もチャレンジしてみたいです。

~

さて、僕の記事はこんな感じです!

~

----

~

#ref(Devel/電子工作/irMagician/赤外線学習リモコンR2-D2/r2d2.jpg,right,around,33.3%)
冬は寒い。

~
外が寒い中を帰ってきて、自宅も寒いとげんなりする。~
帰宅途中にエアコンをオンにできたらいいのに。

~

…そう言えば僕は[[スター・ウォーズ好き>Devel/StarWars]]……そうだ、R2-D2に頼もう!~
ということで、赤外線で色々な家電を操作するR2-D2を作ることに。~

~

今回は、外出先からはスマホのアプリで自宅の家電を操作できるように、~
そして、自宅ではR2-D2に話しかけることでテレビなどの家電を操作できるようにします。(テレビのリモコンってよく行方不明になるよね!)~
そう、いわゆる鬼奴が帰らない感じのやつです!

~
これまで、色々な赤外線学習リモコンを作ってきましたが、いずれも今一歩という感じでしたので、~
今回は非常に便利で安価な小型赤外線モジュール[[irMagician>Devel/電子工作/irMagician]]と、小型コンピュータ[[Raspberry Pi>Devel/電子工作/RaspberryPi]]を使って作ってみることにしました。

~

出来上がったものが、こちらの動画のR2-D2です!

(撮影時期が夏なので、暖房でなく冷房をかけるようになってますw)


#clear
#ref(Devel/電子工作/irMagician/赤外線学習リモコンR2-D2/irmagician.jpg,right,around,33.3%)
#youtube(bldDCwuLSd0)
#clear

~

では、作り方を見ていきましょう。

**必要なもの
***ハードウェア
|項目|説明|h
|[[Raspberry Pi>Devel/電子工作/RaspberryPi]]|名刺サイズの超小型コンピュータ。Linuxなどが動作する。|
|[[irMagician>Devel/電子工作/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(B01CFHHYF4,left)
#amazon(480071172X,left)
#amazon(B007WSKGIE,left)
#amazon(B001A1PR4M,left)
#amazon(B001QS17WA,left)
#amazon(B004AP8QLQ,left)
#amazon(B002OED6UQ,left)
#clear

***ソフトウェア
|項目|説明|h
|[[Julius>http://julius.osdn.jp/]]|大語彙連続音声認識エンジン。音声コマンドを認識するために使用します。|
|&ref(Devel/電子工作/irMagician/赤外線学習リモコンR2-D2/r2d2_20140604.tar.gz,,赤外線学習リモコンR2-D2一式);|私が実装した赤外線送信HTTPサーバと音声コマンド式HTTPクライアントなどのPythonスクリプトです。Raspberry Pi上で動作させます。|
|&ref(Devel/電子工作/irMagician/赤外線学習リモコンR2-D2/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(B00T356SFO)
#amazon(B01CFHHYF4)
[[こちら>Devel/電子工作/RaspberryPi/Raspbianのインストール]]をご覧ください。
#clear

**2.irMagicianのセットアップと動作確認 [#irmagician]
#ref(Devel/電子工作/irMagician/赤外線学習リモコンR2-D2/irmagician.jpg,right,around,33.3%)
+irMagicianをRaspberry PiにmicroUSBケーブルで接続する。
+シリアル接続して動作確認する。(詳細は[[こちら>Devel/電子工作/irMagician]]を参照)
#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,Devel/電子工作/irMagician/赤外線学習リモコンR2-D2/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(Devel/電子工作/irMagician/赤外線学習リモコンR2-D2/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(Devel/電子工作/irMagician/赤外線学習リモコンR2-D2/julius.png,right,around,nothumb,50%)
[[こちら>Devel/電子工作/RaspberryPi/日本語音声認識]]をご覧ください。

**6.Raspberry Piに話しかけると、前述のHTTPサーバにGETリクエストするHTTPクライアントの準備 [#client]
+前述のr2d2.tar.gzから下記のcommand.yomiを取り出す。
#code(,nonumber,nooutline,noicon,Devel/電子工作/irMagician/赤外線学習リモコンR2-D2/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,Devel/電子工作/irMagician/赤外線学習リモコンR2-D2/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に格納してください。


~
~

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

**今後の展望
-毎朝定時に照明とテレビとエアコンが点くようにする。(crontabに仕込むだけ)
-誤認識が多いので、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

~

----

~

僕の記事はここまで。

~


さて、明日の[[おうちハック Advent Calendar 2014>http://qiita.com/advent-calendar/2014/ouch-hack]]の記事は…と紹介しようとしましたが、~
来週一週間のご担当が埋まってません!どなたか記事をお願いします! (^^;


#blognavi(Blog)
差分 一覧