|
学习型遥控器的制作
起因
我翻开存满制作的抽屉,找出了2009年用51单片机做的遥控器(图1)。那款遥控器的单片机软件我并没有完整地完成,因此还不能成为空调遥控器,只能通过它来读取红外的逻辑“1”和逻辑“0”的长度,然后,通过串口在计算机上显示。那款遥控器使用AT89C2051作为控制芯片,用了红外一体接收头来接收红外信号,用AT24C02存储芯片来存储红外逻辑数据。由于AT89C2051仅有128字节的RAM,不能超过40个编码,当读取比较长的编码时就没地方存放了。而空调包含了许多的参数信息,这些信息数据要通过遥控器一起传输,因此空调的遥控编码比较多(我家的空调有200个左右的逻辑数据)。显然,51单片机做的那款遥控器不能达到应用要求了。升级遥控器,我首选了目前经常使用的型号为ATMEGA8的AVR单片机。它有1KB的RAM,完全可以轻易记录下200个左右的逻辑编码。
红外学习型遥控器的主要功能是学习,意思是“复制”其他红外遥控器,取而代之。所谓“复制”,就是复制后的遥控器的所有功能与原遥控器一模一样。否则,就不能算成功的“复制”。 学习型红外遥控,可以分为两类:以固定码格式学习的遥控器和波形拷贝方式学习的遥控器。前者,需要收集各种不同种类的遥控器信号,然后进行识别比较,最后再记录。但是,要实现几乎所有的红外遥控器的成功复制就太难了。因为,红外遥控器的红外编码格式变化太多。不过这种学习型遥控器对硬件要求相对简单,处理器的工作频率可以不高,存储容量也较小,其缺点是对未知编码的遥控器无效。后者主要是把原始遥控器所发出的信号进行完全拷贝,而不管遥控器是什么格式,存储在EEPROM等存储器中。当发射时,只需将储存器中记录的波形长度还原成原始信号即可。这种学习型遥控器对MCU的主频要求高,RAM要求较大,其优点是对任何一种红外遥控器都可以进行学习。所以,我以第二种方案进行设计。 红外学习遥控器的学习功能在某些应用场合非常有用。但是,学习遥控器的使用,需要原来的遥控器,没有原来的遥控器,学习功能就无法实现了,这也算一个缺点吧。 所需元器件及材料: 编号 零件名称 数量 1 16MHz晶振 1
由于使用的SST25VF040存储芯片的封装比较小,所以笔者通过转接板,把SOIC封装转接为DIP封装,方便了后期的制作。 电路原理
实验证明,整个电路可以在2.3~4.2V电压下正常工作,可以使用2节1.5V电池作为它的工作电源。我使用的是3.6V可充电电池。
之前,我使用了HS38B红外一体接收头,但要录制红外信号时,电源电压必须大于4.0V才能正常录制。后来,我购买了低工作电压(2.0~4.2V)的红外一体接收头,具体型号没关系,只要引脚兼容就可以。 设计要点介绍
1.?红外编码方式
常用的红外遥控包括两种调制方式:PWM(脉冲宽度调制)和PPM(脉冲位置调制)。 PWM(脉冲宽度调制):以发射红外载波的宽度来代表“0”和“1”。例如常用的VCD、DVD遥控器,其“0”为载波发射0.56ms、不发射0.56ms; “1”为载波发射0.56ms、不发射1.68ms。此外,还有引导码,一般为载波发射9ms,不发射4.5ms。 PPM(脉冲位置调制):以发射载波的位置表示“0”和“1”。从发射载波到不发射载波为“0”,从不发射载波到发射载波为“1”。其发射载波和不发射载波的时间相同,都为0.68ms,也就是每位的时间是固定的。还有一种不常用的调制方式:FSK(频移键控调制)。 频移键控用两种不同的频率代表“0”和“1”。例如,发射0.6ms的30kHz载波代表“0”,发射0.6ms的40kHz代表“1”。当然,这种方式不太常用。 通过以上对编码方式的分析,可以得出以某种固定格式的“0”和“1”去学习红外信号的方法。这种方法虽然能有效地减少系统开销,但解码的成功率大大降低。另外,由于空调的遥控状态远多于电视机、DVD等。因为它需要传输大量参数,如温度、风力、湿度、加热、制冷等,并且也没有一个统一的标准。如果按“位”的方式来记录,复制成功率会大大降低。那么,怎样才能完善地记录下遥控数据呢?——合适的单片机就能为这些数据提供存储空间。
2.?红外一体接收头的使用
图7中HS38B的引脚从左到右分别是:输出[OUT]、地[GND]、电源[VCC]。 图8~图10是我实验时红外一体接收头接收到的逻辑数据。为了使录制时的遥控器逻辑电平,和发射时的逻辑电平一致。我在输出端接了耦合电容,起到逻辑电平翻转的作用。当然,在制作遥控器时,耦合电容是不需要的,通过软件翻转即可。 每张图上面的两个波形(蓝颜色的),是遥控器发射时的逻辑波形;下面两个波形(红色的)是笔者制作的遥控器的波形。这些波形在自制的遥控器录制好红外编码后通过红外发射管发射出的。 程序设计思路
单片机程序通过记录逻辑电平的长度来实现红外遥控的编码记录。当然,它的明显缺点是需要占用较大的RAM空间。但是它的学习成功率,比以某种固定长度记录“0”和“1”来学习红外信号的要高。 程序要先判断电路中的REC按钮是否被按下。按下后,LED灯常亮,进入录制模式。按下需要分配的按钮,如SB1,LED灭半秒后,又亮起,表示确认。现在,就可以拿起遥控器,对准红外一体接收头,按下要录制的按钮。录制好一次后,LED会灭半秒后再次亮起。需要再录一次,录制成功后LED灯就会完全灭了。现在才算真正完成了录制。为什么要录制两次呢?因为,有些遥控器的编码是交错的。奇数和偶数次的编码数据是不一样的,即第1次和第2次按下同一个按钮,它的编码是不一样的。但是,第1、3、5次或第2、4、6次按下的按钮编码是一样的。通常,遥控器的电源按钮的开和关,也是不一样的编码。我家里的空调遥控器开和关虽是同一个按钮,但是编码却是不一样的。 M8的定时器1工作在16位的定时器模式下,并设定为8分频,用于记录逻辑电平的长度,并用2字节,记录下逻辑电平的长度。当200ms左右,红外一体接收头没有电平变化,记录就自动完成了。 此时,数据还在M8的RAM中。由于录制前已经分配好按钮号(SB1~SB7),程序会把红外编码保存到SST25VF存储器对应的分配空间里,一个按钮固定占用1KB的存储器空间。
二、红外发射
M8的INT1引脚设置为输入模式,等待下降沿中断。8个按钮对应的引脚全部输出0。当任意一个按钮按下后,就会产生下降沿中断。此时,程序在INT1中断函数中,设置INT1引脚输出0,同时8个按钮设置为输入状态。这时读取接钮的引脚状态,如果为0,就判断它被按下了,如果为1就判断没有按下。 当录制好红外编码后,(SB1~SB7)的某个按钮按下。程序会从SST25VF存储器中载入对应的按钮编码波形,并通过38kHz的载波发射。 最终做了一版如下图所示 学习型红外遥控器实现功能如下:
使用方法
程序使用ISP下载线更新,如图6所示。下载口共10根插针,其中4根和单片机连接,2根用于供电。如果要使用ISP下载线中的电源(2和10引脚)供电,需要拔下SST存储芯片,防止过高的电压损坏存储芯片。
|
|
|