恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

基于Arduino与红外遥控的智能小车DIY:从信号解码到运动控制

  • 首页
  • 资讯中心
  • /
  • 基于Arduino与红外遥控的智能小车DIY:从信号解码到运动控制

相关资讯

Arduino FM收音机项目实战:从RDA5807M模块到智能收音机制作 2026/8/19 2:25:07
Python实时音量监控:5分钟打造智能提醒器 2026/8/19 2:25:07
SageMaker特征工程本地调试通不过?三天调试我删掉了80%的依赖 2026/8/19 2:25:07

最新资讯

长安汽车百亿新能源产业园:从制造到智造的技术升级与挑战
【Bug已解决】API Error: 400 invalid beta flag when trying to use Claude Code with Bedrock using claude 3.
入门级纯电市场定价逻辑与北汽新能源EC3产品力深度解析
异步视觉语言智能体:实现增量式3D场景图构建与实时决策
RT-Thread邮箱机制解析:轻量级任务通信与零拷贝实践
程序员必知的硬件知识:从BMC日志到RAID电池,揭秘系统稳定性背后的硬件真相

今日推荐

Windows 安卓应用安装终极方案:5分钟上手免费APK安装器,三步告别模拟器
WarcraftHelper 魔兽争霸3优化实战指南
抖音批量下载实战手册:用douyin-downloader把6小时手工劳动压缩到15分钟

本周热门

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码
【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码
隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

基于Arduino与红外遥控的智能小车DIY:从信号解码到运动控制

发布时间:2026/8/19 2:25:07
基于Arduino与红外遥控的智能小车DIY:从信号解码到运动控制 1. 项目概述当电视遥控器遇上玩具车你有没有想过躺在沙发上随手按下的电视遥控器除了换台和调音量还能干点别的比如用它来遥控一辆小车满屋子跑。这个听起来有点“不务正业”的想法正是“红外遥控车”项目的核心乐趣所在。它不是一个复杂的工业级机器人而是一个绝佳的入门级电子DIY项目完美融合了硬件拆解、信号解码和基础编程的逻辑。这个项目的本质是利用一个我们身边最常见的红外发射器——电视遥控器去控制一个接收端——通常是基于Arduino或类似单片机的智能小车。它解决的核心问题是为电子爱好者、创客教育甚至是想给孩子做个有趣玩具的家长提供了一个低成本、高趣味性且知识点密集的实践案例。你不需要昂贵的专用遥控设备几块钱的红外接收头、一块开发板、两个电机和一个小车底盘就能开启一段“信号破译”与“运动控制”的奇妙旅程。对于初学者你能学到红外通信的基本原理、如何用单片机解码遥控器按键、以及最基础的电机驱动与PWM调速。对于有经验的玩家则可以深入探索信号协议、抗干扰设计、甚至扩展为多车编队或结合其他传感器如超声波避障的复合项目。接下来我就带你从零开始拆解这个项目的每一个技术环节分享我在多次制作中积累的实操要点和那些容易踩坑的细节。2. 核心思路与系统架构设计2.1 为什么选择红外遥控在开始动手前我们得先想明白无线控制方案那么多蓝牙、Wi-Fi、2.4G射频模块都很成熟为什么偏偏选红外首要原因是极致的低成本与易得性。一个通用的红外接收头如VS1838B价格通常在1元以内而一个废弃的电视遥控器更是零成本。对于入门项目成本是首要考虑因素。其次红外通信的协议相对简单且标准化。市面上绝大多数消费电子产品的红外遥控都遵循NEC、RC-5、Sony SIRC等几种主流协议其中NEC协议因其简单高效而最为常见这大大降低了我们解码的难度。最后是学习的连贯性。从理解红外光的调制与解调到手动解码一串脉冲宽度再到最终转化为控制指令整个过程涵盖了数字通信的基础概念是学习嵌入式系统输入捕获功能的绝佳案例。当然红外也有明显的短板方向性强、易受遮挡、通信距离短通常10米以内且无法穿墙。但这对于在室内桌面或客厅地板上跑的小车来说恰恰构成了一个有趣的挑战——你需要对准方向这反而增加了操作的“手感”和趣味性。我们的设计思路就是基于这些特点构建一个稳定、可扩展的接收系统。2.2 系统整体架构框图整个系统可以清晰地分为发射端、接收端和执行端三部分。发射端就是你的电视遥控器。它内部有一个红外发射二极管当按下按键时遥控器内部的编码芯片会根据预设协议如NEC生成一串特定的、经过38kHz载波调制的红外脉冲信号并发射出去。接收端这是项目的核心大脑。主要由三部分构成红外接收头如VS1838B它内部集成了光电二极管、前置放大器和解调电路。它的作用是过滤掉环境中的其他红外光如日光灯只接收38kHz的载波信号并将其解调还原成原始的数字电平信号输出给单片机。主控单片机以Arduino Uno为例。它通过一个数字输入引脚读取接收头输出的电平信号利用其输入捕获或外部中断功能精确测量脉冲的宽度从而解码出遥控器发送的指令数据。电机驱动模块最常用的是L298N或TB6612FNG。单片机解码出指令后通过GPIO引脚输出控制信号给驱动模块由驱动模块提供大电流来驱动直流电机。执行端即小车底盘包括两个直流减速电机、轮子、万向轮和电池盒。整个数据流是遥控器按键 - 红外编码信号 - 空气传播 - 接收头解调 - 数字电平信号 - 单片机解码 - 控制逻辑 - 电机驱动信号 - 电机动作。注意在选择红外接收头时务必确认其解调频率是否为38kHz这是绝大多数消费电子遥控器的标准载波频率。买错了频率就无法正确解调信号。3. 硬件选型、电路设计与焊接要点3.1 核心元器件清单与选型理由一份清晰的物料清单是成功的一半。以下是我多次制作后总结的优选清单元器件推荐型号数量选型理由与注意事项主控板Arduino Uno R31生态丰富资料极多USB编程方便引脚够用。对于更小体积的项目 Nano是完美替代品。红外接收头VS1838B / HS0038B1最常用内置屏蔽抗干扰能力较好。注意引脚顺序通常面向接收面从左至右为“输出、地、电源”。电机驱动模块L298N 双H桥模块1经典耐造驱动电流大单桥2A可同时驱动两个电机正反转和调速。缺点是发热较大。TB6612FNG 模块1更推荐。效率高发热小外围电路简单驱动能力1.2A对小电机绰绰有余。直流减速电机TT马达带轮2价格低廉扭力适中自带减速齿轮和塑料轮非常适合入门小车。注意选购时看好轴径与轮胎的匹配。小车底盘双轮万向轮底盘套件1套包含电机固定板、轮子、万向轮和螺丝省去自己打孔的麻烦。电源18650锂电池*2 电池盒1套或使用9V方块电池。关键点电机驱动模块和Arduino最好分开供电避免电机启动瞬间的电压骤降导致单片机复位。杜邦线公对公、公对母若干用于连接各模块。建议多备一些。开关拨动开关1用于控制整车电源方便调试。3.2 电路连接详解与原理图解读正确的连接是硬件工作的基础。这里以Arduino Uno TB6612FNG VS1838B这个更优组合为例说明连接方法。电源部分重中之重我强烈建议采用双电源方案。用一个4节AA电池盒6V或两节18650电池7.4V单独为TB6612FNG的VM电机电源引脚供电。同时用另一组电池如USB充电宝或直接从TB6612FNG的VCC逻辑电源引脚接5V为Arduino供电。这样可以彻底隔离电机大电流对控制电路的干扰。如果非要用单电源务必确保电池容量充足并在电源入口处并联一个大容量如1000μF的电解电容来缓冲电压波动。信号连接部分红外接收头OUT- Arduino 数字引脚D11可任选需与代码中定义一致GND- ArduinoGNDVCC- Arduino5VTB6612FNG驱动模块AIN1,AIN2- ArduinoD5,D6控制左侧电机方向BIN1,BIN2- ArduinoD9,D10控制右侧电机方向PWMA,PWMB- ArduinoD3,D11分别控制左、右电机速度PWM引脚STBY- ArduinoD7使能引脚高电平有效VM- 电机专用电源正极6-12VVCC- Arduino5V模块逻辑电源GND- 与ArduinoGND及电机电源负极共地必须电机A输出 - 连接左侧电机两根线电机B输出 - 连接右侧电机两根线电路原理解读红外接收头将解调后的方波信号送入Arduino的中断引脚。TB6612FNG是一个双H桥驱动芯片AIN1/AIN2和BIN1/BIN2这两组输入的逻辑电平组合决定了对应电机的转动方向正转、反转、刹车、停止。PWMA/PWMB输入PWM信号通过调节占空比来无级调节电机转速。STBY是整个芯片的开关。3.3 焊接与组装实操心得先调试后固定在将所有模块用热熔胶或螺丝固定到底盘上之前务必先在桌面上用杜邦线连接好所有电路并完成基础的代码测试比如让两个电机分别正反转。确认一切正常后再进行固定否则出了问题排查起来会非常痛苦。电源线加粗连接电机和驱动模块VM的导线会有瞬间大电流通过。使用较粗的导线如AWG22或直接将电池盒焊接到驱动模块上可以减少线损和发热。接收头的安装位置红外接收头的前端黑色透明部分必须裸露在外且前方无遮挡。最好将其用延长线引出安装在小车车体前部较高位置并确保其指向与小车前进方向有一定夹角这样在操作时更容易对准。共地是生命线无论你用了几组电源所有模块的GND地线最终必须连接在一起形成一个共同的参考零电位。这是电路正常工作的绝对前提很多莫名其妙的信号问题都是因为“地”没接好。4. 红外信号解码与Arduino编程核心4.1 NEC协议深度解析与解码逻辑我们的电视遥控器大概率使用的是NEC协议。理解它是正确解码的关键。一个完整的NEC红外指令帧由以下几部分组成引导码一个9ms的高脉冲 4.5ms的低脉冲。这是帧开始的标志接收端靠识别这个独特的脉冲组合来确认信号起始。用户码16位用于区分不同厂家的设备。通常遥控器会连续发送两次用户码第二次是第一次的反码用于校验。数据码8位对应具体的按键值。数据反码8位是数据码的按位取反用于校验数据码是否正确。结束位一个560μs的脉冲。所有逻辑“0”和“1”都是用560μs的高脉冲加不同长度的低脉冲来表示逻辑“0”560μs高 560μs低。逻辑“1”560μs高 1690μs低约3倍于“0”的低电平时间。解码的逻辑就是检测到引导码后开始测量每一个560μs高脉冲之后的低电平持续时间。如果低电平持续约560μs则判定为比特“0”如果持续约1690μs则判定为比特“1”。按顺序收集32个比特16位用户码8位数据码8位数据反码就完成了一帧的解码。4.2 利用IRremote库快速实现解码对于Arduino我们无需从零开始写解码程序强大的IRremote库帮我们完成了一切脏活累活。以下是核心步骤安装库在Arduino IDE中点击“项目” - “加载库” - “管理库”搜索“IRremote”安装由Arduino-IRremote维护的版本。编写最小测试代码先不控制小车只解码并打印按键值。#include IRremote.h // 包含IRremote库 const int RECV_PIN 11; // 定义红外接收头连接的引脚 IRrecv irrecv(RECV_PIN); // 创建红外接收对象 decode_results results; // 用于存储解码结果的结构体 void setup(){ Serial.begin(9600); // 初始化串口用于打印 irrecv.enableIRIn(); // 启动红外接收 Serial.println(红外解码器就绪请按下遥控器按键...); } void loop(){ if (irrecv.decode(results)){ // 如果成功解码到一个信号 Serial.print(解码类型: ); Serial.print(results.decode_type, HEX); // 打印协议类型 Serial.print(, 解码值: ); Serial.println(results.value, HEX); // 以16进制打印按键值 irrecv.resume(); // 恢复接收等待下一个信号 } }获取按键键值将代码上传到Arduino打开串口监视器波特率设为9600。用遥控器对准接收头按下你计划用于控制小车的按键如上、下、左、右、停止。记录下串口打印出的results.value。例如你可能会得到0xFF18E7、0xFF4AB5等一串十六进制数。这就是每个按键独一无二的“身份证”。实操心得不同品牌、甚至同品牌不同型号的遥控器其用户码和按键码都可能不同。务必用自己的遥控器实测并记录键值不要直接照抄网上的代码。这是项目成功的第一步也是最容易出错的一步。4.3 运动控制逻辑与PWM调速实现拿到键值后我们就可以编写完整的控制程序了。核心思路是在loop()函数中持续监听红外信号一旦解码成功就将results.value与预设的键值进行比较执行相应的电机控制函数。这里以控制小车前进为例展示如何结合IRremote库和电机驱动#include IRremote.h const int RECV_PIN 11; IRrecv irrecv(RECV_PIN); decode_results results; // 定义TB6612FNG控制引脚 const int AIN1 5, AIN2 6, PWMA 3; // 左电机 const int BIN1 9, BIN2 10, PWMB 11; // 右电机 const int STBY 7; // 定义遥控器键值需根据自己实测修改 #define IR_FORWARD 0xFF18E7 // 前进键 #define IR_BACK 0xFF4AB5 // 后退键 #define IR_LEFT 0xFF10EF // 左转键 #define IR_RIGHT 0xFF5AA5 // 右转键 #define IR_STOP 0xFF38C7 // 停止键 void setup() { Serial.begin(9600); irrecv.enableIRIn(); // 初始化所有电机控制引脚为输出模式 pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(PWMA, OUTPUT); pinMode(BIN1, OUTPUT); pinMode(BIN2, OUTPUT); pinMode(PWMB, OUTPUT); pinMode(STBY, OUTPUT); digitalWrite(STBY, HIGH); // 使能电机驱动芯片 stopCar(); // 初始状态为停止 } void loop() { if (irrecv.decode(results)) { Serial.println(results.value, HEX); // 调试用打印接收到的值 switch(results.value) { case IR_FORWARD: moveForward(200); // 以速度值200前进 break; case IR_BACK: moveBackward(200); break; case IR_LEFT: turnLeft(150); // 左转速度可以稍慢 break; case IR_RIGHT: turnRight(150); break; case IR_STOP: stopCar(); break; default: // 可在此处理其他按键或忽略 break; } irrecv.resume(); // 必须调用准备接收下一个信号 } // 可以在此添加其他非阻塞任务 } // 以下是电机动作函数实现 void moveForward(int speedVal) { // 左电机前进 digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); analogWrite(PWMA, speedVal); // PWM调速speedVal范围0-255 // 右电机前进 digitalWrite(BIN1, HIGH); digitalWrite(BIN2, LOW); analogWrite(PWMB, speedVal); } void stopCar() { // 将两个方向引脚都置低实现刹车具体效果取决于驱动模块逻辑 digitalWrite(AIN1, LOW); digitalWrite(AIN2, LOW); digitalWrite(BIN1, LOW); digitalWrite(BIN2, LOW); analogWrite(PWMA, 0); analogWrite(PWMB, 0); } // 后退、左转、右转函数类似区别在于方向引脚的电平组合和左右电机速度差。 // 例如原地左转可以让左电机后退右电机前进。 void turnLeft(int speedVal) { digitalWrite(AIN1, LOW); // 左电机后退 digitalWrite(AIN2, HIGH); analogWrite(PWMA, speedVal); digitalWrite(BIN1, HIGH); // 右电机前进 digitalWrite(BIN2, LOW); analogWrite(PWMB, speedVal); }PWM调速原理analogWrite(pin, value)函数在支持PWM的引脚上产生一个方波。value参数0-255控制的是占空比即一个周期内高电平所占的比例。value255表示100%占空比电机获得全速电压value127表示约50%占空比电机平均电压减半转速下降。通过改变speedVal你就可以实现小车从慢到快的无级变速。5. 系统调试、优化与功能扩展5.1 上电调试流程与常见问题排查按照以下步骤可以系统性地排查问题供电检查首先确保所有电源连接正确电压在合理范围。用万用表测量Arduino的5V和GND之间是否为5V电机驱动VM端电压是否正常。红外信号解码测试上传并运行前面的“最小测试代码”。打开串口监视器按下遥控器按键。如果什么都没打印检查红外接收头引脚是否接反接收头距离遥控器是否太远或角度偏差太大环境是否有强烈的红外干扰源如白炽灯、太阳直射代码中指定的接收引脚与实际连接是否一致电机单动测试写一个简单的测试程序分别让左电机和右电机正转、反转几秒钟。如果电机不转检查电机驱动模块的使能引脚如STBY是否设置为高电平电机驱动模块的逻辑电源VCC和电机电源VM是否都已接入控制方向的两个引脚电平组合是否正确例如对于TB6612AIN1HIGH, AIN2LOW为正转电机接线是否牢固可以交换电机两根线来测试。集成联调将解码程序和控制程序合并。常见问题小车动作与按键不符检查switch-case语句中的键值是否与你自己实测的完全一致十六进制格式。按下按键小车无反应在switch语句的default分支里打印results.value确认信号是否被正确接收和解码。可能是遥控器电池电量不足。电机响应迟钝或卡顿检查电源容量是否充足。电机启动瞬间电流很大容量不足的电池会导致电压骤降使单片机复位。这就是为什么强调要用大容量电池或电容缓冲。5.2 抗干扰与可靠性优化技巧红外遥控在室内易受干扰以下是提升稳定性的几个技巧软件去抖与连发处理IRremote库本身有一定去抖能力。但对于某些遥控器的“连发”键按住不放会重复发送特定重复码需要在代码中做特殊处理。通常重复码是一个固定的值如0xFFFFFFFF你可以选择忽略它或者将其视为与前一次有效按键相同的指令。if (results.value 0xFFFFFFFF) { // 重复码可以执行上一次的动作或者忽略 results.value lastValidKey; // 假设你保存了上一次的有效键值 } else { lastValidKey results.value; // 保存新的有效键值 // ... 执行switch-case }增加硬件滤波在红外接收头的VCC和GND引脚之间就近并联一个10μF的电解电容和一个0.1μF的陶瓷电容可以很好地滤除电源线上的噪声。优化接收头安装用热缩管或黑色电工胶带包裹接收头除前端透光窗以外的部分可以减少侧面和后方杂散光的干扰。5.3 功能扩展思路基础功能实现后你可以尝试以下扩展让项目更具挑战性和趣味性速度分级控制定义两个不同的速度键如“慢速”、“快速”按下后改变全局速度变量从而实现巡航速度的切换。组合键功能通过判断短时间内按下的两个键实现复杂功能。例如先按“功能键”再按“方向键”让小车以“之”字形行进。集成超声波避障在小车前方加装HC-SR04超声波模块。在红外控制的主循环中插入超声波测距代码。当检测到前方障碍物距离小于安全阈值时自动触发stopCar()函数并发出警报如蜂鸣器响实现半自主安全防护。灯光与音效增加LED灯条和蜂鸣器模块。前进时亮白光后退时亮红灯转弯时闪烁黄灯配合不同的蜂鸣音调极大提升小车的炫酷程度和状态指示直观性。更换主控尝试使用ESP32替代Arduino。ESP32自带Wi-Fi和蓝牙你可以在保留红外控制的同时增加手机APP控制或网页控制的功能将其升级为双模遥控小车。6. 项目总结与进阶思考完成这个红外遥控小车你收获的远不止一个能跑动的玩具。你完整地实践了一个嵌入式系统项目的标准流程需求分析、方案选型、硬件设计、软件编程、系统调试和功能优化。每一个环节遇到的问题和解决方案都是宝贵的经验。我个人在多次制作和教学中发现最容易让初学者受挫的点往往不是复杂的代码而是最基础的硬件连接和电源问题。“共地”和“电源隔离”这两个概念一定要在动手前就理解透彻。另一个深刻的体会是调试时要善于“分而治之”。不要试图一次性写好所有代码、连接好所有线路然后指望它一次成功。务必像我们前面步骤那样先让红外解码单独工作再让电机单独转动最后再把它们组合起来。每完成一个子功能就验证一次能帮你快速定位问题所在。这个项目就像一个引子打开了一扇通往更广阔世界的大门。理解了红外通信你可以去研究如何用单片机发射红外信号控制家里的空调、电视。掌握了电机控制和传感器融合你可以进一步探索循迹小车、平衡车甚至更复杂的机器人。从用一个旧遥控器控制小车开始你的创造之旅才刚刚起步。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号