(SKU:RB-03T002)紅外發(fā)射接收套件

來自ALSROBOT WiKi
2015年6月23日 (二) 15:25Arduino77討論 | 貢獻的版本

跳轉(zhuǎn)至: 導(dǎo)航、 搜索


Hongwaijieshoufashe.png

目錄

產(chǎn)品概述

Arduino 紅外無線遙控套件由Mini超薄紅外遙控器和38KHz紅外接收模塊組成,Mini超薄紅外遙控器具有20個功能鍵,發(fā)射距離最遠可達8米,非常適合在室內(nèi)操控各種設(shè)備。紅外接收模塊可接收標準38KHz調(diào)制的遙控器信號,通過對Arduino進行編程,即可實現(xiàn)對遙控器信號的解碼操作,從而可制作各種遙控機器人以及互動作品。

規(guī)格參數(shù)

  1. CR2025環(huán)保紐扣電池,容量160mah
  2. 發(fā)射距離:8m以上(具體和周圍環(huán)境、接收端的靈敏度等因素有關(guān))
  3. 有效角度:60度
  4. 面貼材料:0.125mmPET,有效壽命2萬次。
  5. 品質(zhì)穩(wěn)定,性價比高
  6. 靜態(tài)電流3-5uA,動態(tài)電流3-5mA。

產(chǎn)品清單

  1. 紅外發(fā)射模塊*1個
  2. 紅外接收模塊*1個
  3. 3P傳感器連接線*2個

使用方法

  • 什么是紅外接收頭?

紅外遙控器發(fā)出的信號是一連串的二進制脈沖碼 為了使其在無線傳輸過程中免受其他紅外信號的干擾,通常都是先將其調(diào)制在特定的載波頻率上,然后再經(jīng)紅外發(fā)射二極管發(fā)射出去,而紅外線接收裝置則要濾除其他雜波,只接收該特定頻率的信號并將其還原成二進制脈沖碼,也就是解調(diào).

  • 工作原理

內(nèi)置接收管將紅外發(fā)射管發(fā)射出來的光信號轉(zhuǎn)換為微弱的電信號,此信號經(jīng)由IC內(nèi)部放大器進行放大,然后通過自動增益控制、帶通濾波、解調(diào)變、波形整形后還原為遙控器發(fā)射出的原始編碼,經(jīng)由接收頭的信號輸出腳輸入到電器上的編碼識別電路。

  • 紅外接收頭的引腳與連線

D為數(shù)據(jù)輸出 GND為電源地 VCC為電源正

紅外遙控接收傳感器的測試

我們使用 Arduino 控制器來做個測試,要用到硬件設(shè)備如下:

  1. Arduino 控制器×1
  2. Arduino LCD1602 字符液晶擴展板×1
  3. 紅外遙控接收傳感器模塊×1
  4. 蜂鳴器發(fā)聲模塊×1
  5. 超薄紅外遙控器×1
  6. 通用 3P 傳感器連接線×2
  7. USB 數(shù)據(jù)通信線×1

紅外遙控實驗

  1. 實驗器件 紅外遙控器 1個 IR Receiver Module 1個 數(shù)字傳感器連接線 1根
  2. 實驗原理 要想對某一遙控器進行解碼必須要了解該遙控器的編碼方式,這就叫知己知彼,百戰(zhàn)不殆 。本產(chǎn)品使用的遙控器的編碼方式為:NEC協(xié)議。下面就介紹一下NEC協(xié)議:

?NEC協(xié)議介紹: 特點: (1)8位地址位,8位命令位
(2)為了可靠性地址位和命令位被傳輸兩次
(3)脈沖位置調(diào)制
(4)載波頻率38khz
(5)每一位的時間為1.125ms或2.25ms
?邏輯0和1的定義如下圖:

Hongwai1.jpg

協(xié)議如下:
?按鍵按下立刻松開的發(fā)射脈沖:

Hongwai2.jpg

上面的圖片顯示了NEC的協(xié)議典型的脈沖序列。注意:這是首先發(fā)送LSB(最低位)的協(xié)議。在上面的脈沖傳輸?shù)牡刂窞?x59命令為0x16。一個消息是由一個9ms的高電平開始,隨后有一個4.5ms的低電平, (這兩段電平組成引導(dǎo)碼)然后由地址碼和命令碼。地址和命令傳輸兩次。第二次所有位都取反,可用于對所收到的消息中的確認使用。總傳輸時間是恒定的,因為每一點與它取反長度重復(fù)。如果你不感興趣, 你可以忽略這個可靠性取反,也可以擴大地址和命令,以每16位!
?按鍵按下一段時間才松開的發(fā)射脈沖:

Hongwai3.jpg

一個命令發(fā)送一次,即使在遙控器上的按鍵仍然按下。當按鍵一直按下時,第一個110ms的脈沖與上圖一樣,之后每110ms重復(fù)代碼傳輸一次。這個重復(fù)代碼是由一個9ms的高電平脈沖和一個2.25ms低電平和560μs的高電平組成。
?重復(fù)脈沖

Hongwai4.jpg

