2016年11月13日 星期日

自製紅外線遙控器

這裡我們不講硬體如何製作,而是說明如何用 Arduino 發射特定的紅外線編碼,藉以模擬出家裏的遙控器。


材料清單

接收部分
1. Arduino 開發板 *1
2. 紅外線接收模塊 *1
3. 杜邦線 *3P

發射部分
1. Arduino 開發板 *1
2. R1電阻 100R *1
3. 紅外線發射LED2 *1
4. 杜邦線 *2P


紅外線接收電路

電路接線和程式碼詳 http://pizgchen.blogspot.tw/2016/11/blog-post_13.html


紅外線發射電路

有三種電路方式,都可以作為紅外線發射電路,如下圖:


為方便起見我們採用左側那個電路,但實際應用時最好採用右側電路,因為發射信號的距離會比較遠。實際電路接線如下圖:




讓 Arduino 發射 38KHz 的信號

請您先將下列程式碼 Upload 到 Arduino,然後將紅外線發射管對準紅外線接收器,並開啟接收器的 Serial Monitor:

#include <IRremote.h>
IRsend irsend;

void setup() { }

void loop() {
  for (int i = 0; i < 3; i++) {
    irsend.sendSony(0xa90, 12); // Sony TV power code
    delay(100);
  }
  delay(1000);
}

您應該可以看到大概如下圖所示的畫面,在接收端的確有收到來自發射端發出的信號「A90」。



如果您夠仔細的話,應該會發現到雖然我們使用 D3 腳位作為發射紅外線信號,但我們並未在 setup() 區段內指定 D3 腳位的 pinMode 為 OUTPUT,那麼為什麼還可以正常發射 38KHz 信號呢? 因為 IRRemote Library 使用 Timer2 中斷,而 Timer2 是設定在 D3 腳位。

另外要提醒您,tone() 函式也是使用 Timer2 中斷,所以您如果同時使用 tone() 函式讓 Arduino 發出聲音,並且也使用 IRRemote Library 讓紅外線發射 38KHz 信號,您會發現它們無法同時作用。


發射紅外線編碼

Arduino 有內建許多廠商的紅外線編碼函式,如下

void sendNEC(unsigned long data, int nbits);
void sendSony(unsigned long data, int nbits);
void sendRC5(unsigned long data, int nbits);
void sendRC6(unsigned long data, int nbits);
void sendDISH(unsigned long data, int nbits);
void sendSharp(unsigned long data, int nbits);
void sendPanasonic(unsigned int address, unsigned long data);
void sendJVC(unsigned long data, int nbits, int repeat);


其實 KEYES 遙控器是採用 NEC 編碼格式,因此如果您想發出「1」的編碼,可以

irsend.sendNEC(0xFF6897, 32);

如果是未知廠商的編碼,您可以使用下列函式

void sendRaw(unsigned int buf[], int len, int hz);

以發射 KEYES 遙控器為例,如果要發射按鍵「1」的編碼,程式碼如下

unsigned int raw_1[68] = {0xB3,0x5A,0xB,0xC,0xB,0xC,0xB,0xD,0xA,0xC,0xB,0xD,0xA,0xD,0xA,0xD,0xA,0xD,0xA,0x22,0xB,0x22,0xA,0x22,0xA,0x23,0xA,0x22,0xA,0x22,0xB,0x22,0xB,0x21,0xB,0xC,0xB,0x22,0xA,0x22,0xB,0xC,0xB,0x22,0xB,0xC,0xA,0xD,0xB,0xC,0xA,0x22,0xB,0xC,0xB,0xC,0xB,0x22,0xB,0xC,0xA,0x22,0xB,0x22,0xB,0x21,0xB,};

irsend.sendRaw(raw_1,68,38);



進階題目

聲音函式和紅外線發射函式真的無法同時使用嗎? 答案是否定的。只要讓 tone() 函式和紅外線發射函式不使用同一個 Timer 中斷,如此即可解決問題,但此問題不在本文的討論範圍內。


相關連結

Timers and Interrupts http://letsmakerobots.com/node/28278


採購資訊

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



找出紅外線遙控器的編碼

為了避免遙控器互相干擾,各家電器廠商大都會自訂該公司專屬的紅外線編碼,例如 SONY、JVC、PANASONIC...。

如果你家的遙控器壞掉了或是不見了,那該怎麼辦呢? 比較方便的方式就是再去買一支,再不然就是...自己做一支。

找出遙控器的編碼是一個關鍵,本文就是在說明如何找出遙控器編碼。


材料清單

1. Arduino 開發板
2. 紅外線接收模塊



電路接線

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


程式碼

以下程式可以找出大部分紅外線遙控器的編碼,包括 KEYES 紅外線遙控器套件的編碼。

#include <IRremote.h>

int RECV_PIN = 3;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
}

您可以發現 Serial Monitor 內的資料正是 KEYES 這款遙控器套件的編碼。



後記

南桃園電視盒的遙控器壓一次按鍵似乎會傳出數組編碼,而且好像不是那麼固定,我壓了數次「1」鍵,結果產生如下編碼,個人無法理解這編碼的規則性:



相關連結

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


採購資訊

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



紅外線遙控器

市售紅外線遙控器有很多種,硬體上我們在此僅介紹「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