这段代码是用来控制一个避障小车的行为的。首先定义了一些变量,包括'trace1'、'trace2'、'trace3' 表示三个循迹模块的输出信号,'Left1'、'Left2'、'Right1'、'Right2' 表示左右电机的控制信号,'Dist1'、'Dist2'、'Dist3' 表示三个超声波模块测得的距离。

在 'setup' 函数中,设置了各个引脚的输入输出模式。

在 'loop' 函数中,首先读取三个循迹模块的输出信号,并点亮 LED 灯。

然后通过调用 'checkdistance_0_0' 函数分别测量了三个超声波模块到障碍物的距离。

如果三个循迹模块都检测到黑线,说明小车正在沿着黑线行驶,根据不同的情况设置左右电机的控制信号,使小车可以继续沿着黑线行驶。

如果三个循迹模块都没有检测到黑线,说明小车遇到了障碍物,根据不同的情况设置左右电机的控制信号,使小车可以绕过障碍物。

通过不断的循环执行 'loop' 函数,实现了小车的自动避障和循迹功能。

代码示例:

volatile int trace1;
volatile int trace2;
volatile int trace3;
volatile int Left1;
volatile int Left2;
volatile int Right1;
volatile int Right2;
volatile float Dist1;
volatile float Dist2;
volatile float Dist3;

float checkdistance_0_0() {
  digitalWrite(0, LOW);
  delayMicroseconds(2);
  digitalWrite(0, HIGH);
  delayMicroseconds(10);
  digitalWrite(0, LOW);
  float distance = pulseIn(0, HIGH) / 58.00;
  delay(10);
  return distance;
}

void setup(){
  trace1 = 0;
  trace2 = 0;
  trace3 = 0;
  Left1 = 0;
  Left2 = 0;
  Right1 = 0;
  Right2 = 0;
  Dist1 = 0;
  Dist2 = 0;
  Dist3 = 0;
  pinMode(23, INPUT);
  pinMode(25, INPUT);
  pinMode(27, INPUT);
  pinMode(10, OUTPUT);
  pinMode(0, INPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop(){
  trace1 = digitalRead(23);
  trace2 = digitalRead(25);
  trace3 = digitalRead(27);
  digitalWrite(10,HIGH);
  Dist1 = checkdistance_0_0();
  Dist2 = checkdistance_0_0();
  Dist3 = checkdistance_0_0();
  if ((trace1 == 0 && trace2 == 0) && trace3 == 0) {
    // 避障左转
    if (Dist2 <= 25 && Dist3 <= 25) {
      digitalWrite(9,HIGH);
      digitalWrite(8,LOW);
      analogWrite(3, 135);
      digitalWrite(11,HIGH);
      digitalWrite(12,LOW);
      analogWrite(5, 135);

    }
    // 避障右转
    if (Dist2 <= 25 && Dist1 <= 25) {
      digitalWrite(9,LOW);
      digitalWrite(8,HIGH);
      analogWrite(3, 135);
      digitalWrite(11,LOW);
      digitalWrite(12,HIGH);
      analogWrite(5, 135);

    }
    // 避障直走8低9高正转(右轮)
    if (Dist3 >= 20 && Dist1 >= 20) {
      digitalWrite(9,HIGH);
      digitalWrite(8,LOW);
      analogWrite(3, 140);
      digitalWrite(11,LOW);
      digitalWrite(12,HIGH);
      analogWrite(5, 145);

    }
    // 向右调整
    if (Dist1 <= 20) {
      digitalWrite(9,LOW);
      digitalWrite(8,HIGH);
      analogWrite(3, 150);
      digitalWrite(11,LOW);
      digitalWrite(12,HIGH);
      analogWrite(5, 150);

    }
    // 向左调整
    if (Dist3 <= 20) {
      digitalWrite(9,HIGH);
      digitalWrite(8,LOW);
      analogWrite(3, 135);
      digitalWrite(11,HIGH);
      digitalWrite(12,LOW);
      analogWrite(5, 135);

    }
    // 避障后退
    if (Dist2 <= 15 && (Dist1 >= 20 && Dist3 >= 20)) {
      digitalWrite(9,LOW);
      digitalWrite(8,HIGH);
      analogWrite(3, 150);
      digitalWrite(11,HIGH);
      digitalWrite(12,LOW);
      analogWrite(5, 145);

    }

  } else {
    // 循迹左转
    if (trace2 == 1 && (trace1 == 1 && trace3 == 0) || trace2 == 0 && (trace1 == 1 && trace3 == 0)) {
      digitalWrite(9,HIGH);
      digitalWrite(8,LOW);
      analogWrite(3, 72);
      digitalWrite(11,HIGH);
      digitalWrite(12,LOW);
      analogWrite(5, 40);

    }
    // 循迹右转
    if (trace2 == 1 && (trace1 == 0 && trace3 == 1) || trace2 == 0 && (trace1 == 0 && trace3 == 1)) {
      digitalWrite(9,LOW);
      digitalWrite(8,HIGH);
      analogWrite(3, 40);
      digitalWrite(11,LOW);
      digitalWrite(12,HIGH);
      analogWrite(5, 80);

    }
    // 循迹直走
    if (trace3 == 1 && (trace2 == 1 && trace1 == 1)) {
      digitalWrite(9,HIGH);
      digitalWrite(8,LOW);
      analogWrite(3, 95);
      digitalWrite(11,LOW);
      digitalWrite(12,HIGH);
      analogWrite(5, 90);

    }

  }

}
Arduino 小车避障循迹程序解析 - 自动导航与障碍物规避

原文地址: https://www.cveoy.top/t/topic/bGMz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录