目前,人們的物質文化生活水平日益提高,各種各樣的家用電器走進了千家萬戶,其中,大多數的家用電器都有各自不同的遙控器,人們常常為了控制某臺電器而到處尋找其對應的遙控器,這樣,就給人們的生活帶來了很多不便。為了解決這個問題,本文提出一個多功能遙控器的設計方案:該遙控器可以通過自學習而擁有對多臺電器的遙控功能,即省時、又省力,從而使人們免除同時面對功能眾多遙控器的煩惱。
紅外遙控器原理
遙控器由紅外接收及發射電路、信號調理電路、中央控制器8031.程序及數據存儲器、鍵盤及狀態指示電路組成。
遙控器有兩種狀態:學習狀態和控制狀態。當遙控器處于學習狀態時,使用者每按一個控制鍵,紅外線接收電路就開始接收外來紅外信號,同時將其轉換成電信號,然后經過檢波、整形、放大,再由CPU定時對其采樣,將每個采樣點的二進制數據以8位為一個單位,分別存放到指定的存儲單元中去,供以后對該設備控制使用。
當遙控器處于控制狀態時,使用者每按下一個控制鍵,CPU從指定的存儲單元中讀取一系列的二進制數據,串行輸出(位和位之間的時間間隔等于采樣時的時間間隔)給信號保持電路,同時由調制電路進行信號調制,將調制信號經放大后,由紅外線發射二極管進行發射,從而實現對該鍵對應設備功能的控制。
1. 原理
紅外遙控器是利用一個紅外發光二極管,以紅外光為載體來將按鍵信息傳遞給接收端的設備。紅外光對于人眼是不可見的,因此使用紅外遙控器不會影響人的視覺(可以打開手機攝像頭,遙控器對著攝像頭按,可以看到遙控器發出的紅外光)。
2. 調制
日常生活環境中有很多紅外光源,太陽、蠟燭火光、白熾燈、甚至是我們的身體。這些紅外光源都可能會對我們的接收設備產生干擾,為了屏蔽干擾,只接收有效信息,我們就需要用到調制。調制是我們使需要的信號區別于噪音方法。通過調制我們可以使紅外光以特定的頻率閃爍。紅外接收器會適配這個頻率,其它的噪音信號都將被忽略。你可以認為這種閃爍是引起接收器“注意”的方法,正如我們人類特別容易被黃色的燈光引起注意一樣,甚至在白天。
上圖左邊,調制信號通過驅動放大由紅外 LED 發射;上圖右邊,信號通過接收器檢測輸出。
在串行通訊里,我們經常談及‘ mark’和‘ space’標記。‘ space’是個默認信號,是指發射管關閉狀態,在‘ space’期間,紅外光不被發射。反之在‘ mark’狀態期間,紅外光以特定的頻率脈沖形式發射。在消費類電子產品里,脈沖頻率普遍采用 30KHz 到 60KHz 這個頻段,紅外遙控器一般使用的是38KHz。
在接收端,一個‘ space’信號以高電平方式重現輸出。反之一個‘ mark’信號便是以低電平方式重現。請注意,這里的‘ mark’和‘ space’不是我們需要發送的狀態 1 和 0。‘ mark’和‘ space’以及 1和 0 之間的真正關系取決于被應用的協議。
3. 協議
NEC協議
8 位地址碼, 8 位命令碼
完整發射兩次地址碼和命令碼,以提高可靠性
脈沖時間長短調制方式
38KHz 載波頻率
位時間 1.12ms 或 2.25ms
引導嗎:
下圖為一個引導碼的調制波形:
引導碼 由“9ms mark + 4.5ms space”構成,表示一組 鍵碼 的開始。
邏輯0和1:
下圖為邏輯0和邏輯1的調制波形:
邏輯“1”由“560us mark + 1690 space”組成,symbol period 為2.25ms;邏輯“0”由“560us mark + 560us space”組成,symbol period 為 1.12ms。
完整的一組鍵碼:
下圖位NEC 協議的典型脈沖鏈:
協議規定低位首先發送,如上圖所示的情況,發送的地 址碼為“59”,命令碼為“16”,總的碼值為 0x59A616E9。
重復碼:
下圖為重復碼的調制波形:
重復碼由 “9ms mark + 2.25ms space”組成,symbol period 為 11.25ms,重復碼表示一個重復按鍵,當按鍵按著不松時,會先發一個完整的鍵碼,接著每 110ms 發送一個重復碼,直到松開按鍵,如下面的波形圖所示:
接收端輸出:
在接收端,一個 mark 對應一個低電平輸出,一個 space 對應一個高電平輸出,因此起始碼、邏輯0 1、重復碼等在接收端的輸出波形如下圖所示:
協議解碼程序片段:
[cpp] view plain copytypedef struct ir_symbol_s
{
unsigned short mark_period;
unsigned short symbol_period;
} ir_symbol_t;
typedef struct ir_key_s
{
unsigned int value;
int state;
}ir_key_t;
int NEC_Decode(ir_symbol_t symbol_buf[], int symbol_num, ir_key_t *ir_key)
{
unsigned int key_value;
if(symbol_num == 33) //解析鍵值,設定300us的容錯范圍
{
key_value = 0;
//引導碼判斷
if ( (symbol_buf[0].symbol_period 》 (13500 - 300)) && (symbol_buf[0].symbol_period 《 (13500 + 300))
&& (symbol_buf[0].mark_period 》 (9000 - 300)) && (symbol_buf[0].mark_period 《 (9000 + 300)) )
{
for(i = 0; i 《 (symbol_num-1); i ++)
{
//無效的符號位
if( (symbol_buf[i].symbol_period 《 (1120-300)) || (symbol_buf[i].symbol_period 》 (2250+300)) )
{
printf(“symbol %d, is invalid\n”, i);
return -1;
}
else
{
key_value 《《= 1;
//邏輯1判斷
if( (symbol_buf[i].symbol_period 》 (2250-300)) && (symbol_buf[i].symbol_period 《= (2250+300)) )
{
key_value |= 1;
}
}
}
ir_key-》value = key_value;
ir_key-》state = KEY_STATE_PRESS;
}
}
else if(symbol_num == 2) //NEC協議的重復鍵
{
ir_key-》value = 0;
ir_key-》state = KEY_STATE_REPEAT;
}
else
{
ir_key-》value = 0;
ir_key-》state = KEY_STATE_NONE;
}
return 0;
}
評論