ご注意
改造にはリスクが伴います。また、下記の内容は動作を保証するものではありません。自己責任でお願いします。
この連休に休暇を加え4連休。安曇野の自宅に帰って来たので、前回Arduinoを使って開発したリモコンとのインターフェース部のデバッグを行った。結論から言えば、回路とソフトは一発で動いた。が、ターゲットであるリモコンを解析したところ、ちょっと不思議な設計をしていることが判明し、現物合わせに若干時間を要した。
デバッグ用に作ったプロトコルジェネレーターでしっかりデバッグしておいて大正解であった。これのおかげでArduinoのソフトは現物合わせの部分を除けば無修正であった。
リモコンとのインターフェース用の信号は、結局GNDを除けば6本で済んだ。これで搭載している全ての7Seg-LED及び通常のLEDの状態、電源ボタン、UPボタン、DOWNボタンの制御が出来た。
perlのスクリプトも書いて、MacのVMwareで動かしているUbuntuで実行してみた。本番ではこれがOMAP4を搭載したPandaboardになる。
ArduinoとのインターフェースになるUSBシリアルはUbuntuからは/dev/ttyACM0に見える。既にcpanでシリアル制御、POP3Client、SMTPのモジュールをダウンロードして、取り合えず実験用のコードを書いおいたので動かしてみた。電源投入コマンドをメールで送信すると、パネルヒーターが自動的に操作され、電源が入り、設定温度に循環水の温度が設定され、下記のメールをリプライしてくるようになった。
電源:ON
ボイラー:燃焼中
設定温度/時:45 循環水温度/分:28
室温:31.34℃
現在サポートしているのは、
パネルヒーター(ボイラー)のON/OFF
循環水温度の設定
現在のリモコンパネルの状態表示
のみ。デバッグ用に、パネルヒーターから取得した生データも送るコマンドも搭載している。
ケーブルはホットボンドで固定。
解析したリモコンの回路(実機の配線パターンから追った推測)とボタン操作に関して追加した全体回路。勿論、従来通り、リモコンのボタン操作も可能。
Arduinoに搭載したバニラボードの全体回路図。キー操作部に加え、温度センサーも搭載。
前記事で書いた通り、オシロで解析した結果、当初はリモコン内でのLED等の内部情報のデータの転送レートは500μsec/bitだと考えていた。あの波形を見れば、誰もがそう思うだろう。が、実際は微妙に違っていた。
500μsecでデータをキャプチャーして連続表示すると、値が不定のbitがあった。前半は合っているが、後半が何となく数bit化けていたり。Arduinoで、リモコン側データサンプリングのタイミングを空ピンに出力させオシロで見てみると、前半はタイミングが合っているのだが、途中から徐々にリモコンの内部データが速くなっているのが分かった。化けていた部分は、予想通りエッジ部分で不定の値を取っていた。私のソフトはオシロで見ても500μsecぴったり。どうもこの内部信号、500μsecより微妙に速いのであった。結局調べてみると、正しいサンプリングレートは492μsec。ホスト(ボイラー)と正しく通信は出来ているので、真剣にこの周期なのだろう。
今回の開発では、Arduinoで正確なタイミングを生成するためタイマー割込を使った。割込周期は最速で20μsec。492μsecなんて微妙な周期は作れない。仕方がないので、5bitキャプチャーする毎に40μsecタイミングを速く調整する処理を加えて辻褄を合わせた。これで化けずに完璧に読めるようになった。
思うに、普通に設計すれば、492μsecなんて半端な数字は普通使わないと思う。本当は500μsecで設計したのだが、何かソフトの処理のオーバーヘッドか誤差の関係で、結果的に492μsecなんて数字になったような気がする。通信部分は複雑なプロトコルでもなければ普通一人の担当者が送受信部を一緒に作る場合が多いだろうから、送受信共に同一のアルゴリズムを使ったために、送受信には問題が無かったのだろう、なんて勝手に邪推している。
データがきちんと読めたところで、内部のデータフォーマットも判明した。ほぼ、補足通りのデータフォーマットであった。
データは64bit長。フォーマットは以下の通り。8bit長のデータが8個で構成されている。
0xE3 7SegDIGIT 7SegDIGIT2 7SegDIGIT3 7SegDIGIT4 LED1 LED2 LED3
0xE3マーカー(フレーム識別用?)
7SegDIGIT~7SegDIGIT4各桁毎の7セグメントLEDのエレメントデータ。エレメントは下記のLEDそのまま。bit7は1固定、bit6がG~bit0がAに対応している。
LED1[7] 上記7セグメントLEDのコロン(UC or LC)
LED1[6:0] 不明(未使用?)
LED2[7:5] 不明(未使用?)
LED2[4] LED / おやすみ
LED2[3] 不明(未使用?)
LED2[2] LED / おはよう
LED2[1] LED / 燃焼
LED2[0] LED / 運転
LED3[7] 上記7セグメントLEDのコロン(UC or LC)
LED3[6:0] 不明(未使用?)
これらの解析は実は簡単で、リモコンのボタンを操作しながら点灯するLEDや表示される7セグメントLEDの状態から解析した。欲しかった情報は全て網羅できたのでこれ以上の解析はやめた。
全く何のインターフェースも無いリモコンに、数本の線をつないだだけでHackできたのは結構自己満足。メールを送ると、「ピーッ」と電源が入り、「ピッ、ピッ…」と温度調整がされる様子は我ながら感動的であった。
次の予定。いよいよPandaboardの組込Linux側プラットフォームに着手。基本的にメアドを公開する訳じゃないので、それほどセキュアな仕組みも必要ないかと思うが、万が一のイタズラ等の対策と、停電等の異常系処理を強化して運用に向けてのテストを行う。今度はPandaboardを含め、実際に壁に設置する予定。次は夏休みかなぁ。
いずれにせよ、何とか今年の冬からは運用できる目処が立った。