library/esp32_coderacer_wlib/esp32_coderacer_wlib.ino

160 lines
7.3 KiB
Arduino
Raw Normal View History

#include <CodeRacer.h>
#include <ESP32Servo.h>
#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);
}
}