2016-11-23 21:10 | カテゴリ:PIC応用回路
手持ちにあった、ミニコンポ(AIWA)の赤外線リモコンの信号を解析して、模型に応用すべく、プログラムを製作してみました。
ブロ友の6jiroさんがご紹介くださったプログラムがAVR用だったので、PICでできないかと思いついたのですが、、、、
思わぬところで、はまりまくってしまいました。(この辺は後日顛末記でご紹介します)(笑)

1AIWA.jpg


このリモコンは、調べてみると、42ビットのデータフォーマットをして、通信のタイプは、PWM方式との事でした。
まずは、実際の信号を調べることから始めました。

続きはこちらから、、、、



「実波形の調査」

実際に赤外線の信号パターンがどの様になっているかを調べないことには、プログラミングできません。
WEBで見てみると、NEC方式とか、家電協会ほうしきとか、SONY方式とかあるようですが、千差万別なフォーマットがあるようです。
全てのフォーマットを自動判別して解読できるようにするのは、いささか荷が重いので、とりあえず、このAIWAのリモコンを片付けたいとおもいます。(6jiroさん、ご期待に沿えず申し訳ありません)(笑)

ここで、活躍するのが、先日導入したロジックアナライザです。
赤外線ICの出力信号を確認するだけなら、PICは不要ですので、ブレッドボードに赤外線受信モジュールと電源をセットとして、その出力をロジアナに入れて波形を見てみました。

(2IR信号波形例)
2IR信号波形例

波形は、PWM方式です。
赤外線センサーからの出力は反転されていますので、通常はH、信号があるとLになります。
信号の前に、リーダー部分の波形があり、取り込みの目印になります。

(3PWM波形)
3PWM波形


山の幅が小さいところが、「0」、大きいところが「1」として、42ビット分を読み取ってみました。
ゼロのパルスは、おおむね600マイクロ秒程度の負と正のパルス。
1のパルスは同じく600マイクロ秒の負パルスと1600マイクロ秒程度の正パルスです。
この例は、リモコンのPOWERボタンを押した際の波形です。


「信号取り込みの方法の検討」


PWM方式なので、各波形の波長を計測して、「リーダー」、「0」、「1」を判定し、それをビットデータとして、配列の変数に書き込んでいけば良さそうです。
シリアル通信のような、決まった波長で、山がある、なしで、信号を表していれば、スターとビットから定期的にチェックして、「0」、「1」を判断すればよいのですが、波長を計測となると、外部割込みを使用して、その割り込み間隔の時間をタイマーでカウントして、その長い、短いで判断します。

具体的には、外部割込みをRB0ピンに設定し、赤外線センサーの出力をRB0に繋ぎます。
赤外線センサーは、常時Hで、信号がある際に、Lになりますので、割込みは「立下り」で設定します。

割込みルーチンですることは、
割込みが入ると、TMR1のカウントを読み込んで、「リーダー」の長さに該当するカウント(プラスマイナス15%を範囲として設定しました)なら、リーダーと判断し、次のパルスから信号として順次取り込みます。
該当しない場合は、再度、TMR1をリセットして、次の割り込みが「リーダー」かをチェックします。

実際のプログラムは、この様にしました。

(4プログラムリーダー判定)
4プログラムリーダー判定

「リーダー」を確認した後は、読み込んだTMR1の値から、「0」か「1」かを判定し、6バイト(48ビット)の配列に1ビットずつ取り込んでいきます。

(5プログラム取り込み)
5プログラム取り込み


全ビット42ビットを取り込んだところで、受信信号がそろいました。
実際の取り込んだ信号の例です。

この42ビットの信号のうち、メーカー指定ビットなどは、リモコン操作では変化しません。
調べてみると、4バイト目と5バイト目の16ビットで、キーの割り当ては十分なようです。

これらの16ビットのデータを調べてみました。

(6信号のデータ例)
6信号のデータ例


これは、取り込んだ赤外線のデータを外部に表示する手立てがなかったので、RS232の信号として、PICのTX端子から出力させて、ロジアナの解析機能で数値化したものです。
各ボタンを押した際のデータの例です。

  (信号バイト番号) 1  2  3  4  5  6

  POWERボタン 76 04 4F C0 3F 03
  1のボタン 76 04 4F E0 1F 03
  2のボタン 76 04 4F D0 2F 03
  再生のボタン 76 04 4F C0 BF 01




「取り込んだ信号の判定」

これをリモコンのボタンの数だけ確認して、各データをプラグラムの配列(EEPROMに設定)に定義しておきます。

(7プログラムEEPROM定義)
7プログラムEEPROM

実際に取り込んだデータの16ビットと、登録してあるキーの信号パターンを比較すれば、どのキーが押されたか判定できます。

(8コマンド判定)
8コマンド判定


コマンドのコード比較は、必要最小限のデータが16ビットなので、整数型の変数の配列に入れて、順次比較して目的のコードを選択するようにしました。
コードの数が20個程度ですから、最初からの順次比較で問題ないと思います。
これが何十や何百もあれば、バイナリーサーチを使わないと時間がかかってしまうでしょうが。

今回のデモプログラムの全体です。
テキストファイルにしていますので、Cメインファイルにコピペしてください。
(プログラム全体)
プログラム全体


「実際の動作状況」

というわけで、紆余曲折ありましたが、リモコンのボタンに対応した、二進数の表示をLEDで確認できるところまで来ました。
ビデオに録りましたので、ご笑覧ください。








【ジャンル】:趣味・実用 【テーマ】:電子工作
コメント(4)

管理者のみに表示する