结合STM32Arduino理解红外遥控编解码通信原理
Posted strongerHuang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结合STM32Arduino理解红外遥控编解码通信原理相关的知识,希望对你有一定的参考价值。
关注+星标公众号,不错过精彩内容
作者 | sugar
转自 | MultiMCU EDU
红外遥控我们并不陌生,身边随处可见,最常见的就是家电中的红外遥控,那你知道其中的收发原理吗?
今天就来分享一篇关于红外解码的文章。
1
硬件连接红外解码只需连3 根线(2 根电源 + 1 根数据)即可,如下图中TSOP382
。
2
NEC 协议解码本文所述的红外编解码采用 NEC
协议。通信的数据帧里使用 高电平时间
来区分 0
和 1
。
对于按一下然后按住不动的情况,NEC 协议下是这么处理的:
上图中写的“固定重复指令”也叫作“重复引导码”。对于红外通信协议,搜关键词“IR 引导码”会比较容易搜出结果。
NEC 的编码规则非常简单,如下图:
实际用逻辑分析仪抓取的波形如下,可以与上面的规则相互印证:
3
Arduino 红外解码把上图中的代码复制到下面:
#include <IRremote.h>
const int irReceiverPin = 2;
IRrecv irrecv(irReceiverPin);
decode_results results;
decode_results res_last;
void setup()
Serial.begin(9600);
irrecv.enableIRIn();
void loop()
if(irrecv.decode(&results))
if(res_last.value != results.value)
res_last.value = results.value;
Serial.print("irCode: ");
Serial.print(results.value, HEX);
Serial.print(", bits: ");
Serial.println(results.bits);
irrecv.resume();
4
STM32 红外解码1.外部中断方式
参考《江涛带你玩STM32-CubeMX红外NEC解码实战(上)—外部中断方式》
外部中断方式的优点在于:用哪个引脚都可以。因为没有使用片上定时器外设,所以需要使用 CPU 计数方式来算时间。
2.定时器捕获方式
参考《江涛带你玩STM32-CubeMX红外NEC解码实战(下)—定时器TIM捕获方式》
定时器捕获方式需要使用与定时器相关的引脚,优点是 CPU 不参与计时,被解放出来的 CPU 可以做其他的事。
PS
除了 NEC 协议,红外通信还有很多其他的协议,这在 Mixly 图形化编程软件中看得很明显,如下图:
本文选择最简单的 NEC
协议谈红外解码意在简单地体现 IR 通信的应用,所以没有引入 38kHz
载波的概念,如果想深入了解可以参考《STM32之红外遥控信号自学习实现》。
5
收、发解码差异如上图,红外通信比较奇特的一点就是收发数据反相。这就导致虽然从发送方或接收方都能解出正确数据,但必解码时必须注意极性,极性要是反了就解不出或解不对数据。
通信实验:
如上图,作者觉得发与收之间的相位差加强了实验的真实感。作者用了两个单片机,分别是 ATMega 2560 和 ATMega 644,选 Arduino 系单片机的原因是想偷个懒不写软件。
下面放大一个数据,仔细看一看 38KHz 的载波长什么样:
上图的结论是占在“接收方”的角度写的“发送方”的行为。也就是说:
1.想让接收方接到 0,发送方就发 38KHz 的载波;
2.想让接收方接到 1,发送方就停止发送载波。
这里不免有人会问:停止发送载波实际上让接收方收到了 1,那该怎么区分“停止通信”和“通信中的 1”呢?
这答案就能看出 NEC 协议的作用了:数据帧有头有尾,在头尾之间的停止发送就是数据 1,不在头尾之间的就是没有通信。
声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。
------------ END ------------
关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
点击“阅读原文”查看更多分享。
以上是关于结合STM32Arduino理解红外遥控编解码通信原理的主要内容,如果未能解决你的问题,请参考以下文章
STM32入门开发: 制作红外线遥控器(智能居家-万能遥控器)