红外通信协议
1、红外光的基本原理
红外线是波长介于微波和可见光之间的电磁波,波长在 760 纳米到 1 毫米之间,是波形比红光长的非可见光。自然界中的一切物体,只要它的温度高于绝对零度(-273)就存在分子和原子的无规则运动,其表面就会不停的辐射红外线。当然了,虽然是都辐射红外线,但是不同的物体辐射的强度是不一样的,而我们正是利用了这一点把红外技术应用到我们的实际开发中。
红外发射管很常用,在我们的遥控器上都可以看到,它类似发光二极管,但是它发射出来的是红外光,是我们肉眼所看不到的。发光二极管的亮度会随着电流的增大而增加,同样的道理,红外发射管发射红外线的强度也会随着电流的增大而增强,常见的红外发射管如下图所示。
红外接收管内部是一个具有红外光敏感特征的 PN 节,属于光敏二极管,但是它只对红外光有反应。无红外光时,光敏管不导通,有红外光时,光敏管导通形成光电流,并且在一定范围内电流随着红外光的强度的增强而增大。典型的红外接收管如下图所示。
这种红外发射和接收对管在小车、机器人避障以及红外循迹小车中有所应用,这部分内容在我们的 KST-51 开发板上并没有实现,但是属于红外部分的内容,所以我提供一个原理图给大家作为学习之用,如下图所示。
发射部分:当发射控制输出高电平时,三极管 Q1 不导通,红外发射管 L1 不会发射红外信号;当发射控制输出低电平的时候,通过三极管 Q1 导通让 L1 发出红外光。
接收部分:R4 是一个电位器,我们通过调整电位器给 LM393 的 2 脚提供一个阈值电压,这个电压值的大小可以根据实际情况来调试确定。而红外光敏二极管 L2 收到红外光的时候,会产生电流,并且随着红外光的从弱变强,电流会从小变大。当没有红外光或者说红外光很弱的时候,3 脚的电压就会接近 VCC,如果 3 脚比 2 脚的电压高的话,通过 LM393 比较器后,接收检测引脚输出一个高电平。当随着光强变大,电流变大,3 脚的电压值等于 VCC-I*R3,电压就会越来越小,当小到一定程度,比 2 脚的电压还小的时候,接收检测引脚就会变为低电平。
这个电路用于避障的时候,发射管先发送红外信号,红外信号会随着传送距离的加大逐渐衰减,如果遇到障碍物,就会形成红外反射。当反射回来的信号比较弱时,光敏二极管 L2接收的红外光较弱,比较器 LM393 的 3 脚电压高于 2 脚电压,接收检测引脚输出高电平,说明障碍物比较远;当反射回来的信号比较强,接收检测引脚输出低电平,说明障碍物比较近了。
用于小车循迹的时候,必须要有黑色和白色的轨道。当红外信号发送到黑色轨道时,黑色因为吸光能力比较强,红外信号发送出去后就会被吸收掉,反射部分很微弱。白色轨道就会把大部分红外信号反射回来。通常情况下的循迹小车,需要应用多个红外模块同时检测,从多个角度判断轨道,根据判断的结果来调整小车使其按照正常循迹前行。
2、红外遥控通信原理
在实际的通信领域,发出来的信号一般有较宽的频谱,而且都是在比较低的频率段分布大量的能量,所以称之为基带信号,这种信号是不适合直接在信道中传输的。为便于传输、提高抗干扰能力和有效的利用带宽,通常需要将信号调制到适合信道和噪声特性的频率范围内进行传输,这就叫做信号调制。在通信系统的接收端要对接收到的信号进行解调,恢复出原来的基带信号。
我们平时用到的红外遥控器里的红外通信,通常是使用 38K 左右的载波进行调制的。下面我把原理大概给大家介绍一下,先看发送部分原理。
调制:就是用待传送信号去控制某个高频信号的幅度、相位、频率等参量变化的过程,即用一个信号去装载另一个信号。比如我们的红外遥控信号要发送的时候,先经过 38K 调制,如下图 所示。
原始信号就是我们要发送的一个数据“0”位或者一位数据“1”位,而所谓 38K 载波就是频率为 38K 的方波信号,调制后信号就是最终我们发射出去的波形。我们使用原始信号来控制 38K 载波,当信号是数据“0”的时候,38K 载波毫无保留的全部发送出去,当信号是数据“1”的时候,不发送任何载波信号。
那在原理上,我们如何从电路的角度去实现这个功能呢?如下图所示。
38K 载波,我们可以用 455K 晶振,经过 12 分频得到 37.91K,也可以由时基电路 NE555来产生,或者使用单片机的 PWM 来产生。当信号输出引脚输出高电平时,Q2 截止,不管38K 载波信号如何控制 Q1,右侧的竖向支路都不会导通,红外管 L1 不会发送任何信息。当信号输出是低电平的时候,那么 38K 载波就会通过 Q1 释放出来,在 L1 上产生 38K 的载波信号。这里要说明的是,大多数家电遥控器的 38K 的占空比是 1/3,也有 1/2 的,但是相对少一些。
正常的通信来讲,接收端要首先对信号通过监测、放大、滤波、解调等等一系列电路处理,然后输出基带信号。但是红外通信的一体化接收头 HS0038B,已经把这些电路全部集成到一起了,我们只需要把这个电路接上去,就可以直接输出我们所要的基带信号了,如下图所示。
由于红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头供电引脚上必须加上滤波电容,官方手册给的值是 4.7uF,我们这里直接用的 10uF,手册里还要求在供电引脚和电源之间串联 100 欧的电阻,进一步降低干扰。
当 HS0038B 监测到有 38K的红外信号时,就会在 OUT 引脚输出低电平,当没有 38K 的时候,OUT 引脚就会输出高电平。那我们把 OUT 引脚接到单片机的 IO 口上,通过编程,就可以获取红外通信发过来的数据了。
大家想想,OUT 引脚输出的数据是不是又恢复成为基带信号数据了呢?那我们单片机在接收这个基带信号数据的时候,如何判断接收到的是什么数据,应该遵循什么协议呢?像我们前边学到的 UART、I2C、SPI 等通信协议都是基带通信的通信协议,而红外的 38K 仅仅是对基带信号进行调制解调,让信号更适合在信道中传输。
由于我们的红外调制信号是半双工的,而且同一时刻空间只能允许一个信号源,所以红外的基带信号不适合在 I2C 或者 SPI 通信协议中进行的, UART 虽然是 2 条线,但是通信的时候,实际上一条线即可,所以红外可以在 UART 中进行通信。当然,这个通信也不是没有限制的,比如在 HS0038B 的数据手册中标明,要想让 HS0038B 识别到 38K的红外信号,那么这个 38K 的载波必须要大于 10 个周期,这就限定了红外通信的基带信号的比特率必须不能高于 3800,那如果把串口输出的信号直接用 38K 调制的话,波特率也就不能高于 3800。当然还有很多其它基带协议可以利用红外来调制,下面我们介绍一种遥控器常用的红外通信协议——NEC 协议。
3、常用的红外通信协议
家电遥控器通信距离往往要求不高,而红外的成本比其它无线设备要低的多,所以家电遥控器应用中红外始终占据着一席之地。遥控器的基带通信协议很多,大概有几十种,常用的有 ITT 协议、NEC 协议、Sharp 协议、Philips RC-5 协议、Sony SIRC 协议等,用的最多的就是 NEC 协议了。
3.1、NEC协议
3.1.1、NEC协议原理
NEC 协议的数据格式包括了引导码、用户码(地址码)、户码反码(地址反码)、按键键码和键码反码,最后一个停止位。停止位主要起隔离作用,一般不进行判断,编程时我们也不予理会。其中数据编码总共是 4 个字节 32 位,如下图所示。第一个字节是用户码,第二个字节可能也是用户码,或者是用户码的反码,具体由生产商决定,第三个字节就是当前按键的键数据码,而第四个字节是键数据码的反码,可用于对数据的纠错。
这个 NEC 协议,表示数据的方式不像我们之前学过的比如 UART 那样直观,而是每一位数据本身也需要进行编码,编码后再进行载波调制。
- 引导码:9ms 的载波和4.5ms 的空闲。
- 比特值“0”:560us 的载波+560us 的空闲。
- 比特值“1”:560us 的载波+1.68ms 的空闲。
- 其中的载波主要是通过硬件中的方波来实现,不建议通过软件来实现。所以我们根据脉冲时间长短来解码。推荐载波占空比为1/3至1/4。
(1)、逻辑1与逻辑0
NEC协议载波为38khz,在空中实际传输时其逻辑1与逻辑0的表示如图所示:
逻辑1为2.25ms,脉冲时间560us;逻辑0为1.12ms,脉冲时间560us。所以我们根据脉冲时间长短来解码。推荐载波占空比为1/3至1/4。
(2)、NEC协议格式
比如地址码为0x9A,数据码为0x68:
首次发送的是9ms的高电平,其后是4.5ms的低电平,接下来就是8bit的地址码(从低有效位开始发),而后是8bit的地址码的反码(主要是用于校验是否出错)。然后是8bit 的数据码(也是从低有效位开始发),而后也是8bit 的数据码的反码。最后发送的是8ms低电平+50ms高电平的结束码。
实际空中传输时引导码先是 9ms 载波脉冲,紧接着是引导码的 4.5ms 的空闲,而后边的数据码,是众多载波和空闲交叉,它们的长短就由其要传递的具体数据来决定。
以上是一个正常的序列,但可能存在一种情况:你一直按着1个键,这样的话先发送一次命令码,之后不会再发送命令码,而是以110ms为周期发送一段重复码。如下图:
重复码由9ms高电平和2.25ms的低电平以及560us的高电平组成。
完整波形如下:
需要注意的是:1838红外一体接收头为了提高接受灵敏度。输入高电平,其输出的是相反的低电平。
3.1.1、NEC协议举例
上面讲到当按下遥控器的一个按键时,会发出一帧的数据,这一帧的数据的组成分别是:引导码、地址码、地址码的反码、数据码和数据码的反码。
当发送的地址为0x00(00000000),发送的红外数据为0xAD(10101101)时的一帧的格式大概如下(下面的极性和上面的图刚好相反,但是不影响理解协议):
由上面的图可以看出,每个码的脉冲宽度都有规定,大概如下:
上面的图中有个引导码(重复),这个的作用是,当我们一直按住同一个按键的时候,就会每隔一段时间发一个引导码(重复),也就是重复码。
3.1.2、NEC协议接收数据程序流程图
注意:
用示波器在接收头抓的电平看起来和NEC协议刚好相反,那是因为:HS0038B 这个红外一体化接收头,当收到有载波的信号的时候,会输出一个低电平,空闲的时候会输出高电平。