NEC IR protocol 紅外線接收器程式撰寫

紅外線接收器有區分很多款規格,這篇文章主要針對NEC 38KHz規格進行說明,文章以下使用圖示,部分參考原文出處,使用於非商業性質,僅供教育說明

NEC Protocol                                                                                  

如下圖所示,NEC format 由 以下組成

  • Leader code, 8 bits address and 8 bits command length
  • Address and Command 傳送兩次,第二次為反向結果可以作為錯誤檢知使用,或者擴展成16bits
  • 38KHz Carrier frequncy
  • Pulse distance modulation
  • Bit time 為 1.125ms 或者  2.25ms 

Modulation                                                                                 

NEC protocol使用 pulse distance encoding調變技術

  • 560us 載波與space組成 2.25ms 波型代表 位元 "1"
  • 560us 載波與space組成 1.12ms 波型代表 位元 "0"






訊號接收,目前紅外線接收可透過模組IC進行處理,只要挑選對應正確的載波訊號,紅外線接收器即可將訊號轉成方波輸出,以下圖示為 PANASONIC PNA4612M (38KHz) 原理圖
操作上非常方便,指要依序接上VCC(+5V) GND供應電源後,Vout即為輸出腳可接拉到MCU接收腳位,中間不需再連接或者上拉電阻元件,大大減輕單晶片處理載波訊號難度


現在紅外線為很普及的產品,使用經驗上通常按下按鈕後,發出紅外線讓接收器接收,進行達到 "Remote control"的目的,可是操作應該有發現,例如持續按下聲音大小聲按鈕時,不必放開按鍵,就可以持續觸發,通常作法並非一直發送相同Address+command訊號,而是連續輸出Repeat code 間隔110ms 訊號輸出方式

Repeat code 由9ms載波和 2.25ms space 組成,每間隔110ms傳送一次

參考資料連結: http://www.sbprojects.com/knowledge/ir/nec.php


程式撰寫                                                                                        


  • C編譯器 :CCS PCWHD 
  • MCU: Microchip PIC18F45K22


紅外線接收器,接收來自於紅外線發射的載波後進行解析,並且輸出方波,前面文章已經說明透過pulse ON/OFF 不同時間作為表示bit 1 or 0,收接資料後單晶片並無法短時間馬上解析出結果,最保險方式就是搭配timer 計時器技術當下每個脈波花的總時間,完成接收全部資料後,再透過旗標flag進行解析脈波,再轉換成正確的資料 Address and Command

Microhcip PIC18F45K22 共計有  多組Timer可供使用,從以上資訊得知最長時間會達到110ms,本文採用Timer1 16bits 並搭配Prescaler 1/2/4/8 擴展timer1 overflow的時間




TIMER1 configuration,依序算出每個波型對應時間長度
Interrupt rate:  T1_INTERNAL|T1_DIV_BY_4 
4/64000000*65536*4 = 16.384 ms  (resolution:0.0625*4=0.25us)
Leader: 13.5ms(54000) (13.5*1000)/0.25us
"1": 2.25 ms (9000)  (2.25*1000)/0.25us
"0": 1.12 ms (4480)  (1.12*1000)/0.25us

#define IR_LEADER_MIN       50000  
#define IR_LEADER_MAX       58000
#define IR_ZERO_MIN         4000
#define IR_ZERO_MAX         5000
#define IR_ONE_MIN          8000
#define IR_ONE_MAX          9900

定義資料群組,資料量總共 32 bits 搭配一組Leader 與 第一組 garbage訊號(需忽略),最大資料達16bits
建置34組 long資料Array
/* irframes[0] (start) will be garbage, ignore it... *_-
** irframes[1] NEC Leader code
** irframes[2~9]   custom code
** irframes[10~17] custom code'
** irframes[18~25] data code
** irframes[26~33] data code'
*/
#define irFramesCounts 34
long    irFrames[irFramesCounts];



搭配單晶片CCP 模組下緣觸發(H->L)訊號,或者採用RB 中斷觸發訊號,藉由旗標判斷資料接收過程,一旦完成接收,flag轉為true,緊接就可以進行每個資料量判斷,進而解析紅外接收資料後處理模式,並且判斷正反訊號正確性,程序完成後組成兩個 8bit int 資料返回
if ((irFrames[1] < IR_LEADER_MIN) && (irFrames[1] > IR_LEADER_MAX))
    return -1;
  
  for (i=0; i<8; i++)
  {
    // custom code
    custom_ptr = i+2;
    if ((irFrames[custom_ptr] >= IR_ZERO_MIN) && (irFrames[custom_ptr] <= IR_ZERO_MAX)) shift_right(&custom, 1, 0);
    else  if ((irFrames[custom_ptr] >= IR_ONE_MIN) && (irFrames[custom_ptr] <= IR_ONE_MAX)) shift_right(&custom, 1, 1);
      
    //custom' code
    _custom_ptr = i+10;
    if ((irFrames[_custom_ptr] >= IR_ZERO_MIN) && (irFrames[_custom_ptr] <= IR_ZERO_MAX)) shift_right(&_custom, 1, 0);
    else  if ((irFrames[_custom_ptr] >= IR_ONE_MIN) && (irFrames[_custom_ptr] <= IR_ONE_MAX)) shift_right(&_custom, 1, 1);
      
    // data code
      data_ptr = i+18;
      if ((irFrames[data_ptr] >= IR_ZERO_MIN) && (irFrames[data_ptr] <= IR_ZERO_MAX)) shift_right(&data, 1, 0);
      else  if ((irFrames[data_ptr] >= IR_ONE_MIN) && (irFrames[data_ptr] <= IR_ONE_MAX)) shift_right(&data, 1, 1);
      
    // data' code
    _data_ptr = i+26;
    if ((irFrames[_data_ptr] >= IR_ZERO_MIN) && (irFrames[_data_ptr] <= IR_ZERO_MAX)) shift_right(&_data, 1, 0);
    else  if ((irFrames[_data_ptr] >= IR_ONE_MIN) && (irFrames[_data_ptr] <= IR_ONE_MAX)) shift_right(&_data, 1, 1);
  }

  if ((custom != (_custom^0xFF)) || (data != (_data^0xFF)))
    return -1;


實驗結果                                                                             

這是一款很常見的紅外線遙控器模組,先行再每個按鈕位置上標註上Command資料,實驗上搭配Microchip PicKit3實驗板,進行驗證測試結果。 LCD顯示Leader 顯示13.44ms(正常都有誤差値,撰寫軟體需留意),Custom(Address) :00 這款沒有定義用戶碼,接收到data編號為:45為筆者按下Power 按鈕時解析出來的結果,驗證結果成功


 







沒有留言:

張貼留言

留言板