2014年9月19日金曜日

リモコン送信 AVRマイコン編

赤外線リモコンは30kHz~40kHz程度でduty1/2~1/3くらいの副搬送波にデータを載せて送信しています。リモコン受光部はこの副搬送波でフィルターしたデータを取り出して出力してきますが、フィルターは結構広い周波数を許容してくれます。またdutyはフィルターにはあまり関係無いので今回は発光強度を上げるためにも1/2で発光させるようにしています。
AVRでの赤外線出力は8bit TimerであるTIMER0を38kHzでPWM出力し、これをOnしている期間をHighのデータ期間、Offしている期間をLowの期間として使用します。

今回はFormatAEHA,FormatNEC,FormatSONY,FormatOtherの4パターンをそれぞれの処理ルーチンで実装していますが、基本的な動作はHigh・Lowの切り替えタイミングを順次Timer割り込みで処理していくことでリモコン信号を作っています。

例としてFormatOtherの場合を解説します。
IRSendコマンドを受けるとデータが揃うのを待ってIrOutput::Send()が呼び出されます。
この中でFormatの種類を判別してSendOther()に分岐します。
SendOther()ではHeader部分を解釈し内部シーケンス用の変数を初期化してSendOtherBody()を呼び出します。
SendOtherBody()ではデータ領域を1byteずつ順番に読みだして、ビットパターンとそれ以外のパターンに分けます。
ビットパターンの場合は後続するデータを1bitずつ読みだし値によってPattern0/Pattern1のHigh/Low期間のパターンを送出します。
それ以外のパターンの場合、パターン番号のパターンのHigh/Low期間のパターンを送出します。
これをデータの最後まで繰り返し、1セットのリモコンコードを送ります。

その後、リピート間隔分の時間を置いてリピート回数に応じて同じ処理を繰り返し、最後にコマンドの応答を返して終了します。

前回と同じものですがこれらを実装したHA2moduleのコードはここにあります。


0 件のコメント:

コメントを投稿