へのへのもへじ工作室
09 | 2017/10 | 11
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



AUTHOR: 拓啓ぽん
DATE: 03/28/2013 22:52:37
テレビのリモコンで模型を動かすという発想はすばらしいと思います。
Arduinoとの組み合わせでDCC顔負けのポイント切り替えシステムなどを構築したら面白そうですね。

たとえばポイントに1~9で番号を振って、番号+地デジで本線、番号+BSで側線とかどうでしょう。

スポンサーサイト
コメント

にしおかさん
たしかに、プログラムはわかりにくいですね。設計書もなく、またトレトレの投稿だと「スペース」や「タブ」が消えてすべて左寄せになってしまい、さらに見にくくなって申し訳ないです。
サウンドですが、MP3の再生もぜひやってみたいですが、
http://www.mes-ekit.com/?pid=27382328
の汽笛をならすのも簡単に楽しめていいかとも考えていますがいかがでしょうか?
[2013/03/29 08:13] URL | へのへのもへじ #79D/WHSg [ 編集 ]


へのへのもへじさん
実際に実行してしまうあたり素晴らしいです。スケッチは労作ですね、長いビットを読み出そうとしているのは感じ取れるのですが、詳細は見えていません。
DCCのマニュアルの存在も知りませんでした。汽笛鳴らしのチップもなかなかおもしろそうです。
[2013/03/30 00:25] URL | アイスマン #79D/WHSg [ 編集 ]


アイスマンさん
コメントありがとうございます。確かにスケッチがわかりにくくてすみません。また、きちんと動くようになるまで時間がかかったのすが、リモコンのメーカーが変わるとまたスケッチを合わせないと動かないのが面倒になりそうです。
[2013/03/30 22:07] URL | へのへのもへじ #79D/WHSg [ 編集 ]


コメントの投稿














管理者にだけ表示を許可する



天気予報


-天気予報コム- -FC2-

プロフィール

へのへのもへじ

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

最近の記事

最近のコメント

最近のトラックバック

カテゴリー

ブロとも申請フォーム

この人とブロともになる

アルバム

ブログ内検索

RSSフィード

リンク

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

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