注意:

1. arduino 的 libraries 在 mac os 中的地址

/Users/<username>/Documents/Arduino/libraries/

2. 红外遥控程序注意将IRremote文件夹 复制到Arduino安装目录下面libraries 文件夹下面 ,否则编译会出现

C:\Program Files (x86)\Arduino\libraries\RobotIRremote\src\IRremoteTools.cpp:5:16: error: 'TKD2' was not declared in this scope int RECV_PIN = TKD2; // the pin the IR receiver is connected to                ^编译有误。   

文件下载地址


1. 准备

红外遥控器发出的信号是一连串的二进制脉冲码。为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管发射出去,而红外线接收装置则要滤除其他杂波,叧接收该特定频率的信号并将其还原成二进制脉冲码,也就是解调。 

内置接收管将红外发射管发射出来的光信号转换为微弱的电信号,此信号经由IC内部放大器进行放大,然后通过自动增益控制、带通滤波、解调变、波形整形后还原为遥控器发射出的原始编码,经由接收头的信号输出脚输入到电器上的编码识别电路。

要想对某一遥控器进行解码必须要了解该遥控器的编码方式。本产品使用的遥控器的码方式为:NEC协议。下面就介绍一下NEC协议的特点:

(1)8位地址位,8位命令位 

(2)为了可靠性地址位和命令位被传输两次

(3)脉冲位置调制 

(4)载波频率38khz 

(5)每一位的时间为1.125ms或2.25ms 

  逻辑 01的定义如下图

 逻辑1的是由560us的高电平和1.69ms的低电平组成的脉冲表示

python 红外 遥控 红外遥控程序_python 红外 遥控

逻辑0的是由560us的高电平和565us的低电平组成的脉冲表示

python 红外 遥控 红外遥控程序_引脚_02

python 红外 遥控 红外遥控程序_引脚_03

重复脉冲

重复码的格式是由9ms的AGC高电平和2.25ms的低电平及一个560us的高电平组成。如右图所示

python 红外 遥控 红外遥控程序_python 红外 遥控_04

python 红外 遥控 红外遥控程序_红外_05

python 红外 遥控 红外遥控程序_python 红外 遥控_06

按键按下立刻松开的发射脉冲:

下图片显示了NEC的协议典型的脉冲序列。

①一个信息发送是由9mS的AGC自动增益控制脉冲开头,在早期的IR红外接收器中用来设置增益。接着是4.5mS空闲,然后是地址、命令。

②地址和命令都传送2次,第二次的地址和命令是反码,可以用来校验接收到的信息。总的传输时间是固定的,因为每一位都有反码传送。

python 红外 遥控 红外遥控程序_引脚_07

python 红外 遥控 红外遥控程序_python 红外 遥控_08

按键按下一段时间才松开的发射脉冲:

python 红外 遥控 红外遥控程序_红外_09

红外接收头的引脚与连线

如左图将VOUT接到模拟口,GND接到实验板上的GND,VCC接到实验板上的+5v。

python 红外 遥控 红外遥控程序_引脚_10

python 红外 遥控 红外遥控程序_红外_11

实验连线 

如右图将红外接收头按照上述方法接好,将VOUT接到数字11口引脚,将LED灯通过电阻接到数字引脚2,3,4,5,6,7。 

遥控器键值

可先用串口显示对应按键编码,再修改程序使之匹配,以适应不同遥控器

示例遥控器按键编码 

“0” = 0x00FF6897 ; “—” = 0x00FF9867 ; “C” =0x00FFB04F ; 
“1”=0x00ff30CF ; “2”=0x00FF18E7 ; “3”=0x00FF7A85 ;
“4”=0x00FF10EF ; “5”=0x00FF38C7 ; “6”=0x00FF5AA5 ;
“7”=0x00FF42BD ; “8”=0x00FF4AB5 ; “9”=0x00FF52AD ;

编译前注意:

复制\2.例程代码\例程19-红外遥控里的库文件夹IRremoteArduino的安装目录:Arduino\libraries目录下,缺失库文件可能编译出错。

2. 代码

