惠而浦空調遙控協議分析及使用Arduino遙控空調

一、工具

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進制,填到協議數據響應的位中即可。

另外,需要注意的是,惠而浦空調發送的先後順序是低位先發,高位後發。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章