#include #include #include "esp32-hal-ledc.h" //----- Taster ------------ #define TASTERPIN 17 //----- Werte für den Servo ----- #define SERVOPIN 16 // Pin an dem der Servomotor angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. #define SERVO_LINKS 140 // Wert um den Servo 45 Grad nach links zu drehen ... der kann je nach Servo anders sein #define SERVO_RECHTS 35 // Wert um den Servo 45 Grad nach rechtss zu drehen ... der kann je nach Servo anders sein #define SERVO_MITTE 90 // Wert um den Servo in die Mitte zu drehen ... der kann je nach Servo anders sein #define SERVO_SCHWENK_LINKS 135 #define SERVO_SCHWENK_RECHTS 40 //----- Werte für den Ultraschallsensor ----- #define US_TRIG 12 // Pin an dem der TRIG Pin des Ultraschallsensor angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. #define US_ECHO 14 // Pin an dem der ECHO Pin des Ultraschallsensor angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. #define US_STOP_ABSTAND_CM 15 // Wenn der gemessene Abstand kleiner ist, hält der CodeRacer an //----- Werte für die Motoren ----- #define MOTORRE_TEMPO 205 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255 #define MOTORLI_TEMPO 200 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255 #define MOTORRE_SPEED 2 // Pin an dem der SPEED/ENABLE Pin des rechten Motors angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. #define MOTORRE_FWRD 4 // Pin an dem der FORWÄRTS Pin des rechten Motors angeschlossen ist. Was vorwärts und rückwärts ist, muss probiert und vielleicht umgesteckt werden.'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. #define MOTORRE_BACK 15 // Pin an dem der RÜCKWÄRTS Pin des rechten Motors angeschlossen ist. Was vorwärts und rückwärts ist, muss probiert und vielleicht umgesteckt werden.'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. #define MOTORLI_SPEED 21 // Pin an dem der SPEED/ENABLE Pin des linken Motors angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. #define MOTORLI_FWRD 22 // Pin an dem der FORWÄRTS Pin des linken Motors angeschlossen ist. Was vorwärts und rückwärts ist, muss probiert und vielleicht umgesteckt werden.'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. #define MOTORLI_BACK 23 // Pin an dem der RÜCKWÄRTS Pin des linken Motors angeschlossen ist. Was vorwärts und rückwärts ist, muss probiert und vielleicht umgesteckt werden.'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. #define RACER_LINKS_MS 200 // Die Zeit in Millisekunden, die der Racer braucht um sich 45 Grad nach links zu drehen #define RACER_RECHTS_MS 200 // Die Zeit in Millisekunden, die der Racer braucht um sich 45 Grad nach rechts zu drehen //----- Werte für die LEDs ----- #define LED_VORWAERTS 26 // Pin an dem die VORWÄRTS LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. #define LED_STOP 25 // Pin an dem die STOP LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. #define LED_LINKS 27 // Pin an dem die LINKS LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. #define LED_RECHTS 33 // Pin an dem die RECHTS LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. //----- Variablen, die wir brauchen um uns Werte zu merken ---- long abstand_vorn_cm, abstand_links_cm, abstand_rechts_cm; bool coderracer_activ = false; //----- Objekte die wir haben. Der CodeRacer mit all seinen Pins in der Reihenfolge: // servopin, us_trigger_pin, us_echo_pin, motor_links_frwd_pin, motor_links_back_pin, motor_links_enable_pin, motor_rechts_frwd_pin, int motor_rechts_back_pin,motor_rechts_enable_pin CodeRacer coderacer(SERVOPIN, US_TRIG, US_ECHO, MOTORLI_FWRD, MOTORLI_BACK, MOTORLI_SPEED, MOTORRE_FWRD, MOTORRE_BACK, MOTORRE_SPEED, LED_VORWAERTS, LED_STOP, LED_LINKS, LED_RECHTS); //CodeRacer coderacer(); //---- Hier startet der Code zum Einstellen aller wichtigen Dinge. Setup() wird einmal ausgeführt. ---- void setup() { // Monitor Serial.begin(115200); // Serial Monitor aktivieren. Mit dem Monitor kann man sich Werte und Meldungen anzeigen lassen. // Taster pinMode(TASTERPIN,INPUT_PULLUP); // CodeRacer initialisieren coderacer.begin(); // Einstellungen für den Servo machen: winkel_mitte, winkel_links, winkel_rechts, schwenk_links, schwenk_rechts coderacer.servo_einstellungen(SERVO_MITTE, SERVO_LINKS, SERVO_RECHTS, SERVO_SCHWENK_LINKS, SERVO_SCHWENK_RECHTS); coderacer.servo_links(); delay(10); coderacer.servo_rechts(); delay(10); coderacer.servo_mitte(); // Einstellungen für die Motoren: motor_links_tempo, motor_rechts_tempo, drehung_links_ms, drehung_rechts_ms coderacer.motor_einstellungen(MOTORLI_TEMPO, MOTORRE_TEMPO, RACER_LINKS_MS, RACER_RECHTS_MS); } //---- Hier startet unsere endlose Schleife - die immer wieder von vorn angefangen wird, wenn wir am Ende angekommen sind. Da ist unser "Fahr"Code drin, der den CodeRacer steuert void loop() { // Taster abfragen RacerStartStop(); if(true == coderracer_activ){ // Abstand messen -> nach vorn abstand_vorn_cm = coderacer.abstand_messen(); // Zum anfahren muss das Tempo höher sein - also jetzt wieder Tempo runter ... coderacer.normal_tempo(); // Abstandssensor schon verstellen ... dann hat er das bis zur nächsten Messung auch geschafft coderacer.servo_schwenk(); // Ist die Bahn frei? if(abstand_vorn_cm < US_STOP_ABSTAND_CM){ // Nein! Der Abstand nach vorn ist kleiner als erlaubt! // Racer anhalten coderacer.anhalten(); // Nach links schauen! coderacer.servo_links(); // Abstand messen und merken. abstand_links_cm = coderacer.abstand_messen(); // Nach rechts schauen! coderacer.servo_rechts(); // Abstand messen und merken. abstand_rechts_cm = coderacer.abstand_messen(); // Welcher Abstand ist größer? if(abstand_links_cm > abstand_rechts_cm){ // Links ist mehr Platz! coderacer.links(); // Servo in die Mitte Stellen coderacer.servo_mitte(); } else{ // Rechts ist mehr Platz! coderacer.rechts(); // Servo in die Mitte Stellen coderacer.servo_mitte(); } } else{ // Ja! Die Bahn ist frei coderacer.vorwaerts(); } } } //-------------- Funktionen und Prozeduren ------------------------- void RacerStartStop(void){ if(digitalRead(TASTERPIN) == LOW){ if(false == coderracer_activ){ coderracer_activ = true; digitalWrite(LED_STOP, LOW); } else { coderracer_activ = false; digitalWrite(LED_STOP, HIGH); } delay(100); // Taster prellen ... while(digitalRead(TASTERPIN) == LOW){ // do nothing just wait ... delay(200); } } if(false == coderracer_activ){ coderacer.anhalten(); coderacer.servo_mitte(); digitalWrite(LED_STOP, HIGH); } else { digitalWrite(LED_STOP, LOW); } }