2018-08-22 10:47:45 +02:00
# include <CodeRacer.h>
2018-07-10 15:50:17 +02:00
# include <ESP32Servo.h>
2018-08-16 12:31:50 +02:00
# include "esp32-hal-ledc.h"
2018-07-10 15:50:17 +02:00
//----- Werte für den Ultraschallsensor -----
2018-09-12 16:35:18 +02:00
# define US_STOP_ABSTAND_CM 20 // Wenn der gemessene Abstand kleiner ist, hält der CodeRacer an
# define US_MIN_ABSTAND_LI_RE 8 // Wenn der Unterschied zwischen linkem und und rechtem Abstand kleiner ist, dann drehe in dieselbe Richtugn wie vorher weiter
# define MAX_ANZAHL_DREHUNGEN 10 // Wenn der Coderacer sich schon so oft gedreht hat ohne eine Stelle zu finden, wo es Platz gibt - fahren wir mal ein Stück rückwärts ...
2018-07-10 15:50:17 +02:00
//----- Variablen, die wir brauchen um uns Werte zu merken ----
long abstand_vorn_cm , abstand_links_cm , abstand_rechts_cm ;
2018-09-12 16:35:18 +02:00
enum drehrichtung { links = 0 , rechts } ;
drehrichtung drehung = links ;
unsigned int anzahl_drehung = 0 ;
2018-08-22 10:47:45 +02:00
CodeRacer coderacer ;
2018-07-10 15:50:17 +02:00
//---- 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.
2018-08-22 10:47:45 +02:00
// CodeRacer initialisieren
coderacer . begin ( ) ;
2018-07-10 15:50:17 +02:00
2018-08-22 10:47:45 +02:00
coderacer . servo_links ( ) ;
delay ( 10 ) ;
coderacer . servo_rechts ( ) ;
delay ( 10 ) ;
coderacer . servo_mitte ( ) ;
2018-09-12 16:35:18 +02:00
anzahl_drehung = 0 ;
drehung = links ;
2018-07-10 15:50:17 +02:00
}
//---- 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 ( ) {
2018-08-16 12:31:50 +02:00
2018-08-22 10:47:45 +02:00
// Abstand messen -> nach vorn ... um zu sehen, ob was passiert messen wir immer ... auch wenn der Racer nicht fahren soll
abstand_vorn_cm = coderacer . abstand_messen ( ) ;
// Abfragen ob der Racer fahren soll oder nicht ...
if ( true = = coderacer . start_stop ( ) ) {
2018-08-16 12:31:50 +02:00
// Abstandssensor schon verstellen ... dann hat er das bis zur nächsten Messung auch geschafft
2018-08-22 10:47:45 +02:00
coderacer . servo_schwenk ( ) ;
2018-08-16 12:31:50 +02:00
// Ist die Bahn frei?
if ( abstand_vorn_cm < US_STOP_ABSTAND_CM ) {
// Nein! Der Abstand nach vorn ist kleiner als erlaubt!
// Racer anhalten
2018-08-22 10:47:45 +02:00
coderacer . anhalten ( ) ;
2018-08-16 12:31:50 +02:00
// Nach links schauen!
2018-08-22 10:47:45 +02:00
coderacer . servo_links ( ) ;
2018-08-16 12:31:50 +02:00
// Abstand messen und merken.
2018-08-22 10:47:45 +02:00
abstand_links_cm = coderacer . abstand_messen ( ) ;
2018-08-16 12:31:50 +02:00
// Nach rechts schauen!
2018-08-22 10:47:45 +02:00
coderacer . servo_rechts ( ) ;
2018-08-16 12:31:50 +02:00
// Abstand messen und merken.
2018-08-22 10:47:45 +02:00
abstand_rechts_cm = coderacer . abstand_messen ( ) ;
2018-09-12 16:35:18 +02:00
// Ist der Abstand links oder rechts groß genug genug?
// Wenn nicht - wenn der Racer sich bisher noch nicht gedreht hat - fahre ein Stück rückwarts. Wenn der Racer sich gerade schon gedreht hat, drehe in dieselbe Richtung wie vorher.
if ( ( abstand_links_cm < US_MIN_ABSTAND_LI_RE ) & & ( abstand_rechts_cm < US_MIN_ABSTAND_LI_RE ) ) {
if ( anzahl_drehung = = 0 ) {
coderacer . rueckwaerts ( ) ;
delay ( 300 ) ;
coderacer . anhalten ( ) ;
//noch mal Abstand messen ...
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 ( ) ;
}
if ( anzahl_drehung > MAX_ANZAHL_DREHUNGEN ) {
anzahl_drehung = 0 ;
} else {
anzahl_drehung + + ;
}
2018-08-16 12:31:50 +02:00
}
2018-09-12 16:35:18 +02:00
// wenn der Racer sich noch nicht gedreht hat (anzahl_drehung == 0) - oder gerade rückwärts gefahren ist (anzahl_drehung == 1) drehe jetzt dahin wo mehr Platz ist;
if ( anzahl_drehung < = 1 ) {
// Welcher Abstand ist größer?
if ( abstand_links_cm > abstand_rechts_cm ) {
// Links ist mehr Platz!
drehung = links ;
}
else {
// Rechts ist mehr Platz!
drehung = rechts ;
}
}
switch ( drehung ) {
case links :
coderacer . links ( ) ;
coderacer . servo_mitte ( ) ;
break ;
case rechts :
coderacer . links ( ) ;
coderacer . servo_mitte ( ) ;
break ;
2018-08-16 12:31:50 +02:00
}
2018-07-10 15:50:17 +02:00
}
else {
2018-08-16 12:31:50 +02:00
// Ja! Die Bahn ist frei
2018-09-12 16:35:18 +02:00
// Wenn die Bahn richtig frei ist, dann können wir den Zähler fürs drehen auf 0 setzen ...
if ( abstand_vorn_cm > ( US_STOP_ABSTAND_CM + US_MIN_ABSTAND_LI_RE ) ) {
anzahl_drehung = 0 ;
}
2018-08-22 10:47:45 +02:00
coderacer . vorwaerts ( ) ;
2018-07-10 15:50:17 +02:00
}
2018-08-22 10:47:45 +02:00
2018-09-12 16:35:18 +02:00
} else {
anzahl_drehung = 0 ;
2018-07-10 15:50:17 +02:00
}
}