Damit der Code funktioniert brauchst du noch die Ultraschall Bibliothek.
lege den „NewPing“ Ordner in den „libraries\“ Ordner.
Hier kannst du den Code herunterladen:
//Weil wir einen Servo und einen Ultraschall-Sensor benutzen, fügen wir zwei Bibliotheken ein, die deren Benutzung vereinfachen.
#include <Servo.h>
#include <NewPing.h>
//damit wir uns nicht die Nummern der Pin's merken müssen, geben wir ihnen Namen, an denen wir die Pinfunktion erkennen.
#define LeftMotorForward 6
#define LeftMotorBackward 5
#define RightMotorForward 8
#define RightMotorBackward 9
#define USTrigger 3
#define USEcho 2
#define MaxDistance 100
#define LED 13
//Hier erstellen wir zwei 'objekte', eine für den Servo und eine für den Ultraschall-Sensor
Servo servo;
NewPing sonar(USTrigger, USEcho, MaxDistance);
//Hier erstellen wir Variablen für Zahlen ohne Vorzeichen, welche wir weiter unten im Code brauchen für Messwerte, Geschwindigkeit etc.
unsigned int duration;
unsigned int distance;
unsigned int FrontDistance;
unsigned int LeftDistance;
unsigned int RightDistance;
unsigned int Time;
void setup() //Dieser Abschnitt läuft nur einmahl beim Programmstart
{
//Serial.begin(115200); //damit wir zum Fehler suchen eine Serielle verbindung haben
//Hier definieren wir die Pin Modus. Weil wir Signale ausgeben werden, stellen wir sie als Ausgänge
pinMode(LeftMotorForward, OUTPUT);
pinMode(LeftMotorBackward, OUTPUT);
pinMode(RightMotorForward, OUTPUT);
pinMode(RightMotorBackward, OUTPUT);
pinMode(LED, OUTPUT);
servo.attach(4); //Der Servo hängt an pin 4
}
void loop() //Dieser Abschnitt widerholt sich selber währen der Arduino eingeschaltet ist.
{
servo.write(90); //Der Servo schaut vorwärts
delay(500);
scan(); //ruft die Scan Funktion auf
FrontDistance = distance; //Setzt die Variable FrontDistance auf den Wert, den wir von der Scan Funktion bekommen haben
if(FrontDistance > 40 || FrontDistance == 0) //falls 40cm vor dem Roboter nichts ist, dann..
{
moveForward(); //rufe die moveForward Funktion auf
}
else //andernfalls (allso falls etwas kommt innert 40cm ) dann...
{
moveStop(); //rufe die moveStop Funktion
servo.write(167); //Drehe den Servo nach links (möglicherweise kann der kleine Servo nicht die ganzen 180Grad)
delay(500); //Warte eine halbe Sekunde, bis der Servo links ankommt
scan(); //Rufe die scan Funktion
LeftDistance = distance; //Setze die Variable LeftDistance auf die Distanz von links
servo.write(0); //Drehe den Servo nach rechhts
delay(500); //Warte eine halbe Sekunde, bis der Servo rechts ankommt
scan(); //Rufe die scan Funktion auf
RightDistance = distance; //Setze die Variable RightDistance auf die Distanz von rechts
if(RightDistance < LeftDistance) //Ist die Distanz rechts kleiner als der linke Abstand..
{
moveLeft(); //Rufe die moveLeft Funktion auf
delay(500); //Pausiere das Programm eine halbe Sekunde, bis der Roboter gedreht hat
}
else if(LeftDistance < RightDistance) //Andernfalls, wenn die Distanz links kleiner ist als rechts dann..
{
moveRight(); //Rufe die moveRight Funktion auf
delay(500); //Pausiere das Programm eine halbe Sekunde, bis der Roboter gedreht hat
}
else //falls die Distanz links und rechts gleich ist (das passiert sehr unwarscheindlich) dann..
{
moveBackward(); //Rufe die moveBackward Funktion auf
delay(200); //Pausiere das Programm für 200 Millisekunden um den Roboter rückwärts fahren zu lassen
moveRight(); //rufe die moveRight Funktion
delay(200); //Pausiere das Programm für 200 Millisekunden um den Roboter nach rechts zu drehen
}
moveStop();
}
}
void moveForward() //Diese Funktion macht das der Roboter vorwärts fährt
{
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorBackward, LOW);
digitalWrite(RightMotorForward, HIGH);
}
void moveBackward() //Diese Funktion macht das der Roboter rückwärts fährt
{
digitalWrite(LeftMotorForward, LOW);
digitalWrite(LeftMotorBackward, HIGH);
digitalWrite(RightMotorForward, LOW);
digitalWrite(RightMotorBackward, HIGH);
}
void moveLeft() //Diese Funktion macht das der Roboter nach links dreht
{
digitalWrite(LeftMotorForward, LOW);
digitalWrite(LeftMotorBackward, HIGH);
digitalWrite(RightMotorBackward, LOW);
digitalWrite(RightMotorForward, HIGH);
}
void moveRight() //Diese Funktion macht das der Roboter nach rechts dreht
{
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(LeftMotorForward, HIGH);
digitalWrite(RightMotorForward, LOW);
digitalWrite(RightMotorBackward, HIGH);
}
void moveStop() //Diese Funktion macht das der Roboter still steht
{
digitalWrite(LeftMotorBackward, LOW);
digitalWrite(LeftMotorForward, LOW);
digitalWrite(RightMotorForward, LOW);
digitalWrite(RightMotorBackward, LOW);
}
void scan() //Diese Funktion misst die Distanz vor dem Ultraschallsensor
{
delay(50);
Time = sonar.ping();
distance = Time / US_ROUNDTRIP_CM;
}