You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Arduino的避障RC小车后退距离不足问题求助

Arduino避障RC小车后退距离不足及异常停止问题修复方案

问题现状

  • 搭载4引脚超声波传感器的Arduino控制RC小车,触发避障后退动作时后退距离不足,反复碰撞同一墙壁
  • 调整后退延迟参数后,小车出现前进约2秒后无故停止的异常
  • 已排查操作:电机引脚改接Arduino直插引脚、更换新电池,问题未解决
  • 备注:引脚13为高电平时小车左转(HIGH=左转,LOW=右转),代码改编自《RC car to Robot》教程并适配4引脚传感器

问题根源分析

  1. 传感器逻辑冗余:原代码重复执行了3引脚+4引脚两次测距流程,导致距离变量被错误覆盖,避障判断依据不准确
  2. 动作逻辑冲突:触发避障时同时启动后退+左转,电机功率分散导致后退速度不足,实际距离达不到预期
  3. 变量未初始化:cm变量未赋值就进行串口输出,可能引发内存异常
  4. 前进状态不明确:前进分支未明确关闭转向电机输出,存在隐性故障风险

分步修复方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:35:49