2016年11月13日 星期日

紅外線遙控器

市售紅外線遙控器有很多種,硬體上我們在此僅介紹「KEYES」這一款紅外線遙控器套件,至於其它款式的原理及操作,其實也跟「KEYES」大同小異。



紅外線遙控器套件清單:
1. 遙控器 * 1
2. 接收模塊 *1
3. 5mm發射 LED *1
4. 杜邦線母母頭 * 3P


電路接線

這裡要注意的是, 接收模塊的腳位上面只有標示「S」和「-」,沒有標示「VCC」。這裏「S」表信號腳位(黃色杜邦線),「-」表 GND 腳位(綠色杜邦線),而中間那支腳就是 VCC (橙色杜邦線),詳下圖:



Arduino    紅外線接收模塊
VCC         中間腳(橙色線)
GND        「-」(綠色線)
D3            「S」(黃色線)


程式碼

#include "IRremote.h"

/*-----( Declare Constants )-----*/
int receiver = 3; // pin 1 of IR receiver to Arduino digital pin 3

/*-----( Declare objects )-----*/
IRrecv irrecv(receiver);           // create instance of 'irrecv'
decode_results results;            // create instance of 'decode_results'
/*-----( Declare Variables )-----*/

void setup()
{
  Serial.begin(9600);
  Serial.println("YourDuino IR Receiver Button Decode Test");
  irrecv.enableIRIn(); // Start the receiver
}

void loop()
{
  if (irrecv.decode(&results)) // have we received an IR signal?
  {
//    Serial.println(results.value, HEX);  UN Comment to see raw values
    translateIR();
    irrecv.resume(); // receive the next value
  }
}/* --(end main loop )-- */

/*-----( Declare User-written Functions )-----*/
void translateIR() // takes action based on IR code received
// describing KEYES Remote IR codes
{
  switch(results.value)
  {
  case 0xFF629D: Serial.println(" FORWARD"); break;
  case 0xFF22DD: Serial.println(" LEFT");    break;
  case 0xFF02FD: Serial.println(" -OK-");    break;
  case 0xFFC23D: Serial.println(" RIGHT");   break;
  case 0xFFA857: Serial.println(" REVERSE"); break;
  case 0xFF6897: Serial.println(" 1");    break;
  case 0xFF9867: Serial.println(" 2");    break;
  case 0xFFB04F: Serial.println(" 3");    break;
  case 0xFF30CF: Serial.println(" 4");    break;
  case 0xFF18E7: Serial.println(" 5");    break;
  case 0xFF7A85: Serial.println(" 6");    break;
  case 0xFF10EF: Serial.println(" 7");    break;
  case 0xFF38C7: Serial.println(" 8");    break;
  case 0xFF5AA5: Serial.println(" 9");    break;
  case 0xFF42BD: Serial.println(" *");    break;
  case 0xFF4AB5: Serial.println(" 0");    break;
  case 0xFF52AD: Serial.println(" #");    break;
  case 0xFFFFFFFF: Serial.println(" REPEAT");break;
  default:
    Serial.println(" other button   ");
  }// End Case

  delay(500); // Do not get immediate repeat
}

UPLOAD 程式到 Arduino 後,請開啟 Serial Monitor 並隨意按下遙控器按鍵,您就可以看到 Arduino 已正確接收到紅外線信號,如下圖:


至於程式裏面的紅外線編碼是怎麼來的,您可以參考「相關連結」裏的「找出紅外線遙控器的編碼」這篇文。



進階題目

遙控器上面有 0~9 共 10 個數字鍵,那麼遙控器只能按出 0~9 這樣的數字給 Ardunio 嗎? 答案是否定的。

我們可以在程式上指定一個字串變數用來儲存使用者按下的數字(其實它是字元),使用者每按下一個數字按鍵,便將這個字元結合到該字串變數尾端,一直遇到「#」字(註A),才將整組字串變數傳回,如此相當於遙控器按出一組數字信號。

一組數字信號是由多個字元組成,在傳輸過程中難免發生錯誤,所以我們應該要檢查這組資料的正確性。藉由檢查資料長度以及資料內容,可以確立傳輸的資料是否正確。您可以仿效紅外線編碼格式,指定一個前導字符和結尾字符,然後把固定長度的資料夾在其中,例如

*27584#

「*」表前導字符
「#」表結尾字符
27584 表傳輸的資料,它的資料長度是 5 碼

另外,濾除多次重覆按鍵也是一個課題。

當我們可以正確用紅外線發出一串數字編碼之後,我們可以用它來做哪些應用呢? 建議您可以試著去做一個紅外線遙控器密碼鎖來玩玩。

註:
A. 使用其它按鍵也可以,例如「*」鍵。


後記

1. 紅外線接收器容易受環境光源干擾,因此應避免將紅外線遙控裝置使用於戶外。
2. 如果您使用這樣的遙控器在您家的客廳搖控自走車,您可能會發現電視節目自己胡亂跳台,很明顯地這樣的紅外線遙控會干擾電器設備,因此要審慎使用。自訂遙控器編碼,或許可以解決這樣的問題。


相關連結

IR receiver 1838 Datasheet https://arduino-info.wikispaces.com/file/view/IR-Receiver-AX-1838HS.pdf
找出紅外線遙控器的編碼 http://pizgchen.blogspot.tw/2016/11/blog-post_13.html


採購資訊

紅外線遙控器套件 http://goods.ruten.com.tw/item/show?21628077374704











沒有留言:

張貼留言