使用上一节的程序虽然可以实现一个靶,但功能上实在有点太简单了,而且有一个比较严重的问题,就是由于红外管有点敏感,环境光也自动触发了管子,所以这个方案实在是有点不合适,在Arduino库中有红外线接收及发送的例程,可以下载安装来使用。库的名字叫:irremote,在库管理器中安装即可使用。以下是一个简单的接收例子,接线图如上一节一般,代码如下:
#include <IRremote.h>
int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN); //创建一个红外接收的实例
decode_results results;
void setup() {
pinMode(13, OUTPUT);
irrecv.enableIRIn(); //打开接收器
}
void loop() {
digitalWrite(13, LOW);
if (irrecv.decode(&results)) {
digitalWrite(13,HIGH);
delay(2000);
irrecv.resume(); // 接收下一个结果
}
}
另外,我们还可以直接学习一下Arduino IDE中的例子(IRrecvDemo)来更深入了解这个库的功能。
#include <IRremote.h>
int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
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");
irrecv.enableIRIn(); // Start the receiver
Serial.println("Enabled IRin");
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume(); // Receive the next value
}
delay(100);
}
//----------
这个例子需要打开计算机上串口工具来看产生的数据。会看到遥控器中各个按键在触发时发出的编码。
有这个功能基础,就可以为我们之后设计发射枪与靶提供了基础,例如我们玩具中有两把枪,枪1和枪2,这两支枪发射时可发射出不同编码的红外信号,当靶接收到信号后,就可以识别究竟是那一支枪打中了。
不过,这个程序也有另外一个问题,我们的玩具肯定不止一个靶,即有不止一个的红外接收管,但当我依样接好管子,并将代码改成如下时,就会出现意想不到的事情。
#include <IRremote.h>
int RECV_PIN1 = 7;
int RECV_PIN2 = 8;
IRrecv irrecv1(RECV_PIN1); //创建一个红外接收的实例1
IRrecv irrecv2(RECV_PIN2); //创建一个红外接收的实例2
decode_results results;
void setup() {
pinMode(12, OUTPUT); //外接一个LED来作指示灯。
pinMode(13, OUTPUT); //使用板载的灯。
irrecv1.enableIRIn(); //打开接收器1
irrecv2.enableIRIn(); //打开接收器2
}
void loop() {
digitalWrite(12, LOW);
if (irrecv1.decode(&results)) {
digitalWrite(12,HIGH);
delay(2000);
irrecv1.resume(); // 接收下一个结果
}
digitalWrite(13, LOW);
if (irrecv2.decode(&results)) {
digitalWrite(13,HIGH);
delay(2000);
irrecv2.resume(); // 接收下一个结果
}
}
这个程序是不能正常运行的。具体的问题是只有第二个接收器能正常工作,另一个接收器是不能正常工作的。为了解决这个问题,我在网上查了很久,最后找到了一个国外友人Neco777重写的irremote库,利用这个库就可以正常支持两个,甚至三个接收器(不过据说第四个就有问题了~~,我没有具体试过,因为我最多也是要接三个接收器)。
这个库的下载地址是:
https://github.com/Neco777/Arduino-IRremote
下载后,直接把这个库中的文件代替原来Arduino中的库内容,要把原库对应的内容全部删除。