Arduinoで赤外線リモコンとシリアル通信

前回の実験で赤外線リモコンの受信データが分かったので、今回はリモコンで送信したデータを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接続する。
回路2

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です