红外遥控是Arduino项目里最实用的交互方式之一,十几块钱一个红外接收头,配合家里的电视遥控器或者万能遥控器,就能给项目加上无线控制功能。做遥控小车、红外遥控灯、舵机云台这类项目,IRremote库基本是标配。NEC协议用得最多,兼容性也最好。

红外接收头怎么接Arduino
常用的红外接收头是VS1838B或者HX1838,3个引脚:OUT(信号输出)、GND、VCC。OUT接Arduino任意数字引脚(推荐D11,因为IRremote库默认用这个),GND接地,VCC接5V或3.3V都行。三个引脚的排列不同厂家可能不一样,拿到手先看模块丝印。
Arduino IDE里装IRremote库(shirriff写的经典版本或者新版Arduino-IRremote都行)。新版API变了,用法是IrReceiver.begin(11, ENABLE_LED_FEEDBACK)初始化,IrReceiver.decode()接收解码。
NEC协议解码:怎么读出遥控器按键值
NEC协议是家电遥控器最常用的红外协议。每一帧数据包含引导码、客户码、客户码反码、数据码、数据码反码,总共32位。Arduino接收到后,IRremote库自动解析,你只需要读IrReceiver.decodedIRData.command就能拿到按键值。
写个简单的测试代码:loop里判断IrReceiver.decode()返回true,然后打印command的十六进制值。对着接收头按遥控器上的按键,串口就会显示每个按键对应的值。比如音量+可能是0x02,音量-是0x03,电源键是0x45。把这些值记下来,后面代码里用switch-case根据按键值执行不同操作。
用遥控器控制舵机云台
红外遥控+两个舵机做一个两轴云台是很经典的入门项目。水平舵机接D9、垂直舵机接D10,红外接收头接D11。代码逻辑很简单:定义两个角度变量,按"上"键垂直角度+5°、按"下"键-5°、按"左"键水平-5°、按"右"键+5°,每次按键后调用舵机的write()转到新角度。
注意舵机不要直接由Arduino的5V引脚供电,一个SG90还行,两个同时转可能电流不够。加一个独立的5V电源给舵机供电,GND跟Arduino共地。
红外发射:用Arduino模拟遥控器
IRremote不仅能接收,还能发射红外信号。用红外发射管(940nm)接Arduino的PWM引脚(推荐D3),配合限流电阻(100Ω左右),就能发射NEC编码的红外信号。
代码里用IrSender.sendNEC(address, command, repeat)发射。比如你想用Arduino复制家里电视遥控器的电源键:先用接收头读出原始按键值(包括address和command),然后用发射管发送同样的值,就能控制电视开关机了。
这个功能可以用来做万能遥控器,或者给家里的老旧设备加上智能控制。比如老式风扇没有遥控功能,加一个红外接收头+继电器模块,用遥控器就能控制风扇开关了。
红外通信的常见坑
第一个坑是日光干扰。红外接收头对38kHz调制信号敏感,但强烈的日光里也有红外成分,可能导致接收距离变短甚至误触发。室内用没问题,室外长距离控制建议换蓝牙或WiFi方案。
第二个坑是协议兼容性。不是所有遥控器都是NEC协议,有些是RC5(飞利浦)、RC6(微软)、Sony SIRC。IRremote库都支持,但解码方式不同。如果你的遥控器解出来的值不对或者全是0,可能不是NEC协议,换一种协议试试。
第三个坑是按键连发。很多遥控器长按一个键会发送重复帧(NEC协议里的repeat code),IRremote会把它当作一个新事件。代码里要区分"首次按下"和"重复帧",可以用IrReceiver.decodedIRData.flags里的IRDATA_FLAGS_IS_REPEAT标志来判断,避免长按一个键舵机连续转好几格。
红外遥控是Arduino项目里性价比最高的无线控制方案之一,十几块钱的接收头+一个旧遥控器就能用。理解了NEC协议的解码逻辑,后面不管是做遥控小车还是智能家居控制,都是在这个基础上扩展。










红外发射也很实用,我用Arduino+红外发射管做了一个万能遥控器,把家里电视、空调、风扇的遥控信号都存进去了,一个按键切换设备。
日光干扰这个确实有,我把红外接收头放窗边,白天接收距离明显变短。后来加了个黑色热缩管套在接收头前面挡一下可见光,好多了。
RC5协议也能用IRremote解码吗?我家里有个飞利浦的旧遥控器想利用一下。
红外遥控做舵机云台确实好玩,不过有个坑提醒一下:遥控器的按键值因品牌而异,同一个按键在不同遥控器上的command值可能完全不同。建议大家拿到遥控器先用decode示例代码把每个键的值都读一遍记下来,别想当然。