Pages

Monday, 16 December 2013

使用 Arduino 遙控家電

前言
躺在床上看書看累了,你想倒頭就睡,卻懶得下床關燈嗎?或是窩在舒服的沙發上看電視,你想開個電風扇涼快一下,卻連抬個腿都覺得麻煩嗎?「拿起一個遙控器,按一下把電燈關掉,再按一下就把電風扇打開。」,如果可以這樣,該是多麼美好的一件事!
這聽起來很困難嗎?不!一點都不!本專題要告訴您如何使用紅外線遙控插座,藉此控制電器的開關,並且以 Arduino 自製一個簡單的紅外線遙控器,利用 Arduino 來遙控紅外線插座。
image image
STEP 1:
把紅外線插座插到 110V 插座 (圖1),先按一下黑色按鈕讓燈亮,再按住按鈕約 3 秒鐘,等燈亮後手放開,此時燈會閃爍 (圖2),代表紅外線插座已進入紅外線學習模式:
image
▲ 圖 1:將紅外線插座插入110V插座
image
▲ 圖 2: 按住按鍵 3 秒鐘後放開,此時燈會閃爍,表示已進入紅外線學習模式
拿起家裏任何一個遙控器,對著紅外線插座按任一鍵 (圖3),這個紅外線插座很聰明,當你聽到繼電器發出嗒的一聲時,表示它已經把紅外線學起來了。
image
▲ 圖 3:用遙控器對著紅外線插座按任一鍵
完成設定後,馬上來做個簡單的測試,將電器 (例如電風扇、立燈) 插到紅外線插座上,然後按一下遙控器同一顆按鍵,此時電器電源會打開 (圖4),再按一下,便會關閉電源 (圖5)。
image
▲ 圖 4:按一下打開電器,此時燈會亮
image
▲ 圖 5:再按一下關閉電器,此時燈會熄滅
STEP 2:
下一步是使用 Arduino 讀取遙控器的紅外線訊號。
首先是連接電路,將 38kHz 紅外線接收器接到 Arduino 上。紅外線接收器的接法如圖 6 所示,接收器的 Vout 腳接到 pin 2 腳位,Vcc 接到 5V 輸出腳位,GND 接到 Arduino 的 GND 腳位。
image
▲ 圖 6:紅外線接收器線路接法
接著是安裝 IRRemote Library。請將 IRRemote Library 下載後(註1),解壓縮放到 libraries 資料夾底下即可,例如 "C:\arduino-1.0.1\libraries"
將底下的程式輸入Arduino IDE 並上傳至 Arduino 板子上:
01// 顯示紅外線協定與訊號
02#include <IRremote.h>           // 引用 IRRemote 函式庫
03 
04const int irReceiverPin = 2;    // 紅外線接收器 OUTPUT 訊號接在 pin 2
05 
06IRrecv irrecv(irReceiverPin);   // 定義 IRrecv 物件來接收紅外線訊號
07decode_results results;         // 解碼結果將放在 decode_results 結構的 result 變數裏
08 
09void setup()
10{
11  Serial.begin(9600);           // 開啟 Serial port, 通訊速率為 9600 bps
12  irrecv.enableIRIn();          // 啟動紅外線解碼
13}
14 
15// 顯示紅外線協定種類
16void showIRProtocol(decode_results *results)
17{
18  Serial.print("Protocol: ");
19   
20  // 判斷紅外線協定種類
21  switch(results->decode_type) {
22   case NEC:
23     Serial.print("NEC");
24     break;
25   case SONY:
26     Serial.print("SONY");
27     break;
28   case RC5:
29     Serial.print("RC5");
30     break;
31   case RC6:
32     Serial.print("RC6");
33     break;
34   default:
35     Serial.print("Unknown encoding"); 
36  
37 
38  // 把紅外線編碼印到 Serial port
39  Serial.print(", irCode: ");           
40  Serial.print(results->value, HEX);    // 紅外線編碼
41  Serial.print(",  bits: ");          
42  Serial.println(results->bits);        // 紅外線編碼位元數   
43}
44 
45void loop()
46{
47  if (irrecv.decode(&results)) {        // 解碼成功,收到一組紅外線訊號
48    showIRProtocol(&results);            // 顯示紅外線協定種類
49    irrecv.resume();                     // 繼續收下一組紅外線訊號       
50  
51}
程式上傳完畢後,打開 Serial Monitor,接著拿起遙控器,對著紅外線接收器按下按鍵(要用跟紅外線插座一樣的同一個按鍵),這時候 Serial Monitor 會顯示紅外線訊號的編碼,如圖 7 所示:
image
▲ 圖 7:遙控器紅外線訊號
請將解到的 Protocol 種類與編碼記錄下來(本例為 NEC 協定,編碼為 4CB3817E),待會我們會用到。
STEP 3:
下一步我們將使用 Arduino 來發射紅外線,以遙控紅外線插座。
首 先一樣是先連接電路,我們要把紅外線發射器和一顆按鈕接到 Arduino。紅外線發射器的接法如圖8所示,發射器的長腳要接到 pin 3 腳位,並且串接一顆 100 ohm 電阻,短腳要接到 GND 腳位。至於按鈕則是一支腳接到 5V輸出腳位,另一支腳接到 pin 4 腳位,同時接一個 10K 電阻連接到 GND 腳位。
image
將底下的程式輸入Arduino IDE 並上傳至 Arduino 板子上:
01/*
02* 發射紅外線訊號
03 *     注意! 紅外線發射器(IR LED)必須接到 pin 3, 不能接其它腳位
04 */
05#include <IRremote.h>                  // 引用 IRRemote 函式庫
06 
07const int buttonPin = 4;                 // 按鍵(pushbutton)接在 pin 4
08int buttonState = 0;                     // 按鍵狀態
09 
10IRsend irsend;                          // 定義 IRsend 物件來發射紅外線訊號
11 
12void setup()
13{
14  pinMode(buttonPin, INPUT);             // 把 buttonPin 設置成 INPUT
15}
16 
17void loop()
18{
19  // 讀取按鍵狀態
20  buttonState = digitalRead(buttonPin);
21 
22  // 檢查按鍵是否被按下(pressed)
23  // 有的話 buttonState 會是 HIGH
24  if (buttonState == HIGH) {   
25    // 發射紅外線訊號
26    irsend.sendNEC(0x4CB3817E, 32);   // 記得換成你遙控器的紅外線編碼
27  }
28}
本 例所用的是講 NEC 協定的遙控器,所以程式呼叫 sendNEC() 發射紅外線訊號,如果你在 STEP 2 解到是其它紅外線協定,必須改呼叫其它函式,例如 sendSony(), sendRC5(), sendRC6(), sendSharp() 等。另外,記得將程式裏的紅外線編碼換成你遙控器的編碼。
大功告成了,此時按下按鈕後,Arduino 就會遙控紅外線遙控插座,你便可以打開或關閉電器的電源囉。
假如你有 Ethernet Shield、Wi-Fi Shield 或者是藍芽擴充模組,你只要利用 Arduino 和紅外線遙控插座,然後再寫個手機 App 便可以利用手機來遙控家電的開關了。這部份就留給你當作功課了。
註1: IRRemote Library 可由以下連結下載:
https://github.com/coopermaa/Arduino-IRremote
材料表:
1) 一張 Arduino 板子,一條 USB 傳輸線,以及 Arduino IDE 軟體開發環境:
clip_image002clip_image004
2) 一顆 38 kHz 的紅外線接收器 (Infrared Receiver),如 TSOP2438, TSOP4438, PNA4602, FM-8038TM2-5DN
clip_image006
▲ 紅外線接收器(Infrared Receiver)
3) 一顆發射波長為 940nm (nanometer, 奈米) 的紅外線發射器
clip_image007
4) 一個紅外線遙控插座 (可在露天或淘寶買到)
clip_image009
相關文章: from http://coopermaa2nd.blogspot.tw/2012/12/arduino.html
------------------------------------------

熱門文章