基于Arduino的红外遥控

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 = 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  = 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 = 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
 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(13, OUTPUT);
 85   Serial.begin(9600);
 86
 87   irrecv.enableIRIn(); // Start the receiver
 88  }
 89
 90 int on = 0;
 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 > 250)
100       {
101        on = !on;
102 //       digitalWrite(8, on ? HIGH : LOW);
103        digitalWrite(13, 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 }

五、程序功能 

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

实验截图: 

原文地址:https://www.cnblogs.com/SkystarX/p/12180793.html

时间: 2024-10-13 16:47:02

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

基于arduino的红外传感系统

一.作品背景 在这个科技飞速发展的时代,物联网已经成为了我们身边必不可少的技术模块,我这次课程设计做的是一个基于arduino+树莓派+OneNet的红外报警系统,它主要通过识别人或者动物的运动来判断是否有人在附近再通过蜂鸣器的响叫来实现报警功能. 红外报警系统在生活中的应用也很广泛,例如博物馆的展品,家里的安防系统,公司的安防系统等,但是如何准确的报警,保证红外线的正确识别是这个系统的主要问题,本次的实践综合这些因素提出了比较靠谱的解决方案,用智能网关解决这一系列的问题. 二.元件原理 热释电

[原创]基于51单片机的红外遥控课程设计

[注]: 一眨眼,大学接近尾声,具有找工作需要,所以把大学做的电子设计“劣作”放上来.希望考研失意,还能赶上“好工作”的春招班车.如果大伙有什么工作推荐也可以联系我哦,因为一年考研少接触了这方面,所以难免有些生疏.但请相信我!给我机会我会很认真学的! 邮箱:[email protected] 转载请注明出处呀! 基于51单片机的红外遥控课程设计 目录 第一章 设计简介... 3 第二章 系统方案... 3 一.设计方案对比... 3 二.方案设计... 4 第三章 硬件设计... 5 一.红外遥

基于短消息的远程家电红外遥控系统

通过远程广域网控制家电设备是信息家电的主要发展方向之一.由于价格低廉.覆盖面广.使用方便等原因,短消息平台已经成为远程家电控制的重要方法. 本文研究和开发了一种基于短消息的远程红外遥控系统.该系统以Java语言应用程序作为客户控制终端,以短消息作为控制信号的传输平台,以家电常用的红外遥控器作为控制设备,形成了比较完备的远程家电控制系统原型. 本文首先分析了广域网传输技术.家电控制设备.客户控制终端等三个关键技术的选型问题,并据此提出了系统设计的总体结构. 随后,本文介绍了系统的硬件设计,着重讨论

基于STC12系列单片机的通用红外遥控信号分析程序(一)

前言 最近学51单片机学习到红外遥控解码与发送部分,开发板的相关教程只有NEC协议的解码,基本的解码套路是1838接收头输出管脚接单片机外部中断0,当接收到红外信号时产生下降沿触发中断,在中断函数中先延时9ms判断电平再延时4.5ms判断电平,从而跳过引导码:再分别延时560us.1690us左右不等的时间判断电平来解码“0”或“1”,直到结束:红外发送思路就是根据NEC协议及红外码值的二进制码分别控制高低电平,并延时相应的时间.但存在这么几个问题: 1. 解码逻辑写死在中断处理函数中,不方便扩

基于STC89C52的oled红外遥控闹钟

这个红外遥控主要是程序通过对按下的键的键码进行解析,并运行相应的功能代码 一次按键动作的遥控编码信息为 32 位串行二进制码.对于二进制信号“0”,一个脉冲占 1.2ms:对于二进制信号“1”,一个脉冲占 2.4ms,而每一脉冲内低电平均为 0.6ms.从起始标志到 32 位编码脉冲发完大约需80ms,此后遥控信号维持高电平.若按键未释放,则从起始标志起每隔 108ms 发出 3 个脉冲的重复标志.在 32 位的编码脉冲中,前 16 位码不随按键的不同而变化,我们称之为用户码.它是为了表示特定用

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

最近在调试红外遥控格力空调,在论坛中学到了不少东西.参考: (1)<解决问题系列(4)--红外编码分析利器使用> (2)<315Mhz模块传输替代315Mhz遥控器> 调试环境: 软件:Arduino IDE 1.0 硬件:Arduino uno r3 问题分> 我使用的遥控器型号是YAD0F. 在使用逻辑分析仪dump出原始码之后,使用sendRaw函数来发送原始码,发现空调没有反应.原始码如下: 9004,4499,699,1609,697,511,695,511,695

[每日电路图] 2、红外遥控电路原理设计与解析【转+解读】

          楼主说:本文主要讲一个红外遥控电路的原理及设计,第四部分是重点,用电路图说明具体过程——接收,计数,满足条件触发控制电路! from elecfans:http://www.elecfans.com/article/88/131/198/2015/20151215394306.html 一.概述: 红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波:红外接收电路由红外接收二极管.三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器.

基于arduino+web的物联网demo,web和微信控制

视频效果: 基于arduino+web的物联网demo,web和微信控制 基于arduino + web的物联网demo,实现了web和微信的多方式控制,折腾了好几周,终于完美解决了. 配件清单: Arduino uno3(主板) HLK-RM04(Uart串口转Wifi) 主板程序源码: String strs = ""; int led = 6; void setup() {    pinMode(led, OUTPUT);   Serial.begin(115200);//设置串

cortex_m3_stm32嵌入式学习笔记(二十三):红外遥控实验(输入捕捉+解码)

红外遥控是一种无线.非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中. 红外遥控的编码方式目前广泛使用的是: PWM(脉冲宽度调制)的 NEC 协议和 PhilipsPPM(脉冲位置调制) 的 RC-5 协议的.ALIENTEK MiniSTM32 开发板配套的遥控器使用的是NEC 协议,其特征如下: 1. 8 位地址和 8 位指令长度: 2.地址和命令 2 次传输(确保可靠性) 3. PWM