1、红外接收头介绍 

一、什么是红外接收头? 

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

二、工作原理 

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

三、红外接收头的引脚与连线 

红外接收头有三个引脚如下图:

用的时候将VOUT接到模拟口,GND接到实验板上的GND,VCC接到实验板上的+5v。

红外遥控实验 

1、实验器件 

红外遥控器:1个

红外接收头:1个

LED灯:6个

220Ω电阻:6个

多彩面包线:若干

2、实验连线 

首先将板子连接好;接着将红外接收头按照上述方法接好,将VOUT接到数字11口引脚,将LED灯通过电阻接到数字引脚2,3,4,5,6,7。返样就完成了电路部分的连接。

3、实验原理 

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

·NEC协议介绍:特点:(1)8位地址位,8位命令位

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

(3)脉冲位置调制

(4)载波频率38khz

(5)每一位癿时间为1.125ms戒2.25ms

·逻辑 0和1的定义如下图

协议如下:

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

上面图片显示了NEC的协议典型的脉冲序列。注意:这首先发送LSB(最低位)的协议。在上面癿脉冲传输的地址为0x59命令为0x16。一个消息是由一个9ms的高电平开始,随后有一个4.5ms的低电平,(返两段电平组成引寻码)然后由地址码和命令码。地址和命令传输两次。第二次所有位都取反,可用于对所收到的消息中的确认使用。总传输时间是恒定的,因为每一点与它取反长度重复。如果你不感兴趣,你可以忽略这个可靠性取反,也可以扩大地址和命令,以每16位!

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

一个命令发送一次,即使在遥控器上的按键仍然按下。当按键一直按下时,第一个110ms癿脉冲与上图一样,之后每110ms重复代码传输一次。返个重复代码是由一个9ms的高电平脉冲和一个2.25ms低电平和560μs癿高电平组成。

·重复脉冲

注意:脉冲波形进入一体化接收头以后,因为一体化接收头里要迕解码、信号放大和整形,故要注意:在没有红外信号时,其输出端为高电平,有信号时为低电平,故其输出信号电平正好和发射端相反。接收端脉冲大家可以通过示波器看到,结合看到的波形理解程序。

