红外遥控器是我们常用的一种遥控设备。你可以用它控制电视、空调、音响等家用电器,同时也可以改造家里的电饭煲、咖啡机和微波炉等传统家电。想象一下只用一个遥控器就能搞定所有的家用电器控制,只需要搭配Arduino控制器、继电器和红外遥控器套件,就可以搭建一个智能家用电器平台。
1、红外遥控器通信原理
红外遥控器有两部分组成:红外发射装置(红外遥控器)和红外接收装置(红外接收头)。
红外发射装置(红外遥控器)发出的信号是一连串的二进制脉冲码为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管发射出去。
红外接收装置(红外接收头)内置接收管将红外发射管发射出来的光信号转换为微弱的电信号,此信号经由IC内部放大器进行放大,然后通过自动增益控制、带通滤波、解调变、波形整形后还原为遥控器发射出的原始编码,经由接收头的信号输出脚输入到电器上的编码识别电路。
2、NEC协议
想对某一遥控器进行解码必须要了解该遥控器的编码方式,我选用的这款遥控器产品使用的编码方式为:NEC协议。
NEC协议特点如下所示:
8位地址位,8位命令位;
为了可靠性地址位和命令位被传输两次;
脉冲位置调制;
载波频率38khz;
每一位的时间为1.125ms或2.25ms。
NEC协议表示逻辑0和1的定义如下图:
具体协议分析如下所示:
按键按下立刻松开的发射脉冲典型序列如下所示:
在上面的脉冲传输的地址为0x59命令为0x16。一个消息是由一个9ms的高电平开始,随后有一个4.5ms的低电平,(这两段电平组成引导码)然后由地址码和命令码。地址和命令传输两次。第二次所有位都取反,可用于对所收到的消息中的确认使用。总传输时间是恒定的,因为每一点与它取反长度重复。如果你不感兴趣, 你可以忽略这个可靠性取反,也可以扩大地址和命令,以每16位。
按键按下一段时间才松开的发射脉冲典型序列如下所示:
一个命令发送一次,即使在遥控器上的按键仍然按下。当按键一直按下时,第一个110ms的脉冲与上图一样,之后每110ms重复代码传输一次。这个重复代码是由一个9ms的高电平脉冲和一个2.25ms低电平和560μs的高电平组成。
重复脉冲典型序列如下所示:
注意:脉冲波形进入一体化接收头以后,因为一体化接收头里要进行解码、信号放大和整形,故要注意在没有红外信号时,其输出端为高电平,有信号时为低电平,故其输出信号电平正好和发射端相反。接收端脉冲大家可以通过示波器看到,结合看到的波形理解程序。
3、实践
根据NEC编码的特点和接收端的波形,本实验将接收端的波形分成四部分:引导码(9ms和4.5ms的脉冲)、地址码16位(包括8位的地址位和8位的地址的取反)、命令码16位(包括8位命令位和8位命令位的取反)、重复码(9ms、2.25ms、560us脉冲组成)。
利用定时器对接收到的波形的高电平段和低电平段进行测量,根据测量到的时间来区分:逻辑“0”、逻辑“1”、引导脉冲、重复脉冲。引导码和地址码只要判断是正确的脉冲即可,不用存储,但是命令码必须存储,因为每个按键的命令码都不同, 根据命令码来执行相应的动作。
设置遥控器上的几个按键VOL+:控制LED灯亮的;VOL-:作为控制蜂鸣器响。
实现代码如下所示: