14 Arduino 赤外線受信モジュールを接続
この記事では、Arduino に赤外線受信モジュール接続します。
使用するモジュールは写真のように、小さな基板に赤外線受信モジュールが組み込まれ、入出力ピン(上から : DATA出力、電源5v、GND)が出ています。
モジュールが赤外線信号を受信すると DATA出力が「0」になる反転出力です。
一般に赤外線信号が出ている期間を「Mark」期間、無信号を「Space」期間と呼んでいるので、赤外線信号が出ている Mark ではモジュール出力は「0」(GRD電位) になります。
このモジュール以外に、赤外線リモコンが必要です。この記事ではKITに付属しているELEGOOのものを使用していますが、家庭で使用しているTVのリモコンも使用できます。ただし、信号フォーマットが特殊な、「SONY」と「三菱」は、プログラムを大幅に変更しないと使用できません、
![](images/ap14_1.png)
今回赤外線受信モジュールを以下のように接続しました。
- GND - GND
- +5V - 5v
- DATA - pin 11(デジタル入力)
![](images/ap14_2.png)
赤外線リモコンの波形
リモコンは赤外線をOn/Offして情報を送りますが、その信号フォーマットには種類があります。多くのリモコンは、NECが中心となり設定した赤外線リモコン仕様に準拠しており、 ELEGOOのリコモンもこれに準拠した以下のフォーマット仕様です。
- キャリア : 赤外線(λp = 940nm)サブキャリア 38kHz
- Leader 部 : Mark 9mSec Space 4.5mSec
- Data 部 : 固定長フレーム 4 bytes (32bit)
偶数バイトは奇数バイトの反転 - Stop bit : Mark 1T
Data部 詳細 (T = 560μs)
- Data の '1' : Mark 1T + Space 3T
- Data の '0' : Mark 1T + Space 1T
![](images/ap14_3.png)
![](images/ap14_4.png)
スケッチ内容
受信モジュールが接続されているピンのHIGHパルスを常に監視しています。pulseIn関数を利用し、入力がHIGHに変わると同時に時間の計測を始め、LOWに戻ったら、そこまでの時間(つまりパルスの長さ)を us単位で計測します。
900usを超えていればその bit は「1」として処理します。
ストップビット直後は長い Spaceとなるためにタイムアウトが発生し、その時点でデータ読み取りを中止します。
受信データは、32ビットまでであれば全てが表示されますが、それ以上のデータを受信すると、はじめに受信した情報から失われ最後の32ビットが表示されます。
また、リピート信号は、表示されません。
// 赤外線受信モジュール // 2021-6-7 int irRxPin = 11; // 赤外線受信モジュールの接続ピン void setup() { pinMode(irRxPin, INPUT); // 接続ピンを入力 Serial.begin(9600); // シリアル通信設定 } void loop() { unsigned long pulseLen; unsigned long data = 0; // 受信データの保管場所 int num; // 信号の始まりを待つ while( digitalRead(irRxPin) ); // リーダー部を空読み pulseIn(irRxPin, HIGH, 30000); // データビットの読み込み for( num=0; num<64; num++ ) { // スペース部のパルス幅測定 pulseLen = pulseIn(irRxPin, HIGH, 20000); // タイムアウトで測定中断する if(pulseLen == 0) break; // 900usを超えたら「1」とする data <<= 1; if(pulseLen > 900)data += 1; } if(num){ // データが有効ならシリアル送信 Serial.println( data, HEX ); } delay(500); // リピートは無視する }
動作の確認
![](images/ap14_5.jpg)
![](images/ap14_6.jpg)
次回は、16x2文字のLCD表示器を接続します。