赤外線リモコン受信モジュール GP1UXC41QS

gp1uxc41qs.jpg

配線

受信部(半球の突起)を正面に向けて・・・

ピン位置名称意味
Vout出力(Arduinoのデジタルピンへ)
中央GNDGround(ArduinoのGNDへ)
Vcc電源(Arduinoの5Vへ)

プログラミング

リモコンの赤外線を検出したときにLOW, 検出しないときにHIGHが出力される。 リモコンから送信されるデータはパルスの幅とパルス間の間隔で0, 1を表している。 以下にテレビのリモコンで使われるフォーマット の一つであるNECフォーマットのデータを表示するプログラム例を示す。

const int pin = 2;
void setup() {
  pinMode( pin, INPUT );
  Serial.begin( 115200 );
}
unsigned long last, code;
unsigned int custom;
unsigned char data;
void loop() {
  while ( 1 ) {
    while ( digitalRead( pin ) );     // 赤外線パルスを待つ
    last = micros();                  // パルスの時間を計測開始
    while ( !digitalRead( pin ) );    // 赤外線パルスの終了を待つ
    if ( micros() - last > 8400 ) break; 
                                      // パルス幅が8.4msより大きければ、符号の始まり
  }
  last = micros();                    // 次のパルスまでの時間を計測
  while ( digitalRead( pin ) );
  if ( micros() - last < 4200 ) {     // 次のパルスまでの時間が4.2ms未満ならば、「リピート」
    Serial.println( "Repeat" );
  } else {
    code = 0;                         // 符号はcodeに入る
    for ( int i = 0; i < 32; i++ ) {  // 符号は32ビットなので、32回繰り返す
      code >>= 1;                     // 符号は下位ビットが先頭なので、右にシフトしていく
      while ( !digitalRead( pin ) );  // 赤外線パルスの終了を待つ
      last = micros();                // 次のパルスまでの時間を計測
      while ( digitalRead( pin ) );
      if ( micros() - last > 1400 ) code |= 0x80000000;
                                      // 次のパルスまでの時間が1.4msより大きければ"1"なので、符号の最上位ビットを1にする
    }
    custom = code & 0xffff;           // 符号のうち始めの16ビットがカスタマコード
    data = (code >> 16) & 0xff;       // 次の8ビットがデータ
    Serial.println( "custom=" + String( custom, HEX ) + " data=" + String( data, HEX ) );
                                      // カスタマコードとデータを16進数で出力
  }
  while ( !digitalRead( pin ) );
}

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS