一、红外遥控
红外遥控技术是通过红外技术、红外通信技术和遥控技术的结合实现的一种无线控制技术。由于红外线的波长较短,对障碍物的衍射能力较差,无法穿透墙壁,所以红外遥控术更适合应用在短距离直线控制的场合,也正是这样,放置在不同房间的家用电器可使用通用的遥控器而不会产生相互干扰。
红外遥控所需传输的数据量较小,一般仅为几个至几十个字节的控制码,传输距离一般小于 10 米,因其功耗小、成本低、易实现等诸多优点,被广泛应用于电视机、机顶盒、DVD 播放器、功放、空调等家用电器的遥控。
二、手机红外遥控功能
部分智能手机都配置了是红外遥控功能(即安装红了外发射器)。那么,安装了红外发射器的智能手机,可以拿来当遥控器使用,还能一部手机遥控许多家电。具有红外功能的智能手机的顶部,有的镶嵌一个或多个小灯泡,有的是一小片黑色盖子,这个黑盖子对红外线来说可是透明的,只是人的肉眼看不穿它。红外遥控带着灯泡就像一支手电筒,红外光照到哪里,哪里的电器才会接收响应,这决定了红外遥控的三个特性:
- 遥控器要对准电器才有反应。
- 遥控器不能距离电器太远,最好是五米之内。
- 遥控器与电器之间不能有障碍物。
安装了红外发射器的手机,可以拿来当遥控器使用,还能一部手机遥控许多家电,这就需要破解电器的信号编码了。
三、红外发射原理简介
通用红外遥控系统主要由发射和接收两大部分组成。发射部分包括单片机芯片或红外遥控发射专用芯片实现编码和调制,红外发射电路实现发射;接收部分包括一体化红外接收头电路实现接收和解调,单片机芯片实现解码。红外遥控发射专用芯片非常多,编码及调制频率也不完全一样。手机实现红外遥控功能,主要就是发射红外信号部分,这就需要了解下红外信号的编码和调制原理。
3.1.红外遥控二进制信号的编码
红外遥控器发射的信号由一串「0」和「1」的二进制代码组成,不同的芯片对「0」和「1」的编码有所不同,通常有曼彻斯特 (Manchester) 编码和脉冲宽度编码 (PWM)。家用电器使用的红外遥控器绝大部分都是脉冲宽度编码,如下图所示:
3.2.红外遥控二进制信号的调制
二进制信号的调制由发送单片机芯片或红外遥控发射专用芯片来完成,把编码后的二进制信号调制成频率为 38kHz 的间断脉冲串,相当于用二进制信号的编码乘以频率为38kHz 的脉冲信号得到的间断脉冲串,即是调制后用于红外发射二极管发送的信号。通用红外遥控器里面常用的红外遥控发射专用芯片载波频率为 38kHz,这是由发射端所使用的 455kHz 陶瓷晶振来决定的。在发射端对晶振进行整数分频,分频系数一般取 12 所以 455kHz ÷ 12 ≈ 37.9kHz ≈ 38kHz。
四、 NEC编码协议
在红外开发中,可能最重要的就是发送二进制信号的编码协议了,各个厂家所使用的编码协议不同,所以遥控器也不能相互控制,而即使编码协议相同,使用的用户码不同,也不能被接收端接受。所以类似万能遥控器这种应用,第一个要解决的问题就是各类家用电器,各类厂家所使用的编码协议以及所使用的用户码等。但各类电器众多,这种应用是很难兼容全的,有的大厂家会将自家产品的编码及对应功能键的数据序列公布在网上,方便其他开发者开发,至于其他没有公布的,可能就要使用红外解码仪来破解它所使用的协议以及各功能键对应的数据码等。
在日常家用电器中,NEC 编码是比较常见的一种编码协议, 通用红外遥控器发出的一串二进制代码按功能可以分为分「引导码、用户码 16 位、数据码 8 位、数据反码 8 位和结束位」,编码共占 32 位,如下图2所示:
其中引导码由一个 9ms 的 38kHz 载波起始码和一个 4.5ms 的无载波低电平结果码组成。用户码由低 8 位和高 8 位组成 (用户码高八位和低八位可采用原码与反码的方式,可用于纠错,但也可直接是 16 位的原码方式),不同的遥控器有不同的用户码,避免不同设备产生干扰,用户码又称为地址码或系统码。数据码采用原码和反码方式重复发送,编码时用于对数据的纠错,遥控器发射编码时,低位在前,高位在后。结束位是 0.56ms 的 38kHz 载波。而其中的「0」码由 0.56ms 的 38kHz 载波和 0.56ms 的无载波低电平组合而成,脉冲宽度为 1.125ms,「1」码由 0.56ms 的 38kHz 载波和 1.69ms 的无载波低电平组合而成,脉冲宽度为 2.25ms,如下图所示:
五、红外遥控器解码
红外遥控器的解码仪能够分析常见家电的红外遥控信号,下面两种除外:
1、空调遥控器,空调的控制比较复杂,光光温度就可能调节十几次,难以破解。
2、灯光遥控器,灯本身发光发热,同时也会散发大量红外线,势必对外部的红外信号造成严重干扰;所以灯只能采取射频遥控器。
红外解码仪是家电维修人员的必备仪器,常用于检测遥控器能否正常工作,开发者为了让手机实现遥控功能,也要利用解码仪捕捉每个按键对应的红外信号,红外信号由三部分组成,分别是:
- 用户码,表示厂商代号,每个厂家都有自己的唯一代号;
- 数据码,表示按键的编号,不同的数据码代表不同的按键;
- 电路格式,表示红外信号的编码协议,每种协议都有专门的指令格式。
比如说电路61212表示的是NEC6121协议,该协议的红外信号编码格式为:引导码+用户码+数据码+数据反码+结束码,其中引导码和结束码都是固定的,数据反码由数据码按位取反得来,真正变化的只有用户码和数据码。
六、 Android红外遥控功能开发
1、红外权限配置
在App工程的AndroidManifest.xml中补充红外权限配置
<!--红外遥控-->
<uses-permission android:name="android.permission.TRANSMIT_IR" />
<!-- 是否仅在支持红外的设备上运行 -->
<uses-feature android:name="android.hardware.ConsumerIrManager" android:required="false" />
2、红外功能API
红外遥控功能从Android4.4之后才开始支持,对应的管理类名叫ConsumerIrManager,常用的三个方法分别是:
-
hasIrEmitter (): 用于检查设备是否具有红外发射器。返回true表示有,返回false表示没有。
-
getCarrierFrequencies() : 获得红外发射器可用的载波频率范围。
-
transmit (int carrierFrequency, int[] pattern) : 用于发射红外信号。
第一个参数为信号频率,单位赫兹(Hz),家用电器的红外频率通常使用38000Hz;第二个参数为整型数组形式的信号格式。
下边是一个封装好的红外遥控管理类
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
@TargetApi(Build.VERSION_CODES.KITKAT)
public class ConsumerIrManagerApi {
private static ConsumerIrManagerApi instance;
private static android.hardware.ConsumerIrManager service;
private ConsumerIrManagerApi(Context context) {
//Android4.4才开始支持红外功能
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
// 获取系统的红外遥控服务
service = (android.hardware.ConsumerIrManager) context.getApplicationContext().