Progetto 11 Serbatoio di Evitamento Ultrasonico

Descrizione

In questo programma, il sensore ultrasonico rileva la distanza dell’ostacolo per inviare segnali che controllano l’auto robot. Successivamente, ti mostreremo come realizzare un’auto con evitamento degli ostacoli.

La logica specifica del robot di evitamento ultrasonico è mostrata di seguito:

Diagramma di flusso

Diagramma di Connessione:

Nota: i pin “-”, “+” e “S” del servo sono rispettivamente collegati a G(GND), V(VCC)e D9 della scheda di espansione. VCC, Trig, Echo e Gnd del sensore ultrasonico sono collegati con 5v(V), 5(S), Echo e Gnd(G) della scheda di espansione.

Codice di Test:

/*
 keyestudio Mini Tank Robot V2.1
 lezione 11
 ultrasonic_avoid_tank
 http://www.keyestudio.com
*/
int random2;
int a;
int a1;
int a2;
#define ML_Ctrl 13  //definire il pin di controllo della direzione del motore sinistro
#define ML_PWM 11   //definire il pin di controllo PWM del motore sinistro
#define MR_Ctrl 12  //definire il pin di controllo della direzione del motore destro
#define MR_PWM 3   //definire il pin di controllo PWM del motore destro

#define Trig 5  //pin Trig ultrasonico
#define Echo 4  //pin Echo ultrasonico
int distance;
#define servoPin 9  //pin Servo
int pulsewidth;
/************la funzione per far funzionare il motore**************/
void Car_front()
{
  digitalWrite(MR_Ctrl,LOW);
  analogWrite(MR_PWM,200);
  digitalWrite(ML_Ctrl,LOW);
  analogWrite(ML_PWM,200);
}
void Car_back()
{
  digitalWrite(MR_Ctrl,HIGH);
  analogWrite(MR_PWM,200);
  digitalWrite(ML_Ctrl,HIGH);
  analogWrite(ML_PWM,200);
}
void Car_left()
{
  digitalWrite(MR_Ctrl,LOW);
  analogWrite(MR_PWM,255);
  digitalWrite(ML_Ctrl,HIGH);
  analogWrite(ML_PWM,255);
}
void Car_right()
{
  digitalWrite(MR_Ctrl,HIGH);
  analogWrite(MR_PWM,255);
  digitalWrite(ML_Ctrl,LOW);
  analogWrite(ML_PWM,255);
}
void Car_Stop()
{
  digitalWrite(MR_Ctrl,LOW);
  analogWrite(MR_PWM,0);
  digitalWrite(ML_Ctrl,LOW);
  analogWrite(ML_PWM,0);
}

//La funzione per controllare il servo
void procedure(int myangle) {
  for (int i = 0; i <= 50; i = i + (1)) {
    pulsewidth = myangle * 11 + 500;
    digitalWrite(servoPin,HIGH);
    delayMicroseconds(pulsewidth);
    digitalWrite(servoPin,LOW);
    delay((20 - pulsewidth / 1000));
  }
}
//La funzione per controllare il sensore ultrasonico
float checkdistance() {
  digitalWrite(Trig, LOW);
  delayMicroseconds(2);
  digitalWrite(Trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig, LOW);
  float distance = pulseIn(Echo, HIGH) / 58.00;  //58.20, cioè, 2*29.1=58.2
  delay(10);
  return distance;
}
  //****************************************************************
void setup(){
  pinMode(servoPin, OUTPUT);
  procedure(90); //impostare il servo a 90°
  
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
  pinMode(ML_Ctrl, OUTPUT);
  pinMode(ML_PWM, OUTPUT);
  pinMode(MR_Ctrl, OUTPUT);
  pinMode(MR_PWM, OUTPUT);
}
void loop(){
  random2 = random(1, 100);
  a = checkdistance();  //assegnare la distanza frontale rilevata dal sensore ultrasonico alla variabile a
  
  if (a < 20) //quando la distanza frontale rilevata è inferiore a 20 
  {
      Car_Stop();  //il robot si ferma
      delay(500); //ritardo di 500ms
      procedure(160);  //la piattaforma ultrasonica gira a sinistra
      for (int j = 1; j <= 10; j = j + (1)) { //istruzione for, i dati saranno più accurati se il sensore ultrasonico rileva più volte.
        a1 = checkdistance();  //assegnare la distanza sinistra rilevata dal sensore ultrasonico alla variabile a1
      }
      delay(300);
      procedure(20); //la piattaforma ultrasonica gira a destra
      for (int k = 1; k <= 10; k = k + (1)) {
        a2 = checkdistance(); //assegnare la distanza destra rilevata dal sensore ultrasonico alla variabile a2
      }
      
      if (a1 < 50 || a2 < 50)  //il robot girerà verso il lato con distanza maggiore quando la distanza sinistra o destra è inferiore a 50cm. 
      {
        if (a1 > a2) //la distanza sinistra è maggiore del lato destro      
        {
          procedure(90);  //la piattaforma ultrasonica gira di nuovo verso destra         
Car_left();  //il robot gira a sinistra
          delay(500);  //gira a sinistra per 500ms
          Car_front(); //vai avanti
        } 
        else 
        {
          procedure(90);
          Car_right(); //il robot gira a destra
          delay(500);
          Car_front();  //vai avanti
        }
      } 
      else  //Se entrambi i lati sono maggiori o uguali a 50cm, gira a sinistra o a destra casualmente
      {
        if ((long) (random2) % (long) (2) == 0)  //Quando il numero casuale è pari
        {
          procedure(90);
          Car_left(); //il robot serbatoio gira a sinistra
          delay(500);
          Car_front(); //vai avanti
        } 
        else 
        {
          procedure(90);
          Car_right(); //il robot gira a destra
          delay(500);
          Car_front(); //vai avanti
       }
     }
  } 
  else  //Se la distanza frontale è maggiore o uguale a 20cm, l'auto robot andrà avanti
  {
      Car_front(); //vai avanti
  }
}

Risultato del Test

Carica il codice con successo, il selettore DIP viene spostato all’estremità destra e accendi l’alimentazione, il robot serbatoio va avanti ed evita automaticamente l’ostacolo.