
昨日に引き続き、引き篭もってますw
暇さえあれば、スクフェスやって、エアガン撃って、ゴロ寝して・・・
完璧に駄目人間ですね!(ぉ
そんな感じのお休みですが、またまたArduinoを使って実験君です。
今日は赤外線リモコンが吐き出すデータをハッキングして見よう。って内容です。

Arduinoのセットに入ってた、赤外線リモコンと赤外線受光モジュール。
参考にしたのは、
こちらのサイトです。
ほぼ、同じ中華製のリモコン(表面が違うだけ?)だと思ったので、そのまま使えるだろうと思って、スケッチをコピペして、回路を接続。
・・・うまく動作しない・・・
どうやら、赤外線受光モジュールの配線を間違ってたらしい。
直してつけて見たけど、まったく反応なし。
・・・どうやら誤配線で壊したらしい・・・orz
さてどうしよう?と思っていたところに、そういえば昔赤外線送受信モジュールを遊びで買った覚えがあったなぁ~とパーツ箱をあさって見る。
・・・あった。
基盤から半田を温めて抜き取る。
そのままだとブレッドボードにうまく刺さらないので、配線を接続。

こんな感じになりました(汗

Fritzingのイラストだとこんな感じ。
=================================================
//IRリモコン解析用
#define BUTTON 9
#define IR_IN 10
#define IR_DATA_SIZE 100
byte ir_data[IR_DATA_SIZE];
byte ir_code[32];
void setup() {
Serial.begin(9600);
pinMode(IR_IN, INPUT_PULLUP);
pinMode(BUTTON, INPUT_PULLUP);
}
void loop() {
if(digitalRead(BUTTON) == 0){
digitalWrite(13,HIGH);
ir_read(IR_IN);
ir_print_1();
ir_print_2();
digitalWrite(13,LOW);
}else{
digitalWrite(13,LOW);
}
}
//データ受信
void ir_read(byte ir_pin){
for(int i = 0; i < IR_DATA_SIZE; i++){
ir_data[i] = 0;
}
unsigned long now, last, start_at;
boolean stat;
start_at = micros();
//2.5秒以上入力がなかったら終了
while(stat = digitalRead(ir_pin)){
if(micros() - start_at > 2500000) return;
}
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) return;
}
now = micros();
ir_data[i] = (now - last)/100; //byteに格納するあため
last = now;
stat = !stat;
}
}
//生データ出力
void ir_print_1(){
for (int i = 0; i < IR_DATA_SIZE; i++){
Serial.print(ir_data[i]);
if(ir_data[i] < 1) break;
Serial.print(",");
}
Serial.println();
}
//解析データ出力
void ir_print_2(){
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]);
}
}
//出力
for(int i = 0; i < 32; i++){
Serial.print(ir_code[i]);
Serial.print(",");
}
Serial.println();
Serial.println(result,DEC);
}
===========================================
ボタンを押すと入力待機(2.5秒)その間赤外線の入力がなければ終了。
赤外線の入力があったら、シリアル通信で出力。
で、出力データの整頓プログラムつきです。

シリアルモニターの出力はこんな感じです。

参考にしたサイトのリモコンと同じデータビットを吐き出してるのがわかりました。
まぁ、同じ中華製なので妥当な結果ですね。
この受信データをプログラムで動的に出力させることが出来れば、リモコンで、モーターを動かしたりする事が出来るようになります。
今回はその足がかりとして、サンプルスケッチの構文解析がメインですね。
データビットの解析が出来るようになったら、リモコンコピー機とか色々作れるようになりますね。
とりあえず、今日の研究結果は以上です。