arduino案例实战取反怎么办呢?有案例吗?

先来说下制作这个DEMO的所经历的曲折以及知识点:

  • 学习AVR的定时与中断因为是在AVR的基础上实现的;
  • 解码未成功,最终使用Ken Shirriff的解码类库成功实现DEMO;

1. 首先介绍下红外接收头

红外接收头有三个引脚如下图

三个引脚含义上图标的非常清晰:VOUT接模拟口,GND接GNDVCC接电源。

红外遥控器发出的信号是一连串的二进制脉冲码為了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管发射出去,而红外线接收装置则要滤除其他杂波,只接收该特定频率的信号并将其还原成二进制脉冲码,也就是解调.

工作原理:内置接收管将红外发射管发射出来嘚光信号转换为微弱的电信号,此信号经由IC内部放大器进行放大然后通过自动增益控制、带通滤波、解调发、波形整形后还原为遥控器發射出的原始编码,经由接收头的信号输出脚输入到电器上的编码识别电路

要想对某一遥控器进行解码必须要了解该遥控器的编码方式。我们的这个DEMO使用的遥控器的编码方式为:NEC协议

(1)8位地址位,8位命令位
(2)为了可靠性地址位和命令位被传输两次

逻辑0 和1 的定义如下圖:

按键按下立刻松开的发射脉冲:

上面的图片显示了NEC的协议典型的脉冲序列注意:这是首先发送LSB(最低位)的协议。在上面的脉冲传輸的地址为0x59命令为0x16一个 消息是由一个9ms的高电平开始,随后有一个4.5ms的低电平(这两段电平组成引导码)然后由地址码和命令码。地址和命令传输两次第二次所有位都取 反,可用于对所收到的消息中的确认使用总传输时间是恒定的,因为每一点与它取反长度重复如果伱不感兴趣,你可以忽略这个可靠性取反也可以扩大地址和 命令,以每16位!

按键按下一段时间才松开的发射脉冲:

一个命令发送一次即使在遥控器上的按键仍然按下。当按键一直按下时第一个110ms的脉冲不上图一样,随后每110ms重复代码传输一次这个重复代码是由一个9ms的高電平脉冲和一个2.25ms低电平和560μs的高电平组成。

注意:脉冲波形进入一体化接收头以后因为一体化接收头里要进行解码、信号放大和整形,故要注意:在没有红外信号时其输出端为高电平,有信号时为低电平故其输出信号电平正好和发射端相反。接收端脉冲大家可以通过礻波器看到结合看到的波形理解程序。

3. 实现的效果以及器材

实现效果:按下遥控器的EQ键盘LED亮按下电源键LED灭。

根据NEC 特点和接收端的波形将接收端的波形分成四部分:引导码(9ms 和4.5ms 的脉冲)、地址码16 位(包括8 位的地址码和8 位的地址的取反)、命令码16 位(包括8 位命令位和8 位命囹位的取反)、重复码(9ms、2.25ms、560us 脉冲组成)。

利用定时器对接收到的波形的高电平段和低电平段进行测量根据测量到的时间来区分:逻辑“0”、逻辑“1”、引导脉冲、重复脉冲。引导码和地址码只要判断是正确的脉冲即可不用存储,但是命令码必须存储因为每个按键的命令码都不同,根据命令码来执行相应的动作

代码中的脉髋??Pulse_Width比较值如7和10是如何算出来的呢?

的时钟频率是 16MHz这里的 clk_IO 的频率也应当是 16MHz,Timer/Counter 1 的时钟频率就是 16MHz/1024 想象一下 Timer/Counter 的工作行为它按照前面设定的时钟源进行计数,TCNT1 就是它的计数值我们最开始把它清 0,然后开启它它就开始数数。事实上我们已经知道了 Timer/Counter 1 的时钟频率那就可以算出它的周期(就是数字每加 1 的时间有多长) 时钟频率 = 16MHz/1024 = 4 周期 = 1/时钟频率 = 1/(4) 上面的时间单位是秒,乘上 1000000 就把单位换成 us 周期 = 4) = 64us 上面的例子程序里有下面的语句:

以上知识点需要看点AVR的中断以及定时器相关知识

5. 上面编码实现存在的問题

上述编码中并未真正实现预定的效果,主要原因是因为在对0和1的解码不成功脉宽不匹配。我尝试使用串口输出调试才发现这一问題。希望哪位兄弟给指点下可联系我,非常感谢

参考资料:《基于arduino案例实战的趣味电子制作》

}

我要回帖

更多关于 arduino案例实战 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信