如何让漫游者向左行驶并停下来

How to make, that the Rover drives to the left and stop

目前我正在使用 L298 电机驱动器、超声波传感器和 ESP32。目标是当超声波传感器(位于漫游者前方)检测到物体时,漫游者向左行驶并停止。 问题是,当传感器检测到物体时,流动站只会停止而不会向左移动。否则,如果我删除代码的停止部分,我的流动站将向左移动。但是,我不知道我是怎么做的,他做这两个命令。

// defines Sensor pins

#define trigPin 12
#define echoPin 13

//Define Motor pins
#define motorIn3  16 //Input 3
#define motorIn1  17 //Input 1
#define motorIn4  18 //Input 4
#define motorIn2  19 //Input 2

// defines variables
long duration;
int distance;

// define ActivateDistance
double activateDistance = 20;

void setup() 
{
  // Sets the trigPin as an Output
  pinMode(trigPin, OUTPUT); 
  // Sets the echoPin as an Input
  pinMode(echoPin, INPUT); 

  // sets the Motorpins  as outputs:
  pinMode(motorIn1, OUTPUT);
  pinMode(motorIn2, OUTPUT);
  pinMode(motorIn3, OUTPUT);
  pinMode(motorIn4, OUTPUT);

  Serial.begin(9600); // Starts the serial communication

}

void loop() 
{

  //Moving Motor forward
  digitalWrite(motorIn2, HIGH);
  digitalWrite(motorIn4, HIGH);
  digitalWrite(motorIn3, LOW);
  digitalWrite(motorIn1, LOW); 

  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

 // Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

 // Reads the echoPin, returns the sound wave travel time in microseconds
 duration = pulseIn(echoPin, HIGH);

 // Calculating the distance
 distance = duration * 0.034 / 2;


//when the distance is under 20, the motor should drives to the left and stopps.
 if (distance <= activateDistance)
 {
  //for loop using that the motor drives a specific amount to the left
  for(int i = 0; i<5;i++)
  {
 //Motor drives to left
  digitalWrite(motorIn1, LOW);
  digitalWrite(motorIn2, HIGH);
  digitalWrite(motorIn3, HIGH);
  digitalWrite(motorIn4, LOW);
//After drives to left, the motor should stop.
    if(i == 4)
    {  
      //Moves forward 
      digitalWrite(motorIn2, HIGH);
      digitalWrite(motorIn4, HIGH);
      digitalWrite(motorIn3, LOW);
      digitalWrite(motorIn1, LOW); 
      delay(1000);
      //Motor Stops.
      digitalWrite(motorIn1, LOW);
      digitalWrite(motorIn2, LOW);
      digitalWrite(motorIn3, LOW);
      digitalWrite(motorIn4, LOW); 
    }
  }

 }
  delay(1000);
}

抱歉我的英语不好。

在您指示漫游者向左行驶后完全没有延迟,因此for(int i = 0; i<5;i++)中的四个第一次将执行得非常快。也许 添加一个延迟 以便漫游者有时间完成转弯。

我也不明白你为什么把if(i == 4)和下面的指令放在for loop的末尾:你可以把它放在for循环之后并且具有完全相同的行为。

希望对您有所帮助。

首先,尝试用每个函数都有自己的目的来重写你的代码。这将使您更深入地了解正在发生的事情以及问题所在。例如,您可以创建一个计算距离的函数并在主循环中检查它,或者创建一个以持续时间作为参数的车辆前向函数。

其次,当你设置你的电机引脚时,你需要设置一些延迟,让你的车辆有足够的时间移动。

我用一些函数重写了你的代码并打印了一些,只是记得校准时间以获得更好的性能。

// defines Sensor pins

#define trigPin 12
#define echoPin 13

//Define Motor pins
#define motorIn3 16 //Input 3
#define motorIn1 17 //Input 1
#define motorIn4 18 //Input 4
#define motorIn2 19 //Input 2

// defines variables
long duration;
int distance;

// define ActivateDistance
const int activateDistance = 20;

void setup()
{
    // Sets the trigPin as an Output
    pinMode(trigPin, OUTPUT);
    // Sets the echoPin as an Input
    pinMode(echoPin, INPUT);
    // sets the Motorpins  as outputs:
    pinMode(motorIn1, OUTPUT);
    pinMode(motorIn2, OUTPUT);
    pinMode(motorIn3, OUTPUT);
    pinMode(motorIn4, OUTPUT);
    Serial.begin(9600); // Starts the serial communication
}

void stop()
{
    // stop motor without duration
    Serial.println("STOP");
    digitalWrite(motorIn1, LOW);
    digitalWrite(motorIn2, LOW);
    digitalWrite(motorIn3, LOW);
    digitalWrite(motorIn4, LOW);
}

void left(int duration)
{
    //Motor goes to left
    Serial.println("LEFT");
    digitalWrite(motorIn1, LOW);
    digitalWrite(motorIn2, HIGH);
    digitalWrite(motorIn3, HIGH);
    digitalWrite(motorIn4, LOW);
    delay(duration);
    stop();
}

void forward(int duration)
{
    //Motor goes forward
    Serial.println("FORWARD");
    digitalWrite(motorIn2, HIGH);
    digitalWrite(motorIn4, HIGH);
    digitalWrite(motorIn3, LOW);
    digitalWrite(motorIn1, LOW);
    delay(duration);
    stop();
}

long get_distance(void)
{
    //get distance from sensor
    // Clears the trigPin
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    // Sets the trigPin on HIGH state for 10 micro seconds
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    // Reads the echoPin, returns the sound wave travel time in microseconds
    duration = pulseIn(echoPin, HIGH);
    // Calculating the distance
    distance = duration * 0.034 / 2;
    return distance;
}

void loop()
{
    // check sensor
    if (get_distance() <= activateDistance)
    {
        Serial.println("Found an Obstacle!!!");
        // go left for 1 second
        left(1000);
        // go forward for 1 second
        forward(1000);
    }
    else
        // go forward for 1 second
        forward(1000);
}