TVやエアコンをネットワークから制御
家にあるTVやエアコンを、iPod touchや携帯電話からネットワーク経由でリモコン制御する仕掛けを作ってみました。
要は一種のPCに接続できる学習リモコンなのですが、信号の波形をPCに取り込んで解析できるので、リモコンにもともとついていない信号を送ったりする等、単なる学習リモコン以上のことができます。
帰宅前にエアコンをつけておいたり、手元のiPhoneのワンプッシュで複数の機器(TVとAVアンプなど)を一度に連携させて操作できたりします。
赤外線の送受信機はこんなの。PICマイコンで自作したものですが、数年前に作った別機能の基板をむりやり流用したのでとても汚い出来です、が動いてます(ぉぃ。
PC(というかかつて改造したLS-GLですが)とは、シリアル-USBコンバータ経由で接続しています。
受信モードにしてリモコンから信号を送ると、シリアルポート経由で信号の内容(何μs赤外線のON/OFFが続いたかを並べたもの)をPCに送ります。逆に送信モードでPCからそのデータを送りかえせば、赤外線を発信するようになっています。赤外線LEDは複数搭載しているので、一カ所に置いておけばだいたい部屋中に届きます。
PC側はWebサーバが動いていて、CGIとしてリモコン制御用のプログラムを起動するようになっています。ここにiPhoneなどからアクセスして操作します。
Webインターフェースはこんな感じ。インラインフレームの応用でページ遷移なしで送信できます(Ajaxを使うと携帯で動かないので)。
エアコンの場合、リモコン側で過去の設定(設定温度やモード、ON/OFFタイマーの残り時間など)を覚えていて、キーを押すたびに全ての情報を送るので、信号の中身を解析して適切な情報を送るようプログラムを書く必要がありました。その分、タイマーがもともと1,2,3,7時間のみと半端な時間指定しかできなかったところを分単位で設定できるなど、元のリモコンより高機能になっています。
ちなみにエアコンの方の室温表示はPICNICから取得しています。
PICのプログラム
PICのプログラムはアセンブリで組みましたが、とにかくPICはメモリ(というか自由に使えるレジスタ)が200byteくらいと少ない。そのため、TVリモコンくらいなら良いのですが、エアコンのような複雑なリモコン信号だとメモリに乗り切りません。かといってEEPROMは書き込みが遅いし、信号を送るたびに書き換えることになるので寿命がちょっと心配です。
仕方ないので、PICでシリアル通信(57.6Kbps)しながら同時にリモコンで使用されているキャリア周波数である38KHzの信号を出力する仕組みにしています。
通信自体もPCからの入力をある程度はバッファリングしておいたり、PC側の送信が速すぎないよう同期を取ったりと、いろいろ工夫が必要になり、けっこう大変でした。
なにしろ38KHzということは約16μsごとにON/OFFしなければいけません。最近のPCなら何万回もの命令をこなせる時間ですが、PICだとせいぜい30〜40命令程度(しかも極めて単純な処理)しか処理できません。PIC16F88ならUSARTがついてるのでシリアル通信はまだ楽とはいえ、命令数をせっせと削ったり、ON/OFF処理の隙間にシリアル通信処理を埋め込んだりと、それなりに大変でした。38kHzの生成は外付け回路か(基板のスペースが足りないか)PIC16F88内蔵のPWMでやった方が楽だったかも。