一、工具
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;
//Header
mark(WHIRLPOOL_HDR_MARK);
space(WHIRLPOOL_HDR_SPACE);
// Data
for(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);
}
}
}
//checksum
for(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);
}
}
//Footer
mark(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進制,填到協議數據響應的位中即可。
另外,需要注意的是,惠而浦空調發送的先後順序是低位先發,高位後發。