專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

紅外遙控:智能學(xué)習(xí)紅外遙控編碼

作者:huqin   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月20日   【字體:

   家用電器如電視、機(jī)頂盒、空調(diào)等都可以通過(guò)紅外遙控,Rainbow專為物聯(lián)網(wǎng)、家居智能而設(shè)計(jì)的硬件,自然在紅外遙控收發(fā)方面有很好的支持。

    紅外遙控通常是由紅外發(fā)光二極管發(fā)射一定頻率的載波,通過(guò)載波攜帶的控制信息,經(jīng)過(guò)調(diào)制的信號(hào)被接收器接收后再進(jìn)行解碼,根據(jù)所接收到的編碼再去執(zhí)行響應(yīng)的操作,如:切換電視頻道、調(diào)整空調(diào)溫度等。家用電器能夠接收的基本上都是用38K的載波進(jìn)行調(diào)制后的紅外信號(hào),而HX1838則是專門(mén)對(duì)38K載波進(jìn)行接收處理的專用模塊,Rainbow進(jìn)行紅外接收的時(shí)候,需要先在紅外接收插口中插入HX1838接收模塊。

    Rainbow開(kāi)發(fā)包能夠很方便實(shí)現(xiàn)對(duì)紅外遙控信號(hào)的接收處理,形成原始的數(shù)據(jù),這些數(shù)據(jù)可以進(jìn)一步解碼或者不用解碼,而是通過(guò)紅外發(fā)光二極管發(fā)射出去控制家電等。將紅外遙控信號(hào)記錄下來(lái),并能夠?qū)⒂涗浵聛?lái)的信號(hào)通過(guò)紅外發(fā)光二極管發(fā)射出去控制電器,這就是萬(wàn)能學(xué)習(xí)型紅外遙控的基本實(shí)現(xiàn)原理,Rainbow開(kāi)發(fā)包提供了紅外遙控編碼接收和發(fā)射函數(shù),同時(shí)Rainbow具有網(wǎng)絡(luò)模塊,可以在這個(gè)基礎(chǔ)上開(kāi)發(fā)出通過(guò)手機(jī)、網(wǎng)頁(yè)等實(shí)現(xiàn)遙控家電的萬(wàn)能遙控設(shè)備。

   在軟件包的“Projects\IR-Recv”文件夾包含了本文的完整工程,可以直接編譯、燒寫(xiě)和調(diào)試。這個(gè)程序主要展示如何在Rainbow中進(jìn)行紅外遙控原始編碼接收,看看main.cpp的代碼:
#include "WProgram.h"
#include "IRRemote.h"

int main()
{
   //Rainbow初始化
   boardInit();
   //默認(rèn)串口初始化
   Serial.begin();
   Serial.println("IR-Recv start...");

   //創(chuàng)建紅外遙控接收實(shí)例,HX1838接到TIM4的CH1,即:PB6
   IRRecv irRecv;
   irRecv.enableIRIn();
   while(1)
   {
      uint16_t* rawBuf;
      int16_t len = irRecv.available();
      //判斷紅外采集是否完成
      if(len > 0)
      {
         //取紅外采集的原始編碼
         rawBuf = irRecv.getRawCode();
         //將接收到的紅外原始編碼通過(guò)默認(rèn)串口輸出
         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();
         //準(zhǔn)備取下一個(gè)紅外遙控編碼
         irRecv.resume();
      }
   }
}

    在Rainbow中進(jìn)行紅外遙控編碼接收的流程:
    1、首先需要#include "IRRemote.h",
    2、定義紅外遙控接收對(duì)象IRRecv irRecv;
    3、開(kāi)始進(jìn)行紅外遙控接收irRecv.enableIRIn();
    4、如果接收到紅外遙控編碼的話,irRecv.available()返回原始的紅外遙控編碼的長(zhǎng)度,返回值大于0
    5、通過(guò)irRecv.getRawCode()可以提取到原始的紅外遙控編碼數(shù)組,數(shù)組長(zhǎng)度是irRecv.available()
    6、對(duì)紅外遙控原始編碼處理完畢后,需要調(diào)用irRecv.resume(),以便進(jìn)行下一次紅外遙控編碼獲取

    上面的程序編譯無(wú)誤后,將程序燒寫(xiě)到Rainbow中,并將HX1838紅外接收模塊插入到Rainbow中專為HX1838設(shè)計(jì)的接口中,然后在電腦上運(yùn)行串口調(diào)試工具并和Rainbow連接成功,取一個(gè)家用電器的遙控器對(duì)準(zhǔn)紅外接收模塊,在遙控器上按下一個(gè)按鍵,此時(shí)在串口調(diào)試工具中會(huì)將該按鍵的原始紅外遙控編碼的長(zhǎng)度和內(nèi)容顯示出來(lái)。

    接下來(lái)我們說(shuō)說(shuō)紅外遙控原始編碼的含義。從串口調(diào)試工具中輸出的原始編碼是類似這樣一串字符:
  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

    這其實(shí)上面的字符串就是打開(kāi)美的空調(diào),并將溫度設(shè)置到28度、制熱的紅外遙控原始編碼,它是由一系列16位的整數(shù)構(gòu)成的,到底是些什么意義呢?

    前面我們說(shuō)到了紅外遙控發(fā)射是通過(guò)一定頻率的載波對(duì)紅外編碼進(jìn)行調(diào)制后通過(guò)紅外發(fā)光二極管發(fā)射出去的,說(shuō)起“調(diào)制”這個(gè)詞有些抽象,我們可以理解為在指定的時(shí)間內(nèi)發(fā)送載波與不發(fā)送載波,載波就是一個(gè)產(chǎn)生一定頻率的波形發(fā)生器,只要一通電就通過(guò)一條電線向紅外發(fā)光二極管輸送信號(hào),讓紅外發(fā)光二極管按照這個(gè)頻率的波形發(fā)光(發(fā)送),而調(diào)制過(guò)程就好比我們有一個(gè)電子開(kāi)關(guān),開(kāi)關(guān)打開(kāi)的時(shí)候,波形發(fā)生器就通電,驅(qū)動(dòng)紅外發(fā)光二極管發(fā)光,開(kāi)關(guān)關(guān)閉的時(shí)候波形發(fā)生器就關(guān)閉,紅外發(fā)光二極管就不發(fā)光。

    說(shuō)到這里,前面那一段原始紅外遙控編碼就好解釋了,首先這些數(shù)字是表示時(shí)間的,單位是us,他們就是表示電子開(kāi)光打開(kāi)和關(guān)閉的時(shí)間,即調(diào)制過(guò)程。這些數(shù)字中,奇數(shù)的數(shù)字表示電子開(kāi)關(guān)打開(kāi)的時(shí)間,即發(fā)送38K載波的時(shí)間,偶數(shù)的數(shù)字表示關(guān)閉發(fā)送載波的時(shí)間。以美的空調(diào)開(kāi)機(jī)那個(gè)編碼的前幾個(gè)數(shù)字4486,4428,590,1604為例:表示發(fā)送38K載波4486us,然后停止發(fā)送載波4428us, 再發(fā)送590us的載波,然后再停止發(fā)送1604us載波,以此類推。
 

關(guān)閉窗口

相關(guān)文章