基于Arduino的避障RC小车后退距离不足问题求助
Arduino避障RC小车后退距离不足及异常停止问题修复方案
问题现状
- 搭载4引脚超声波传感器的Arduino控制RC小车,触发避障后退动作时后退距离不足,反复碰撞同一墙壁
- 调整后退延迟参数后,小车出现前进约2秒后无故停止的异常
- 已排查操作:电机引脚改接Arduino直插引脚、更换新电池,问题未解决
- 备注:引脚13为高电平时小车左转(HIGH=左转,LOW=右转),代码改编自《RC car to Robot》教程并适配4引脚传感器
问题根源分析
- 传感器逻辑冗余:原代码重复执行了3引脚+4引脚两次测距流程,导致距离变量被错误覆盖,避障判断依据不准确
- 动作逻辑冲突:触发避障时同时启动后退+左转,电机功率分散导致后退速度不足,实际距离达不到预期
- 变量未初始化:
cm变量未赋值就进行串口输出,可能引发内存异常 - 前进状态不明确:前进分支未明确关闭转向电机输出,存在隐性故障风险
分步修复方案
1. 清理冗余传感器代码
删除原代码中针对3引脚传感器的无效测距流程,保留4引脚trig/echo分离的正确逻辑:
// 移除以下旧的3引脚传感器代码块 /* pinMode(pingPin, OUTPUT); digitalWrite(pingPin, LOW); delayMicroseconds(2); digitalWrite(pingPin, HIGH); delayMicroseconds(5); digitalWrite(pingPin, LOW); duration = pulseIn(pingPin, HIGH); inches = microsecondsToInches(duration); */
2. 调整避障动作顺序
将同时后退+左转的逻辑改为先纯后退足够距离,再执行转向,避免功率分散:
if (inches < 12 ){ // 第一步:纯后退2秒 digitalWrite(8, HIGH); // 锁死转向电机刹车 digitalWrite(9, LOW); // 松开驱动电机刹车 digitalWrite(12, LOW); // 设置驱动后退方向 analogWrite(3, 200); // 启动后退 delay(2000); // 第二步:左转1秒 digitalWrite(9, HIGH); // 刹车驱动电机 digitalWrite(8, LOW); // 松开转向电机刹车 digitalWrite(13, HIGH); // 设置左转方向 analogWrite(11, 255); // 启动左转 delay(1000); // 刹车所有电机并短暂停顿 digitalWrite(8, HIGH); digitalWrite(9, HIGH); delay(500); }
3. 完善前进状态设置
前进分支明确关闭转向电机输出,避免异常停止:
else{ // 驱动电机前进设置 digitalWrite(12, HIGH); digitalWrite(9, LOW); analogWrite(3, 200); // 转向电机保持锁死状态 digitalWrite(8, HIGH); analogWrite(11, 0); // 确保转向电机无输出 }
4. 修复未初始化变量
为cm变量添加赋值逻辑,避免输出异常:
// 在距离计算代码段添加 cm = duration * 0.01715; // 等价于 duration*0.034/2,单位厘米
完整修复后代码
// 传感器引脚定义(语义化重命名) const int trigPin = 7; const int echoPin = 2; // 距离变量 long duration; int distanceCm; float inches; float cm; void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // 电机方向引脚 pinMode(12, OUTPUT); // 驱动电机:HIGH=前进,LOW=后退 pinMode(13, OUTPUT); // 转向电机:HIGH=左转,LOW=右转 // 电机刹车引脚 pinMode(9, OUTPUT); // 驱动电机刹车 pinMode(8, OUTPUT); // 转向电机刹车 // 初始状态初始化 digitalWrite(9, LOW); // 松开驱动电机刹车 digitalWrite(8, HIGH); // 锁死转向电机刹车 analogWrite(3, 200); // 驱动电机初始速度 digitalWrite(12, HIGH); // 初始前进方向 } void loop() { // 4引脚超声波传感器标准测距流程 digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); // 计算距离值 distanceCm = duration * 0.034 / 2; inches = microsecondsToInches(duration); cm = distanceCm; // 串口输出距离信息 Serial.print("Distance: "); Serial.print(distanceCm); Serial.print("cm / "); Serial.print(inches); Serial.println("in"); // 避障逻辑 if (inches < 12 ){ // 纯后退动作 digitalWrite(8, HIGH); digitalWrite(9, LOW); digitalWrite(12, LOW); analogWrite(3, 200); delay(2000); // 左转动作 digitalWrite(9, HIGH); digitalWrite(8, LOW); digitalWrite(13, HIGH); analogWrite(11, 255); delay(1000); // 刹车并停顿 digitalWrite(8, HIGH); digitalWrite(9, HIGH); delay(500); } else{ // 正常前进状态 digitalWrite(12, HIGH); digitalWrite(9, LOW); analogWrite(3, 200); digitalWrite(8, HIGH); analogWrite(11, 0); } delay(100); // 降低检测频率,避免频繁触发 } long microsecondsToInches(long microseconds) { return microseconds / 74 / 2; }
内容的提问来源于stack exchange,提问作者HussainMir
相关产品推荐
相关产品推荐

