受信部(半球の突起)を正面に向けて・・・
ピン位置 | 名称 | 意味 |
左 | Vout | 出力(Arduinoのデジタルピンへ) |
中央 | GND | Ground(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 ) ); }