线路连接图:

  1. #include <IRremote.h>
  2. int RECV_PIN = ;
  3. int LED1 = ;
  4. int LED2 = ;
  5. int LED3 = ;
  6. int LED4 = ;
  7. int LED5 = ;
  8. int LED6 = ;
  9. long on1 = 0x00FFA25D;
  10. long off1 = 0x00FFE01F;
  11. long on2 = 0x00FF629D;
  12. long off2 = 0x00FFA857;
  13. long on3 = 0x00FFE21D;
  14. long off3 = 0x00FF906F;
  15. long on4 = 0x00FF22DD;
  16. long off4 = 0x00FF6897;
  17. long on5 = 0x00FF02FD;
  18. long off5 = 0x00FF9867;
  19. long on6 = 0x00FFC23D;
  20. long off6 = 0x00FFB047;
  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. Serial.print(" (");
  54. Serial.print(results->bits, DEC);
  55. Serial.println(" bits)");
  56. }
  57. Serial.print("Raw (");
  58. Serial.print(count, DEC);
  59. Serial.print("): ");
  60.  
  61. for (int i = ; i < count; i++)
  62. {
  63. if ((i % ) == ) {
  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.  
  75. void setup()
  76. {
  77. pinMode(RECV_PIN, INPUT);
  78. pinMode(LED1, OUTPUT);
  79. pinMode(LED2, OUTPUT);
  80. pinMode(LED3, OUTPUT);
  81. pinMode(LED4, OUTPUT);
  82. pinMode(LED5, OUTPUT);
  83. pinMode(LED6, OUTPUT);
  84. pinMode(, OUTPUT);
  85. Serial.begin();
  86.  
  87. irrecv.enableIRIn(); // Start the receiver
  88. }
  89.  
  90. int on = ;
  91. unsigned long last = millis();
  92.  
  93. void loop()
  94. {
  95. if (irrecv.decode(&results))
  96. {
  97. // If it's been at least 1/4 second since the last
  98. // IR received, toggle the relay
  99. if (millis() - last > )
  100. {
  101. on = !on;
  102. // digitalWrite(8, on ? HIGH : LOW);
  103. digitalWrite(, on ? HIGH : LOW);
  104. dump(&results);
  105. }
  106. if (results.value == on1 )
  107. digitalWrite(LED1, HIGH);
  108. if (results.value == off1 )
  109. digitalWrite(LED1, LOW);
  110. if (results.value == on2 )
  111. digitalWrite(LED2, HIGH);
  112. if (results.value == off2 )
  113. digitalWrite(LED2, LOW);
  114. if (results.value == on3 )
  115. digitalWrite(LED3, HIGH);
  116. if (results.value == off3 )
  117. digitalWrite(LED3, LOW);
  118. if (results.value == on4 )
  119. digitalWrite(LED4, HIGH);
  120. if (results.value == off4 )
  121. digitalWrite(LED4, LOW);
  122. if (results.value == on5 )
  123. digitalWrite(LED5, HIGH);
  124. if (results.value == off5 )
  125. digitalWrite(LED5, LOW);
  126. if (results.value == on6 )
  127. digitalWrite(LED6, HIGH);
  128. if (results.value == off6 )
  129. digitalWrite(LED6, LOW);
  130. last = millis();
  131. irrecv.resume(); // Receive the next value
  132. }
  133. }

五、程序功能 

对遥控器发射出来的编码脉冲进行解码,根据解码结果执行相应的动作。返样大家就可以用遥控器遥控你的器件了,让它听你的指挥。

实验截图: 

基于Arduino的红外遥控的更多相关文章

  1. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

  2. 基于arduino的红外传感系统

    一.作品背景 在这个科技飞速发展的时代,物联网已经成为了我们身边必不可少的技术模块,我这次课程设计做的是一个基于arduino+树莓派+OneNet的红外报警系统,它主要通过识别人或者动物的运动来判断 ...

  3. 基于STM32的红外遥控重点解析

    本文有两个内容:一.红外遥控协议的的讲解:二.解码程序解析(参考正点原子的代码) 红外的介绍.优点.缺点就不给大家说了,进入正题 一.红外遥控协议的的讲解 红外遥控的编码目前广泛使用的是:NEC Pr ...

  4. 基于Arduino、STM32进行红外遥控信号接收

    catalogue . 遥控器原理简介 . 红外遥控原理 . 常见红外遥控器红外线信号传输协议 . 遙控器的发展 . 实验过程 . 攻击面 . 基于STM32实现红外信号解码 1. 遥控器原理简介 0 ...

  5. Arduino红外遥控系列教程2013——红外转码

    教程三:红外转码教程——用电视遥控器取代机顶盒遥控器 前言前段时间看到了使用红外遥控的X-Bot机器人[链接],感觉很有意思.最近开始玩Arduino与红外,一方面打算将来用于BOXZ的之间的通讯控制 ...

  6. arduino红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法

    最近在调试红外遥控格力空调,在论坛中学到了不少东西.参考: (1)<解决问题系列(4)——红外编码分析利器使用> (2)<315Mhz模块传输替代315Mhz遥控器> 调试环境 ...

  7. 基于STC89C52的oled红外遥控闹钟

    这个红外遥控主要是程序通过对按下的键的键码进行解析,并运行相应的功能代码 一次按键动作的遥控编码信息为 32 位串行二进制码.对于二进制信号“0”,一个脉冲占 1.2ms:对于二进制信号“1”,一个脉 ...

  8. 红外遥控NEC协议使用总结

    最近做了一个调试红外遥控三色灯的实习,花了一个多月的时间研究基于NEC协议的红外遥控,下面是这次实习技术方面的总结. 一.NEC协议特征: 8位地址和8位命令长度 每次传输两遍地址(用户码)和命令(按 ...

  9. STM32之红外遥控信号自学习实现

    一.序言 很早前就想实现这个红外遥控自学习的这个实验,用于来自己控制房子里如空调等红外遥控设备的自动化,NEC的标准到具体的产品上可能就被厂家定义为不一样了,所以自学习就应该是接收到什么就发送什么,不 ...

随机推荐

  1. jar包运行

    配置mainClass:            <plugin>                <groupId>org.apache.maven.plugins</gr ...

  2. window10+python3.7安装tensorflow--gpu tensorflow 安装

    能安装GPU的前提是:1.显卡支持CUDA (1)右击我的电脑–属性 (2)打开设备管理器   (3)显示适配器 我的电脑是支持CUDA的 2.pip 版本 >= 8.1查看pip版本 :pip ...

  3. java三大循环结构

    用于处理需要重复执行的操作: 根据判断条件的成立与否,决定程序段落的执行次数,而这个程序段落我们称为循环体: while:事先不需要知道循环执行多少次: do  while:同上,只是至少要执行一次( ...

  4. [转]SpringBoot整合Swagger2以及生产环境的安全问题处理

    1.创建springboot项目 https://www.cnblogs.com/i-tao/p/8878562.html 这里我们使用多环境配置: application-dev.yml(开发环境) ...

  5. CF351E Jeff and Permutation

    CF351E Jeff and Permutation 贪心好题 考虑每个对能否最小化贡献和 先不考虑绝对值相同情况 发现,对于a,b假设|a|<|b|,那么有无贡献只和b的正负有关!如果a在b ...

  6. 2019-9-2-Visual-Studio-自定义项目模板

    title author date CreateTime categories Visual Studio 自定义项目模板 lindexi 2019-09-02 12:57:38 +0800 2018 ...

  7. P1040 快速幂取模

    题目描述 给你三个正整数a,b,m,请你求出 \(a^b \bmod m\) 的结果. 输入格式 一行三个整数 \(a,b,m(1 \le a,b,m \le 10^9)\) . 输出格式 一个整数, ...

  8. Canvas学习实践:一款简单的动画游戏

    最近学习了下Canvas绘图...突发奇想就有了下面这款简单的小游戏,纯属娱乐~ 废话不多说,直接上代码: <!DOCTYPE html> <html lang="zh&q ...

  9. 聊聊固态硬盘1--人生头两块SSD

    第一块固态硬盘--浦科特m6s   来源:京东双11   价格:319rmb           第二款固态--饥饿鲨ocz arc100   来源:美国亚马逊 黑色星期五 价格:366rmb     ...

  10. [译] 重新思考 1 号进程 / Rethinking PID 1

    By Lennart Poettering 译 SReadFox 原文链接:http://0pointer.de/blog/projects/systemd.html 译注:笔者大约在 2011 年读 ...