2014年9月12日金曜日

リモコン受信 RaspberryPi編

AVRの方のFormatOtherを変更したので、RaspberryPiの方も変更をかけました。
以前はIRRemote.ccの中で処理を完結させていたのですが、赤外線リモコンを受信した後の解釈部分はAVRと共通化しました。
IrAnalyze.cc,IrDataBuffer.cc,IrPatternTable.ccをそのまま持ってきてIRRemote.ccの中でPCM audio I/Fからバッファに赤外線リモコンの生データを読み込んだ後、PulseRecord()の中でAVRのPinChange割込みの処理と等価になるように処理します。
その後はAVRの通常Threadと同じように各フォーマットの解析をしてCodeBufferにリモコンコードを生成しています。
以下詳細。

Record()が記録部分のメイン処理です。
この中のPCMRead()で赤外線リモコンデータを76kHzでPCMAudio I/Fを使ってサンプリングしています。その後、PulseRecord()の中で圧縮処理をしています。
ここまででFormatOtherのデータが生成されている状態になります。
次にFormatAEHA,FormatNEC,FormatSONYのそれぞれの解析をしてみてエラーが出るかどうかを確認しています。どれかでエラーが出なかった場合はそのフォーマット、3つともエラーの場合はFormatOtherとしてファイルに記録して終わります。

PCMRead()の中では、76kHzのサンプリングクロックでPCM Audio Inputのポートに繋いだ赤外線受光部からの信号を記録し32bit毎にデータとして取り込んでいきます。
最初に何らかのデータが来るまで待って、データが来始めたところからサンプリングバッファに記録していきます。このルーチンの中では取り敢えずサンプリングバッファが一杯になるまで記録して戻ります。

PulseRecord()の中ではPCMRead()で記録したサンプリングデータの中の有効な部分をまず切り出します。
データの変化のある最初の部分から連続して100ms以上データがない状態になるまでの期間を有効なデータとしています。
その後、有効な区間を解析していきます。
有効期間を先頭から順番にデータの変化点の区間をHigh,LowのペアのデータとしてSearchPatternTable()、CalcAverage()で (AVRと共通なIrPatternTable.ccのルーチン)PatternTableに登録していきます。
パターンが全て登録し終わると最後のHigh区間のデータを登録しMakePatternConvTable()を呼び出し、登録されているパターンの上位2つのデータを0/1として選び、それ以外のデータを登録順に登録したパターンテーブルを作成します。

その後、再度有効な部分を順番に解析していきます。
データ区間のHigh/Low期間をパターンテーブルから検索し、0/1の場合はビットパターンとして記録、2番目以降の場合はそれ以外のパターンとしてパターン番号を記録していきます。
最後にCodeBufferの先頭部分にデータ長やフォーマットコード、データサイズ、パターンテーブルサイズを記録して戻ります。

以上がRaspberryPiでの赤外線リモコンの記録シーケンスになります。
これらのコードはここにあります。

0 件のコメント:

コメントを投稿