Arduino UNO + L298N 循迹小车保姆级教程:从接线到代码调试,一次搞定

张开发
2026/4/7 14:44:50 15 分钟阅读

分享文章

Arduino UNO + L298N 循迹小车保姆级教程:从接线到代码调试,一次搞定
Arduino UNO L298N 循迹小车实战指南从零搭建到精准调试第一次接触Arduino和电机驱动的新手们是否曾被L298N模块上密密麻麻的接线端子吓退或是烧录完代码却发现小车要么原地打转要么直接冲出赛道这篇文章将带你从元器件选购开始手把手完成一个能稳定循迹的智能小车更重要的是——我会分享那些教程里从不提及的调试技巧和常见故障排查方法。1. 硬件准备与电路搭建1.1 元器件清单与选购建议制作循迹小车需要以下核心部件附选购注意事项Arduino UNO R3建议选择原厂或质量可靠的兼容板劣质板常出现USB接口松动或稳压芯片发热问题L298N电机驱动模块双H桥设计注意区分新旧版本新版通常有散热片和蓝色电位器TT减速电机推荐6V/200RPM规格搭配65mm橡胶轮比普通130电机扭矩更大红外循迹模块TCRT5000传感器套件含可调电阻版本更易校准电源方案测试阶段可用9V电池供电长期使用建议选用18650锂电池组两节串联保护板特别注意市场上有些L298N模块标注5V输出但实际负载能力不足当同时给Arduino供电时可能导致系统不稳定。1.2 电路连接详解正确的接线是项目成功的基础以下是经过验证的连接方案L298N模块端子Arduino引脚注意事项ENAD5 (PWM)左侧电机使能IN1D6控制电机转向IN2D7与IN1电平相反ENBD9 (PWM)右侧电机使能IN3D10控制电机转向IN4D11与IN3电平相反12V输入外部电源正极7-12V范围GND电源负极 Arduino GND必须共地循迹传感器连接以四路为例const int sensorPins[] {2, 4, 12, 13}; // 从左到右排列 void setup() { for(int i0; i4; i) { pinMode(sensorPins[i], INPUT); } }关键细节很多教程不会告诉你L298N的5V输出端如果同时给Arduino供电必须拔掉板载的5V使能跳线帽否则可能引起电压冲突。我第一次做车时就因为这个问题烧坏了一个UNO。2. 电机驱动原理与PWM调参2.1 L298N工作原理解析这个蓝色小模块内部其实是两组H桥电路通过给IN1/IN2和IN3/IN4输入不同电平组合来控制电机正反转IN1IN2电机状态HIGHLOW正转LOWHIGH反转LOWLOW刹车HIGHHIGH自由停止PWM信号通过ENA/ENB引脚控制电机转速占空比越大转速越高。但实际测试发现当PWM值低于40时很多电机根本无法启动。2.2 速度曲线优化实验通过串口绘图器记录不同PWM值对应的实际转速使用霍尔编码器测量void testMotor(int pinE, int pin1, int pin2) { digitalWrite(pin1, HIGH); digitalWrite(pin2, LOW); for(int pwm0; pwm255; pwm5) { analogWrite(pinE, pwm); Serial.println(pwm); delay(500); } }实测数据表明常见TT电机存在明显的死区和饱和区死区PWM40时电机不转因静摩擦力线性区40-180之间转速与PWM基本成比例饱和区180后转速增加不明显但发热加剧基于此推荐将工作PWM设置在80-150之间既能保证扭矩又避免过热。3. 循迹算法开发与调试技巧3.1 传感器校准方法论TCRT5000模块需要根据赛道背景调整灵敏度正确的校准流程将小车放置在赛道白色区域旋转每个传感器上的蓝色电位器直到指示灯刚好熄灭移至黑色轨迹线确认指示灯亮起重复2-3步直到所有传感器响应一致常见问题当环境光较强时可能需要用遮光胶带包裹传感器避免干扰。3.2 状态机控制算法比起大量if-else判断状态机模式更易于维护和调试。下面展示改进后的算法框架enum States { FORWARD, SOFT_LEFT, HARD_LEFT, SOFT_RIGHT, HARD_RIGHT, STOP }; States currentState FORWARD; void updateState() { bool s[4]; // 存储四个传感器状态 for(int i0; i4; i) s[i] !digitalRead(sensorPins[i]); if(s[0] s[3]) currentState STOP; else if(s[0] || s[1]) currentState HARD_LEFT; else if(s[2] || s[3]) currentState HARD_RIGHT; else if(s[1]) currentState SOFT_LEFT; else if(s[2]) currentState SOFT_RIGHT; else currentState FORWARD; } void executeState() { switch(currentState) { case FORWARD: setMotors(100, 100); break; case SOFT_LEFT: setMotors(70, 100); // 右侧稍快 break; // 其他状态处理... } }调试技巧在loop()中加入以下代码可实时监控传感器状态Serial.print(s[0]); Serial.print( ); Serial.print(s[1]); Serial.print( ); Serial.print(s[2]); Serial.print( ); Serial.println(s[3]);4. 系统优化与进阶改造4.1 电源噪声抑制方案当电机启停时电源波动可能导致Arduino复位。解决方法在L298N的电源输入端并联4700μF电解电容Arduino供电单独使用一块7805稳压器电机电源与逻辑电源完全隔离推荐POLOLU方案4.2 扩展功能实现基础循迹稳定后可以尝试速度闭环控制增加编码器实现PID调速无线调试通过HC-05蓝牙模块传输传感器数据赛道记忆使用EEPROM存储最优路径参数#include EEPROM.h void saveParams() { EEPROM.put(0, pGain); // 存储PID参数 EEPROM.put(4, iGain); }4.3 机械结构优化建议将电池置于车体中部降低重心使用3D打印支架固定传感器推荐前悬式布局轮胎表面贴电工胶带增大摩擦最后分享一个血泪教训第一次参赛时因为没固定好线材行驶中杜邦线松脱导致全场失控。现在我都用热熔胶固定所有接口再套上蛇皮网。

更多文章