|
A.需求的产生
实现遥控无疑是一件很酷的事情.
不过对于一件非商业出售的电器,配个遥控器实在是有些累赘.
试想现在谁家不是一堆遥控器呀! TV,VCD,DVD,DVB,电风扇,音响,空调.......
而时常出现的问题有:
1. 遥控器因为太多,要用的时候不知道哪个是哪个.
2. 忘记把没电的电池拿下来,结果要用时发现....#$%^$^%#$%%^&
但如果全部使用高级电池,则全部成本起码需要上百RMB.
在这次STM32-Netradio 项目上面,也很需要一个遥控器.
考虑到以面提及的问题,如果再为这个配一个专用的遥控器,则成本就高了.
而且,家里又多了一个遥控器,我想这是大家都不愿意的事情.
于是,产生了做一个自学习型遥控的需求.
有需要就有动力,开始着手研究.
下图是两个不同的遥控器的不同按键的编码.
![](http://./bbs_upload/files_25/ourdev_531877.jpg)
![](http://./bbs_upload/files_25/ourdev_531878.jpg)
B.确定实现方案
我们可以把每个电平跳变的时间戳记录下来,然后下次再次接收到信号时同源数据进行比对.
如果完全符合(根据实际情况需要做允许偏差,一般1%就可以很好的识别了),就认为是同一
按键.
C.如何取得遥控编码数据
在对数据的接收上面,最好是使用"捕获" 功能,这样直接实现了中断和时间戳.
在没有"捕获" 功能的硬件上面,可以使用电平跳变中断和定时器来配合.
D.如何得到样本数据
因为在匹配过程上需要源样本数据,所以,还需要有一个学习程序,把某个键的编码完全记
录下来并保存备用(最好是存储在存储器里面,这样下次启动就可以直接读取出来使用了).
从上面两个图片来看,我们只需要记录并保存100ms 以内的所有编码就可以了.
E.具体实例
在STM32-NETRADIO 上,定义一个全局变量rem_mode 来标示当前的工作状态.
默认为关闭状态,启动后,从文件系统读取样本数据.
如果解读成功,就设置rem_mode 为正常解码状态,
接收到遥控信号后和样本进行比对,完全符合就产生对应的事件.
然后有一个学习程序,执行学习程序后,会先把rem_mode 设置为学习状态,
然后提示你按对应的键盘,程序会记录并保存这100ms 内的数据;
然后在提示接下一个键.......直到所有的键都采集到并保存到文件里面.
同时把新的样本数据更新到样本数据表里面.然后再把rem_mode 设置为正常解码状态,
学习程序到此结束.此时可以用遥控来操作了.
F.局限性和注意事项
1.只适合单帧且单帧长度在100ms 以内的的遥控器.(对于单帧的长度,还有改进的空间)
像下面这个遥控器(结构:起始帧,数据帧,结束帧,数据帧,结束帧,数据帧,结束帧......)
以及空调遥控器(空调遥控一次性发送全部设置数据),目前还没办法兼容.
![](http://./bbs_upload/files_25/ourdev_531879.jpg)
如果要能兼容上面的遥控器,可以使用更复杂的算法,不过对于空调遥控则是不考虑了.
2.不支持连按.(要实现连按的代价较大,但在需要时也可以实现)
aozima 2010-02-02
点击此处下载 ourdev_531871.pdf(文件大小:263K) (原文件名:实现自学习型遥控.pdf)
DEMO代码,仅做思路参考.ourdev_531872.zip(文件大小:4K) (原文件名:remote.zip) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|