_Jasmine 发表于 2015-4-22 15:44:54

求助:一块Arduino板子,两个红外接收端的实现问题

本帖最后由 _Jasmine 于 2015-4-22 15:43 编辑

需要在小车的前方和侧面各安装一个红外接收端。
目前能够实现单独一个的红外信号接收解码,效果良好,程序如下:
#include <IRremote.h>
const int irReceiverPin = 2;// 紅外線接收器 OUTPUT 訊號接在 pin 2
IRrecv irrecv(irReceiverPin);// 定義 IRrecv 物件來接收紅外線訊號
decode_results results;                  // 解碼結果將放在 decode_results 結構的 result 變數裏

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();// 啟動紅外線解碼
}

void loop()
{
if (irrecv.decode(&results))
{
    // 解碼成功,收到一組紅外線訊號
    // 印到 Serial port
    Serial.print("irCode: ");         
    Serial.print(results.value, HEX);    // 紅外線編碼
    Serial.print(",bits: ");         
    Serial.println(results.bits);      // 紅外線編碼位元數
    irrecv.resume(); // 繼續收下一組紅外線訊號      
}
}

解码后端口显示结果:

但是如果想要实现两个红外接收端各自接收红外信号解码,就会出现问题,不知道程序是哪里出错了?

/*
* IRRemote 紅外線遙控教學
*   範例 1.1: 接收紅外線
*/
#include <IRremote.h>

const int irReceiverPin = 2; // 紅外線接收器 OUTPUT 訊號接在 pin 2
IRrecv irrecv(irReceiverPin);   // 定義 IRrecv 物件來接收紅外線訊號
decode_results results;   // 解碼結果將放在 decode_results 結構的 results 變數裏

const int irReceiverPin2= 4;    // 紅外線接收器 OUTPUT 訊號接在 pin 4
IRrecv irrecv2(irReceiverPin2);// 定義 IRrecv 物件來接收紅外線訊號
decode_results results2;    // 解碼結果將放在 decode_results 結構的 results2 變數裏

void setup()
{
Serial.begin(9600);   
irrecv.enableIRIn();   // 啟動紅外線解碼
irrecv2.enableIRIn();   // 啟動紅外線解碼
}

void loop()
{
if (irrecv.decode(&results))
{
    showIRProtocol(results);    // 顯示紅外線協定種類
    irrecv.resume();    // 繼續收下一組紅外線訊號      
}
delay(100);
if (irrecv2.decode(&results2))
{
    showIRProtocol2(results2);   // 顯示紅外線協定種類
    irrecv2.resume();       // 繼續收下一組紅外線訊號      
}
delay(100);
}


void showIRProtocol(decode_results results)
{
Serial.print("Protocol: ");
// 判斷紅外線協定種類
switch(results.decode_type)
{
    case NEC:Serial.print("NEC");break;
    case SONY:Serial.print("SONY");break;
    case RC5:Serial.print("RC5");break;
    case RC6:Serial.print("RC6");break;
    default:Serial.print("Unknown encoding");
}
// 把紅外線編碼印到 Serial port
Serial.print(",irCode: ");         
Serial.print(results.value, HEX);    // 紅外線編碼
Serial.print(",bits: ");         
Serial.println(results.bits);      // 紅外線編碼位元數
}

void showIRProtocol2(decode_results results2)
{
Serial.print("Protocol2: ");
// 判斷紅外線協定種類
switch(results2.decode_type)
{
    case NEC:Serial.print("NEC");break;
    case SONY:Serial.print("SONY");break;
    case RC5:Serial.print("RC5");break;
    case RC6:Serial.print("RC6");break;
    default:Serial.print("Unknown encoding");
}
// 把紅外線編碼印到 Serial port
Serial.print(",irCode2: ");         
Serial.print(results2.value, HEX);    // 紅外線編碼
Serial.print(",bits2: ");         
Serial.println(results2.bits);      // 紅外線編碼位元數
}

得到的结果很奇怪:

而且经过测试发现其实只有2号接收端在工作,但是很奇怪的是明明把1号接收端的连线拔掉了却还是会有如图所示的irCode输出。

chendunjin 发表于 2015-5-18 16:27:35

大哥,问题解决了没有啊
我也有同样的问题
在线等

dcopyboy 发表于 2015-4-23 10:24:16

这种情况 是应用在异地遥控的场合。理论上讲 紅外線接收器 是应该采用并联使用的。即将不同的接收头的数据端同时接入单片机的相同端口。注意数据线的有效长度及合理的屏蔽。
同地 不同的遥控只要采用单一接收头,不同的遥控器即可,单片机 按不同的遥控编码执行不同的功能。

yy691139541 发表于 2017-6-8 22:56:46

dcopyboy 发表于 2015-4-23 10:24
这种情况 是应用在异地遥控的场合。理论上讲 紅外線接收器 是应该采用并联使用的。即将不同的接收头的数据 ...

把接收头的信号线接到相同的端口还能分辨 出是那个接收头接收到的信号吗?

abcd1879 发表于 2017-6-26 17:47:59

路过学习:P:P

keneng 发表于 2017-6-27 08:14:32

能不能加个类似片选的控制试试
页: [1]
查看完整版本: 求助:一块Arduino板子,两个红外接收端的实现问题