自己动手做Arduino玩具(三)

使用上一节的程序虽然可以实现一个靶,但功能上实在有点太简单了,而且有一个比较严重的问题,就是由于红外管有点敏感,环境光也自动触发了管子,所以这个方案实在是有点不合适,在Arduino库中有红外线接收及发送的例程,可以下载安装来使用。库的名字叫:irremote,在库管理器中安装即可使用。以下是一个简单的接收例子,接线图如上一节一般,代码如下:

#include 

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 

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 

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中的库内容,要把原库对应的内容全部删除。
 

你可能感兴趣的:(Arduino)