Raspberry Piでエアコンを操作できる赤外線リモコンを作りました。類似の事例はネット上に数多く見つかるのですが、「エアコン以外の機器を操作している」もしくは「Raspberry Pi以外で実現している」ケースしかみつからなかったので、記録に残しておきます。

主に参考にしたのは以下のサイトです。
http://homebrew.jp/show?page=1480
http://www.256byte.com/remocon.htm
http://www.geocities.jp/bokunimowakaru/std-commander.html

最初のサイトは「エアコン以外の機器を操作している」ケースで、この通りにやったところ、実際にテレビや照明などの操作はうまくいきましたので、これを前提に行います。

うちのエアコン(ダイキン製)で試した際に躓いたのは、irrecordで信号を記録させるところです。ちょっと調べた方はすぐにわかると思うのですが、エアコンは送信すべき情報量が多く信号のフォーマットが規格とは若干違うのが原因のようです。

そこで、mode2コマンドで信号のパルス列を調べてみることにしました。mode2の出力は
space 2309756
pulse 465
space 401
pulse 471
space 392
pulse 446
space 438
pulse 451
space 398
pulse 468
space 410
pulse 433
space 25278
pulse 3490
space 1703
pulse 464
space 1264

のような形式です。信号のフォーマットに関しては上記の2番目のサイトがわかりやすかったです。見たところ、点灯している時間がほぼ一定で、消灯している時間に差があるため、NECフォーマットを拡張したもののようです。そこで、こちら https://gist.github.com/fchiba/6204022 のようなプログラムを書いて、でもう少し人間に読みやすいような形式にして、詳しく覗いてみることにしました。


通常のNECフォーマットでは、1つの操作は、

リーダー信号+データ信号+ストップ信号

で成り立ちます。つまり、リモコンで1回ボタンを押してすぐ離すと、これが1回送信されます。しかし、ダイキンのエアコンでは、1回のボタン操作で

1) "bit 0"×6回+ストップ信号
2) リーダー信号+データ信号(64bit)+ストップ信号
3) リーダー信号+データ信号(64bit)+ストップ信号
4) リーダー信号+データ信号(152bit)+ストップ信号

がまとめて送信されます。最初の1)〜3)までは常に一定で、温度や風量などを変更した際には4)の152bitの部分だけが変わるようです。

この152bitのデータ信号の部分を細かく解析していくと、本物のリモコンと同じようなことができそうです。しかし、今回はプリセットでいくつかの定型的な操作さえできればいいので、上記のmode2の結果を編集して、lircd.confにraw形式で貼り付けておしまいにしました(mode2をそのまま再生できる方法があればよかったのですが…)。具体的には https://gist.github.com/fchiba/6204072 の2つ目のremoteセクションのような感じです。

ちなみに、信号の記録の際には、何度か試して正しくパースできるものを選んでいます。ノイズなどがあると、例えばストップ信号が途切れ途切れになったり、bit1が正しく1:3にならず1:2になったりします。こういう場合は、カーテンを閉めテレビなどを消すと、ノイズは減りました。

あと、信号が弱かったため3番目のサイトを参考にコンデンサを挟んでやったところ、実用的な強度で光ってくれるようになりました。