赤外線リモコンの検討(構想編2)

f:id:torusanada98:20210724210430p:plain

構想編2

メーカーサイトに掲載されたサンプルコードを解析します。

受信モジュール

サンプルコード解析前に、受信モジュールの仕様を確認します。図はメーカーサイトに掲載されている回路図です。

f:id:torusanada98:20210724210505p:plain

受信モジュール以外、電源のパスコンのみです。受信モジュールの型式は見つからなかったので、一般的な赤外線受信モジュールの仕様書を確認してみました。図はPL-IRM2126の仕様書の入出力信号図です。

f:id:torusanada98:20210724210526p:plain

この図を見ると赤外線受信時に'L'の仕様となっています。サンプルコードはこの仕様前提で確認を行います。

サンプルコード

秋月電子の販売サイトにメーカーリンクが張られていて、クリックすると本記事のアイキャッチ写真のサイトにジャンプします。そこのサンプルコード欄内にマウスポインタを移動すると枠に右上に「Copy」アイコンが表示され、そこをクリックするとコピペ用バッファにサンプルコードが保存されます。

f:id:torusanada98:20210724210551p:plain

それをテキストエディタにコピペしてサンプルコードを保存しました。

サンプルコード解析

さっそくサンプルコードを確認してみます。ヘッダーファイルは一切なく、defineから始まっています。

f:id:torusanada98:20210724210618p:plain

各定義は、後でソースコードからの参照時に確認します。実行コードの最初はsetupとmain loopです。

f:id:torusanada98:20210724210645p:plain

setupでは、受信Readyを示すLED出力ピンと受信信号ピンの設定を行っています。次はmain loopです。非常にシンプルな構造で、受信Readyを示すLEDの制御とリモコンコード受信関数、受信コード解析関数が並んでいるだけです。続いてリモコンコード受信関数「get_ir_key()」を確認します。

f:id:torusanada98:20210724210713p:plain

最初は受信PINがBIT_START(4000us)以上'H'(消灯)となるのを待ちます。これは、下記フレームフォーマットのLeaderの消灯タイミング待ち処理です。

f:id:torusanada98:20210724210734p:plain

Leaderの消灯期間は約4500usですが、他に4000us以上消灯確定となるコードがないため、確認としては十分と考えられます。次は受信処理関数「read_pluse」で32bit分の消灯パルス長を取り込みます。関数の詳細は後で確認します。続いてパルス長バイナリ変換関数「pluse_to_bits」で32bit分のパルス長をバイナリ変換します。続いてカスタマコードチェック関数「RemoteVerify」でカスタマコードを確認します。最後にバイナリのデータ16bitを10進変換して戻ります。それではそれぞれの関数を確認します。最初は受信処理関数「read_pluse」です。

f:id:torusanada98:20210724210800p:plain

この関数はLeaderの消灯期間直後の32回分の消灯時間を配列「pluse[i]」に格納しています。次はパルス長バイナリ変換関数「pluse_to_bits」です。

f:id:torusanada98:20210724210825p:plain

ここでは配列「pluse[i]」に格納された消灯時間長を0/1判定します。'1'の判定は1500us以上、'0'判定は450us以下です。下記のDatabitフォーマットに従って判定されています。

f:id:torusanada98:20210724210843p:plain

格納先は配列bits[i]です。次はカスタマコードチェック関数「RemoteVerify」です。

f:id:torusanada98:20210724210908p:plain

消灯時間をバイナリ変換した32bitのデータが格納されたbits[i]の先頭の16bitを10進変換してその結果を16128(xx11 1111 0000 0000)とコンペアします。おそらく添付のリモコンのカスタマコードと考えられます。最後にバイナリ10進変換関数「bit_to_int」を確認します。

f:id:torusanada98:20210724210931p:plain

data bitの先頭から16bit分を配列「bits[i]」から読み出して10進変換してresultに格納します。main最後は受信データ判定関数「do_response」です。resultに格納された数値をリモコンに定義された機能と照合します。サンプルコードなのでレスポンスはせずに機能表示のみです。これで一通りサンプルコードの確認ができました。次回はarduino UNOでこのサンプルコードを実行してみます。

 

つづく(構想編3)