从零构建Arduino超声波避障小车:硬件选型、代码实现与调试全攻略

发布时间:2026/5/31 15:24:05
从零构建Arduino超声波避障小车:硬件选型、代码实现与调试全攻略
1. 项目概述与核心思路如果你对电子制作和机器人感兴趣想亲手打造一个能自己“看路”的智能小车那么这个基于Arduino的超声波避障小车项目绝对是一个绝佳的入门选择。它不像一些复杂的机器人项目那样需要深厚的理论基础而是通过一个非常直观的物理原理——超声波测距结合Arduino这个简单易用的开源平台让你亲手实现“感知-决策-行动”的完整闭环。简单来说这个小车就像拥有了简单的触觉当它前方的超声波传感器探测到障碍物时Arduino这个“大脑”会立刻做出判断并指挥电机驱动模块让小车转向或后退从而避免碰撞。整个过程涉及了传感器数据采集、微控制器逻辑处理以及电机驱动控制是学习嵌入式系统和自动控制的经典实践。这个项目非常适合电子爱好者、机器人初学者以及STEM教育领域的实践者。你不需要是编程高手或电路专家只要跟着步骤一步步来就能在动手过程中深刻理解传感器如何与外界交互、代码如何控制硬件动作。我将以Arduino Mega为核心控制器搭配HC-SR04超声波传感器和L298N电机驱动模块带你从零开始完成硬件连接、代码编写到最终调试的全过程。我会重点解释每一个步骤背后的“为什么”比如为什么选择L298N而不是其他驱动代码里的延时参数是怎么算出来的以及我在调试过程中踩过的那些坑和总结出的技巧。我们的目标是让你不仅做出一个能跑的小车更能透彻理解它运行的每一个细节。2. 核心硬件选型与功能解析在开始动手焊接和接线之前我们有必要先搞清楚手头这几个核心部件到底是干什么的以及为什么是它们组合在一起能实现避障功能。理解每个模块的角色后续的电路连接和代码编写才会有的放矢遇到问题也更容易排查。2.1 Arduino Mega项目的“决策大脑”Arduino Mega 2560是我们这个项目的控制核心。你可能会问为什么不用更常见的Arduino Uno呢这里有几个关键的考量。首先避障小车虽然逻辑不复杂但我们需要同时连接超声波传感器至少占用2个数字引脚、L298N电机驱动模块至少占用4-6个数字引脚可能还需要预留调试用的串口通信引脚。Uno的14个数字I/O引脚在连接了这些设备后余量就非常紧张了。而Mega拥有54个数字I/O引脚和16个模拟输入引脚资源充裕得多为后续可能的功能扩展比如增加更多的传感器、蓝牙遥控、巡线模块等留下了充足的空间。其次Mega的Flash存储空间256KB和SRAM8KB也比Uno大可以容纳更复杂的控制逻辑和调试信息输出。对于初学者项目Uno确实够用但选择Mega能让你更专注于功能实现而不用时刻担心资源瓶颈这是一种“富余设计”的思路能有效降低初期的调试复杂度。2.2 HC-SR04超声波传感器小车的“眼睛”HC-SR04超声波传感器是整个避障功能的感知源头。它的工作原理非常巧妙其内部有一个超声波发射器和一个接收器。工作时我们先给Trig引脚一个至少10微秒的高电平脉冲这会触发发射器发出一束40kHz的超声波。这束声波在空气中传播遇到障碍物后反射回来被接收器捕获。Echo引脚会在发射结束后变为高电平并在接收到回波后变回低电平。因此Echo引脚高电平的持续时间正好等于超声波从发射到返回所经过的时间。那么距离怎么算呢我们知道常温下声音在空气中的速度约为340米/秒即34000厘米/秒。距离等于速度乘以时间但要注意这个时间是超声波“往返”一次的时间所以单程距离需要除以2。公式为距离厘米 (高电平时间微秒 * 0.0343) / 2。在代码中我们通常简化为距离 高电平时间 * 0.017或距离 高电平时间 / 58.0。HC-SR04的测量范围在2cm到400cm之间精度能达到3mm对于小车避障来说完全足够。它的非接触式测量特性使得小车无需触碰物体就能感知非常适合这种移动应用场景。2.3 L298N电机驱动模块小车的“肌肉与神经”直流电机是典型的“大电流、低电压”设备而Arduino的I/O引脚只能提供最大40mA的电流和5V电压这远远不足以直接驱动哪怕一个小型直流电机。因此我们需要一个“中间人”——电机驱动模块。L298N就是一个非常经典的双H桥直流电机驱动芯片。所谓“H桥”你可以想象成由四个开关通常是晶体管或MOSFET组成的一个“H”形电路通过精确控制这四个开关的导通与关断可以轻松地控制电机的正转、反转、刹车和滑行。L298N模块通常集成了这颗芯片以及必要的保护电路、散热片和接口。它最多可以同时驱动两个直流电机。控制逻辑很简单每个电机对应两个输入引脚IN1, IN2和一个使能引脚ENA。通过给IN1和IN2输入不同的电平组合01、10、00、11可以分别对应电机的正转、反转、刹车和滑行。而使能引脚ENA则通常连接PWM脉冲宽度调制信号通过调节PWM的占空比可以无级调节电机的转速。这种将控制信号来自Arduino的弱电与动力电源给电机供电的强电完全隔离的设计既保护了精密的微控制器又提供了强大的驱动能力是连接“大脑”与“肌肉”的理想桥梁。2.4 电源系统能量供给的权衡电源是整个系统稳定运行的基石却也是最容易被忽视的环节。在这个项目中我们面临一个典型的双电源需求Arduino和传感器需要稳定的5V电压而直流电机则需要更高的电压如7.4V或12V以获得足够的扭矩和转速。常见的方案有两种一是使用两套独立的电池组分别供电二是使用一套电池通过L298N模块上的5V输出或额外的降压模块为Arduino供电。我强烈推荐第一种方案即使用两套电源。原因在于电机在启动、停止或堵转的瞬间会产生非常大的电流波动和电压跌落这种干扰如果通过共用的电源传导到Arduino极易导致单片机复位或程序跑飞表现为小车行为异常、抽疯。你可以准备一块9V电池或专用的电池盒为Arduino供电再用另一块大容量的锂电池如7.4V航模电池通过L298N为电机供电。这样实现了完全的电气隔离稳定性最高。如果为了简化只想用一块电池那么务必选择容量大、放电性能好的电池如18650锂电池组并确保L298N模块的5V输出使能跳线帽已接上用它为Arduino供电。但即便如此在电机负载突变时仍有可能观察到Arduino板载电源指示灯轻微闪烁这是共电源难以避免的干扰。3. 硬件电路搭建与连接详解理论清晰之后我们就可以开始动手搭建了。硬件连接是项目的基础接线错误轻则功能失常重则烧毁元件。我会按照功能模块一步步拆解连接过程并解释每一根线的作用。请务必在断电状态下进行所有接线操作。3.1 电机与车体的安装首先处理机械部分。根据你拥有的机器人小车底盘套件如资料中提到的“joy it robot car kit”通常包含一个底盘、四个直流减速电机、四个轮子和一些固定件。安装时确保两个电机作为主动轮安装在同一边通常是后轮而前轮使用万向轮或从动轮这样转向更灵活。将电机用螺丝牢固地固定在底盘预留的孔位上。接着将轮子套在电机的输出轴上如果轴是D形的注意对准方向压紧。完成后的底盘应该四平八稳用手转动轮子电机轴应随之顺畅转动没有卡滞。接下来是电机线缆的准备。每个电机有两根引线通常为红黑或蓝白。为了方便后续连接驱动板建议你使用杜邦线母对母将电机引线延长。或者更可靠的做法是使用电烙铁将电机的引线焊接在小的接线端子上再插到驱动板上这样连接更牢固避免小车跑动时因振动导致脱线。3.2 L298N电机驱动模块接线L298N模块是接线枢纽我们分三部分来连接它控制信号端、电机动力端和电源端。控制信号端连接Arduino这部分是“命令通道”。找到模块上标有IN1, IN2, IN3, IN4, ENA, ENB的排针。将IN1连接至Arduino Mega的数字引脚8。将IN2连接至Arduino Mega的数字引脚9。将IN3连接至Arduino Mega的数字引脚10。将IN4连接至Arduino Mega的数字引脚11。 这四根线决定了电机的转动方向。将ENA连接至Arduino Mega的PWM引脚2注意资料中连接至引脚12有误应为PWM引脚以调速。将ENB连接至Arduino Mega的PWM引脚3。 这两根PWM线用于控制电机的速度。电机动力端连接电机模块上有OUT1, OUT2, OUT3, OUT4四个接线端子。将右侧电机的两根线分别接入OUT1和OUT2。至于哪根线接OUT1哪根接OUT2决定了电机默认的正转方向。如果后续发现小车前进时右侧电机反转只需将这两根线对调即可。同样将左侧电机的两根线分别接入OUT3和OUT4。电源端这是最容易出错的地方。模块上有12V输入或标为VCC、GND和5V输出。将给电机供电的电池如7.4V锂电池的正极接到模块的12V输入负极-接到模块的GND。关键一步检查模块上是否有一个“5V输出使能”的跳线帽。如果你使用独立电源为Arduino供电推荐务必拔掉这个跳线帽。否则模块内部的5V稳压电路会与Arduino板载的5V电源冲突可能导致损坏。如果你希望用这一块电池同时为Arduino供电不推荐则需要插上这个跳线帽并从模块的5V输出引脚引一根线到Arduino的5V引脚同时模块和Arduino的GND必须相连。3.3 HC-SR04超声波传感器接线超声波传感器的接口非常简洁只有四根针VCC、Trig、Echo、GND。VCC连接至Arduino的5V引脚为其提供工作电压。GND连接至Arduino的任意一个GND引脚形成共地这是所有电子设备协同工作的基础。Trig触发连接至Arduino Mega的数字引脚A1资料中指定也可用其他数字引脚代码需对应修改。这个引脚用于接收来自Arduino的启动脉冲信号。Echo回响连接至Arduino Mega的数字引脚A2。这个引脚向Arduino返回高电平脉冲信号。注意有些版本的HC-SR04模块工作电压是5V但Echo引脚输出也是5V电平。而Arduino Mega的数字引脚虽然可以容忍5V输入但长期使用仍有风险。更稳妥的做法是在Echo引脚和Arduino之间串联一个1kΩ左右的电阻或者使用电平转换模块。但对于这个入门项目直接连接在大多数情况下是可行的。3.4 Arduino Mega的电源与总线连接最后完成Arduino的供电和公共地连接。如果你采用独立电源方案将给Arduino供电的电池如9V电池或USB电源连接到Arduino的电源接口或Vin引脚。至关重要你必须用一根导线将Arduino的GND引脚与L298N模块的GND即电机电池的负极连接在一起。这意味着整个系统Arduino、传感器、驱动模块必须共享同一个“地”参考点否则控制信号将无法被正确识别电路无法正常工作。为了方便接线你可以使用一块面包板。将Arduino的5V和GND引脚分别接到面包板的电源正极和负极排孔上这样传感器、甚至其他模块的VCC和GND就可以直接从面包板上取电使得布线更加整洁。完成所有接线后不要急于上电。花几分钟时间按照上述清单从头到尾仔细检查一遍特别是电源正负极是否接反、GND是否全部连通、信号线是否插到了正确的数字引脚上。确认无误后硬件部分就准备就绪了。4. 避障逻辑与代码实现剖析硬件是身体的骨架代码则是赋予其灵魂的大脑。避障小车的核心逻辑是一个简单的“感知-决策-执行”循环。下面我将逐段解析代码并解释每一个参数和判断条件的由来。4.1 引脚定义与初始化首先我们需要在代码开头定义所有用到的引脚并设置它们的模式。// 电机控制引脚定义 const int enA 2; // 右侧电机速度控制 (PWM) const int in1 8; // 右侧电机方向控制1 const int in2 9; // 右侧电机方向控制2 const int enB 3; // 左侧电机速度控制 (PWM) const int in3 10; // 左侧电机方向控制1 const int in4 11; // 左侧电机方向控制2 // 超声波传感器引脚定义 const int trigPin A1; // 触发引脚 const int echoPin A2; // 回波引脚 // 避障参数定义 const int safeDistance 20; // 安全距离单位厘米 const int turnSpeed 150; // 转向时电机速度 (0-255) const int forwardSpeed 180; // 前进时电机速度 (0-255) const int turnDuration 300; // 转向持续时间单位毫秒代码解析与参数设定safeDistance安全距离这是整个避障逻辑的阈值。当测得的距离小于这个值时小车认为前方有障碍需要采取行动。设为20cm是一个比较折中的值。如果设得太小如10cm小车可能来不及刹车或转向就撞上了设得太大如50cm小车又会过于“胆小”在空旷地方也频繁转向。你可以根据小车的刹车性能和实际环境调整这个值。turnSpeed和forwardSpeedPWM值范围是0-255对应占空比0%-100%。forwardSpeed设为180约70%功率能保证小车有足够的前进动力又不至于太快而失控。turnSpeed设为150约60%功率是为了让转向动作既明确又平稳。速度过高容易导致转弯过猛或打滑。turnDuration转向持续时间。这个参数决定了小车每次转向的角度。300ms是一个经验值能让小车大概旋转45-90度取决于轮子摩擦力、地面状况和速度。你需要在实际测试中微调这个值以达到理想的避障转向效果。在setup()函数中我们需要初始化所有引脚并启动串口通信用于调试。void setup() { // 初始化电机控制引脚为输出模式 pinMode(enA, OUTPUT); pinMode(enB, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); // 初始化超声波传感器引脚 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // 初始化串口用于输出调试信息如测得的距离 Serial.begin(9600); // 初始状态停止所有电机 stopCar(); }4.2 超声波测距函数封装我们将测距功能封装成一个独立的函数这样主逻辑会非常清晰。long getDistance() { // 发送一个至少10微秒的高脉冲来触发测距 digitalWrite(trigPin, LOW); delayMicroseconds(2); // 确保低电平稳定 digitalWrite(trigPin, HIGH); delayMicroseconds(10); // 维持10微秒高电平 digitalWrite(trigPin, LOW); // 读取回波引脚的高电平持续时间单位微秒 long duration pulseIn(echoPin, HIGH, 30000); // 设置超时时间30ms // 计算距离单位厘米 // 声音速度约340m/s 0.034 cm/微秒。距离 (时间 * 速度) / 2 long distance duration * 0.034 / 2; // 如果测距超时或无效返回一个很大的值如999 if (duration 0 || distance 400) { return 999; } Serial.print(Distance: ); Serial.print(distance); Serial.println( cm); return distance; }关键点解析pulseIn函数与超时设置pulseIn(echoPin, HIGH, 30000)会等待echoPin变为高电平并开始计时直到其变回低电平。第三个参数30000是超时时间单位微秒即如果30毫秒后还没收到回波函数就返回0。这个设置非常必要因为如果前方没有障碍物超声波会一直传播下去没有回波没有超时设置程序就会永远卡在这里。30ms对应大约5米的探测距离340m/s * 0.03s / 2对于小车足够。无效数据处理如果duration为0超时或计算出的距离大于400cm超出HC-SR04有效范围我们返回一个很大的值999。这告诉主程序“前方没有障碍物”小车可以放心前进。这种“防御性编程”能避免因传感器偶尔误读而导致程序逻辑混乱。串口调试在函数内打印距离值是调试过程中最有效的手段。通过串口监视器你可以实时观察传感器读数是否稳定、是否符合预期这对于判断硬件连接是否正确、环境是否有干扰至关重要。4.3 电机动作控制函数为了让主循环代码简洁我们把电机的几种基本动作前进、后退、左转、右转、停止也封装成函数。void moveForward(int speed) { // 右侧电机正转 digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(enA, speed); // 左侧电机正转 digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enB, speed); } void turnRight(int speed, int duration) { // 右侧电机反转或停止左侧电机正转 digitalWrite(in1, LOW); digitalWrite(in2, HIGH); // 右侧反转实现原地右转 // digitalWrite(in1, LOW); digitalWrite(in2, LOW); // 右侧停止实现弧线右转 analogWrite(enA, speed); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enB, speed); delay(duration); stopCar(); // 转向动作完成后停止 } void turnLeft(int speed, int duration) { // 左侧电机反转或停止右侧电机正转 digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(enA, speed); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); // 左侧反转 analogWrite(enB, speed); delay(duration); stopCar(); } void stopCar() { // 将所有方向控制引脚设为相同电平实现刹车或滑行 // 这里采用刹车模式IN1HIGH, IN2HIGH digitalWrite(in1, HIGH); digitalWrite(in2, HIGH); digitalWrite(in3, HIGH); digitalWrite(in4, HIGH); analogWrite(enA, 0); // 速度设为0 analogWrite(enB, 0); }动作选择策略转向方式代码中提供了两种转向思路。一种是让一侧电机反转另一侧正转实现“原地转向”坦克式这种方式转弯半径小动作干脆。另一种是让一侧电机停止另一侧正转实现“弧线转向”这种方式更平滑更像汽车转弯。你可以通过注释/取消注释相关代码行来切换体验。通常原地转向对于避障更有效。刹车模式在stopCar()函数中我设置了IN1HIGH, IN2HIGH这是L298N的“刹车”模式能让电机快速停止。如果设为LOW, LOW则是“滑行”模式电机惯性滑行停止。刹车模式响应更快但耗电稍大。4.4 主循环逻辑与避障策略最后我们将所有功能整合到loop()函数中形成主控制循环。void loop() { long dist getDistance(); // 1. 感知获取前方距离 if (dist safeDistance dist 0) { // 2. 决策如果检测到障碍物在安全距离内 Serial.println(Obstacle detected! Avoiding...); stopCar(); // 先刹车确保安全 delay(100); // 短暂停顿让车体稳定 // 简单的随机转向策略增加行为的不可预测性避免陷入死循环 if (random(2) 0) { // 随机生成0或1 Serial.println(Turning Right); turnRight(turnSpeed, turnDuration); } else { Serial.println(Turning Left); turnLeft(turnSpeed, turnDuration); } delay(200); // 转向后稍作停顿 } else if (dist 999 || dist safeDistance) { // 3. 执行如果前方安全无障碍或距离足够远 Serial.println(Path clear. Moving forward.); moveForward(forwardSpeed); } else { // 处理异常读数如距离为0或负值 Serial.println(Invalid sensor reading. Stopping.); stopCar(); delay(500); } delay(50); // 主循环延迟控制检测频率约20Hz }避障策略深度解析“感知-决策-执行”闭环这是机器人学中最基础的模型。代码完美体现了这一点getDistance()是感知if-else判断是决策调用moveForward或turnRight/Left是执行。随机转向策略if (random(2) 0)这行代码引入了一个简单的随机数让小车在遇到障碍时随机选择左转或右转。为什么需要随机想象一下如果小车总是固定右转而它在一个U型死胡同里它就会不断右转撞向右墙陷入“死循环”。随机转向大大降低了陷入这种局部循环的概率是一种非常朴素但有效的智能行为。延迟的作用代码中有多处delay()。stopCar()后的delay(100)给物理刹车过程一个缓冲时间让小车完全停稳后再转向避免在惯性下滑行中转向导致方向失控。转向后的delay(200)让转向动作完全执行完毕车体姿态稳定下来然后再开始新一轮的测距和决策。如果没有这个延迟小车可能还在转向过程中就又开始测距此时传感器可能仍对着障碍物导致误判。主循环最后的delay(50)控制整个循环的运行频率。太快的循环如无延迟会占用大量CPU资源且没必要太慢的循环如延迟500ms会导致小车反应迟钝。50ms20Hz是一个折中的选择既能及时响应环境变化又不会让Arduino过载。异常处理else分支用于处理传感器返回的无效数据如0或负值让小车停止并等待这是一种安全冗余设计。将以上所有代码段按顺序组合在一起就构成了完整的避障小车控制程序。上传到Arduino Mega后你的小车就拥有了基础的避障智能。5. 系统调试、优化与问题排查实录代码上传成功硬件连接无误但小车可能不会立刻如你所愿地工作。调试是项目中最能学到东西的环节。下面是我在多次实践中总结出的调试流程、常见问题及优化技巧。5.1 分模块调试法不要试图让整个系统一次性完美运行。采用分模块调试能快速定位问题。第一步单独测试电机驱动暂时注释掉所有超声波传感器相关的代码和loop()中的主逻辑。写一个简单的测试程序让小车依次执行前进、后退、左转、右转、停止每个动作持续2秒。void loop() { moveForward(200); delay(2000); turnLeft(150, 500); delay(1000); turnRight(150, 500); delay(1000); stopCar(); delay(2000); }观察小车动作。如果某个电机不转或反转检查对应接线IN1/IN2是否接反。如果电机抖动或无力检查使能引脚ENA/ENB是否连接到了PWM引脚2,3,4,5,6,7,8,9等带~标识的以及电源电压是否足够。第二步单独测试超声波传感器恢复传感器代码但保持电机不动作或只让小车停止。打开Arduino IDE的串口监视器波特率设为9600。用手或书本在传感器前方移动观察打印出的距离值是否连续、稳定地变化。如果无任何输出检查Trig和Echo引脚是否接错、传感器VCC和GND是否接反或接触不良。如果输出为0或恒定值检查pulseIn函数是否因超时返回0。尝试增大超时值或检查传感器前方是否有吸音材料如海绵、布料这些材料会吸收超声波。如果输出值乱跳可能是电源干扰。确保传感器供电稳定直接从Arduino的5V引脚取电而非面包板并检查Echo信号线是否受到电机电源线的干扰尽量让信号线与电源线分开走线。第三步整合测试与参数微调当电机和传感器都能独立正常工作时再上传完整的避障代码。将小车放在空旷地面观察它是否能直线前进。用手在它前方20-30cm处设置障碍观察它是否能在接近20cm时停下、转向。微调参数这是让小车行为“聪明”起来的关键。safeDistance如果小车经常撞上适当增大如25cm如果过于敏感在远处就转向则适当减小。turnDuration如果转向角度不足无法避开障碍增大此值如400ms如果转向过度总是转圈则减小此值。forwardSpeed速度越快需要的刹车距离越长应相应增大safeDistance。初期调试建议用较低速度如150。随机转向如果发现小车总在同一个地方打转可以增加随机性的复杂度例如random(0, 4)然后根据不同的值执行后退、左转、右转等不同动作组合。5.2 常见问题与解决方案速查表下表汇总了调试过程中最可能遇到的典型问题及其排查思路问题现象可能原因排查与解决方案电机完全不转1. 电源未接通或电压不足。2. L298N使能跳线帽未插若使用模块5V输出。3. 电机线缆断路或接触不良。4. Arduino控制信号未输出。1. 用万用表测量电机供电端子电压应≥7V。2. 检查L298N的5V使能跳线帽。3. 用电池直接触碰电机引线看是否转动。4. 用digitalWrite和analogWrite函数手动控制各个引脚并用LED或万用表测量输出。电机只朝一个方向转方向控制引脚IN1/IN2, IN3/IN4电平设置错误或接线错误。检查代码中moveForward、turnLeft等函数内的digitalWrite语句确保高低电平组合正确正转H/L反转L/H。交换电机接在OUT1和OUT2上的两根线试试。电机转动缓慢或无力1. 电池电量不足。2. PWM速度值设置过低。3. 使能引脚未启用PWM接错了数字引脚。4. 机械负载过重或轮子卡住。1. 给电池充电或更换新电池。2. 将forwardSpeed和turnSpeed调至200左右测试。3. 确保ENA/ENB连接到了Arduino上带~的PWM引脚如2,3。4. 抬起小车看空载时转速是否正常。超声波读数始终为0或超大值1. 传感器接线错误Trig/Echo接反。2. 传感器损坏。3. 代码中pulseIn超时时间太短。4. 有连续物体在2cm以内导致无法测距。1. 对照引脚定义图仔细检查VCC, Trig, Echo, GND四根线。2. 更换一个传感器测试。3. 将pulseIn的超时参数第三个参数增大到5000050ms。4. 确保传感器前方2cm内没有障碍物。小车行为混乱不受控制1. 电源干扰电机电流影响Arduino。2. 程序逻辑错误或变量溢出。3. 所有设备未共地。1.最可能的原因采用独立双电源供电并确保Arduino和L298N的GND用导线连接。2. 检查串口输出看距离读数是否正常。简化程序逻辑进行测试。3. 用万用表通断档确认Arduino的GND和L298N的GND是连通的。小车在障碍物前“犹豫”或抖动传感器读数波动大导致在阈值边缘反复触发“前进”和“停止/转向”。1.软件滤波在getDistance()函数中连续读取3-5次距离去掉最大最小值后取平均。2.增加滞后区间设置两个阈值如“危险距离”15cm和“安全距离”25cm。低于15cm转向高于25cm才前进在15-25cm之间保持原状态。这能有效消除抖动。5.3 性能优化与功能扩展思路当基础避障功能稳定后你可以尝试以下优化和扩展让小车变得更“聪明”增加状态指示灯在Arduino上连接一个RGB LED或两个普通LED。用不同颜色或闪烁模式指示小车当前状态如绿色常亮前进红色闪烁检测到障碍蓝色转向中。这在调试时非常直观。改善电源管理使用一个大的锂电池组如11.1V 2200mAh配合一个降压模块如LM2596为Arduino提供稳定的5V电源。同时在电机电源输入端并联一个大容量如470μF的电解电容可以吸收电机启停产生的瞬间电流冲击进一步稳定系统电压。实现更智能的避障策略目前的随机转向策略比较初级。可以升级为测距转向遇到障碍后让小车原地左转和右转各测一次距然后选择距离更远的方向前进。沿墙行驶通过持续调整与侧面障碍物的距离实现沿墙走或绕开复杂障碍区。增加“倒车”功能在现有代码中遇到障碍后可以先让小车后退一小段距离moveBackward然后再转向这样能给转向留出更多空间避免在狭小角落卡住。引入上位机监控通过蓝牙模块如HC-05将Arduino与手机或电脑连接实时上传传感器数据和小车状态甚至可以实现手机遥控与自动避障模式的切换。调试和优化的过程正是电子制作的精髓所在。每一个问题的解决都会让你对系统的工作原理有更深的理解。记住耐心和系统性的排查是你最好的工具。当你看到自己亲手制作的小车灵巧地避开一个个障碍时那种成就感就是对你所有努力最好的回报。这个项目只是一个起点它所涵盖的传感器应用、电机控制和嵌入式编程思想是通往更复杂机器人世界的大门。