嵌入式万能红外解码算法实现

 

嵌入式万能红外遥控解码算法实现

                                       

-                                                            2014 酷玩创意

  

       遥控器大家一定都用过,电视、空调、机顶盒……各种电器遥控成了一种必备功能,同样在我们的设计中引入遥控不但可以让我们的产品更智能,还可以简化按键扫描电路。废话不多说,我们先看看这个红外“长”什么样吧。


 嵌入式万能红外解码算法实现_第1张图片

各种遥控器


 嵌入式万能红外解码算法实现_第2张图片

红外发射

 

 

        这么些遥控器几乎每家都可以有好几个,这不新鲜。要是你手上有一个这样的器件(没有也可以在废品店淘一个)而自己又是电类专业的学生你是否有要把遥控也应用在自己的电路设计中呢?有这样的想法其实你已经成功一半了,因为本身这个东东就不复杂的,我们继续往下看吧。

 

       那么这个东东该怎么用呢?

 

       当然遥控器发送红外信号就算你看得见它(手机摄像头可以看见)你也不认识它是吧,要不然你就可以被遥控了是吧哈哈。你当然需要的是一颗红外接收头了:

 嵌入式万能红外解码算法实现_第3张图片

一体红外接收头


       如上图就是这三个脚的东西:一体化红外接收头,一个电源,一个地和红外信号输出口。

 

       遥控器发送的红外信号被它接收到后经过放大滤波处理将在第三脚输出和发射端匹配的信号,接下来我们就要用MCU按照红外信号的协议来从里面来识别出编码信息来。

 

       又是编码又是解码,大家可别被这样说法吓到了,其实就是一种发端和收端的简单规定,网上搜一搜相关协议资料一大把,大家也不必深究了解个大概即可。大多版本是这样说的:你按下遥控键,就会发出一串红外信号,这串信号包括一个9ms多的引导码,16位用户码和8位数据编码和8位反码……我们现在要找的就是这8位编码数据。引导码9ms这还比较靠谱,数据码是低电平开始高电平结束,编码的0和1由高电平的时间长短来判断,根据经验我们发现不同器件不同遥控器影响解码成败的关键就是在这个时间的差异了。

 

       网上所有解码实现都是通过一个中间时间来判断当前信号的电平,运气好可以成功,运气不好解码失败也不知道是什么原因。怎么办呢?其实要做好解码工作我们不是只看协议只看别人的程序就OK的。真正的解码是从认识波形开始的。

      波形分析要用到示波器吗?要是你有倒也可以,只要能把一个完整的红外信号捕捉住对照协议分析也是挺好的,不过你得确保你的MCU在解码时也能提供精确的时间,否则依然无法解码。我们这里推荐的是一种是用单片机的定时器和中断功能来捕捉红外波形的分析方法(同输入捕捉功能相似)

 

    解码三步曲之波形特征分析根据协议红外信号最重要的两个特征:1低电平开始,2高电平的时间长短表示0和1,单片机可以通过红外的低电平触发中断,然后在中断中记录该系列红外信号的高低电平的持续时间长短(引导码+用户识别码+数据码大概是>66次高低电平),然后通过在线仿真或串口或其他手段观察程序中采集到的时间数据就能找出规律来。

 嵌入式万能红外解码算法实现_第4张图片

       

        以STM8为例我们有这样一段程序: 

 嵌入式万能红外解码算法实现_第5张图片

        

       这段代码的大概意思是:在程序中使用了一个数组mIrdata[64],收到红外信号时通过IrdaSample函数采样红外信号高低电平时间,并存放在数组中。


       其实这里的时间只是一个相对的概念,他可以是绝对的系统时间,也可以是一小段延时的计数或者就是51这样的无敌低端处理器的机器指令数量,实现万能解码这里的时间度量就非常关键-需要在各自平台上找到区分“0”“1”信号的度量值(相对值,不需要绝对时间),其实在STM8中我们是采用单片机的定时器做的系统时间。


       有了这样的波形数据特征后我们就可以找到编码0和编码1在我们自己机器上的时间度量的差异了。如下图

嵌入式万能红外解码算法实现_第6张图片

        通过单片机自己的测量我们得到了汽车mp3遥控器的波形特征数据(单位是0.1ms), 可以看出这里的其起始码是8.3ms低电平后接4.1ms高电平。在这里时间是精确的但这并不重要。关键是我们通过单片机自己的度量采集到了红外的数据特征。


        可以看出这里的第3位到34位数据是用户码以0.4或0.5低电平开始0.5ms高电平结束为0,1.6ms结束位1,所以是0x00和0xff,同样其后的32位数据里就该是我们的编码和反码了。

 嵌入式万能红外解码算法实现_第7张图片

      

     解码三步曲之红外数据分析 很明显我们通过刚才分析的结果可以确定编码数据0是0.5+0.5的电平组合,1是0.5+1.6,所以我们的解码应该从第35位开始:

 嵌入式万能红外解码算法实现_第8张图片

 

        好了白话了这么久这种解码方法到底能不能用能呢?下面看看洒家是怎么用最便宜的方案实现这个解码的吧哈哈:如下图


嵌入式万能红外解码算法实现_第9张图片

效果图


        我们采用的8位高性价比的STM8处理器(工频16M,1-2块一片)使用他的GPIO中断和定时功能对红外信号进行捕捉。MCU对一次遥控按键有两种处理方法 1:1次中断接收完所有红外信号(>64bit),这种方法采用GPIO电平逻辑来采集信号,一次按键一次中断处理,是网上通用的做法; 2:是每次响应红外一个比特位的中断信号,结合定时器获得每个中断的时间戳来采集信号(类似/或等同输入捕捉),在>64次中断后 对采集数据进行处理。前者同步,后者异步。


        解码后我们通过带字库的12864显示我们的编码,当然如果是要控制机器人或者智能赛车就通过编码进行控制即可。


     解码三步曲之干扰控制 红外解码成功后不见得你就能够很好的用它来控制东西了,因为还有一个非常关键的问题就是干扰!红外信号容易受环境影响,在软件上我们要做好容错处理。一方面需要对信号的有效性做充分判段,另一方面是要对信号的开关做周到的设计,只有这样才能做到每次按键的高效识别。在我们的实现中采用了MCU任务管理的方法去实现定时任务的处理。这一块我将在另一板块给大家分享。

嵌入式万能红外解码算法实现_第10张图片   

基于MCU的任务调度 

    

    硬件需求:

 

嵌入式万能红外解码算法实现_第11张图片          嵌入式万能红外解码算法实现_第12张图片         嵌入式万能红外解码算法实现_第13张图片  

                                 

       遥控器              +          红外接收模块               +  单片机(中断+定时器/输入捕捉)

 

 

 

完整代码工程可通过http://shop108911095.taobao.com/?spm=2013.1.0.0.Z8tf8S取得

 

更多趣味算法、应用更新中。

    

你可能感兴趣的:(通用机器人,智能控制,家电等红外解码实现)