#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|


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS