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 意見:

小B 提到...

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

coopermaa 提到...

hi, 可以試看看底下的方法:

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

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

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

小B 提到...

謝謝你!程式沒問題~

coopermaa 提到...

you are welcome.

小B 提到...
作者已經移除這則留言。
Sven Wang 提到...

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提供這樣方便的平台!!!!我受益良多!!!

coopermaa 提到...

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

Sven Wang 提到...

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

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

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

coopermaa 提到...

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

Sven Wang 提到...

我把程式改成下面這樣
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只要有上電就會導致紅外線接受不正常呢?? 這樣應該很多人都會有問題才是阿....

coopermaa 提到...

可能是電不足...
試試把 Servo 的電源分開

Sven Wang 提到...

Cooper,

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

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

謝謝提供方向:))

coopermaa 提到...

恭禧!恭禧!

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

Zhenhao Chen 提到...

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

coopermaa 提到...

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

Zhenhao Chen 提到...

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

coopermaa 提到...

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