2009年05月31日

2009年05月31日:ATtiny13A でリモコン受信

 ATtiny13A 遊びのつづき。赤外線リモコンの受信をやってみた。前回のようないい加減なアルゴリズムではノイズを拾って誤動作が多くなるので、もう少しまじめに考える。今回使っている古い DENON のリモコンは、こんなデータを送っているみたい。

DENON リモコンタイムチャート

 こんなアルゴリズムでいけそう。

  • 15ビットずつデータを読み込む(先にくるのが下位ビットとする)。
  • 下位5ビットが 10000 でなければ破棄する。
  • データが有効なら、5ビット右シフトして下位10ビットをとる。10ビット目(最後に受信したビット)が1なら反転データと判断してビット反転する。
  • 直前の有効データと同じであれば、正常に受信できたと判断する。

 パルスの間隔を測るには、IRリモコン受信素子からの入力の立ち下がりで割り込みをかけて直前の割り込みからの時間を計ればよい。データのフォーマットから見て時間分解能は10マイクロ秒程度は欲しいところだが、一方データの切れ目を正しく認識するためには、秒単位の無信号区間を正しく認識する必要がある。時間を 16 bit 整数で処理したのではオーバーフローしてしまうし、かといって 32 bit 整数を使うとプログラムが大きくなって 1 KBytes の制限を簡単に越えてしまう。タイマオーバーフローの割り込みルーチンを少し工夫しないといけない。

 で、いろいろ試行錯誤の結果、こんなプログラムができた。リモコンのボタンに対応して PWM 出力を変化させるようになっている。コンパイルしたバイナリは 876 bytes だった。1 KBytes なんてすぐいっぱいになっちゃうねえ。まあ、本格的に使おうと思ったらアセンブリ言語で書くことになるんだろうな。

Posted at 2009年05月31日 01:07:59
email.png