利用stm32f407的PA8引脚的复用功能输入捕获功能,将遥控器每个按键所对应的波形记录下来,再通过红外发射头发射出去,进而来控制电器。
由于要对所有遥控器适用,这就要求程序要能够在不知道红外编码方式的前提下学习,所以我决定将遥控器发出来的所有波形都记录下来,用的时候再按这个波形发射就能够实现遥控,中间不需要解码出相应的键值码。
编程学习波形的大致思路:
将遥控器每一个按键所对应的波形学习下来(即储存高低电平的时间 参考nec编码协议部分内容)每一位信息应该对应两个时间,所以要存储200多个时间信息,建立二维数组进行存储,利用输入捕获捕获到下降沿的时候开始计时,并立即设置为上升沿捕获,上升沿时来时读取低电平时间存到数组第一位,立即将计数器清零并设置为下降沿捕获,开始计数,下降沿来时读取计数器的数值存储到素组第二位,依次类推,直到这个键值信息存储完毕,结束判断是根据是不是超过90ms的高电平,结束时最后一位可以不要。
发射学习到的波形:
利用定时器产生38khz的载波频率,将数组里边的数值作为发射时间,奇数位为发射红外引号,偶数位不发射,这样就能产生学习到的波形。具体载波发生器参见32定时器章节。
设计步骤:准确采集红外信息 解码采集到的信息 储存信息并能编码发送
发现问题及解决方案:如果不解码不好存储,(采集到的波形数据太大,尤其是空调的)所以需要转换思路,在不知道编码协议的情况下,根据自己采集到的波形规律自己设计程序解码,再按照自己的解码方式编码发送出去即完成接收和发送,从而达到万能遥控的目的
无论哪种编码方式都会有起始位(大部分是一位起始位,也有的是两位起始位)所以必须要确定好起始位,几乎所有的红外编码格式都是有一个固定的发射红外的时间(比如NEC协议 先发射560us的红外,紧接着再发560us或者1680us来决定是0还是1)所以起始位结束后(接收端)就会有一个560us的低电平(不一定是560us,但是不会超过800us)这样就能把起始位提取出来,等需要的时候再发射出去,而且同一个公司的遥控器用的起始位大体相同,但是为了保险起见一个遥控器的起始位单独存起来,换遥控器就采集新的起始位。
解码思路:从第三位有效数据开始判断是不是小于1000us若是则将前两位保存起来作为起始信号,第三位作为发射红外的时间,紧接着再往下判断是不是大于1000us,若是则提取出来作为延时时间,例如nec协议 9000 4500(起始位) 560(发射时间) 560(延时时间0) 560(发射时间) 1680(延时时间1) 不同的编码协议不一定就是这个数据所以要能够自适应。
利用stm32f407的PA8引脚的复用功能输入捕获功能,将遥控器每个按键所对应的波形记录下来,再通过红外发射头发射出去,进而来控制电器。
由于要对所有遥控器适用,这就要求程序要能够在不知道红外编码方式的前提下学习,所以我决定将遥控器发出来的所有波形都记录下来,用的时候再按这个波形发射就能够实现遥控,中间不需要解码出相应的键值码。
编程学习波形的大致思路:
将遥控器每一个按键所对应的波形学习下来(即储存高低电平的时间 参考nec编码协议部分内容)每一位信息应该对应两个时间,所以要存储200多个时间信息,建立二维数组进行存储,利用输入捕获捕获到下降沿的时候开始计时,并立即设置为上升沿捕获,上升沿时来时读取低电平时间存到数组第一位,立即将计数器清零并设置为下降沿捕获,开始计数,下降沿来时读取计数器的数值存储到素组第二位,依次类推,直到这个键值信息存储完毕,结束判断是根据是不是超过90ms的高电平,结束时最后一位可以不要。
发射学习到的波形:
利用定时器产生38khz的载波频率,将数组里边的数值作为发射时间,奇数位为发射红外引号,偶数位不发射,这样就能产生学习到的波形。具体载波发生器参见32定时器章节。
设计步骤:准确采集红外信息 解码采集到的信息 储存信息并能编码发送
发现问题及解决方案:如果不解码不好存储,(采集到的波形数据太大,尤其是空调的)所以需要转换思路,在不知道编码协议的情况下,根据自己采集到的波形规律自己设计程序解码,再按照自己的解码方式编码发送出去即完成接收和发送,从而达到万能遥控的目的
无论哪种编码方式都会有起始位(大部分是一位起始位,也有的是两位起始位)所以必须要确定好起始位,几乎所有的红外编码格式都是有一个固定的发射红外的时间(比如NEC协议 先发射560us的红外,紧接着再发560us或者1680us来决定是0还是1)所以起始位结束后(接收端)就会有一个560us的低电平(不一定是560us,但是不会超过800us)这样就能把起始位提取出来,等需要的时候再发射出去,而且同一个公司的遥控器用的起始位大体相同,但是为了保险起见一个遥控器的起始位单独存起来,换遥控器就采集新的起始位。
解码思路:从第三位有效数据开始判断是不是小于1000us若是则将前两位保存起来作为起始信号,第三位作为发射红外的时间,紧接着再往下判断是不是大于1000us,若是则提取出来作为延时时间,例如nec协议 9000 4500(起始位) 560(发射时间) 560(延时时间0) 560(发射时间) 1680(延时时间1) 不同的编码协议不一定就是这个数据所以要能够自适应。
举报