前回の実験で赤外線リモコンの受信データが分かったので、今回はリモコンで送信したデータをArduino経由でシリアル通信で送信してみた。
材料
・Arduino pro mini 328 5V
・赤外線リモコン
・赤外線リモコン受信モジュール
回路
ソースコード
//IRリモコンコントローラ #define IR_IN 10 #define IR_DATA_SIZE 100 byte ir_data[IR_DATA_SIZE]; byte ir_code[32]; byte ir_result; void setup() { Serial.begin(9600); pinMode(IR_IN, INPUT_PULLUP); } void loop() { ir_result = ir_read(IR_IN); if (ir_result > 0){ //Serial.println(ir_result,DEC); print_comand(ir_result); } } //データ受信 byte ir_read(byte ir_pin){ unsigned long now, last, start_at; boolean stat; start_at = micros(); //2.5秒以上入力がなかったら終了 while(stat = digitalRead(ir_pin)){ if(micros() - start_at > 2500000) return 0; } digitalWrite(13,HIGH); for(int i = 0; i < IR_DATA_SIZE; i++){ ir_data[i] = 0; } start_at = last = micros(); for(int i = 0; i < IR_DATA_SIZE; i++){ //入力が反転するまで待ち(上限25ms) while(1){ if(stat != digitalRead(ir_pin)) break; //信号終了 if(micros() - last > 25000){ digitalWrite(13,LOW); return ir_get_data(); } } now = micros(); ir_data[i] = (now - last)/100; //byteに格納するあため last = now; stat = !stat; } } //データ解析 byte ir_get_data(){ int j = 0; byte result = 0; //1or0判定 for (int i = 3; i < 66; i+=2){ if(ir_data[i] > 10){ ir_code[j] = 1; }else{ ir_code[j] = 0; } j++; } //データを数値化 for (int i = 0; i < 8; i++){ if(ir_code[i+16] == ir_code[i+24]){ //反転データチェック result = 0; break; }else{ bitWrite(result,i,ir_code[i+16]); } } return result; } //コマンド出力 void print_comand(byte ir){ switch (ir){ case 69: Serial.println("power"); break; case 70: Serial.println("mode"); break; case 71: Serial.println("mute"); break; case 68: Serial.println("play"); break; case 64: Serial.println("back"); break; case 67: Serial.println("forward"); break; case 7: Serial.println("EQ"); break; case 21: Serial.println("-"); break; case 9: Serial.println("+"); break; case 22: Serial.println("0"); break; case 25: Serial.println("repeat"); break; case 13: Serial.println("SD"); break; case 12: Serial.println("1"); break; case 24: Serial.println("2"); break; case 94: Serial.println("3"); break; case 8: Serial.println("4"); break; case 28: Serial.println("5"); break; case 90: Serial.println("6"); break; case 66: Serial.println("7"); break; case 82: Serial.println("8"); break; case 74: Serial.println("9"); break; default: ; } }
動作確認
ArduinoIDEのシリアルモニタで確認すると、無事に”power”や”play”などを受信できていることがわかる。
次に以前作ったArduino7セグスレーブと接続してみた。
回路はこんな感じ。リモコン側のTXと7セグ側のRX接続する。