【问题标题】:How to correctly receive and send raw IR data from Arduino如何正确接收和发送来自 Arduino 的原始 IR 数据
【发布时间】:2014-03-30 23:26:14
【问题描述】:

以下是我从 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);

问题是我无法从我需要控制的设备获得任何响应。我已经检查了我的红外发射器,我的读数与上面相同。

我错过了什么吗?

【问题讨论】:

    标签: c++ arduino embedded infrared arduino-c++


    【解决方案1】:

    您应该多次读取信号,然后将它们的值平均以消除小的偏差误差。确保您的发射器和接收器使用相同的光波长并在 38KHz 下工作(您正在传输调制在 38KHz。如果您的发射器为您进行调制,那么您不应该使用 IRremote)。

    另外,您对“响应”的期望是什么?通常,IR 通信是单向的。

    【讨论】:

    • 另外,您对“响应”的期望是什么?通常,IR 通信是单向的。 我认为 OP 只是意味着来自接收数据的设备(电视或类似设备)的响应。 OP 的电视或其他不得更改频道/音量/等的东西。
    • 我所说的“响应”是指设备没有按照我使用代码对它的命令进行操作,就像它没有打开或关闭一样。谢谢你,我会试试你所说的平均水平。
    【解决方案2】:

    您已达到 RAWBUF 的 100 字节限制,因此您可能需要增加该数字。尝试提高到 400。

    在IRemote.h中打开并修改这一行(关于#122)

    #define RAWBUF 100 // Length of raw duration buffer
    

    为了更大的目标

    #define RAWBUF 400 // Length of raw duration buffer
    

    我将您的代码与三星空调绑定,我收到 116 个字节

    【讨论】:

    【解决方案3】:

    我刚开始玩 Arduino,并试图通过执行您所做的操作从我的 Pentax 遥控器复制代码,但它不起作用。然后我找到了这篇文章:http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html。我说:“发送和接收的原始缓冲区有两个不同之处。发送缓冲区的值以微秒为单位,而接收缓冲区的值以 50 微秒为单位。”

    因此,您只需将原始数组中的每个元素乘以 50,然后将这些值发送到 irsend.sendRaw(raw,100,38)。为我工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 2014-09-18
      • 2019-02-17
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多