へのへのもへじ工作室
02 | 2013/03 | 04
S M T W T F S
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -

スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

リモコン解析スケッチ
先日投稿したリモコン通信ですが、見た目を少し直しました。こちらでの公開はちょっと場違い、処理がわかりにくいかもしれませんが、お役に立てることもあろうかということで,,,

いくつか仕組みの説明です。リモコンからの受信ですが、arduinoの時間を読み出せるタイマー(時計)を使います。まずは、データを受け取ったときのパルスの時間を記録して、すべて受信したら1,0のデータを判別します。

赤外線ユニットは、秋月(秋葉原)などで販売されているものを利用、接続も説明書を参考にします。arduinoではD0(受信データ)を使うことを前提としていますが他の端子でもかまいません。

ledは動作確認用で、先日の基板についていたLEDを点灯させています。こちらも変更してもとってしまっても問題なしです。

trainoへの再送信はarduinoのserial関数を使っています(LEDはD1,D3の間につけます)。これを取り去ってLEDを点けたりモーターを回したりするようにすれば、いろいろなものに使えます。なお、リモコンによって送信されるデータが違いますので、arduinoのシリアルモニターに表示されるデータ(d[1]〜d[6])にどのようなデーターが入るか確認して、それに合わせた修正が必要です。


//
//
// IR remocon decoder by Henohenomoheji
//
//
#define CLOCK 16 // クリスタルの周波数を入れる
#define PRESCALER 1 // スケッチでスピードを買えた場合に設定

// デジタル入出力ピンの定義
#define TIMER2APIN 3 // 赤外線通信送信用(38kHz)

void led(int p) {

pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(11, INPUT);

switch(p) {
case 0: return;
case 5: pinMode(5, OUTPUT); return; // 下側緑
case 6: pinMode(6, OUTPUT); return; // 下側青
case 9: pinMode(9, OUTPUT); return; // 2つ赤
case 10: pinMode(10, OUTPUT); return; // 2つ緑
case 11: pinMode(11, OUTPUT); return; // 2つ青
}
}
unsigned long t[202];
unsigned int b[202];
int sendIR(char *);
void setup() {
pinMode(TIMER2APIN, OUTPUT); // PD3
Serial.begin(1200);
//
// start IR pulse(38kHz)
//
// TCNT2=0;
OCR2A=26-1;
OCR2B=13-1;
TCCR2A=0b00100011;
TCCR2B=0b00001010;
led(9);
sendIR("E"); // 電源投入時にtraino停止コマンドを送信
delay(100);
led(0);
}
void decodedata() {
int i=0,j=0,k=0;
unsigned long data[10]={0,0,0,0,0,0,0,0,0,0};

// t[0]にはLO→digitalRead(0)==0になった時間が入っている
for(k=0;k10000) goto disp; t[++i]=micros(); // 次にdigitalRead(0)==1になった時刻を保存
for(j=0;(digitalRead(0)==1);j++) if(j>10000) goto disp; t[++i]=micros(); // 次にdigitalRead(0)==0になった時刻を保存
}

