ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

arduinoコミュのリモコン解析の方法教えてください

  • mixiチェック
  • このエントリーをはてなブックマークに追加
真夏も過ぎてしまいましたが、、、エアコンを遠隔で操作したくなり、リモコン受光モジュール(OSRM38C9AA)を購入してきました。
こちらのサイトhttp://d.hatena.ne.jp/NeoCat/20090419/1240158722を参考に配線し、スケッチをコピーしたのですが、シリアルモニターに表示されません。
エアコン、テレビのリモコンで試しましたがどちらも表示されません。

arduinoはUNOを使っています。

どのような原因が考えられますでしょうか?

壊れた時用として、受光モジュールは2つ購入していたので、入れ替えてみましたが動作しませんでした。

ゆくゆくはウェブアプリから遠隔で操作したいと思っておりますが、まだまだ遠いです。。。

コメント(31)

スケッチ記入するの忘れてしまいました。

int ir_in = 8;
int ir_out = 13;
unsigned int data[512] = {};

int last = 0;
unsigned long us = micros();

// セットアップ
void setup() {
Serial.begin(57600); // シリアル通信速度の設定
pinMode(ir_in, INPUT); // 入出力ピンの設定
pinMode(ir_out, OUTPUT);
}

// dataからリモコン信号を送信
void sendSignal() {
for (int cnt = 0; cnt < 512; cnt++) {
unsigned long len = data[cnt]*10; // dataは10us単位でON/OFF時間を記録している
if (len == 0) break; // 0なら終端。
unsigned long us = micros();
do {
digitalWrite(ir_out, 1 - (cnt&1)); // iが偶数なら赤外線ON、奇数なら0のOFFのまま
delayMicroseconds(8); // キャリア周波数38kHzでON/OFFするよう時間調整
digitalWrite(ir_out, 0);
delayMicroseconds(7);
} while (long(us + len - micros()) > 0); // 送信時間に達するまでループ
}
Serial.print("OK\n");
}

// シリアルからの受信をチェック
void checkSerial() {
if (Serial.available() > 0) {
if (Serial.read() == ' ') { // スペース受信で入力開始
Serial.print(">");
unsigned int x = 0;
int i = 0;
int len = 0;
while (1) {
while (Serial.available() == 0) {} // 次のバイトが来るまで無限ループで待つ
int a = Serial.read();
if (a >= '0' && a <= '9') { // 0〜9を受信なら
len++;
x *= 10;
x += a - '0';
} else if (len) { // 数値を受信済み、かつ数値以外が来たら
data[i++] = x; // 受信した数値をdataに記憶
Serial.print(i);
Serial.print(":");
Serial.print(x);
Serial.print("\t");
if (x == 0 || i >= 512) { // 0受信で赤外線送信開始
sendSignal();
break;
}
x = 0;
len = 0;
}
}
}
}
}

void loop() {
unsigned int val;
unsigned int cnt = 0;

// Wait for incoming IR signal
while ((val = digitalRead(ir_in)) == last) {
if (++cnt >= 30000) {
if (cnt == 30000)
Serial.print("\n");
else
checkSerial();
cnt = 30000;
}
}

unsigned long us2 = micros();
Serial.print((us2-us)/10, DEC);
Serial.print(" ");
last = val;
us = us2;
}
1人で何度も書き込みすみません。

こちらに簡単に動作確認できるスケッチがありましたので試してみました。
http://happy-arduino.blogspot.jp/2012/03/blog-post.html

スケッチ
const int IR_RecvPin=2;
const int LEDPin=13;

int State=0;

void setup(){
pinMode(LEDPin,OUTPUT);
pinMode(IR_RecvPin,INPUT);
}

void loop(){
State=digitalRead(IR_RecvPin);

if (State==LOW){
digitalWrite(LEDPin,HIGH);
}
else{
digitalWrite(LEDPin,LOW);
}
}


こちらでもLEDが光らず動作確認できませんでした。
2つとも受光モジュールが故障しているって事なんでしょうか?
写真見ると、受光モジュールの3番ピン(Vcc端子)がD8端子に接続されているように見えますが、配線は正しいでしょうか?
>>[3]

配線確認しました。
3番ピンにD8が接続されていました。
説明書をよく読まず1番、3番が逆になっておりました。
1:D8 2:GND 3:Vcc 

配線しなおし、再度リモコンのスイッチを押してみましたが表示されませんでした。
シリアルモニターを一旦切って再度表示させてみましたら、このような記号が出ていました。
関係あるものでしょうか?
情報は正確に。
「OSRM38C9AA」ではググッても何も引っかかりませんでした。
秋月電子で販売している、「OSRB38C9AA」では?
それに、「壊れた時用として、受光モジュールは2つ購入していた」って書いていますが、元々2個入りでは?
当然、2個とも、配線間違えた状態で通電したのですよね?
すでに2個とも壊した後かも?
わたしはこの辺を使ってラクをしちゃったのですが、
https://github.com/shirriff/Arduino-IRremote

それはさておきこの程度で動かないのは妙ですね。
現状は[1]のスケッチを動かしているのでしょうか?
checkSerial()の処理をなくしてしまって(先頭にreturnを入れるとか)実行してみるとどうですか?
(送信処理をなくしてしまうことで問題の切り分けができるかもしれません)
>こちらに簡単に動作確認できるスケッチがありましたので試してみました。
当然、配線は変更していますよね?
とりあえず http://d.hatena.ne.jp/NeoCat/20090419/1240158722 にあったスケッチをコピペしてIR受信モジュールだけつけて動作確認したところ、あっさり動作しました。
[1]にあるのも同じものですよね?

ってことはハードウェアかな。
[5]の画像が引っかかる。
マトモに動作してるなら文字化けは起こらず、数字と空白以外の文字が出るわけもなく...

まさかスケッチが書き込めてないってことはないでしょうね?
たしかにシリアル出力にはバイナリーコードは送ってないみたいだし、ボーレートがあってない時によく見かけますね。

スケッチが書き込めてなくて前のが残っている可能性も否定できませんね。

とりあえず Serial.println("IRTEST"); をsetupの最後かloopの先頭に入れてちゃんとシリアルを受信できてるか切り分けしてみるといいかも。
>>[6]

まちがっていました。OSRB38C9AAでした。
1個ずつではなく、2個入りでした。

【2】については、配線の変更はしております。現在は【1】に変更しています。

壊れてしまったのかもしれません。。。
>>[9]

試していただきありがとうございます。
動作しましたか。。。
配線間違って使った時に、受信モジュールが壊れてしまったかもしれません。
信号出力に電源食わせたら壊れても文句は言えないんだけど、「そんなに簡単に壊れるかなぁ?」って思うんですよね。
上のコメントにもありますが、是非シリアル通信が正常に行われているか確かめてみてくださいな。
>>[11]

いつもありがとうございます。
>Serial.println("IRTEST"); をsetupの最後かloopの先頭に入れてちゃんとシリアルを受信できてるか切り分けしてみるといいかも。

setupの最後に入れて試してみました。
シリアルモニターを確認すると、cIRTESTと表示され、リモコンのスイッチを入れてみましたが反応しませんでした。一旦ソフトを切って、再起動し、再度シリアルモニターを確認すると、今度はHIRTESTと表示されました。
>>[14]

【7】にありました、checkSerial()の処理をなくしてしまって(先頭にreturnを入れるとか)実行してみるとどうですか?
こちら試してみました。シリアルモニターを確認したところ、【5】と同じ文字が表示されました。リモコンのスイッチを押しましたが、何も表示されませんでした。



void checkSerial() {
if (Serial.available() > 0) {
if (Serial.read() == ' ') { // スペース受信で入力開始
Serial.print(">");
unsigned int x = 0;
int i = 0;
int len = 0;
while (1) {
while (Serial.available() == 0) {} // 次のバイトが来るまで無限ループで待つ
int a = Serial.read();
if (a >= '0' && a <= '9') { // 0〜9を受信なら
len++;
x *= 10;
x += a - '0';
} else if (len) { // 数値を受信済み、かつ数値以外が来たら
data[i++] = x; // 受信した数値をdataに記憶
Serial.print(i);
Serial.print(":");
Serial.print(x);
Serial.print("\t");
if (x == 0 || i >= 512) { // 0受信で赤外線送信開始
sendSignal();
break;
}
x = 0;
len = 0;
}
}
}
}
}


上記のスケッチを下記に変更しました。

void checkSerial() {
return;
}


やり方は正しいでしょうか?
よくよく読んでみるとloop()内のif文はかなり意味不明ですね。
cntが29999のとき、カウントアップしてcnt==30000が成り立って改行が出力される。
次の回はcnt==30001になってるから、cnt=30000に初期化される。
改行は二度と出力されることはない。で、信号がひっくり返られない限りループも抜けられない...

何がやりたかったんでしょうね?

それはさておき。受信モジュールからの信号がひっくり返ってないってことは... やはり壊れてるのかも。
それにしても 'c' とか 'H' とかが面妖です。一体誰が出力してるんだろ?
素子のGNDに5V、信号線にGND、GNDに信号線を接続したら、素子の内部ブロック図からすると、プルアップ抵抗はあるものの、ほとんど電源の逆接続ですよね?
壊れない方がおかしいけど...。
気が付かずに2個共、やってしまっていれば、両方共壊れたと思ってもう1セット購入した方が早いと思いますよ。