#include <IRremote.h>//包含红外库
 int RECV_PIN = 11;//端口声明
 int LED1 = 2;
 int LED2 = 3;
 int LED3 = 4;
 int LED4 = 5;
 int LED5 = 6;
 int LED6 = 7;
 long on1  = 0x00FF6897;//编码示例,与发送匹配用
 long off1 = 0x00ff30CF;
 long on2 = 0x00FF9867;
 long off2 = 0x00FF18E7;
 long on3 = 0x00FFB04F;
 long off3 = 0x00FF7A85;
 long on4 = 0x00FF10EF;
 long off4 = 0x00FF42BD;
 long on5 = 0x00FF38C7;
 long off5 = 0x00FF4AB5;
 long on6 = 0x00FF5AA5;
 long off6 = 0x00FF52AD;
 IRrecv irrecv(RECV_PIN);
 decode_results results;//结构声明
 // Dumps out the decode_results structure.
 // Call this after IRrecv::decode()
 // void * to work around compiler issue
 //void dump(void *v) {
 //  decode_results *results = (decode_results *)v
 void dump(decode_results *results)
 {
     int count = results->rawlen;
     if (results->decode_type == UNKNOWN) 
     {
         Serial.println("Could not decode message");
     } 
     else 
     {
         if (results->decode_type == NEC) 
         {
             Serial.print("Decoded NEC: ");
         } 
         else if (results->decode_type == SONY) 
                 {
                     Serial.print("Decoded SONY: ");
                 } 
                 else if (results->decode_type == RC5) 
                         {
                             Serial.print("Decoded RC5: ");
                         } 
                         else if (results->decode_type == RC6) 
                                 {
                                     Serial.print("Decoded RC6: ");
                                 }
         Serial.print(results->value, HEX);
         Serial.print(" (");
         Serial.print(results->bits, DEC);
         Serial.println(" bits)");
     }
         Serial.print("Raw (");
         Serial.print(count, DEC);
         Serial.print("): ");          for (int i = 0; i < count; i++) 
          {
             if ((i % 2) == 1) 
             {
                 Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
             } 
             else  
             {
                 Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
             }
             Serial.print(" ");
         }
         Serial.println("");
 }void setup()
 {
     pinMode(RECV_PIN, INPUT);   //端口模式,输入
     pinMode(LED1, OUTPUT);//端口模式,输出
     pinMode(LED2, OUTPUT);//端口模式,输出
     pinMode(LED3, OUTPUT);//端口模式,输出
     pinMode(LED4, OUTPUT);//端口模式,输出
     pinMode(LED5, OUTPUT);//端口模式,输出
     pinMode(LED6, OUTPUT);//端口模式,输出
     pinMode(13, OUTPUT);端口模式,输出
     Serial.begin(9600);    //波特率9600
     irrecv.enableIRIn(); // Start the receiver
 }int on = 0;
 unsigned long last = millis();void loop() 
 {
   if (irrecv.decode(&results)) //调用库函数:解码
    {
     // If it's been at least 1/4 second since the last
     // IR received, toggle the relay
     if (millis() - last > 250) 
       {
        on = !on;
        digitalWrite(13, on ? HIGH : LOW);
        dump(&results);
       }
     if (results.value == on1 )
        digitalWrite(LED1, HIGH);
     if (results.value == off1 )
        digitalWrite(LED1, LOW); 
     if (results.value == on2 )
        digitalWrite(LED2, HIGH);
     if (results.value == off2 )
        digitalWrite(LED2, LOW); 
     if (results.value == on3 )
        digitalWrite(LED3, HIGH);
     if (results.value == off3 )
        digitalWrite(LED3, LOW);
     if (results.value == on4 )
        digitalWrite(LED4, HIGH);
     if (results.value == off4 )
        digitalWrite(LED4, LOW); 
     if (results.value == on5 )
        digitalWrite(LED5, HIGH);
     if (results.value == off5 )
        digitalWrite(LED5, LOW); 
     if (results.value == on6 )
        digitalWrite(LED6, HIGH);
     if (results.value == off6 )
        digitalWrite(LED6, LOW);        
     last = millis();      
     irrecv.resume(); // Receive the next value
   }
 }