家用電器如電視、機頂盒、空調等都可以通過紅外遙控,Rainbow專為物聯(lián)網、家居智能而設計的硬件,自然在紅外遙控收發(fā)方面有很好的支持。
紅外遙控通常是由紅外發(fā)光二極管發(fā)射一定頻率的載波,通過載波攜帶的控制信息,經過調制的信號被接收器接收后再進行解碼,根據所接收到的編碼再去執(zhí)行響應的操作,如:切換電視頻道、調整空調溫度等。家用電器能夠接收的基本上都是用38K的載波進行調制后的紅外信號,而HX1838則是專門對38K載波進行接收處理的專用模塊,Rainbow進行紅外接收的時候,需要先在紅外接收插口中插入HX1838接收模塊。
Rainbow開發(fā)包能夠很方便實現(xiàn)對紅外遙控信號的接收處理,形成原始的數據,這些數據可以進一步解碼或者不用解碼,而是通過紅外發(fā)光二極管發(fā)射出去控制家電等。將紅外遙控信號記錄下來,并能夠將記錄下來的信號通過紅外發(fā)光二極管發(fā)射出去控制電器,這就是萬能學習型紅外遙控的基本實現(xiàn)原理,Rainbow開發(fā)包提供了紅外遙控編碼接收和發(fā)射函數,同時Rainbow具有網絡模塊,可以在這個基礎上開發(fā)出通過手機、網頁等實現(xiàn)遙控家電的萬能遙控設備。
在軟件包的“Projects\IR-Recv”文件夾包含了本文的完整工程,可以直接編譯、燒寫和調試。這個程序主要展示如何在Rainbow中進行紅外遙控原始編碼接收,看看main.cpp的代碼:
#include "WProgram.h"
#include "IRRemote.h"
int main()
{
//Rainbow初始化
boardInit();
//默認串口初始化
Serial.begin();
Serial.println("IR-Recv start...");
//創(chuàng)建紅外遙控接收實例,HX1838接到TIM4的CH1,即:PB6
IRRecv irRecv;
irRecv.enableIRIn();
while(1)
{
uint16_t* rawBuf;
int16_t len = irRecv.available();
//判斷紅外采集是否完成
if(len > 0)
{
//取紅外采集的原始編碼
rawBuf = irRecv.getRawCode();
//將接收到的紅外原始編碼通過默認串口輸出
Serial.print("Frame Length:");
Serial.print(len);
Serial.println();
for(uint16_t i=0; i < len; i++)
{
Serial.print(rawBuf[i]);
if(i != len - 1)
{
Serial.print(",");
}
}
Serial.println();
//準備取下一個紅外遙控編碼
irRecv.resume();
}
}
}
在Rainbow中進行紅外遙控編碼接收的流程:
1、首先需要#include "IRRemote.h",
2、定義紅外遙控接收對象IRRecv irRecv;
3、開始進行紅外遙控接收irRecv.enableIRIn();
4、如果接收到紅外遙控編碼的話,irRecv.available()返回原始的紅外遙控編碼的長度,返回值大于0
5、通過irRecv.getRawCode()可以提取到原始的紅外遙控編碼數組,數組長度是irRecv.available()
6、對紅外遙控原始編碼處理完畢后,需要調用irRecv.resume(),以便進行下一次紅外遙控編碼獲取
上面的程序編譯無誤后,將程序燒寫到Rainbow中,并將HX1838紅外接收模塊插入到Rainbow中專為HX1838設計的接口中,然后在電腦上運行串口調試工具并和Rainbow連接成功,取一個家用電器的遙控器對準紅外接收模塊,在遙控器上按下一個按鍵,此時在串口調試工具中會將該按鍵的原始紅外遙控編碼的長度和內容顯示出來。
接下來我們說說紅外遙控原始編碼的含義。從串口調試工具中輸出的原始編碼是類似這樣一串字符:
4486,4428,590,1604,590,534,563,1605,591,1603,592,533,563,535,563,1604,591,535,563,534,564,1606,589,
534,563,535,563,1604,590,1603,592,535,563,1604,591,1607,588,535,563,1605,590,1607,588,1604,591,
1632,564,1602,593,1605,591,534,563,1602,593,534,563,534,563,534,563,535,563,534,563,534,563,1604,
591,534,563,1632,563,534,564,1604,590,1605,590,534,563,534,564,534,563,1605,591,533,563,1604,591,
535,563,534,563,1605,590,1604,592,5263,4512,4427,592,1602,593,534,563,1602,593,1632,563,535,563,
534,563,1605,590,535,564,533,563,1607,589,534,563,534,563,1604,592,1602,593,534,563,1604,591,1630,
564,534,563,1631,564,1604,591,1604,592,1603,592,1604,591,1633,563,534,563,1604,592,534,563,535,563,
510,587,534,563,534,564,510,587,1630,565,510,587,1631,564,511,586,1603,592,1604,591,511,587,511,
587,509,588,1605,590,510,587,1603,593,510,587,511,587,1603,592,1604,591
這其實上面的字符串就是打開美的空調,并將溫度設置到28度、制熱的紅外遙控原始編碼,它是由一系列16位的整數構成的,到底是些什么意義呢?
前面我們說到了紅外遙控發(fā)射是通過一定頻率的載波對紅外編碼進行調制后通過紅外發(fā)光二極管發(fā)射出去的,說起“調制”這個詞有些抽象,我們可以理解為在指定的時間內發(fā)送載波與不發(fā)送載波,載波就是一個產生一定頻率的波形發(fā)生器,只要一通電就通過一條電線向紅外發(fā)光二極管輸送信號,讓紅外發(fā)光二極管按照這個頻率的波形發(fā)光(發(fā)送),而調制過程就好比我們有一個電子開關,開關打開的時候,波形發(fā)生器就通電,驅動紅外發(fā)光二極管發(fā)光,開關關閉的時候波形發(fā)生器就關閉,紅外發(fā)光二極管就不發(fā)光。
說到這里,前面那一段原始紅外遙控編碼就好解釋了,首先這些數字是表示時間的,單位是us,他們就是表示電子開光打開和關閉的時間,即調制過程。這些數字中,奇數的數字表示電子開關打開的時間,即發(fā)送38K載波的時間,偶數的數字表示關閉發(fā)送載波的時間。以美的空調開機那個編碼的前幾個數字4486,4428,590,1604為例:表示發(fā)送38K載波4486us,然后停止發(fā)送載波4428us, 再發(fā)送590us的載波,然后再停止發(fā)送1604us載波,以此類推。