aozima 发表于 2010-2-2 17:38:20

[原创] 实现自学习型遥控 [应用于STM32网络收音机]

A.需求的产生
实现遥控无疑是一件很酷的事情.
不过对于一件非商业出售的电器,配个遥控器实在是有些累赘.
试想现在谁家不是一堆遥控器呀! TV,VCD,DVD,DVB,电风扇,音响,空调.......

而时常出现的问题有:
1. 遥控器因为太多,要用的时候不知道哪个是哪个.
2. 忘记把没电的电池拿下来,结果要用时发现....#$%^$^%#$%%^&
但如果全部使用高级电池,则全部成本起码需要上百RMB.

在这次STM32-Netradio 项目上面,也很需要一个遥控器.
考虑到以面提及的问题,如果再为这个配一个专用的遥控器,则成本就高了.
而且,家里又多了一个遥控器,我想这是大家都不愿意的事情.
于是,产生了做一个自学习型遥控的需求.
有需要就有动力,开始着手研究.

下图是两个不同的遥控器的不同按键的编码.
./bbs_upload/files_25/ourdev_531877.jpg
./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 以内的的遥控器.(对于单帧的长度,还有改进的空间)
像下面这个遥控器(结构:起始帧,数据帧,结束帧,数据帧,结束帧,数据帧,结束帧......)
以及空调遥控器(空调遥控一次性发送全部设置数据),目前还没办法兼容.
./bbs_upload/files_25/ourdev_531879.jpg
如果要能兼容上面的遥控器,可以使用更复杂的算法,不过对于空调遥控则是不考虑了.
2.不支持连按.(要实现连按的代价较大,但在需要时也可以实现)
                                                         aozima 2010-02-02




点击此处下载 ourdev_531871.pdf(文件大小:263K) (原文件名:实现自学习型遥控.pdf)
DEMO代码,仅做思路参考.ourdev_531872.zip(文件大小:4K) (原文件名:remote.zip)

12fen 发表于 2010-2-2 17:41:19

12

yangyi 发表于 2010-2-2 21:04:51

学习了.

chairang 发表于 2010-2-2 22:25:05

MARK

acer 发表于 2010-2-2 22:30:41

D.lovers 发表于 2010-2-2 22:46:35

mark

sz_ehome 发表于 2010-2-3 08:22:40

mark

cinderellah 发表于 2010-2-3 08:24:38

mark~好东西~

Yaksa 发表于 2010-2-3 09:05:02

嗯,这个很好玩,mark之

dragonwww 发表于 2010-2-8 14:15:05

TO aozima :有个想法,用STM32的USART的IrDA功能加个红外二极管可以做成遥控发射端吗?这样不就可以把所有遥控器都统一到一个遥控上来了啊!不过忘了在哪看到一句说IrDA和红外遥控不是一码事,不知道这个想法能不能实现?

aozima 发表于 2010-2-8 14:21:47

回复【9楼】dragonwww
-----------------------------------------------------------------------
没听明白你想的是什么方案.

irDA只是一个协议吧,不管硬件好像.

dragonwww 发表于 2010-2-8 14:57:08

不好意思,没表述清楚:想的是读取几个不同遥控器最常用的几个键(比如:开机,关机),然后存储,再用STM32做遥控发射端,STM32上也做个开机、关机键,但按一下“关机”键时会把对应的几个不同的遥控器的关机键的码都发一遍,这样一个遥控器的同一个关机键就能关不同的设备了。

看来IRDA这样用行不通,那遥控发射应该也能用TIM采用计时功能实现吧?

aozima 发表于 2010-2-8 15:18:05

回复【11楼】dragonwww
那遥控发射应该也能用TIM采用计时功能实现吧?
-----------------------------------------------------------------------
是的,不过,你这个用STM32来关别的,有点绕道太远了吧.用遥控器来操作STM32,再由STM32操作其它的设备.....

dragonwww 发表于 2010-2-9 08:57:44

呵呵,人生在于折腾嘛!
几个不同遥控器只对STM32操作一次,STM32存下相应的码,以后就只用STM32控了,做个手持的、小巧的就欧了。

sl961102 发表于 2010-3-4 16:30:09

这个想法可以,市场有类似的产品,是省了不少的事,否则是太多了遥控吕。

pish 发表于 2010-3-22 17:59:33

mark..

freelinuxer 发表于 2010-3-22 19:32:11

建议参考 lirc 很久以前就在linux上用上了 几乎是遥控器都可以用上

aozima 发表于 2010-3-30 14:20:41

多处反应现在的功能还不好用,对部分遥控器并不太好.
正在想办法研究再强大些的,但暂时还没概念.

找了些资料.
点击此处下载 ourdev_542349.pdf(文件大小:603K) (原文件名:IR_control.pdf)

aozima 发表于 2010-3-31 13:58:46

这几天要忙自己的一个板.没空玩RADIO.

昨天晚上抽空改进了一下红外部分,但还没有经过大面积的测试,所以没有提交,有条件的帮忙测试一下.

