学習リモコンとは
学習リモコンとは既存のリモコンから送信されるコードを何らかの方法で取得・解析・記憶し、その情報を送信することによってオリジナルのリモコンを模倣するものです。
送信データの取得は赤外線の受光素子を用いるものや、解析済みの情報を外部入力端子などを経由して転送するものがあります。
赤外線の受光素子を用いる場合、受信した光データのプロトコルを解析して記録させるのか、単に光の明滅として記録するのかによって記憶容量や再現できるデータに差が出てきます。
記憶方式による違いの利点と欠点を下に記載します。
今回は汎用性が高く手っ取り早く仕上げられる「光の明滅を記録する方式」を採用しました。 メインで使うリモコンを事前に解析したところ、気にしていたほどパケットサイズが大きくなく、サンプリングレート=キャリア周波数にしても問題が無かったからです。
- プロトコルを解析して記憶する場合
利点 実際に送信されるデータがコードとして取り出せるため、記憶に必要なメモリ容量が少なくて済む。
欠点 認識できないプロトコルのリモコンは記憶することができないので、全く未知のリモコンには使えない場合がある。 - 光の明滅として記憶する場合
利点 点灯パターンを読み取るだけなので全てのリモコンを記憶できる。
欠点 データを送信している時間の長さに応じて記憶するメモリ容量が必要になる。
今回は汎用性が高く手っ取り早く仕上げられる「光の明滅を記録する方式」を採用しました。 メインで使うリモコンを事前に解析したところ、気にしていたほどパケットサイズが大きくなく、サンプリングレート=キャリア周波数にしても問題が無かったからです。
ハードウエア
- 信号の入力は赤外線受光モジュールIRM-3638N3を使用しています。
このモジュールは赤外線通信に使われる38kHzのキャリアを除去してNRZI(負論理)で出力してくれるので、データの処理にとても便利です。
- 信号の出力は555で38kHzのキャリアを生成してLEDを点滅させます。高出力の赤外線LED SID1003BQを16個使い、LEDの取り付け角を調節しておく事で赤外線を全方向へ照射します。
LEDの数が多いので電源も強力なものを用意しないといけません。手元にあったACアダプタは1.6Aだったので、1個のLEDに流せる最大電流は200mAになりました。
- 信号の送受信と時計の処理は余っていたPIC16F873Aを使いました。時刻の表示はhpのバブルディスプレイQDSP-6064を使っています。データの保存メモリには余っていた24LC256を使いました。
ソフトウエア
ソースリスト Ver.0.15
- 赤外線データの解析と保存
赤外線の信号は38kHzで変調されているため、スタート位置さえ同期できればサンプリングレートが38kHzであっても元の信号を再現できるはずです。 点灯・消灯のパルス時間をPICのRAMが一杯になるまでカウントし、RAMの最後から連続して0になっている無送信部分をカットします。 以下は実機で読み込んだデータの一部で意外とばらつきがありますが、ヘッダの状況からAEHA形式だと分かります。
- 赤外線データの送信
データ解析でカウントしたキャリアのパルス時間だけ555を動作させると元のデータが復元できます。 - 時計の処理
時計はCCP1割り込みを使って0.5秒ごとにカウントしていますが、赤外線の送受信の時はキャリアの精度を優先させるため割り込みを停止し、処理が終わった直後に割り込みが発生するようプログラムしています。 常時は時計表示のループを回しておき、CCP1が発生した時に時計のカウントを実行、タイマーを照合してリモコンの送信が発生する場合は割り込みを止めて0.5秒以内に赤外線データを送信します。 リモコンデータの送信中は時計表示のループまでタスクが戻ってこないため、時間表示は消えた状態になります。
製作過程で苦労した点
- 初めはプロトコル解析をさせようと思ったが、面倒になって発光状態解析に変えた。
- 長いデータを持つダイキンのエアコンは記憶させることができない。 解析と同時にEEPROMに書くと良いだろうが、EEPROMの1ページの書き込み時間に5ms必要なので書き込み完了まで待つことができない。 送信時のジッタの原因にもなり、目標のシーリングライトを制御できた事もあったので考えないことにした。
- 基板を立体的に配置させたところ。後の高度計を製作する基礎になった。