注意:脈沖波形進入一體化接收頭以后,因為一體化接收頭里要進行解碼、信號放大和整形,故要注意在沒有紅外信號時,其輸出端為高電平,有信號時為低電平,故其輸出信號電平正好和發(fā)射端相反。接收端脈沖大家可以通過示波器看到,結(jié)合看到的波形理解程序。
?本實驗編程思想
根據(jù)NEC編碼的特點和接收端的波形,本實驗將接收端的波形分成四部分:引導(dǎo)碼(9ms和4.5ms的脈沖)、地址碼16位(包括8位的地址位和8位的地址的取反)、命令碼16位(包括8位命令位和8位命令位的取反)、重復(fù)碼(9ms、2.25ms、560us脈沖組成)。 利用定時器對接收到的波形的高電平段和低電平段進行測量,根據(jù)測量到的時間來區(qū)分:邏輯“0”、邏輯“1”、引導(dǎo)脈沖、重復(fù)脈沖。引導(dǎo)碼和地址碼只要判斷是正確的脈沖即可,不用存儲,但是命令碼必須存儲,因為每個按鍵的命令碼都不同, 根據(jù)命令碼來執(zhí)行相應(yīng)的動作。設(shè)置遙控器上的幾個按鍵VOL+:控制LED燈亮的;VOL-:作為控制蜂鳴器響;

實驗代碼

程序功能:對遙控器發(fā)射出來的編碼脈沖進行解碼,根據(jù)解碼結(jié)果執(zhí)行相應(yīng)的動作。按下前進鍵紅燈亮,松開紅燈滅停止;按下后退鍵蜂鳴器響,松開蜂鳴器停止響;這樣大家就可以用遙控器遙控你的器件了,讓它聽你的指揮。其它按鍵的譯碼方式與這幾個鍵一樣,只要大家用示波器測出它們各自的波形,了解各自的命令碼,在執(zhí)行譯碼結(jié)果的函數(shù)中寫上對應(yīng)的命令碼和要執(zhí)行的動作即可。

#define BUZZER 10//蜂鳴器
#define LED_RED 11//紅燈
#define IR_IN  8  //紅外接收
int Pulse_Width=0;//存儲脈寬
int  ir_code=0x00;//命令值
void timer1_init(void)//定時器初始化函數(shù)
{
  TCCR1A = 0X00;
  TCCR1B = 0X05;//給定時器時鐘源
  TCCR1C = 0X00;  TCNT1 = 0X00;
  TIMSK1 = 0X00;	//禁止定時器溢出中斷
}
  void remote_deal(void)//執(zhí)行譯碼結(jié)果函數(shù)
  {
   switch(ir_code)
   {
     case 0xff00://停止
     digitalWrite(LED_RED,LOW);//紅燈不亮
     digitalWrite(BUZZER,LOW);//蜂鳴器不響
     break;  case 0xfe01://VOL+
     digitalWrite(LED_RED,HIGH);//紅燈亮
     break;  case 0xf609://VOL-
     digitalWrite(BUZZER,HIGH);//蜂鳴器響
     break;
   }
  }
  char logic_value()//判斷邏輯值“0”和“1”子函數(shù)
  {
  while(!(digitalRead(8))); //低等待
  Pulse_Width=TCNT1;
  TCNT1=0;
  if(Pulse_Width>=7&&Pulse_Width<=10)//低電平560us
  {
    while(digitalRead(8));//是高就等待
    Pulse_Width=TCNT1;
    TCNT1=0;
    if(Pulse_Width>=7&&Pulse_Width<=10)//接著高電平560us
      return 0;
    else if(Pulse_Width>=25&&Pulse_Width<=27) //接著高電平1.7ms
      return 1;
  }
  return -1;
  }
  void pulse_deal()//接收地址碼和命令碼脈沖函數(shù)
  {
  int i;  //執(zhí)行8個0  for(i=0; i<8; i++)
  {
    if(logic_value() != 0) //不是0
        return;
  }
    //執(zhí)行6個1  for(i=0; i<6; i++)
  {
    if(logic_value()!= 1) //不是1
        return;
  }
    //執(zhí)行1個0
  if(logic_value()!= 0) //不是0
      return;
    //執(zhí)行1個1
  if(logic_value()!= 1) //不是1
      return;
    //解析遙控器編碼中的command指令
  ir_code=0x00;//清零
  for(i=0; i<16;i++ )
  {
    if(logic_value() == 1)
    {
      ir_code |=(1<<i);
    }
  }
  }
  void remote_decode(void)//譯碼函數(shù)
  {
  TCNT1=0X00;
         while(digitalRead(8))//是高就等待
  {
    if(TCNT1>=1563)  //當高電平持續(xù)時間超過100ms,表明此時沒有按鍵按下
    {
      ir_code = 0xff00;
      return;
    }
    }
  //如果高電平持續(xù)時間不超過100ms
  TCNT1=0X00;
  while(!(digitalRead(8))); //低等待
  Pulse_Width=TCNT1;
  TCNT1=0;
  if(Pulse_Width>=140&&Pulse_Width<=141)//9ms
  {
   while(digitalRead(8));//是高就等待
    Pulse_Width=TCNT1;
    TCNT1=0;
    if(Pulse_Width>=68&&Pulse_Width<=72)//4.5ms
    {
      pulse_deal();
      return;
    }
    else if(Pulse_Width>=34&&Pulse_Width<=36)//2.25ms
    {
      while(!(digitalRead(8)));//低等待
      Pulse_Width=TCNT1;
      TCNT1=0;
      if(Pulse_Width>=7&&Pulse_Width<=10)//560us
      {
        return;
       }
    }
  
  }
  void setup()
  {
  unsigned char i;
  pinMode(LED_RED,OUTPUT);//設(shè)置與紅燈連接的引腳為輸出模式
  pinMode(BUZZER,OUTPUT);//設(shè)置與蜂鳴器連接的引腳為輸出模式
  pinMode(IR_IN,INPUT);//設(shè)置紅外接收引腳為輸入
  }
  void loop()
  {
    timer1_init();//定時器初始化
  while(1)
  {
    remote_decode();  //譯碼
    remote_deal();   //執(zhí)行譯碼結(jié)果
  }
}

遙控器鍵值附表

Yaokongqibiaoge.jpg

相關(guān)鏈接

購買地址:紅外發(fā)射接收套件