原来的思路是,捕获一段时间(150ms)内的全部数据并记录,然后和新捕获到的数据进行匹配.
可能发生的问题是在这段时间内出现连按的情况就悲剧了.

现改进为:
在捕获样本时,捕获更长一段时间的(200ms),然后从中分离出前面的有效的一段.并得出数据的个数.
然后在工作中捕获到一定量的数据(由前面的学习和分离程序来确定)就释放信号量交由匹配程序去匹配.
这样做,更好用也反应更快.

缺点:如果某个遥控器不同的按键所发出的数据长度不一就不行了.暂时还没有解决思路.
望众人添砖加瓦.

点击此处下载 ourdev_542575.rar(文件大小:7K) (原文件名:remote_改进_stm32_radio.rar)

dragonwww 发表于 2010-4-6 09:48:47

红外遥控发射部分我已经调出正确的波形,但外部电路好像有点问题,以前讨论过,见以下链接:
//红外接收头 接收的管脚是PC8:Remap(TIM3:CH3)   
//红外发射   发射的管脚是PB9:TIM4:CH4
三极管换用NPN的8050,R9换100欧,R12换24欧,
这样PB9和三极管基极波形都是好的,
但就是红外管波形不好,波形电压才1V多点,接收端也接收不到-_-!
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3945721&bbs_page_no=1&bbs_id=3020

以下是MDK工程源代码,在MDK逻辑仿真里可以看到正确的波形,遥控协议实现的是NEC的,我这也没有带存储的示波器,
有想玩红外发射的可以下载试试看,我甚至怀疑自己买的红外发射头有问题呢,呵呵。


点击此处下载 ourdev_543979.rar(文件大小:1.23M) (原文件名:STM32红外遥控发射 半成品 by dragonwww.rar)

ljt8015 发表于 2010-4-6 11:07:24

mark

oldtom 发表于 2010-4-6 12:08:04

这个很不错,支持。家里遥控器确实是多,看个电视都得要俩个遥控器,一个机顶盒,一个电视机的,马上天气要热了,空调的遥控器,还得要一堆。真的很烦呢。

另外提一个不成熟的建议:
可否把波形存储并上传到上位机上来,然后,用分析规整后再下载到CPU内用于匹配呢?

aozima 发表于 2010-4-6 15:18:39

目前的作法是保存在文本文件中的,看那个可以达到分析的效果.

deiwgah 发表于 2010-4-6 15:40:43

回复【11楼】dragonwww
-----------------------------------------------------------------------

把所有的都发一遍,会不会对不想操作的设备产生干扰呢

dragonwww 发表于 2010-4-6 21:22:56

回复【23楼】deiwgah
-----------------------------------------------------------------------

呵呵,如果两样电器离太近了肯定会有问题的,所以有个前提:两样遥控对象不能太近:)

dujun168 发表于 2010-4-9 22:50:57

mark

psocfans 发表于 2010-5-3 13:53:59

mark

myhonour 发表于 2010-5-3 13:56:25

mark

biansf2001 发表于 2010-7-20 09:07:37

结果如何了。

我也是把波形存下来了,可是发射不出去啊。

shanyao 发表于 2010-7-21 11:25:25

mark!

jspp 发表于 2010-12-6 23:53:23

mark

love_zjb 发表于 2010-12-7 08:56:13

mark

bkey 发表于 2010-12-9 17:13:46

mark

lugang_2920213 发表于 2010-12-9 23:33:40

回复【28楼】biansf2001 花溅泪
结果如何了。
我也是把波形存下来了,可是发射不出去啊。
-----------------------------------------------------------------------

你发射的时候有没有加38K的载波,要是没有的话,发射距离很短, 结果等于发射不出去

bygreencn 发表于 2010-12-14 17:54:16

mark

mick 发表于 2011-3-9 17:18:43

MARK

reflecter 发表于 2011-3-9 19:35:04

楼主的显示波形,是咋弄出来的?示波器的图?

aozima 发表于 2011-3-10 13:06:39

回复【36楼】reflecter
楼主的显示波形,是咋弄出来的?示波器的图?
-----------------------------------------------------------------------
逻辑分析仪,带逻辑分析仪的示波器也行.

nbc327 发表于 2011-3-27 21:40:31

看看!

voval 发表于 2011-6-28 12:33:58

mark~

mypc16888 发表于 2011-9-11 08:25:19

mark

stupidone 发表于 2011-9-11 12:09:25

MARK

aahui 发表于 2011-12-6 13:14:58

正在考虑学习型遥控,参考

hybbb 发表于 2012-1-6 11:29:24

楼主有新进展吗?

marrylilili 发表于 2012-2-7 08:09:20

mark!!

anning 发表于 2012-2-9 12:43:59

mark

myHXH 发表于 2012-2-9 12:50:36

我们这个项目也已经完成了,不过为了压缩成本,是用了stc作为主控的.
另外加了gsm模块,实现短信控制遥控.

tanglj868 发表于 2013-11-7 11:13:30

mark!!!!!!!!!!!!
页: [1]
查看完整版本: [原创] 实现自学习型遥控 [应用于STM32网络收音机]