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






