Why
想把家里的红外设备也都接入到只能家居的服务器里,于是用树莓派搞了个红外发射和接受的装置.尝试了下灯和电风扇的遥控都一发成功,但是到空调的时候发现学习到的红外信号异常的长.灯的遥控器的情况把所有按键都学习一遍然后按需播放就可以,但是空调的红外信号动辄几百上千个元素(因为每次送信需要把所有的情报全送出去),直接暴力学习的话完全不现实.于是就尝试着解析了一下自家空调的红外信号的编码方式.俗话(工程控制论, 宋健 p1 (1980))说的好
仅仅有了生产实践,而没有把实践中具有共性的东西抽象出来,理论还不能形成.
How
在树莓派4B上连一个经典的红外收发电路(网上随便一查就有,有时间了说不定会写),软件也是使用经典irrp.py (点进去之后Python Code里的IR Record and Playback). 解析的遥控器是DAIKIN的ARC478A21,不过看网上其他的文章好像只要长这个样子的遥控器的编码都大差不差,或者可以说实质上是在共用同一种编码格式.另外,由于前述原因,本文和主要参考文献-日本大佬EH500_Kintarou的ダイキンのエアコンのリモコンを解析する会有大面积重复.也可以说,本文是此文章的中文翻译版本.
MAIN
编码模板
在日本流通的红外线遥控器通信模板主要存在有==NEC / 家製協(AEHA) / SONY==三种形式.而DAIKIN系列的遥控器使用的是其中的家製協的模板.其基本参数在以下列出.
- 红外线波长: 950nm
- 频率: fsc=33~40kHz, 38kHz typ., 1/3duty
- 周期(或者说是”刻”(?))T=350~500μs, 425μs typ.
下图由elm-chan的博客引用,展示了基本的编码方式.
如图所示,整个的编码模板大致由3部分构成.最前面的Leader用于声明传输开始,由8T的High和4T的low构成.之后接上2byte的Customer Code以及1byte的CheckSUM,他携带了生产商的识别代码.比如说DAIKIN的Code是0x11,0xDA,CheckSUM=0x27.这个代码感觉应该每个厂家都是唯一且固定的.之后跟上n byte的数据,对于空调来说,其中会包含风向,模式,温度等的信息.最后,跟1T的Hith和8ms以上的LOW以结束通信.
在第二和第三部分的数据传输部分中,1由1T的High和1T的LOW表示,0由1T的High和3T的LOW表示.以一般的T=425μs为例,1相当于425μs的High和425μs的LOW; 0相当于425μs的High和1275μs的LOW.这在后续的分析中会用到.
代码取得
以自动模式,温度为-2,风向上下风量自动为例,执行python3 irrp.py -r -g6 -f code air1
,然后打开code文档并找到”air1”即可得到一下的学习到的编码数据
3511, 1714, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 1279, 462, 1279, 462, 409, 462, 1279, 462, 1279, 462, 1279, 462, 1279, 462, 1279, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 1279, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 1279, 462, 409, 462, 409, 462, 34793, 3511, 1714, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 1279, 462, 1279, 462, 409, 462, 1279, 462, 1279, 462, 1279, 462, 1279, 462, 1279, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 1279, 462, 1279, 462, 409, 462, 1279, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 1279, 462, 1279, 462, 1279, 462, 1279, 462, 409, 462, 1279, 462, 409, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 1279, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 409, 462, 1279, 462, 409, 462, 1279, 462, 1279, 462, 409, 462, 409, 462, 1279, 462, 409, 462
有一说一,631个元素,这长度确实离谱.但是其中也有规律可循.这个文件中记录的代码是High和LOW分别的持续时间[],前文说过,1T一般等于425左右,那么开头的8T High和4T LOW便恰好等于3400和1700.也就是说,这段代码刚好就是AEHA编码模板的开头部分,并且第一个数据是High的持续时间.那接下来就好办了,打开MATLAB数组粘进去,浅写一个for循环就能得到这串数据的二进制代码了.但是通过观察代码可以发现,在中间靠后部分出现了一个34793,也就是说,遥控器其实是送出了两段代码.为了方便起见,我把代码拆成两部分,分别用for进行了decode.
同时,每段代码都掐掉了开头的12T和最后的1T不承载信息的部分.其实主要就是懒得写判断
buff=0;
j=1;
res=0;
airU=[462,1279,x,x,x,x...];
airD=[462,1279,x,x,x,x...];
sizeair=size(airU);
for i=1:2:(sizeair(2)-1)
if airU(i+1)>1000
buff=1;
else
buff=0;
end
res(j)=buff;
j=j+1;
end
之后把得到的代码稍加整理便可得到下节所示的二进制代码
1st:
DATA LOWER <-------> UPPER
0 1,0,0,0, 1,0,0,0 Customer Code -
1 0,1,0,1, 1,0,1,1 |
2 1,1,1,0, 0,1,0,0 Check SUM -----
3 0,0,0,0, 0,0,0,0,
4 0,1,0,0, 0,0,0,0,
5 0,0,0,0, 0,0,0,0,
6 0,0,0,0, 0,0,0,0,
7 0,0,0,0, 0,0,0,0,
8 0,0,0,0, 0,0,0,0,
9 1,0,1,1, 0,0,0,0, Mode (0x0D:AUTO)
10 0,0,0,0, 0,0,0,0,
11 0,0,0,0, 0,0,0,0,
12 0,0,0,0, 0,0,0,0,
13 0,0,0,0, 0,0,0,0,
14 0,0,0,0, 1,0,0,0,
15 0,0,0,0, 0,0,0,0,
16 0,0,0,0, 0,0,0,0,
17 0,0,0,0, 0,0,0,0,
18 0,0,0,0, 0,0,0,0,
19 1,0,0,0, 1,1,0,0 CHECKSUM
2nd:
DATA LOWER <-------> UPPER
0 1,0,0,0, 1,0,0,0 Customer Code -
1 0,1,0,1, 1,0,1,1 |
2 1,1,1,0, 0,1,0,0 Check SUM -----
3 0,0,0,0, 0,0,0,0
4 0,0,0,0, 0,0,0,0
5 1,0,0,1, 0,0,0,0
6 0,1,0,1, 1,0,1,1 Temp
7 0,0,0,0, 0,0,0,1
8 1,1,1,1, 0,1,0,1
9 0,0,0,0, 0,0,0,0
10 0,0,0,0, 0,0,0,0
11 0,1,1,0, 0,0,0,0
12 0,0,0,0, 0,1,1,0
13 0,0,0,0, 0,0,0,0
14 0,0,0,0, 0,0,0,0
15 1,1,0,0, 0,0,1,1
16 0,0,0,0, 0,0,0,0
17 0,0,0,0, 0,0,0,0
18 1,0,1,1, 0,0,1,0 CHECKSUM
其中各个部分的功能经过实验得到了和EH500_Kintarou同样的结论,但是需注意的是,==在第一波数据的第14byte的最高位,我的遥控器不论使用什么模式那一位都是0==,怀疑可能是笔误或者是遥控器型号不同的问题.
解析
各个DATA内容以及编码方式如下表所示.
要注意的是因为送信时是先送低位再送高位所以计算编码时需要把要送信的数据左右反转,表三中的各个KEY Code是已反转后的值.
下表主要引用自ダイキンのエアコンのリモコンを解析する,由博主进行过翻译和修改.
展望
搞清楚了遥控器的编码方式之后下一步就要搞个程序实现自动编码和控制了.考虑到红外不像wifi,LED和机器的接收器之间不能有障碍物,所以作为服务器运行,摆放位置受限的树莓派无法直接作为发射器使用.所以考虑使用ESP8266搞一个发射器,再加上DHT11就可以顺便监控一下温湿度,使用电池供电以可以直接贴在墙上,最后通过MQTT接入家庭的网络.
然后就是如何编码的问题了,目标模式温度风向可以通过树莓派发送,然后再ESP8266里理论上只要修改上表里灰色的部分就行,而且理论上开关是在服务器里判断,所以timer也可以固定成常关的状态.感觉能成.
APPENDIX
[1] ダイキンのエアコンのリモコンを解析する, EH500_Kintarou
[2] 赤外線リモコンの通信フォーマット, elm-chan.org