一、工具
1、红外接收头(HS1838);
2、940nm红外发光二极管及限流电阻100Ω左右;
3、Arduino及Prototype Shield;
4、Saleae Logic兼容逻辑分析仪(价格二三十元,可选,可用IRremote Library的RawDump分析);
5、工具软件:Saleae Logic、Excel、Arduino、Notepad++;
6、Arduino库:IRremote(下载地址:https://github.com/z3t0/Arduino-IRremote);
二、解析惠而浦空调遥控协议
①如下图,将接收头和逻辑分析仪连接好,记录遥控器发送的信号;
②记录的报文如图所示(逻辑分析仪采样率选择12Msps);
(采样率设为12Msps)
(采集到的一帧数据(接收头已过滤了遥控的38kHz载波))
③多次尝试和分析可知一帧数据的大致结构:
导引头(载波约6.2ms,空隙间隔约7.4ms)+数据块+结束块(约0.56ms载波+7.4ms空隙+0.56ms载波+7.4ms空隙)
中间数据块波形有两种形式,根据网上搜索的NEC遥控协议,我们可以暂定如下:
数值0:载波0.56ms,空隙0.56ms
数值1:载波0.56ms,空隙1.69ms
波形解析
④接着分析比较复杂的数据块,由于一帧数据块包含的位数很多(后面分析可知:多达12个字节(96位)),不可能对着分析仪一个一个的数波形,故打算使用以下方法:
1)先使用分析仪的游标大致找到波形的起始和结束时间(如下图所示);
2)导出波形数据,设置如下图(需要设置起始时间、结束时间、使用采样点数)
3)点击Export按钮,给定名字(如开机.csv),保存;
4)将开机.csv文件用Excel打开,如下图,删除多余的通道(如我的接收头连接在Channel0,所以删除Channel1到Channel7);
5)接下来需要翻译出数据块中的数值0和数值1了。
6)CSV数据中的0,1并不是实际遥控的数据,根据第③点的分析,我们可以根据高电平的时长来区分数值0和数值1。在C2单元格,我们输入如下公式,得出每个电平的宽度(基于采样数);
7)使用填充柄填充所有行,如下图;
8)接下来,需要判定B列的1的时长了,采样数小于一定的数值,则表示发送的是0,否则发送的是1;(B列所有值为0的行可以忽略了,在数据块部分,他们都是固定时长的)。在D2中输入如下公式,以判定发送的数值;注,公式中的10000与当初逻辑分析仪所设置的采样率有关联的,12Msps的使用10000正好;
9)使用填充柄填充所有行
10)筛选出B列数值为1的行。操作如下①全选B列,②按Ctrl+Shift+L,③在下拉箭头中单击,去掉0前面的勾,点确定。
11)现在剩下的差不多就是数据块了,如下图,选中并复制出除导引头和结束块外的数据块(一般是从D6开始,向下选择96个单元格),粘贴到新的表格中即可。
12)可以得到数据块的数据了,那么剩下的就是使用控制变量法,一个一个测试遥控器的按键,并找到有变更的数据,分析下即可知道,不同功能在数据块中对应的位。
⑤附件是我整理的惠而浦空调,部分功能对应的位(定时功能比较复杂,且有了自制遥控器后,作用也不大,所以没分析,应该是在前几个字节定义。)
三、使用Arduino遥控空调
有了逆向的协议后,就可以尝试使用Arduino来控制空调了。其中,我们使用IRremote 库来发射信号。
下载IRremote库,并复制到ArduinoLibraries 文件夹下(请上网查找Arduino安装库的方法)。
先使用我们解析出来的数据来测试下,分析是否正确。
①搭好发射电路如下图所示:把红外发射管串接到 Arduino数字PIN3和GND之间(注意二甲管正负极,实际测试发现取消限流电阻,发射距离更远。)
②使用IRremote的sendRaw函数来测试,在这之前,我们需要准备好提供给sendRaw函数的数组,即最底层38kHz载波打开与关闭的时长序列;
1)先把之前得到的96bits的数据块复制出来,并使用转置粘贴为横向数据,如下两图:
2)再将横向的数据复制并粘贴到NotePad++中,
3)删除第二行,接着使用“替换”功能,先后将“ ”(制表符)替换为“,”(英文的逗号);将“0”替换成“550,550”;将“1”替换成“550,1690”。并在行首添加导引头“6200,7400,”,行尾添加结束块“,560,7400,560,7400”结果如图:
③运行Arduino程序,并打开IRremote库的IrsendRawDemo示例,如下图
④清除irSignal数组中的内容,使用我们刚处理的Notepad++中的数据;
⑤编译并下载到Arduino中,将Prototype板上的红外LED靠近并正对空调,观察效果(空调发出“哔”并进入待机);
四、使用sendWhirlpool函数控制空调
虽然可以控制空调了,但为了关个机,还得输入一大串的数据,有点麻烦。接下来,我们将往IRremote库添加自己刚分析好的惠而浦遥控底层协议。
①打开 IRremote库所在文件夹(如C:\arduinotool\arduino-1.0.5\libraries\IRremote),复制并粘贴“ir_NEC.cpp”,重命名为“ir_Whirlpool.cpp”。这就是我们要修改的模板了。
②打开ir_Whirlpool.cpp,修改#define部分如下图(这部分定义了各时间参数,以μs为单位)
#defineWHIRLPOOL_BITS 96
#defineWHIRLPOOL_HDR_MARK 6200
#defineWHIRLPOOL_HDR_SPACE 7400
#defineWHIRLPOOL_BIT_MARK 560
#defineWHIRLPOOL_ONE_SPACE 1690
#defineWHIRLPOOL_ZERO_SPACE 560
#defineWHIRLPOOL_RPT_SPACE 2250
③修改发射函数如下(实测载波设为36kHz,遥控距离更远):
//+=============================================================================
#if SEND_WHIRLPOOL
void IRsend::sendWhirlpool(unsignedchar* data)
{enableIROut(36);unsigned char checksum = 0;for(unsignedchar i =0;i<11;i++){checksum += data[i];}data[11]= checksum;//Headermark(WHIRLPOOL_HDR_MARK);space(WHIRLPOOL_HDR_SPACE);// Datafor(unsignedchar bytecnt =0;bytecnt<11;bytecnt++){for(unsignedchar bitcnt =0;bitcnt<=7;bitcnt++){if(data[bytecnt]& (1<< bitcnt)){mark(WHIRLPOOL_BIT_MARK);space(WHIRLPOOL_ONE_SPACE);}else{mark(WHIRLPOOL_BIT_MARK);space(WHIRLPOOL_ZERO_SPACE);}}}//checksumfor(unsignedchar bitcnt =0;bitcnt<=7;bitcnt++){if(checksum& (1<< bitcnt)){mark(WHIRLPOOL_BIT_MARK);space(WHIRLPOOL_ONE_SPACE);}else{mark(WHIRLPOOL_BIT_MARK);space(WHIRLPOOL_ZERO_SPACE);}}//Footermark(WHIRLPOOL_BIT_MARK);space(WHIRLPOOL_HDR_SPACE);mark(WHIRLPOOL_BIT_MARK);space(WHIRLPOOL_HDR_SPACE);space(0); // Always end with the LED off
}
#endif
④接着修改“irRecv.cpp”和“IRremote.h”,方法见IRremote库的文件“ir_Template.cpp”中相关注释。
⑤完成以上动作后,重启ArduinoIDE,打开IRremote的示例文件:IrsendDemo
⑥修改turnoff数组为以下内容(这些就是抓取的关机报文,按字节整理好,并去掉最后的校验和(CheckSum)字节),代码如下:
/** IRremote: IRsendDemo - demonstrates sendingIR codes with IRsend* An IR LED must be connected to Arduino PWMpin 3.* Version 0.1 July, 2009* Copyright 2009 Ken Shirriff* http://arcfn.com*/#include<IRremote.h>IRsend irsend;
unsigned char turnoff[]={0,0,0,0,0,0,0,0x08,0,0x28,0xa5};void setup()
{
}void loop(){irsend.sendWhirlpool(turnoff);
while(1);
}
⑦再测试下,应该还是可以遥控空调的。
五、结束语
有了以上数据后,可以再添加一个函数,将实际的功能转换成对应的协议数据,并交由sendWhirlpool发送。
以上,大家可以举一反三,做出适合自己空调的遥控器,或者将Arduino联网,使用手机远程控制家里的空调,在回家前,先营造舒适的室内温度。
文中并没有说明如何调节温度,模式等,其实调节温度就是把期望的温度值减去16,转换为16进制,填到协议数据响应的位中即可。
另外,需要注意的是,惠而浦空调发送的先后顺序是低位先发,高位后发。