アストロボーイへの道        astro1

8.  IRリモコン

 アストロ1号を外部から操作すべく、簡単に手に入る赤外線(IR)リモコンを使うことにした。家のテレビ・リモコンや、エアコンのリモコンは常に使っているので、秋葉原の千石電商で見つけたノーブランドのIRリモコンを使う。

(1)リモコン外観


 図1.リモコン外観


(2)受光モジュール

 当初、リモコンと一緒に添付されていた 中国製のInfrared Receiver Module VS1838Bを使用したが、感度が悪く、使用を断念した。代わりに、Rohm製リモコン受光モジュール RPM6938をAmazonから購入した。受光モジュールのデータシートは こちら 。
  図2のブロック図のように、光センサだけでなく、振幅制御も含まれている優れ物である。
 電源は推奨5V、TTL出力(但し、IoL = 0.4 mA)で2値化された出力が得られる。
 データシート上、受光の許容角度(直線到達距離の80%)は片側約30度と広くはない。但し、これは、10m程度の遠方から時であって、1m以下の近距離の実測結果では、80度近くまで受光可能である。

 I/V変換の後にカップリング・コンデンサが入っており、それ以降はAC増幅になっている。増幅感度は高く上げられるが、外来ノイズは受けやすい。リモ コン出力は38 KHzのキャリア周波数の上に、データが乗っている("1"は1.125ms周期の基本波444Hz成分、"0"は2.25ms周期の基本波888Hz成 分)ので、fo = 38 KHzで復調して、適当なBPFを掛けたあと、検波(方式不明)して、外来ノイズの影響を低減している。


           図2.ブロック図 及び 端子番号


(3)IRリモコンフォーマット

 IRリモコンフォーマットにはNECフォーマットと家電協フォーマットの2方式があるが、今回使用するIRリモコンはNECフォーマットに準拠しているので、以下の説明はNECフォーマットを前提にしている。
 NECフォーマットのビット情報は38 KHz (1/3 duty)のキャリアに乗せられ、Frameと呼ばれるデータ単位毎に送られる。リモコンのボタンを1度押すと、1Frameが送信される。
 フレームのデータフォーマットは図3のようになっている。
 先頭を示すリーダーコードで始まり、メーカ名などを示すカスタムコードが16ビット続き、その後にデータコード8ビットとデータコードの反転データ8ビットが続いて、最後にストップビットが来る。カスタムコード、データコードとも下位のLSBから送られる。
 リーダーコードはHIGHの部分 9.0ms とそれに続くLOWの部分 4.5ms から構成されている。
 カスタムコード、データコードを構成するデータの "0", "1" は図4の通りになっており、ビットの長さ(波形の立ち上がりから次の立ち上がりまでの時間)で、"0"と"1"が区別される。これを、PPM ( Pulse Position Modulation )と呼ぶ。
 図5は、リピートコードで、リモコンのボタンを長押しした時などに発生し、AV機器などで使用される。

Data Format
                図3.データフォーマット



        図4.データ "0", "1"



        図5.リピートコード


(4)Arduinoと受光モジュールの接続


      図6.Arduinoと受光モジュールの接続


(5)実際の受光波形

 IRリモコンで「1」のボタンを押した時の受光モジュール出力信号の1Frame分のオシロスコープ波形を図7に示す。CH1(赤)は受光モ ジュール出力、CH2(黄)はリーダーコード検出タイミングパルスである。なお、受光モジュール出力は、光を受光していない時がHIGH、受光した時がLOWレ ベルになるので、図7と図3は極性が反転した状態になる。
 赤い波形の下に波形から読み取れるデータを青字で追記した。カスタムコードは(DF00)h、データコードは (00)h、データコード反転は (FF)h となっている。


          図7.「1」ボタンを押した時の受光モジュール出力波形


(6)Arduinoプログラム

 Arduinoプログラムのマクロ・フローチャートを、図8に詳細なプログラム・リストを図9に掲げる。

   波形のパルス幅は最短でも560μsあり、Arduino UNOのクロック16MHz(周期:62.5ns)と比べると10の4乗倍の大きさなので、ソフトウェアでデコード可能と判断した。
 波形の極性が変化する時刻を配列に記録して置き、変化点から変化点までの時間を測って、リーダーコードを検出する。

 リーダーコードを検出したら、カスタムコードとデータコードが続くので、同様に波形の極性が変化する時刻を配列に記録して置き図 4のように変化点の一つ置き(信号の立ち上がりから立ち上がり)に1ビットが対応するので、この長さを測り、"1"と"0"の判別を行う。8ビット毎に、 上位ビット、下位ビットの配列の逆転を行って、検出したコードをUSB経由のシリアル転送でPCのモニタ画面に表示する。また、データコードとデータコー ド(反転)を加算し255であることを確認して、読み取りエラーのチェックとする。
 図8のマクロ・フローチャートの中で、リアルタイム処理が必要なのは、time[0]〜time[2]読み込み、リーダコード判定とそれに続くtime[2]〜time[66]読み込みである。
 時間的に一番厳しそうなのが、time[2]からtime[3]の間に、リーダーコード判定とtime[3]読み込みを行う部分であるが、560μsあるので処理可能と判断した。


                                         図8.マクロ・フローチャート



program2
program3

                                                 図9.詳細プログラム・リスト


(7)実験結果

 リモコンの「1」ボタンを押した時のArduino IDEのシリアル通信モニタ画面を図10に示す。図7のオシロスコープ波形から目視で判断した カスタムコード(DF00)h、データコード (00)h、データコード反転 (FF)h と、実験のソフトウェア・デコードの結果が同一になっており、プログラムの妥当性を証明できた。
 また、実験により、リモコンのボタンとデータコードの対応を確認したので、表1にその結果を掲げる。


 図10.Arduino IDE シリアル通信モニタ画面(リモコン「1」押印時)

表1.リモコン・ボタンとデータコードの対応
  ボタン  
データコード(HEX)
データコード (DEC)
1
00
0
2
01
1
3
02
2
4
04
4
5
05
5
6
06
6
7
08
8
8
09
9
9
0A
10
0
0D
13

0C
12

0E
14

11
17

14
20

16
22

19
25
OK
15
21


< Top Page に戻る >