要怎麼取得遙控器的紅外線資料呢?有兩個方法,第一個是利用「1.2 顯示紅外線協定種類」的範例程式(Example1.2.pde),這支程式會把紅外線解碼結果顯示在 Serial Monitor 上:
如上圖所示,以我所用的電視遙控器為例,可知我電視遙控器講的是 NEC 紅外線協定,而 Power 鈕的紅外線編碼為 0x4FB48B7,資料長度是 32 位元。
另外一個方法是用「1.4 自製 LCD 介面的紅外線解碼器(IR Decoder)」的紅外線解碼器:
按下遙控器上的按鈕後,LCD 上就會顯示解碼得到的紅外線協定(如 NEC)、紅外線編碼(如 4FB48B7)以及資料長度(如 32 位元)。
大大你好,請問假如我知道我的遙控數值為:B6E3AC3,我想發射這組數值給我的接收器然後讓我的LED亮起來請問一下在(接收程式)裡判斷式怎寫?
回覆刪除if(XXXXX=="B6E3AC3")
{
digitalWrite(ledPin, HIGH);
}
有請大大幫我這個問題嚕^^!
hi, 可以試看看底下的方法:
回覆刪除long irKeycode = 0xB6E3AC3; // 儲存在 long integer 中
if (irrecv.decode(&results)) {
if (results.value == irKeycode) {
digitalWrite(ledPin, HIGH);
}
irrecv.resume();
}
大概是這樣,我沒實測過。
謝謝你!程式沒問題~
回覆刪除you are welcome.
回覆刪除作者已經移除這則留言。
回覆刪除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提供這樣方便的平台!!!!我受益良多!!!
你說「在加入servo的控制碼後,同一顆按鈕收到的紅外線編碼會不一致」
回覆刪除那,你在加入 servo 的控制碼前,有沒有收過紅外線編碼? 當時同一顆按鈕收到的紅外線編碼也是不一致的嗎?
在加入servo前我有測試過囉~一切正常然後也藉此拿到紅外線的編碼
回覆刪除但加入下面這三行之後(兩個servo共六行)紅外線的編碼在serial上面顯示就會是亂碼了
value = 180;
myservo.write(value);
delay(50);
不過 有時候會得到正確的值~
然後servo就會動作
但一切都是運氣...
目前還是無解@@
servo 跟 ir receiver 用的腳位不一樣,應該是不會影響的才對.... 怪~
回覆刪除倒是有位老外結合了 irremote 和 servo,看影片 demo 還蠻正常的:
http://www.youtube.com/watch?v=sXSALN9ce1k
我把程式改成下面這樣
回覆刪除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只要有上電就會導致紅外線接受不正常呢?? 這樣應該很多人都會有問題才是阿....
可能是電不足...
回覆刪除試試把 Servo 的電源分開
Cooper,
回覆刪除我把電源分開之後
紅外線接受到的訊號均顯示正確囉!!!!!!
果真是因為電力問題導致接收受到servo干擾~~
謝謝提供方向:))
恭禧!恭禧!
回覆刪除rubofun 上這篇提到 servo 與 PWM led 的問題,跟你遇到的情形很貌似
請問如何同時設置兩個紅外線接收器?同一個信號發射過去,不同的接收器處理信號不一樣。我設置的紅外線接收器總是變成一個信號。
回覆刪除IRRemote library 不支援同時接兩個紅外線接收器喔
回覆刪除即便可以,如果接了兩顆紅外線接收器,這樣兩顆接收器收到的應該會是同一個訊號,有可能變成不同的訊號嗎?
我想做一個紅外線自動跟踪系統,利用小孔成像,不同紅外線接收器接收到同一個紅外線信號作出不同的反應。是否可以修改IRRemote library從而同時接到1個以上的紅外線接收器
回覆刪除紅外線自動跟蹤系統? 你是指 Line Following Robot 嗎? 可不可以這我也不曉得,因為這 IRRemote Library 是老外寫的
回覆刪除