簡體   English   中英

如何正確接收和發送來自 Arduino 的原始 IR 數據

[英]How to correctly receive and send raw IR data from Arduino

以下是我從 Arduino 讀取原始 IR 數據的代碼:

#define sprint Serial.print 
#define sprintln Serial.println
#include <IRremote.h>

#define IR_RCVR_PIN 11
IRrecv ir_receiver(IR_RCVR_PIN);
decode_results results;

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

void loop() {
   if (ir_receiver.decode(&results)) {
    dump(&results);
    ir_receiver.resume(); // Receive the next value
   }
}

int c = 1;

void dump(decode_results *results) {
   int count = results->rawlen;
   sprintln(c);
   c++;
   sprintln("For IR Scope: ");
   for (int i = 1; i < count; i++) {
       sprint("0x");
       sprint((unsigned int)results->rawbuf[i], HEX);
    sprint(" ");
   }

   sprintln("");
   sprintln("For Arduino sketch: ");
   sprint("unsigned int raw[");
   sprint(count, DEC);
   sprint("] = {");
   for (int i = 1; i < count; i++) {
       sprint("0x");
       sprint((unsigned int)results->rawbuf[i], HEX);
       sprint(",");
    }
    sprint("};");
    sprintln("");
    sprint("irsend.sendRaw(raw,");
    sprint(count, DEC);
    sprint(",38);");
    sprintln("");
    sprintln("");
}

使用它我可以從遙控器得到這個:

1
For IR Scope: 
0x47 0x1F 0xB 0x17 0xA 0x17 0xB 0x6 0xA 0x6 0xB 0x6 0xA 0x17 0xB 0x6 0xA 0x6 0xB 0x17     
0xA 0x17 0xA 0x7 0xA 0x17 0xA 0x7 0xA 0x6 0xB 0x17 0xA 0x17 0xA 0x6 0xB 0x17 0xA 0x17    
0xB 0x6 0xA 0x6 0xB 0x17 0xA 0x6 0xB 0x6 0xA 0x17 0xB 0x6 0xA 0x6 0xB 0x6 0xA 0x7 0xA     
0x6 0xB 0x6 0xA 0x6 0xB 0x6 0xA 0x7 0xA 0x6 0xB 0x6 0xA 0x7 0xA 0x6 0xB 0x6 0xA 0x6 0xB    
0x6 0xA 0x7 0xA 0x6 0xB 0x6 0xA 0x6 0xB 0x17 0xA 0x6 0xB 0x6 0xA 

For Arduino sketch: 

unsigned int raw[100] =       
{0x47,0x1F,0xB,0x17,0xA,0x17,0xB,0x6,0xA,0x6,0xB,0x6,0xA,0x17,
 0xB,0x6,0xA,0x6,0xB,0x17,0xA,0x17,0xA,0x7,0xA,0x17,0xA,0x7,0xA,0x6,
 0xB,0x17,0xA,0x17,0xA,0x6,0xB,0x17,0xA,0x17,0xB,0x6,0xA,0x6,0xB,0x17,0xA,
 0x6,0xB,0x6,0xA,0x17,0xB,0x6,0xA,0x6,0xB,0x6,0xA,0x7,0xA,0x6,0xB,0x6,0xA,
 0x6,0xB,0x6,0xA,0x7,0xA,0x6,0xB,0x6,0xA,0x7,0xA,0x6,0xB,0x6,0xA,0x6,0xB,
 0x6,0xA,0x7,0xA,0x6,0xB,0x6,0xA,0x6,0xB,0x17,0xA,0x6,0xB,0x6,0xA,};

因此,在發送此數據時,我可以使用此指令:

irsend.sendRaw(raw,100,38);

問題是我無法從需要控制的設備中得到任何響應。 我已經檢查了我的紅外發射器,我的讀數與上面相同。

我錯過了什么嗎?

您應該多次讀取信號,然后平均它們的值以消除很小的偏差誤差。 確保您的發射器和接收器使用相同的光波長並在 38KHz 下工作(您以 38KHz 調制傳輸。如果您的發射器為您進行調制,那么您不應該使用 IRremote)。

另外,您期望什么是“響應”? 通常,IR 通信是單向的。

您已達到 RAWBUF 的 100 字節限制,因此您可能需要增加該數字。 嘗試達到 400。

在IRemote.h中打開並修改這一行(約#122)

#define RAWBUF 100 // Length of raw duration buffer

更大的東西

#define RAWBUF 400 // Length of raw duration buffer

我正在將您的代碼與三星空調綁定,我收到了 116 個字節

我剛開始玩 Arduino,並試圖通過執行您所做的操作來復制 Pentax 遙控器中的代碼,但它不起作用。 然后我找到了這篇文章: http : //www.righto.com/2009/08/multi-protocol-infrared-remote-library.html 我說:“發送和接收的原始緩沖區之間有兩個區別。發送緩沖區值以微秒為單位,而接收緩沖區值以 50 微秒為單位。”

因此,您需要做的就是將原始數組中的每個元素乘以 50,然后將這些值發送到irsend.sendRaw(raw,100,38) 為我工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM