### Projekt 12: Ultraschall-Hindernisumfahrungs-Panzer

#### **(1)Beschreibung:**
Im vorherigen Projekt haben wir ein ultraschallgesteuertes, folgendes Smart-Car gebaut. Tatsächlich können wir mit denselben Komponenten und derselben Verdrahtungsmethode durch einfaches Ändern des Testcodes ein ultraschall-basiertes Hindernisumfahrungs-Smart-Car daraus machen. Dieses Smart-Car kann sich entsprechend der Bewegung der menschlichen Hände bewegen.
Wir verwenden Ultraschallsensoren, um den Abstand zwischen dem Smart-Car und dem Hindernis davor zu messen, und steuern dann anhand dieser Daten die Rotation der beiden Motoren, um die Bewegungen des Smart-Cars zu kontrollieren.
| Erkennung | |
| :----------------------------------------------------------: | :----: |
| Vom Ultraschallsensor gemessener Abstand zwischen dem Fahrzeug und dem Hindernis vorne
(Servowinkl auf 90° einstellen) | a(cm) |
| Vom Ultraschallsensor gemessener Abstand zwischen dem Fahrzeug und dem Hindernis rechts
(Servowinkel auf 20° einstellen) | a2(cm) |
| Vom Ultraschallsensor gemessener Abstand zwischen dem Fahrzeug und dem Hindernis links
(Servowinkel auf 160° einstellen) | a1(cm) |
| **Einstellung:** Startwinkel des Servos auf 90° einstellen | |
| Bedingung 1 | Bedingung 2 | Bedingung 3 | Bewegung |
| :-------------: | :------------------------: | ----------- | ------------------------------------------------------------ |
| a<20 | | | 500ms anhalten;
Servowinkel auf 180° einstellen, a1 lesen, 100ms verzögern;
Servowinkel auf 0° einstellen, a2 lesen, 0,1s verzögern. |
| | a1<50
oder
a2<50 | | a1 mit a2 vergleichen |
| | | a1>a2 | Servowinkel auf 90° einstellen, 700ms nach links drehen (PWM auf 255 setzen)
vorwärts fahren(PWM auf 200 setzen). |
| | | a1<a2 | Servowinkel auf 90° einstellen, 700ms nach rechts drehen (PWM auf 255 setzen)
vorwärts fahren(PWM auf 200 setzen). |
| **Bedingung 1** | **Bedingung 2** | | **Bewegung** |
| a<20 | a1≥50
und
a2≥50 | Zufällig | Servowinkel auf 90° einstellen, 500ms nach links drehen (PWM auf 255 setzen)
vorwärts fahren (PWM auf 200 setzen)
Servowinkel auf 90° einstellen, 500ms nach rechts drehen (PWM auf 255 setzen)
vorwärts fahren (PWM auf 200 setzen) |
| **Bedingung** | | | **Bewegung** |
| a≥20 | | | vorwärts fahren (PWM auf 100 setzen) |
#### **(2)Flussdiagramm:**

#### **(3)Anschlussdiagramm:**

(Hinweis: Die braunen, roten und orangefarbenen Kabel des Servos sind jeweils mit G (GND), V(5V)und D10 der Erweiterungsplatine verbunden;und beim Ultraschallsensor ist der VCC-Pin mit 5V (V) verbunden, der Trig-Pin mit Digital 12 (S), der Echo-Pin mit Digital 13 (S) und der GND-Pin mit GND (G); genauso wie beim vorherigen Projekt.)
#### **(4)Testcode:**
(**Hinweis:** Schließen Sie das Bluetooth-Modul nicht an, bevor Sie den Code hochladen, da das Hochladen des Codes ebenfalls serielle Kommunikation verwendet und es zu Konflikten mit der Bluetooth-seriellen Kommunikation kommen kann, was dazu führen kann, dass der Upload fehlschlägt.)
```C
/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 12
Ultrasonic avoid tank
http://www.keyestudio.com
*/
#define servoPin 10 //Der Pin des Servos
int a, a1, a2;
#define ML_Ctrl 4 //Definiert den Richtungssteuerungspin des linken Motors
#define ML_PWM 6 //Definiert den PWM-Steuerungspin des linken Motors
#define MR_Ctrl 2 //Definiert den Richtungssteuerungspin des rechten Motors
#define MR_PWM 5 //Definiert den PWM-Steuerungspin des rechten Motors
#define Trig 12
#define Echo 13
float distance;
void setup()
{
Serial.begin(9600);
pinMode(servoPin, OUTPUT);
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
pinMode(ML_Ctrl, OUTPUT);
pinMode(ML_PWM, OUTPUT);
pinMode(MR_Ctrl, OUTPUT);
pinMode(MR_PWM, OUTPUT);
procedure(90); //Servowinkel auf 90° einstellen
delay(500); //500ms verzögern
}
void loop()
{
a = checkdistance(); //Den vom Ultraschallsensor vorne gemessenen Abstand der Variable a zuweisen
if (a < 20) //Wenn der Abstand nach vorne weniger als 20cm beträgt
{
Car_Stop(); //Der Roboter hält an
delay(500); //500ms verzögern
procedure(180); //Ultraschall-Schwenkkopf dreht nach links
delay(500); //500ms verzögern
a1 = checkdistance(); //Den vom Ultraschallsensor links gemessenen Abstand der Variable a1 zuweisen
delay(100); //Wert lesen
procedure(0); //Ultraschall-Schwenkkopf dreht nach rechts
delay(500); //500ms verzögern
a2 = checkdistance(); //Den vom Ultraschallsensor rechts gemessenen Abstand der Variable a2 zuweisen
delay(100); //Wert lesen
procedure(90); //Zurück auf 90°
delay(500);
if (a1 > a2)
{ //Wenn der Abstand links größer ist als rechts
Car_left(); //Der Roboter dreht nach links
delay(700); //700ms nach links drehen
}
else
{
Car_right(); //700ms nach links drehen
delay(700);
}
}
else//Wenn der Abstand nach vorne >=20cm ist, fährt der Roboter vorwärts
{
Car_front(); //vorwärts fahren
}
}
void Car_front()
{
digitalWrite(MR_Ctrl, HIGH);
analogWrite(MR_PWM, 55);
digitalWrite(ML_Ctrl, HIGH);
analogWrite(ML_PWM, 55);
}
void Car_back()
{
digitalWrite(MR_Ctrl, LOW);
analogWrite(MR_PWM, 200);
digitalWrite(ML_Ctrl, LOW);
analogWrite(ML_PWM, 200);
}
void Car_left()
{
digitalWrite(MR_Ctrl, HIGH);
analogWrite(MR_PWM, 55);
digitalWrite(ML_Ctrl, LOW);
analogWrite(ML_PWM, 200);
}
void Car_right()
{
digitalWrite(MR_Ctrl, LOW);
analogWrite(MR_PWM, 200);
digitalWrite(ML_Ctrl, HIGH);
analogWrite(ML_PWM, 55);
}
void Car_Stop()
{
digitalWrite(MR_Ctrl, LOW);
analogWrite(MR_PWM, 0);
digitalWrite(ML_Ctrl, LOW);
analogWrite(ML_PWM, 0);
}
//Die Funktion steuert Servos
void procedure(byte myangle)
{
int pulsewidth;
for (int i = 0; i < 5; i++)
{
pulsewidth = myangle * 11 + 500; //Den Wert der Pulsbreite berechnen
digitalWrite(servoPin, HIGH);
delayMicroseconds(pulsewidth); //Die Zeit im High-Pegel repräsentiert die Pulsbreite
digitalWrite(servoPin, LOW);
delay((20 - pulsewidth / 1000)); //Da der Zyklus 20ms beträgt, verbleibt die restliche Zeit im Low-Pegel
}
}
//Die Funktion steuert den Ultraschall
float checkdistance()
{
float distance;
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
distance = pulseIn(Echo, HIGH) / 58.20; //Der Wert 58,20 ergibt sich aus 2*29,1=58,2
delay(10);
return distance;
}
```
#### **(5)Testergebnis:**
Nachdem der Testcode erfolgreich hochgeladen wurde, verdrahten Sie alles, stellen Sie den DIP-Schalter auf die ON-Position und schalten Sie die Stromversorgung ein. Das Smart-Car fährt vorwärts und weicht automatisch Hindernissen aus.
