亚博智能论坛  
  
查看: 734|回复: 0

课程19--红外遥控

[复制链接]
  • TA的每日心情
    慵懒
    2017-7-29 14:25
  • 121

    主题

    161

    帖子

    576

    积分

    超级版主

    Rank: 9Rank: 9Rank: 9

    积分
    576
    发表于 2017-6-2 12:36:44 | 显示全部楼层 |阅读模式
    红外遥控
          红外遥控器发出的信号是一连串的二进制脉冲码。为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管发射出去,而红外线接收装置则要滤除其他杂波,叧接收该特定频率的信号并将其还原成二进制脉冲码,也就是解调。
             内置接收管将红外发射管发射出来的光信号转换为微弱的电信号,此信号经由IC内部放大器进行放大,然后通过自动增益控制、带通滤波、解调变、波形整形后还原为遥控器发射出的原始编码,经由接收头的信号输出脚输入到电器上的编码识别电路。
             要想对某一遥控器进行解码必须要了解该遥控器的编码方式。本产品使用的遥控器的码方式为:NEC协议。下面就介绍一下NEC协议的特点:
    18位地址位,8位命令位
    2)为了可靠性地址位和命令位被传输两次
    3)脉冲位置调制
    4)载波频率38khz
    5)每一位的时间为1.125ms2.25ms
    逻辑01的定义如下图
    逻辑1的是由560us的高电平和1.69ms的低电平组成的脉冲表示
    2%8~AW}VYZIER_PB2S@{{TF.png
    逻辑0的是由560us的高电平和565us的低电平组成的脉冲表示
    [Y9RRVUQLE4AN67Y~ALU762.png
    重复脉冲
    重复码的格式是由9msAGC高电平和2.25ms的低电平及一个560us的高电平组成。如下图所示
    JW_5@Y_~WGQ1P)38A8(}I7U.png
    按键按下立刻松开的发射脉冲:
    下图片显示了NEC的协议典型的脉冲序列。
    ①一个信息发送是由9mSAGC自动增益控制脉冲开头,在早期的IR红外接收器中用来设置增益。接着是4.5mS空闲,然后是地址、命令。
    ②地址和命令都传送2次,第二次的地址和命令是反码,可以用来校验接收到的信息。总的传输时间是固定的,因为每一位都有反码传送。
    2IV6KX`]%8J4SCPEB]8TX)1.png
    按键按下一段时间才松开的发射脉冲:
    一个命令发送一次,即使在遥控器上的按键仍然按下。当按键一直按下时,第一个110ms的脉冲与上图一样,之后每110ms重复代码传输一次。返个重复代码是由一个9ms的高电平脉冲和一个2.25ms低电平和560μs的高电平组成,直到按键释放。
    P7ZRO8SZT94NT(O~0`1}OG2.png
    红外接收头的引脚与连线
    如下图将VOUT接到模拟口,GND接到实验板上的GND,VCC接到实验板上的+5v
    X3R~RBTC(_13U8UFJQN_KZ6.png
    实验连线
    如下图将红外接收头按照上述方法接好,将VOUT接到数字11口引脚,将LED灯通过电阻接到数字引脚2,3,4,5,6,7
    VDY~0PBL2SLU7[QWFYDC]OT.png
    遥控器键值
    可先用串口显示对应按键编码,再修改程序使之匹配,以适应不同遥控器

    示例遥控器按键编码
    “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-红外遥控里的库文件夹“IRremote”Arduino的安装目录:Arduino\libraries目录下,缺失库文件可能编译出错。
    参考源程序如下:
    1. #include <IRremote.h>
    2. int RECV_PIN = 11;
    3. int LED1 = 2;
    4. int LED2 = 3;
    5. int LED3 = 4;
    6. int LED4 = 5;
    7. int LED5 = 6;
    8. int LED6 = 7;
    9. long on1  = 0x00FF6897;//编码示例,与发送匹配用
    10. long off1 = 0x00FF30CF;
    11. long on2 = 0x00FF9867;
    12. long off2 = 0x00FF18E7;
    13. long on3 = 0x00FFB04F;
    14. long off3 = 0x00FF7A85;
    15. long on4 = 0x00FF10EF;
    16. long off4 = 0x00FF42BD;
    17. long on5 = 0x00FF38C7;
    18. long off5 = 0x00FF4AB5;
    19. long on6 = 0x00FF5AA5;
    20. long off6 = 0x00FF52AD;
    21. IRrecv irrecv(RECV_PIN);
    22. decode_results results;
    23. // Dumps out the decode_results structure.
    24. // Call this after IRrecv::decode()
    25. // void * to work around compiler issue
    26. //void dump(void *v) {
    27. //  decode_results *results = (decode_results *)v
    28. void dump(decode_results *results) {
    29.   int count = results->rawlen;
    30.   if (results->decode_type == UNKNOWN)
    31.     {
    32.      Serial.println("Could not decode message");
    33.     }

    34. else
    35.    {
    36.     if (results->decode_type == NEC)
    37.       {
    38.        Serial.print("Decoded NEC: ");
    39.       }
    40.     else if (results->decode_type == SONY)
    41.       {
    42.        Serial.print("Decoded SONY: ");
    43.       }
    44.     else if (results->decode_type == RC5)
    45.       {
    46.        Serial.print("Decoded RC5: ");
    47.       }
    48.     else if (results->decode_type == RC6)
    49.       {
    50.        Serial.print("Decoded RC6: ");
    51.       }
    52.      Serial.print(results->value, HEX);
    53.    
    54. Serial.print(" (");
    55.      Serial.print(results->bits, DEC);
    56.      Serial.println(" bits)");
    57.    }
    58.      Serial.print("Raw (");
    59.      Serial.print(count, DEC);
    60.      Serial.print("): ");
    61.   for (int i = 0; i < count; i++)
    62.      {
    63.       if ((i % 2) == 1) {
    64.       Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
    65.      }
    66.     else
    67.      {
    68.       Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
    69.      }
    70.     Serial.print(" ");
    71.      }
    72.       Serial.println("");
    73.      }
    74. void setup()
    75. {
    76.   pinMode(RECV_PIN, INPUT);  
    77.   pinMode(LED1, OUTPUT);
    78.   pinMode(LED2, OUTPUT);
    79.   pinMode(LED3, OUTPUT);
    80.   pinMode(LED4, OUTPUT);
    81.   pinMode(LED5, OUTPUT);
    82.   pinMode(LED6, OUTPUT);
    83.   pinMode(13, OUTPUT);
    84.   Serial.begin(9600);

    85.   irrecv.enableIRIn(); // Start the receiver
    86. }
    87. int on = 0;
    88. unsigned long last = millis();/*应用millis函数可获取机器运行的时间长度,单位ms。系统最长的记录时间为9小时22分,如果超出时间将从0开始。函数返回值为unsigned long型,无参数。 */
    89. void loop()
    90. {

    91. if (irrecv.decode(&results))
    92.    {
    93.     // If it's been at least 1/4 second since the last
    94.     // IR received, toggle the relay
    95.     if (millis() - last > 250)
    96.       {
    97.        on = !on;
    98. //       digitalWrite(8, on ? HIGH : LOW);
    99.        digitalWrite(13, on ? HIGH : LOW);
    100.        dump(&results);
    101.       }
    102.     if (results.value == on1 )
    103.        digitalWrite(LED1, HIGH);
    104.     if (results.value == off1 )
    105.        digitalWrite(LED1, LOW);
    106.     if (results.value == on2 )
    107.        digitalWrite(LED2, HIGH);
    108.     if (results.value == off2 )
    109.        digitalWrite(LED2, LOW);
    110.    
    111. if (results.value == on3 )
    112.        digitalWrite(LED3, HIGH);
    113.     if (results.value == off3 )
    114.        digitalWrite(LED3, LOW);
    115.     if (results.value == on4 )
    116.        digitalWrite(LED4, HIGH);
    117.     if (results.value == off4 )
    118.        digitalWrite(LED4, LOW);
    119.     if (results.value == on5 )
    120.        digitalWrite(LED5, HIGH);
    121.     if (results.value == off5 )
    122.        digitalWrite(LED5, LOW);
    123.     if (results.value == on6 )
    124.        digitalWrite(LED6, HIGH);
    125.     if (results.value == off6 )
    126.        digitalWrite(LED6, LOW);      
    127.     last = millis();     
    128.     irrecv.resume(); // Receive the next value
    129.   }
    130. }   
    复制代码




    回复

    使用道具 举报

    *滑动验证:
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表