还记得大一的时候开始学习单片机,那时候就接触了红外接收,也正常通信过,用的是配套的遥控器。后来发现实验室的开发板上还有一个红外发射头,既然如此,为什么不去做一个红外遥控器呢?
说干就干,还记得那时大二暑假的时候,在家里闲着没事,就想做一个红外遥控器控制家里的电器,首先想要控制的是家里的电视(创维的),
傻傻的:
当时是电视的遥控器,直接用原来的红外接收程序接收,结果发现就算一直按一个按键,它的码也总是会变(笑死),当时可能还是懵懂的状态,一直都没有找到原因,后来听说要用示波器测(或者逻辑分析仪),因为我没有这些玩意,后来就搁置了。
在大二下学期,当时花了二十多大洋买了一个小型的逻辑分析仪,就又折腾了一下,通过红外接收和逻辑分析仪,再加上一个遥控器,齐活,胡乱搞了一通,算是能实现实验室空调的一些简单的控制,算是基本成功了吧。
为什么又要做个遥控器呢,原因有二:
其一:因为我舍友在底下自习室,别人把空调总是开的很低,他身体受不了,他就想着调高一点,奈何他手机没有红外,空调又没有遥控器,都没有,那就只能做一个了。
其二:因为立创EDA最近有一个活动,既然有活动,那肯定有奖励啊,贯彻白嫖精神,必须得参加啊,但白嫖也是有原则的,(总要做点什么东西吧),于是就做个红外遥控器吧。
红外遥控有发送和接收两个部分组成。发射端采用单片机将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红外发射管发射红外信号。红外接收完成对红外信号的接收、放大、检波、整形、并解调出遥控编码脉冲。
红外遥控发射装置,其主要元件为红外发光二极管,单只红外发光二极管的发射功率约为100mw。
红外遥控的控制距离约为10米。
最常见的数据协议是:NEC编码。
还有其他协议:ITT 、a Nokia 、NRC、Sharp、Sony
红外遥控协议组成: 一般是引导码、用户码、按键码、重复码、按键反码、结束码等组成。
红外遥控载波频率: 33K 、 36K 、 36.6K 、 38K 、 40K 、 56K 。常用38K,以37.916K最准确。红外载波占空比:1/3 、1/2、不常用的有1/4。
红外遥控发射采用PPM编码方式,当发射时,将发射一组108ms的编码脉冲。遥控编码脉冲由前导码、16位地址码(8位地址码、8位地址码的反码)和16位操作码(8位操作码、8位操作码的反码)组成。
通过对用户码的检验,每个遥控器智能控制一个设备动作,这样可以有效地防止多个设备之间的干扰。
编码后面还要有编码的反码,用来检测编码接收的正确性,防止误操作,增强系统的可靠性。
前导码是一个遥控器的起始部分,由一个9ms的高电平(起始码)和一个4.5ms的低电平(结果码)组成,作为接收数据的准备脉冲。
以脉宽为0.56ms、周期为1.12ms的组合表示二进制的”0“,以脉宽为1.68ms、周期为2.24ms的组合表示二进制的”1“。
1 、单片机配置寄存器,开启P32脚下降沿中断和定时器中断,定时器推荐使用 8 位自动重装,最大定时96us.
2 、当引导码38KHz红外照射接收器的时候,接收器输出低电平给单片机P3.2脚,触发下降沿中断 。
3 、先保存定时器的时间值,然后清零定时器的自定义变量(不是寄存器) ) 。
4 、下一次38KHz来临的时候,继续触发下降沿中断。和前面一次一样。都是先保存时间值,再清零自定义变量。
5 、上述 2次下降沿中间的时间差,就是红外遥控器的最基本时间差。
6 、根据时间长短,判断正确的引导码出现后,保存后来紧接的32个时间长度(即连续的下降沿,时间差) ) 。
7 、分 4次、分别判断8位数据的时间长度。根据协议识别出1和0。 8位是低位在前高位在后。
8 、 整个NRC协议的顺序是 :9ms+4.5ms 引导码 、8位用户机器码 、8位机器反码 、8位按键码 、8位按键反码。
首先有一个空调的遥控器和一个红外接收头,还需要一个逻辑分析仪和带的上位机软件。
首先我们需要先知道空调遥控器的编码格式
我们把逻辑分析仪的一个通道接到红外接收头的数据引脚,然后打开上位机逻辑分析仪,
点击start开始采集,在采集的过程中我们按下遥控器要解码的一个按键。
之后逻辑分析仪就会出现一个波形,
如下:
这里我已经把波形表示的是0还是1都已经写出来了。
要记得编码的格式是:
每8个二进制数据是一个字节,然后这8个二进制是按从低到高开始发送的,
例如:1011 0010 表示第一个字节
那么我们知道前面的是低位,后面的是高位,所以从高到低应该是0100 1101 正确的编码是4D,后面也是如此。
这里我测的是关空调的指令,所以得出结论,关空调的指令是
uchar code ir_close[6]= {
0x4D,0xB2,0xDE,0x21,0x07,0xF8};//关空调指令
后面的测试也是类似的,我就不写出来了。
下面是美的空调(型号:RN02U/BG)的一些编码。
== 固定编码==
下面这些编码是固定的,不改变。
unsigned char shangxiafeng[6] = {
0x9D,0x62,0xAF,0x50,0x20,0xDF}; //上下风
unsigned char zuoyoufeng[6] = {
0x9D,0x62,0xAF,0x50,0xE0,0x1F}; //左右风
== 不固定编码==
下面这些编码不是固定的,是组合编码。
关于组合编码的格式:
4D B2 :这两个码是固定的
第三个字节:表示风速
第四个字节:表示风速的反码
第五个字节:高4位表示模式,低四位表示温度
第六个字节:高4位表示模式的反码,低4位表示温度的反码
4D B2 FD 02 3A C5
FD 02代表风速大小
3 C代表模式
A 5代表温度
模式:
1.自动 1110 E
2.制冷 1111 F
3.抽湿 1101 D
4.制热 1100 C
风速
AU: FD 02
20%:FF 00
40%:F9 06
60%:FA 05
80%:FC 03
F%(测试不成功):FC 03
温度:
17: 0000 0 18:1000 8 19:1100 C
20:0100 4 21:0110 6 22:1110 E
23:0101 A 24:0100 2 25:1100 3
26:1011 B 27:1001 9 28:0001 1
29:1010 5 30:1101 D
将程序烧录到开发板,验证即可。
主控芯片我采用的是STC8A8K-44脚的单片机,主要是因为我手里头还有两个。这个功能也是非常强悍的,但我都没有用到,有点浪费了。
之前那个红外电路不能正常工作,捣鼓了好久,就是不行。之前开发板上有一个红外发射,我换成那个电路就可以工作了。
为什么我要加一个显示屏呢,这是因为我需要显示当前空调的一些状态信息,这样我就能清楚直观的看到空调的当前状态,方便我进行下一步操作。
因为是遥控器吗,那么肯定是便携式的,那肯定要加一个电池,电池是3.7V左右,我的单片机工作在5V,那么肯定要转换为5V。
既然我们都用到电池,那么肯定要有充电电路,电池没电了,总不能把电池扣下来,充好电再装上去吧,太麻烦,直接插电充。
因为空调的控制按键比较多,这里我就用了一个4x4的矩阵按键,
这样可以用更少的IO口控制更多的按键,可以节省单片机资源。
这个是扩展功能,后续会在屏幕上显示当前的时间,这样,可以更大的利用单片机的资源。
这个也是扩展模块,后续如果想做成学习型的红外遥控器,那么保存数据肯定少不了,这个模块可以存储数据,并且速度也不慢。
这也是扩展模块。后续想要做成联网的,只要把遥控器放到空调旁边,通过手机就可以控制空调的打开和关闭,实现远程控制,这个应用也是非常方便的。
首先我们要确定电源没有问题,因为这个是内部晶振,所以晶振不用管,焊接这一部分之后,我们就可以看看是否能把程序烧录到单片机。
这一部分如果没有问题的话,基本就成功了,后续都是辅助。
升压电路是把电池的3.7V升压到5V。
这一部分是扩展电路,我们需要就焊,不焊也没有影响
背面是按键的一些电阻,蜂鸣器的三极管,红外的三极管
焊接完这一部分,我们基本就焊接完毕
最后我们下载程序,可以出现这个界面,按每个按键(看丝印)执行对应的功能。