特に2つ目のスケッチでLEDが点灯しないならば、動作不良確定かと思います。(ところで、リモコンは本当に赤外線式ですよね?高級品でたまに電波式があるので!イヤに遠くから操作できるなぁ?って思ったら電波式だったって経験があるので。)
シリアル通信がどう見ても文字化けにしか見えません。
特別な理由がなければ、通信速度を落としてシリアルの送受信が
できている事からまず確認してみてください。
体感的に、19200bpsまでは安定してますから、

void setup() {
Serial.begin(19200) ;
Serial.println("A") ;
}
void loop() {}

これだけを動かしてシリアルモニターに A が正しく表示されるか
から確認してみてください。
あ、あと、エアコンの赤外線信号は、TVなどにくらべ長いものが多く、
サンプリングした場合 arduino 本体の 2kbyte の RAM だけでは
オーバーフローした経験があります。外部にシリアル SRAM を
つなげてようやく使えましたので、ご参考までに。

ちなみに今自分もイーサネットでエアコンのON/OFFしてますが、
手っ取り早く安い互換リモコン買ってきて、電源スイッチ部分だけ
リレーに並列接続してON/OFFをコントロールしてます。
現在の状態が把握できないのが玉に瑕ですが、手軽で便利です。
互換リモコンも今は安いのなら1000円せず買えますし。
>>[20]

コメントありがとうございます。
上記のスケッチ試してみたら、きちんとAと表示されました。
>>[21]

リレー方法もありますね。
参考になります。
まだリレーを使った事はありませんが、、、
遅くなりましたが、新しくモジュールを購入して試してみた所、問題なく動作しました。
みなさん回答ありがとうございました。

早速再度質問になりますが、リモコンのON,OFFを繰り返し読み込んでいるのですが、毎回数値が変化してしまいます。ON,OFFボタンが1つで行っているため、1回目、2回目で数値が変化するのは当然ですが、3回目、4回目、、、と試してみると、1回目、2回目の数値と一致しません。
原因はどのようなことが考えられるのでしょうか?
>>[024]
まずはこれらの数字が何を意味してるか理解することじゃないですかね。
こいつらは計測した生データで、一致させたかったらデコードが必要になります。
>>[25]

コメントありがとうございます。
最初の数字は無通信時間でその後はONとOFFの繰り返し回数だと認識してました。

デコード作業が必要なんですね。
調べてみます。
>>[26]
loop()のナカミを注意深く読んでもらいたいのですが(しかし読みにくいよねこのプログラム...)、IRの入力が反転するごとに時間を記録しているのがわかるかと思います。
ということを理解すれば、ON/OFFの波形が描けますよね?
データ部のビットは、OFFまたはON時間の長さで表されます(長いと1、短いと0とかね)。
データ部の前に、ここから信号が始まるということを示す長めのON/OFFのがあります。

なお今更書くのもナニですが、エアコンを制御したいんですよね?
ちと苦労するかも(信号が長いから)。
メーカーを教えて貰えればもう少しアドバイスできるかもしれません。
>>[27]

コメントありがとうございます。
【arduino リモコン解析 デコード】で検索してみても詳しく書いてある記事発見しにくいですね。
エアコンは信号が長いとどこかで書いてありました。。。とりあえずテレビで試すのがよいでしょうか。

メーカーは富士通でSylphide(シルフィード)ってやつでした。
>>[28]
まずここは読みましたか?
http://www.elm-chan.org/docs/ir_format.html

富士通のエアコンはその昔業務で暑かったことがあるような気がしますがさて資料どこさ行っちゃったかな...
信号長は結構長いです。arduinoのRAMじゃ扱いきれないかも。
ただいま出先のうろ覚えで申し訳ないのですが、かつてエアコンを動かしてた時にはH8を使い1KBの波形バッファを使って動かせなかったものはなかったように記憶してます。
ってことはarduinoでもやりようによってはなんとかなるのかな?
↑で紹介したarduino-IRremoteでは手元にあるパナソニックのエアコンをうまく扱えませんでした。
あんまり参考になってませんが。
予想通り、破壊していましたね。

ところで、リモコンのフォーマット調査ですが、「赤外線 リモコン フォーマット」で色々でてきましたよ。
更に「赤外線 リモコン フォーマット 富士通」でググッたら富士通のエアコンが動いたって記事も。
http://shokai.org/blog/archives/8012

もう少し一般的な言葉でググッた方が効率がいいですよ。

ログインすると、残り1件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

arduino 更新情報

arduinoのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング