前提・実現したいこと
ここに質問の内容を詳しく書いてください。
Arduinoを使って赤外線を受信し、赤外線LEDを発光するシステムを作っています。
IRremoteライブラリのスケッチ例の”IRrecvDemo"を参考に作成しています。
赤外線受信モジュールが1つの時は動いたのですが、赤外線モジュールを複数用いて、
モジュール1が***の信号を受信したら○○○の信号のLEDを発光する。
モジュール2が***の信号を受信したら¥¥¥の信号のLEDを発光する。
モジュール3が***の信号を受信したら&&&の信号のLEDを発光する。
…
のようなスケッチを作りたいです。
発生している問題・エラーメッセージ
このプログラムを実行したらシリアルモニタで表示はされたのですが、ピン4に挿されているモジュールを抜いてもピン4の値がモニタに表示され、受信されていることになってしまいます。
該当のソースコード
ソースコード /* * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv * An IR detector/demodulator must be connected to the input RECV_PIN. * Version 0.1 July, 2009 * Copyright 2009 Ken Shirriff * http://arcfn.com */ #include <IRremote.h> IRsend irsend; int RECV_PIN4 = 4; int RECV_PIN5 = 5; int RECV_PIN6 = 6; int RECV_PIN7 = 7; IRrecv irrecv4(RECV_PIN4); IRrecv irrecv5(RECV_PIN5); IRrecv irrecv6(RECV_PIN6); IRrecv irrecv7(RECV_PIN7); decode_results results; void setup() { Serial.begin(9600); // In case the interrupt driver crashes on setup, give a clue // to the user what's going on. Serial.println("Enabling IRin"); irrecv4.enableIRIn(); // Start the receiver irrecv5.enableIRIn(); // Start the receiver irrecv6.enableIRIn(); // Start the receiver irrecv7.enableIRIn(); // Start the receiver Serial.println("Enabled IRin"); } void loop() { if (irrecv4.decode(&results)) { Serial.print("4:"); Serial.println(results.value, HEX); if(results.value == 0xFF807F){ int khz = 38; // 38kHz carrier frequency for the NEC protocol unsigned int irSignal[67] = {9050,4400, 600,500, 650,500, 600,550, 600,500, 650,500, 600,500, 650,450, 650,500, 600,1600, 650,1650, 600,1600, 600,1650, 600,1600, 600,1650, 600,1600, 650,1600, 600,1600, 600,1650, 600,1600, 650,500, 600,500, 600,550, 600,500, 650,500, 600,550, 600,500, 600,550, 600,1600, 600,1650, 600,1600, 600,1650, 600,1600, 600}; // NEC FFE01F irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); irrecv4.enableIRIn(); delay(400); //In this example, the signal will be repeated every 5 seconds, approximately. }else{ delay(100); } irrecv4.resume(); // Receive the next value }else if (irrecv5.decode(&results)) { Serial.print("5:"); Serial.println(results.value, HEX); if(results.value == 0xFF807F){ int khz = 38; // 38kHz carrier frequency for the NEC protocol unsigned int irSignal[67] = {9000,4450, 600,550, 550,600, 550,600, 550,550, 550,550, 600,550, 550,600, 550,550, 550,1650, 600,1650, 550,1650, 600,1650, 550,1650, 600,1650, 550,1650, 600,1650, 550,1700, 550,550, 600,550, 550,1650, 600,550, 550,600, 550,550, 550,600, 550,550, 550,1700, 550,1700, 500,550, 600,1650, 550,1650, 600,1650, 550,1700, 500}; // NEC FF906F irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); irrecv5.enableIRIn(); delay(400); }else{ delay(100); } irrecv5.resume();// Receive the next value }else if (irrecv6.decode(&results)) { Serial.print("6:"); Serial.println(results.value, HEX); if(results.value == 0xFF807F){ int khz = 38; // 38kHz carrier frequency for the NEC protocol unsigned int irSignal[67] = {9050,4400, 650,500, 600,500, 650,500, 650,450, 650,500, 650,500, 600,500, 650,500, 600,1600, 650,1600, 600,1650, 600,1600, 600,1650, 600,1600, 600,1650, 600,1600, 600,1650, 600,500, 600,1650, 600,1600, 650,500, 600,500, 650,500, 600,550, 600,500, 600,1650, 600,500, 600,550, 600,1600, 600,1650, 600,1600, 600,1650, 600}; // NEC FFB04F irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); irrecv6.enableIRIn(); delay(400); //In this example, the signal will be repeated every 5 seconds, approximately. }else{ delay(100); } irrecv6.resume(); // Receive the next value }else if (irrecv7.decode(&results)) { Serial.print("7:"); Serial.println(results.value, HEX); if(results.value == 0xFF807F){ int khz = 38; // 38kHz carrier frequency for the NEC protocol unsigned int irSignal[67] = {9100,4400, 600,550, 600,500, 600,550, 600,500, 600,550, 600,500, 600,550, 600,500, 600,1650, 600,1650, 550,1650, 600,1650, 550,1650, 600,1650, 550,1650, 600,1650, 600,1600, 600,500, 600,1650, 600,500, 650,1600, 600,500, 650,500, 600,550, 600,500, 600,1600, 650,500, 600,1650, 600,500, 600,1650, 600,1600, 600,1650, 600}; // NEC FFA857 irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); irrecv7.enableIRIn(); delay(400); //In this example, the signal will be repeated every 5 seconds, approximately. }else{ delay(100); } irrecv7.resume(); // Receive the next value } }
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
問題が起きているのはピン4だけですか?
他でも抜いて反応してしまいますか?
ピン5を抜いても表示されてしまいます。6、7も同様です…
> 表示されてしまいます
何が?
発生している問題・エラーメッセージに記載しているように、ピン4の受信モジュールを抜いてもピン4が受信しているように表示されてしまうってことです。それがピン5,6,7でも同様ということです。
> ピン5,6,7でも同様
ピン5の受信モジュールを抜いてもピン5が受信しているように表示されてしまう、ということですか?
それとも、
ピン5の受信モジュールを抜いてもピン4が受信しているように表示されてしまう、ということですか?
そもそも、「同時に受信しないように対策をしています」とのことですから、ピン4の受信モジュールを抜いて、ピン4以外のモジュールが受信していないのにピン4が受信しているように表示される、ということなのですね? その段階で相当不思議です。
>ピン5の受信モジュールを抜いてもピン5が受信しているように表示されてしまう、
こちらのようになります。
そうなのですよね…なのでプログラムがおかしいのかと思いまして……謎なんです…
もう一つ条件をしぼらなきゃ...ピンnのモジュールを抜いて、赤外線はどのモジュールに当てているのですか?
私のてもとで(受信モジュール1個で)試してみると、
ピン7だけに受信モジュールを繋いで赤外線を当てると、4(が多いけど)だけでなくて他のピンでも引っかかります。あなたの手元では4ピン「だけ」の表示なのですか?
説明不足ですみません。
そうですね、他のピンも引っかかります。
ピン4を抜いて、ピン5,6,7それぞれに当ててもそれぞれ5,6,7が受信することはありますが、4も5,6,7も受信の表示があるって感じです。
シリアルモニタで、ピン番号関係なく、表示されているという感じに見えます。
loop内でirrecv4のところだけ残してピン4のみ受信というプログラムを書くと、ちゃんと受信がされています。同様にピン5のみ、6のみ、7のみのプログラムでもそれぞれピン5、6、7がちゃんと受信表示されます。
しかし、複数の受信モジュールを使うプログラムを書くとおかしくなるのです…