2008. 9. 1
更新:2015 .8. 1
IR-CTRLは、赤外線リモコンの通信制御モジュールです。日本で使用されている赤外線リモコンの通信フォーマットの殆どを占めるNEC,AEHA(家製協),SONYの3種類の通信フォーマットに対応してみました。送受信は割り込みで駆動されるので、リアルタイム・システムにも容易にポーティングが可能です。
アプリケーションから呼び出す関数は、次に示す通りです。
/* システム初期化 */
void IR_initialize (void);
/* フレーム送信 */ int IR_transmit ( uint8_t fmt, /* フレーム形式 (NEC,AEHA,SONY) */ const void* data, /* 送信するビット列(バイト配列)へのポインタ */ uint8_t len /* 送信するビット数 */ );
IR_transmit()を呼び出します。関数からはすぐに戻り、バックグランドで送信を行います。戻り値が0以外の場合は送信が開始されています。不正なパラメータや通信がアイドル以外の状態だった場合、戻り値が0になり送信はされません。fmtにNECを指定したときは、lenには0または32を指定します。fmtにAEHAを指定したときは、lenには0または48以上の8の倍数を指定します。fmtにSONYを指定した場合、lenには12,15または20を指定します。lenに0を指定した場合はリピート・フレームが送信されます(NEC/AEHAのみ)。送信が完了すると、ワークエリア内のステータスIrCtrl.statの値がIR_IDLEになります。dataの内容は送信が完了するまで保持されなければなりません。lenが0のときは、dataは意味を持ちません。送信間隔のタイミング制御はアプリケーション側で行います。
受信はバックグランドで行われます。フレームが正しく受信されると、ワークエリア内のステータスIrCtrl.statの値がIR_RECVEDに変わります。IrCtrl.fmtは到着したフレームの種類、IrCtrl.lenはビット数、IrCtrl.rxdata[]は受信したデータのビット列を保持しています。フレームの正当性のチェック(種類、長さ、チェックサム等)はアプリケーション側によって行います。受信フレーム長がIR_MAX_RCVRより大きくても受信はされるので、未知のフレームが最大長で受信されたときは、尻切れになっている可能性があります。フレームを処理したら、IrCtrl.statにIR_IDLEをセットしてバッファを解放し、次の送受信に備えます。なお、送信動作中は受信できません。
対象システムには、
が必要です。コンペア機能とキャプチャ機能が同じカウンタで同時に使える場合はそれ1個でOKです。カウンタの設定は、分解能10μs以上、最大計測時間10ms以上とする必要があります。このため、8ビットカウンタでは十分な精度が得られません。ソースファイルの変更点は、ir_ctrl.h内のマクロで必要な機能を選択し、ir_ctrl.c内のマクロに制御のプラットフォーム依存機能を記述するようになっているので、それらに適切に書き加えるだけでOKです。割り込み処理ルーチン内にはさらに固有の処理を追加する必要があるかも知れません。具体的な例はアーカイブに同梱のサンプル・コード等を参照してください。