红外通信协议

1、红外光的基本原理

  红外线是波长介于微波和可见光之间的电磁波,波长在 760 纳米到 1 毫米之间,是波形比红光长的非可见光。自然界中的一切物体,只要它的温度高于绝对零度(-273)就存在分子和原子的无规则运动,其表面就会不停的辐射红外线。当然了,虽然是都辐射红外线,但是不同的物体辐射的强度是不一样的,而我们正是利用了这一点把红外技术应用到我们的实际开发中。

  红外发射管很常用,在我们的遥控器上都可以看到,它类似发光二极管,但是它发射出来的是红外光,是我们肉眼所看不到的。发光二极管的亮度会随着电流的增大而增加,同样的道理,红外发射管发射红外线的强度也会随着电流的增大而增强,常见的红外发射管如下图所示。

图 16-1  红外发射管

  红外接收管内部是一个具有红外光敏感特征的 PN 节,属于光敏二极管,但是它只对红外光有反应。无红外光时,光敏管不导通,有红外光时,光敏管导通形成光电流,并且在一定范围内电流随着红外光的强度的增强而增大。典型的红外接收管如下图所示。

图 16-2  红外接收管

  这种红外发射和接收对管在小车、机器人避障以及红外循迹小车中有所应用,这部分内容在我们的 KST-51 开发板上并没有实现,但是属于红外部分的内容,所以我提供一个原理图给大家作为学习之用,如下图所示。

图 16-3   红外避障、循迹原理图


  发射部分:当发射控制输出高电平时,三极管 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 调制,如下图 所示。

图 16-4  红外信号调制

  原始信号就是我们要发送的一个数据“0”位或者一位数据“1”位,而所谓 38K 载波就是频率为 38K 的方波信号,调制后信号就是最终我们发射出去的波形。我们使用原始信号来控制 38K 载波,当信号是数据“0”的时候,38K 载波毫无保留的全部发送出去,当信号是数据“1”的时候,不发送任何载波信号。

  那在原理上,我们如何从电路的角度去实现这个功能呢?如下图所示。

图 16-5   红外发射原理图

  38K 载波,我们可以用 455K 晶振,经过 12 分频得到 37.91K,也可以由时基电路 NE555来产生,或者使用单片机的 PWM 来产生。当信号输出引脚输出高电平时,Q2 截止,不管38K 载波信号如何控制 Q1,右侧的竖向支路都不会导通,红外管 L1 不会发送任何信息。当信号输出是低电平的时候,那么 38K 载波就会通过 Q1 释放出来,在 L1 上产生 38K 的载波信号。这里要说明的是,大多数家电遥控器的 38K 的占空比是 1/3,也有 1/2 的,但是相对少一些。

  正常的通信来讲,接收端要首先对信号通过监测、放大、滤波、解调等等一系列电路处理,然后输出基带信号。但是红外通信的一体化接收头 HS0038B,已经把这些电路全部集成到一起了,我们只需要把这个电路接上去,就可以直接输出我们所要的基带信号了,如下图所示。

图 16-6  红外接收原理图

  由于红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头供电引脚上必须加上滤波电容,官方手册给的值是 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 位,如下图所示。第一个字节是用户码,第二个字节可能也是用户码,或者是用户码的反码,具体由生产商决定,第三个字节就是当前按键的键数据码,而第四个字节是键数据码的反码,可用于对数据的纠错。

图 16-7  NEC 协议数据格式

  这个 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协议接收数据程序流程图

图 16-9  红外接收程序流程图

  注意:

  用示波器在接收头抓的电平看起来和NEC协议刚好相反,那是因为:HS0038B 这个红外一体化接收头,当收到有载波的信号的时候,会输出一个低电平,空闲的时候会输出高电平。

   

参考:http://www.linuxidc.com/Linux/2014-09/106408.htm

 
 
posted @ 2020-10-27 11:44  孤情剑客  阅读(3791)  评论(0编辑  收藏  举报