Arduino Uno红外信号转发失效问题排查求助
红外遥控信号转发问题:FireTV转音响条形音箱无响应
我尝试用Arduino Uno把FireTV遥控器的信号转换成音响条形音箱的协议,避免频繁切换遥控器。当前硬件搭配了红外接收器、红外LED和一个按钮:接收器触发中断打印接收数据,按下按钮时LED发送预定义红外信号。日志显示发送的数据和原遥控器一致,但音响条形音箱完全没反应。
代码实现
#include <IRremote.h> const int RECV_PIN = 2; const int SEND_PIN = 5; const int BUTTON_PIN = 3; IRrecv irrecv(RECV_PIN); IRsend irsend(SEND_PIN); IRRawDataType receivedData; decode_type_t receivedProtocol; uint16_t receivedAddress; uint16_t receivedCommand; irparams_struct *rawData; int rawDataBits; //bool dataReceived = false; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // 启动红外接收 attachInterrupt(digitalPinToInterrupt(RECV_PIN), irIsr, CHANGE); // 添加中断 pinMode(BUTTON_PIN, INPUT); // 设置按钮引脚为输入 } void loop() { if (digitalRead(BUTTON_PIN) == HIGH) { Serial.println("Button pressed"); // 发送信号 uint16_t sAddress = 0x0102; uint8_t sCommand = 72; uint8_t sRepeats = 0; irsend.sendNEC(sAddress & 0xFF, sCommand, sRepeats); // irsend.sendRC5(sAddress & 0xFF, sCommand, sRepeats); // 试过其他遥控器协议,同样无效 //dataReceived = false; delay(500); // 防抖延迟 } } void irIsr() { if (irrecv.decode()) { // 接收到红外信号时 rawData = irrecv.decodedIRData.rawDataPtr; rawDataBits = irrecv.decodedIRData.numberOfBits; receivedData = irrecv.decodedIRData.decodedRawData; receivedProtocol = irrecv.decodedIRData.protocol; receivedAddress = irrecv.decodedIRData.address; receivedCommand = irrecv.decodedIRData.command; Serial.println("Protocol: " + String(receivedProtocol) + ", Address: " + String(receivedAddress) + ", Command: " + String(receivedCommand) + ", Raw Data: " + String(receivedData)); // 打印原始数据用于调试 Serial.print("RawDataBits: "+ String(rawDataBits)); Serial.print("\n Raw Data: "); for (int i = 0; i < rawDataBits; i++) { Serial.print(rawData->rawbuf[i]); // 访问irparams_struct中的rawbuf数组 Serial.print(" "); } Serial.println(); //dataReceived = true; irrecv.resume(); // 继续接收下一个信号 } }
调试输出
原遥控器输出
Protocol: 8, Address: 2, Command: 72, Data: 3075013890 Raw Data: 13365 164 90 12 10 14 32 13 9 13 10 12 11 11 11 12 11 11 11 13 32 12 11 11 34 12 33 13 33 11 34 11
按下按钮后的输出
Button pressed Protocol: 8, Address: 2, Command: 72, Data: 3075013890 Raw Data: 12208 164 88 11 11 12 33 12 11 11 11 12 11 12 11 11 11 12 11 12 33 11 11 12 33 11 34 11 34 11 34 11
解决思路
- 协议误识别是核心问题:你怀疑的专有协议被误判为NEC完全正确。标准NEC协议的引导码是9000μs低+4500μs高,但原遥控器的引导码是13365/164,和NEC标准完全不符。IRremote库的自动协议识别把非NEC协议归类成了NEC,导致你用
sendNEC发送的信号时序和原遥控器有细微差异,音响的红外接收器能识别这些差异,所以不响应。 - 改用原始数据转发:既然已经能捕获到完整的原始时序数据,直接用
sendRaw函数发送原始数组是最可靠的方式,不用依赖库的协议识别。比如把原遥控器的raw数据存成数组,按下按钮时调用irsend.sendRaw(rawArray, arrayLength, 38);(最后一个参数是载波频率,一般红外遥控是38kHz)。 - 硬件排查:
- 红外LED必须加220Ω左右的限流电阻,否则电流不足导致信号强度不够,音响接收不到。
- 确保LED对准音响的红外接收窗口,发射角度和距离不要太极端。
- 细节调试:
- 用手机摄像头(能捕捉红外光)检查LED是否正常发光,确认硬件发射通路没问题。
- 对比原遥控器和Arduino发送的raw数据时序,重点看引导码、每个位的高低电平时长,有些设备对时序精度要求极高,微小的误差都会导致不响应。
内容的提问来源于stack exchange,提问作者UsualSquare
相关产品推荐
相关产品推荐