disp:
for(i=0;i 1000) data[1]+= 1; i+=2; if(b[i] > 1000) data[1]+= 2; i+=2; if(b[i] > 1000) data[1]+= 4; i+=2; if(b[i] > 1000) data[1]+= 8; i+=2;
if(b[i] > 1000) data[1]+= 16; i+=2; if(b[i] > 1000) data[1]+= 32; i+=2; if(b[i] > 1000) data[1]+= 64; i+=2; if(b[i] > 1000) data[1]+=128; i+=2;
if(b[i] > 1000) data[2]+= 1; i+=2; if(b[i] > 1000) data[2]+= 2; i+=2; if(b[i] > 1000) data[2]+= 4; i+=2; if(b[i] > 1000) data[2]+= 8; i+=2;
if(b[i] > 1000) data[2]+= 16; i+=2; if(b[i] > 1000) data[2]+= 32; i+=2; if(b[i] > 1000) data[2]+= 64; i+=2; if(b[i] > 1000) data[2]+=128; i+=2;
if(b[i] > 1000) data[3]+= 1; i+=2; if(b[i] > 1000) data[3]+= 2; i+=2; if(b[i] > 1000) data[3]+= 4; i+=2; if(b[i] > 1000) data[3]+= 8; i+=2;
if(b[i] > 1000) data[3]+= 16; i+=2; if(b[i] > 1000) data[3]+= 32; i+=2; if(b[i] > 1000) data[3]+= 64; i+=2; if(b[i] > 1000) data[3]+=128; i+=2;
if(b[i] > 1000) data[4]+= 1; i+=2; if(b[i] > 1000) data[4]+= 2; i+=2; if(b[i] > 1000) data[4]+= 4; i+=2; if(b[i] > 1000) data[4]+= 8; i+=2;
if(b[i] > 1000) data[4]+= 16; i+=2; if(b[i] > 1000) data[4]+= 32; i+=2; if(b[i] > 1000) data[4]+= 64; i+=2; if(b[i] > 1000) data[4]+=128; i+=2;
if(b[i] > 1000) data[5]+= 1; i+=2; if(b[i] > 1000) data[5]+= 2; i+=2; if(b[i] > 1000) data[5]+= 4; i+=2; if(b[i] > 1000) data[5]+= 8; i+=2;
if(b[i] > 1000) data[5]+= 16; i+=2; if(b[i] > 1000) data[5]+= 32; i+=2; if(b[i] > 1000) data[5]+= 64; i+=2; if(b[i] > 1000) data[5]+=128; i+=2;
if(b[i] > 1000) data[6]+= 1; i+=2; if(b[i] > 1000) data[6]+= 2; i+=2; if(b[i] > 1000) data[6]+= 4; i+=2; if(b[i] > 1000) data[6]+= 8; i+=2;
if(b[i] > 1000) data[6]+= 16; i+=2; if(b[i] > 1000) data[6]+= 32; i+=2; if(b[i] > 1000) data[6]+= 64; i+=2; if(b[i] > 1000) data[6]+=128; i+=2;
if(b[i] > 1000) data[7]+= 1; i+=2; if(b[i] > 1000) data[7]+= 2; i+=2; if(b[i] > 1000) data[7]+= 4; i+=2; if(b[i] > 1000) data[7]+= 8; i+=2;
if(b[i] > 1000) data[7]+= 16; i+=2; if(b[i] > 1000) data[7]+= 32; i+=2; if(b[i] > 1000) data[7]+= 64; i+=2; if(b[i] > 1000) data[7]+=128; i+=2;
if(b[i] > 1000) data[8]+= 1; i+=2; if(b[i] > 1000) data[8]+= 2; i+=2; if(b[i] > 1000) data[8]+= 4; i+=2; if(b[i] > 1000) data[8]+= 8; i+=2;
if(b[i] > 1000) data[8]+= 16; i+=2; if(b[i] > 1000) data[8]+= 32; i+=2; if(b[i] > 1000) data[8]+= 64; i+=2; if(b[i] > 1000) data[8]+=128; i+=2;

// startIRpulse();
delay(500);
// 受信データから、trainoコマンドを決める
// bose remocon
if(data[1]==0x55) if(data[2]==0xaa) if(data[3]==0x57) sendIR("\\1"); // +
if(data[1]==0xa5) if(data[2]==0x5a) if(data[3]==0x97) sendIR("\\2"); // +
if(data[1]==0xc5) if(data[2]==0x3a) if(data[3]==0x17) sendIR("C"); // +
// sharp aquos remocon
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x4e) /* 1 */ {sendIR("P1"); led(9);}
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x4f) /* 1 */ {sendIR("P2"); led(9);}
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x50) /* 1 */ {sendIR("P3"); led(9);}
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x51) /* 1 */ {sendIR("P4"); led(9);}
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x52) /* 1 */ {sendIR("P5"); led(9);}
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x53) /* 1 */ {sendIR("P6"); led(9);}
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x54) /* 1 */ {sendIR("P7"); led(9);}
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x55) /* 1 */ {sendIR("P8"); led(9);}
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x56) /* 1 */ {sendIR("P9"); led(9);}
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x57) /* 1 */ {sendIR("P0"); led(9);}
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x1b) /* 1 */{sendIR("R"); led(9);}
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x1a) /* 1 */{sendIR("FH"); led(9);}
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x5a) /* 1 */{sendIR("FT"); led(9);}
if(data[1]==0xAA) if(data[2]==0x5a) if(data[3]==0x8f) if(data[4]==0x12) if(data[5]==0x16) /* 1 */{sendIR("E"); led(9);}

