このサイトはMacを使って Arduino Uno の動作や活用法を学びます。

14 Arduino 赤外線受信モジュールを接続

この記事では、Arduino に赤外線受信モジュール接続します。

 

使用するモジュールは写真のように、小さな基板に赤外線受信モジュールが組み込まれ、入出力ピン(上から : DATA出力、電源5v、GND)が出ています。

モジュールが赤外線信号を受信すると DATA出力が「0」になる反転出力です。

一般に赤外線信号が出ている期間を「Mark」期間、無信号を「Space」期間と呼んでいるので、赤外線信号が出ている Mark ではモジュール出力は「0」(GRD電位) になります。

このモジュール以外に、赤外線リモコンが必要です。この記事ではKITに付属しているELEGOOのものを使用していますが、家庭で使用しているTVのリモコンも使用できます。ただし、信号フォーマットが特殊な、「SONY」と「三菱」は、プログラムを大幅に変更しないと使用できません、

 

今回赤外線受信モジュールを以下のように接続しました。

赤外線リモコンの波形

リモコンは赤外線をOn/Offして情報を送りますが、その信号フォーマットには種類があります。多くのリモコンは、NECが中心となり設定した赤外線リモコン仕様に準拠しており、 ELEGOOのリコモンもこれに準拠した以下のフォーマット仕様です。


Data部 詳細 (T = 560μs)

 
 
また、ボタンを長押しした場合内は、データ部のない信号が一定間隔で発射されます。
 

 

スケッチ内容

受信モジュールが接続されているピンの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); // リピートは無視する
}
 

動作の確認

スケッチを Arduino に書き込みプログラムがスタートしたら、Arduino IDE 右上の「シリアルモニタ」アイコンをクリックします。
 
 
下のようなシリアルモニタ画面が開き、リモコンのボタンを押すとそれに対応したコードが表示されます。下の例は、「1」「2」「3」「4」「5」ボタンを押した時のものです。
 
 

 

次回は、16x2文字のLCD表示器を接続します。