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; }