delay(100);
led(11);

Serial.print("data = "); Serial.print(data[1],HEX);
Serial.print(",");Serial.print(data[2],HEX);
Serial.print(",");Serial.print(data[3],HEX);
Serial.print(",");Serial.print(data[4],HEX);
Serial.print(",");Serial.print(data[5],HEX);
Serial.print(",");Serial.print(data[6],HEX);
Serial.print(",");Serial.print(data[7],HEX);
Serial.print(",");Serial.println(data[8],HEX);

Serial.flush();
delay(100);
led(0);
}
void loop() {
int i;
unsigned long data;

for(i=0;i10) return 0;
}
Serial.write(byte(0));
return i;
}
// End of file



続きを読む
スポンサーサイト
家電リモコン翻訳機を作る
久しぶりの投稿になります。最近、鉄道模型はご無沙汰していたのですが、少し前に、拓啓ぽんさんのブロクのやり取りで「家電リモコンをつかえないか」との話がでて気になっており、分析していました。

そこでわかったことは、リモコン通信はパルスの間隔で0.1を決めるもので、trainoで採用したシリアル通信方式(arduinoのserialの機能)とは大きく違いがあることがわかりました。
こちらが理解を深める上で参考になりました。
http://japan.renesas.com/support/faqs/faq_results/Q1000000-Q9999999/mpumcu/com/remo_012j.jsp
これ自身はそれほど複雑ではないのですが、実際には家電メーカーごとにボタンをどうアサインするかなど、詳細が大きく違ったりしていてTrainoにそのまま搭載することはやめました。

そこで発想を変えて、家電リモコンの信号をTrainoの信号に翻訳するものを作り、実験をしていました。この翻訳機では家電リモコンリモコンからの赤外線を解析し、trainoに同じ赤外線通信を使ってデータを送る仕組みです。日本語で聞いて英語で同時翻訳するようなイメージでちょっと遅れて変換動作を行います。

ハードウエアはarduino互換ボードで、リモコン受信ユニットと送信回路とその増幅器を拡張してものを作りました。なお、赤外線LEDはその向きを広範囲に向けて、trainoが動きまわっても通信できるように取り付けます。

これで赤外線リモコンからの信号を読み出し、その内容を翻訳してふたたび赤外線でtrainoに発信します。ただし、自分で自分の送信に反応してしまうと永遠に終わりませんので、自分が発信した後はしばらくは自分自身の受信も止めるようにしています。

今回は、チャンネル1−9,0のボタンでスピード設定、電源ボタンで緊急ストップ、その他走行の向きの切り替えなどの指令を変換できるようにしています。スケッチについてはまとめて後日ご紹介致します。

これだけでは今までのiPhoneなどで実現していた送信機側を家電リモコンに変えただけですので、あまり面白味がありません。レール側やtrainoに取り付けたセンサーがその状態を赤外線で送信出来ればもっと面白そうなことが出来そうですね。


続きを読む


天気予報


-天気予報コム- -FC2-

プロフィール

へのへのもへじ

Author:へのへのもへじ
FC2ブログへようこそ!

最近の記事

最近のコメント

最近のトラックバック

カテゴリー

ブロとも申請フォーム

この人とブロともになる

アルバム

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。