#author("2017-06-09T22:56:08+09:00","default:qua","qua") * 赤外線リモコン受信モジュール GP1UXC41QS [#f8e10ae9] #ref(http://www.ist.aichi-pu.ac.jp/lab/qua/~qua/pbl/img/gp1uxc41qs.jpg,200x150) -[[販売元情報ページ:http://akizukidenshi.com/catalog/g/gI-06487/]] ** 配線 [#d4ba7575] 受信部(半球の突起)を正面に向けて・・・ |ピン位置|名称|意味|h |左|Vout|出力(Arduinoのデジタルピンへ)| |中央|GND|Ground(ArduinoのGNDへ)| |右|Vcc|電源(Arduinoの5Vへ)| ** プログラミング [#q29b1527] リモコンの赤外線を検出したときにLOW, 検出しないときにHIGHが出力される。 リモコンから送信されるデータはパルスの幅とパルス間の間隔で0, 1を表している。 以下にテレビの[[リモコンで使われるフォーマット:http://elm-chan.org/docs/ir_format.html]] の一つであるNECフォーマットのデータを表示するプログラム例を示す。 #author("2019-04-21T23:38:39+09:00","default:qua","qua") 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 & 0xff; // 符号のうち始めの16ビットがカスタマコード data = (code >> 16) & 0xff; // 次の8ビットがデータ Serial.println( "custom=" + String( custom, HEX ) + " data=" + String( data, HEX ) ); // カスタマコードとデータを16進数で出力 } while ( !digitalRead( pin ) ); } ** 簡易版 [#e7c89445] リモコン受信モジュールと上記プログラムを書き込んだ[[ちびコンピュータ ATtiny.]]を組み合わせて簡単にリモコンを受信できるようにしました。読み込んだリモコンのコードをSerial通信で送信します。送信速度は38400bps。 #ref(http://www.ist.aichi-pu.ac.jp/lab/qua/~qua/pbl/img/gp1uxc41qs_attiny.jpg,200x200) 配線は、奥から |ピン位置|名称|意味|h |奥|Vout|出力(Arduinoの0番ピンへ)| |中央|GND|Ground(ArduinoのGNDへ)| |手前|Vcc|電源(Arduinoの5Vへ)| ** 簡易版のプログラミング [#f08ce1f7] リモコンで押されたボタンのコードをシリアルモニタに表示するプログラム例を示します。シリアルモニタの速度を38400bpsにしてください。 void setup(){ Serial.begin( 38400 ); // 38400bps } void loop(){ unsigned char c; while( Serial.available() ){ c = Serial.read(); Serial.println( c, HEX ); } } ** NECフォーマットを採用するいくつかのメーカーのリモコンコード(data)の例(16進数) [#w845d79e] |ボタン|東芝|日立|サンヨー|フナイ|h |1|0x01|0x71|0x10|0x01| |2|0x02|0x72|0x11|0x02| |3|0x03|0x73|0x12|0x03| |4|0x04|0x74|0x13|0x04| |5|0x05|0x75|0x14|0x05| |6|0x06|0x76|0x15|0x06| |7|0x07|0x77|0x16|0x07| |8|0x08|0x78|0x17|0x08| |9|0x09|0x79|0x18|0x09| |10|0x0a|0x70|0x19|0x0a| |11|0x0b|0x7a|0x1a|0x0b| |12|0x0c|0x7b|0x1b|0x0c| |音量+|0x1a|0x12|0x09|0x60| |音量-|0x1e|0x15|0x0a|0x61| |消音|0x10|0x0b|0x0b|0x64| |チャンネル+|0x1b|0x19|0x59|0x50| |チャンネル-|0x1f|0x18|0x5a|0x51| |電源|0x12|0x17|0x00|0x20|