2011年3月31日 星期四

1.5 兩個取得遙控器紅外線資料的方法

image_thumb14
▲ Arduino 與電視遙控器

要怎麼取得遙控器的紅外線資料呢?有兩個方法,第一個是利用「1.2 顯示紅外線協定種類」的範例程式(Example1.2.pde),這支程式會把紅外線解碼結果顯示在 Serial Monitor 上:

image_thumb1414

如上圖所示,以我所用的電視遙控器為例,可知我電視遙控器講的是 NEC 紅外線協定,而 Power 鈕的紅外線編碼為 0x4FB48B7,資料長度是 32 位元。

另外一個方法是用「1.4 自製 LCD 介面的紅外線解碼器(IR Decoder)」的紅外線解碼器:

DSC00161_thumb56 
▲ 紅外線解碼器 (IR Decoder)

按下遙控器上的按鈕後,LCD 上就會顯示解碼得到的紅外線協定(如 NEC)、紅外線編碼(如 4FB48B7)以及資料長度(如 32 位元)。

延伸閱讀

17 則留言:

  1. 大大你好,請問假如我知道我的遙控數值為:B6E3AC3,我想發射這組數值給我的接收器然後讓我的LED亮起來請問一下在(接收程式)裡判斷式怎寫?
    if(XXXXX=="B6E3AC3")
    {
    digitalWrite(ledPin, HIGH);
    }
    有請大大幫我這個問題嚕^^!

    回覆刪除
  2. hi, 可以試看看底下的方法:

    long irKeycode = 0xB6E3AC3; // 儲存在 long integer 中

    if (irrecv.decode(&results)) {
    if (results.value == irKeycode) {
    digitalWrite(ledPin, HIGH);
    }
    irrecv.resume();
    }

    大概是這樣,我沒實測過。

    回覆刪除
  3. 作者已經移除這則留言。

    回覆刪除
  4. coopermaa你好!

    我測試了利用IR傳遞訊號給IR接收器,進而利用arduino控制 servo轉動。
    如同上面你在討論串裡面的回覆一樣。

    但我發現我在紅外線接收判斷式的執行區塊裡加入servo的控制碼後
    if (results.value == irKeycode1) {
    blinkLED();
    value = 180;
    myservo.write(value);
    delay(50);
    }
    我按壓遙控器1,我的IR接受器顯示在serial monitor的紅外線編碼會不一致,導致不一定每次按壓1都會發生動作。

    例如:

    irCode: 57F56608, bits: 32
    irCode: 58DF0D19, bits: 32
    irCode: 9F0ED2F5, bits: 32
    irCode: 51D521B9, bits: 32
    irCode: AE4188A3, bits: 32
    irCode: FFFFFFFF, bits: 0
    irCode: 207F42BD, bits: 32
    以上都是按壓1顯示出來的數值

    以下是我的code

    #include // 引用 IRRemote 函式庫
    #include

    const int irReceiverPin = 2; // 紅外線接收器 OUTPUT 訊號接在 pin 2
    const int ledPin = 13; // LED 接腳
    Servo myservo;
    int value = 0;

    long irKeycode1 = 0x207F42BD ; // 儲存在 long integer 中
    long irKeycode2 = 0x207FC23D ;

    IRrecv irrecv(irReceiverPin); // 定義 IRrecv 物件來接收紅外線訊號
    decode_results results; // 解碼結果將放在 decode_results 結構的 result 變數裏

    void setup()
    {
    pinMode(ledPin, OUTPUT); // 把 LED 接腳設置為輸出模式
    Serial.begin(9600); // 開啟 Serial port, 通訊速率為 9600 bps
    irrecv.enableIRIn(); // 啟動紅外線解碼
    myservo.attach(9);
    }

    // 讓指示燈閃爍幾下
    void blinkLED() {
    for (int i=1; i<= 4; i++) {
    digitalWrite(ledPin, HIGH); // 打開 LED
    delay(100);
    digitalWrite(ledPin, LOW); // 關掉 LED
    delay(100);
    }
    }

    void loop()
    {
    if (irrecv.decode(&results)) { // 解碼成功,收到一組紅外線訊號
    // 印到 Serial port
    Serial.print("irCode: ");
    Serial.print(results.value, HEX); // 紅外線編碼
    Serial.print(", bits: ");
    Serial.println(results.bits); // 紅外線編碼位元數

    if (results.value == irKeycode1) {
    blinkLED(); // 讓指示燈閃爍幾下
    value = 180;
    myservo.write(value);
    delay(50);
    }

    if (results.value == irKeycode2) {
    blinkLED(); // 讓指示燈閃爍幾下
    value = 0;
    myservo.write(value);
    delay(50);
    }
    irrecv.resume(); // 繼續收下一組紅外線訊號
    }
    }





    請問要怎麼樣修改才能使IR接收器接收到正常的紅外線編碼呢? 才能讓我的servo依我紅外線發送資訊正常運作~~~~

    真的很感謝coopermaa提供這樣方便的平台!!!!我受益良多!!!

    回覆刪除
  5. 你說「在加入servo的控制碼後,同一顆按鈕收到的紅外線編碼會不一致」
    那,你在加入 servo 的控制碼前,有沒有收過紅外線編碼? 當時同一顆按鈕收到的紅外線編碼也是不一致的嗎?

    回覆刪除
  6. 在加入servo前我有測試過囉~一切正常然後也藉此拿到紅外線的編碼

    但加入下面這三行之後(兩個servo共六行)紅外線的編碼在serial上面顯示就會是亂碼了
    value = 180;
    myservo.write(value);
    delay(50);

    不過 有時候會得到正確的值~
    然後servo就會動作
    但一切都是運氣...
    目前還是無解@@

    回覆刪除
  7. servo 跟 ir receiver 用的腳位不一樣,應該是不會影響的才對.... 怪~
    倒是有位老外結合了 irremote 和 servo,看影片 demo 還蠻正常的:
    http://www.youtube.com/watch?v=sXSALN9ce1k

    回覆刪除
  8. 我把程式改成下面這樣
    if (results.value == irKeycode1) {
    blinkLED(); // 讓指示燈閃爍幾下
    value = 180;
    myservo.attach(9);
    myservo.write(value);
    delay(1000);
    myservo.attach(10000); <====重點所在,也是唯一加入的一行
    }

    這樣就ok了!!!!
    我想試試看是不是servo一直上電的關係,導致紅外線接受錯誤訊息
    然後我就用了myservo.attach(10000);
    讓servo關掉...
    這樣就成功拉!!!!!!!!!!!!!!!!

    但是....我不知道什麼才是正確的關掉servo的指令
    所以我故意給他一個超乎想像的值讓他shut down XDD
    不知道cooper知不知道正常關掉servo要用什麼指令關~~

    但是...為什麼servo只要有上電就會導致紅外線接受不正常呢?? 這樣應該很多人都會有問題才是阿....

    回覆刪除
  9. 可能是電不足...
    試試把 Servo 的電源分開

    回覆刪除
  10. Cooper,

    我把電源分開之後
    紅外線接受到的訊號均顯示正確囉!!!!!!

    果真是因為電力問題導致接收受到servo干擾~~

    謝謝提供方向:))

    回覆刪除
  11. 恭禧!恭禧!

    rubofun 上這篇提到 servo 與 PWM led 的問題,跟你遇到的情形很貌似

    回覆刪除
  12. 請問如何同時設置兩個紅外線接收器?同一個信號發射過去,不同的接收器處理信號不一樣。我設置的紅外線接收器總是變成一個信號。

    回覆刪除
  13. IRRemote library 不支援同時接兩個紅外線接收器喔
    即便可以,如果接了兩顆紅外線接收器,這樣兩顆接收器收到的應該會是同一個訊號,有可能變成不同的訊號嗎?

    回覆刪除
  14. 我想做一個紅外線自動跟踪系統,利用小孔成像,不同紅外線接收器接收到同一個紅外線信號作出不同的反應。是否可以修改IRRemote library從而同時接到1個以上的紅外線接收器

    回覆刪除
  15. 紅外線自動跟蹤系統? 你是指 Line Following Robot 嗎? 可不可以這我也不曉得,因為這 IRRemote Library 是老外寫的

    回覆刪除

注意:只有此網誌的成員可以留言。