einfaches beispiel hinzugefügt
This commit is contained in:
parent
65fdb43592
commit
a8d9d4ac85
10 changed files with 200 additions and 1794 deletions
|
@ -1,342 +1,81 @@
|
||||||
|
#include <CodeRacer.h>
|
||||||
|
|
||||||
#include <ESP32Servo.h>
|
#include <ESP32Servo.h>
|
||||||
#include "esp32-hal-ledc.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_45GRAD_LINKS 140 // Wert um den Servo 45 Grad nach links zu drehen ... der kann je nach Servo anders sein
|
|
||||||
#define SERVO_45GRAD_RECHTS 35 // Wert um den Servo 45 Grad nach rechtss zu drehen ... der kann je nach Servo anders sein
|
|
||||||
#define SERVO_0GRAD_MITTE 90 // Wert um den Servo in die Mitte zu drehen ... der kann je nach Servo anders sein
|
|
||||||
#define SERVO_10GRAD_MITTE 135
|
|
||||||
#define SERVO_M10GRAD_MITTE 40
|
|
||||||
#define SERVO_SCHWENK_LI -5
|
|
||||||
#define SERVO_SCHWENK_RE 5
|
|
||||||
#define SERVO_SCHWENK_MS 15
|
|
||||||
|
|
||||||
//----- Werte für den Ultraschallsensor -----
|
//----- 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
|
#define US_STOP_ABSTAND_CM 15 // Wenn der gemessene Abstand kleiner ist, hält der CodeRacer an
|
||||||
|
|
||||||
//----- Werte für die Motoren -----
|
|
||||||
#define MOTORRE_MAX_TEMPO 255 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255
|
|
||||||
#define MOTORRE_TEMPO 205 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255
|
|
||||||
#define MOTORLI_MAX_TEMPO 255 // 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
|
|
||||||
#define MOTORPWM_LINKS 5 // PWM-Kanal für linken Motor
|
|
||||||
#define MOTORPWM_RECHTS 6 // PWM-Kanal für rechten Motor
|
|
||||||
|
|
||||||
//----- 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 ----
|
//----- Variablen, die wir brauchen um uns Werte zu merken ----
|
||||||
long abstand_vorn_cm, abstand_links_cm, abstand_rechts_cm;
|
long abstand_vorn_cm, abstand_links_cm, abstand_rechts_cm;
|
||||||
|
|
||||||
int schwenkPosition = SERVO_0GRAD_MITTE;
|
CodeRacer coderacer;
|
||||||
int schwenkRichtung = SERVO_SCHWENK_LI;
|
|
||||||
long schwenkMillis = millis();
|
|
||||||
|
|
||||||
bool coderracer_activ = false;
|
|
||||||
|
|
||||||
//----- Objekte die wir haben. z.B. den Servo ----
|
|
||||||
Servo dummy_myservo; // ein Servo-Objekt anlegen, um den Servo Motor steuern zu können (Timer 0 überspringen)
|
|
||||||
Servo myservo; // ein Servo-Objekt anlegen, um den Servo Motor steuern zu können
|
|
||||||
|
|
||||||
//---- Hier startet der Code zum Einstellen aller wichtigen Dinge. Setup() wird einmal ausgeführt. ----
|
//---- Hier startet der Code zum Einstellen aller wichtigen Dinge. Setup() wird einmal ausgeführt. ----
|
||||||
void setup() {
|
void setup() {
|
||||||
// Monitor
|
// Monitor
|
||||||
Serial.begin(115200); // Serial Monitor aktivieren. Mit dem Monitor kann man sich Werte und Meldungen anzeigen lassen.
|
Serial.begin(115200); // Serial Monitor aktivieren. Mit dem Monitor kann man sich Werte und Meldungen anzeigen lassen.
|
||||||
|
|
||||||
// Taster
|
// CodeRacer initialisieren
|
||||||
pinMode(TASTERPIN,INPUT_PULLUP);
|
coderacer.begin();
|
||||||
|
|
||||||
// Ultraschallsensor
|
coderacer.servo_links();
|
||||||
pinMode(US_TRIG, OUTPUT); // Ultraschallsensor: TRIG ist ein Ausgangspin. Es wird ein Signal zum Ultraschallsensor gesendet
|
delay(10);
|
||||||
pinMode(US_ECHO, INPUT); // Ultraschallsensor: ECHO ist ein Eingangspin. Es wird ein Signal vom Ultraschallsensor empfangen
|
coderacer.servo_rechts();
|
||||||
|
delay(10);
|
||||||
|
coderacer.servo_mitte();
|
||||||
|
|
||||||
// Servo
|
|
||||||
myservo.attach(SERVOPIN); // dem Servo Objekt "sagen" an welchen Pin am Schaltkreis der Server angeschlossen ist
|
|
||||||
|
|
||||||
// Linker Motor
|
|
||||||
pinMode(MOTORLI_FWRD,OUTPUT); // Linker Motor FORWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORLI_BACK,OUTPUT); // Linker Motor BACKWARD ist ein Ausgang.
|
|
||||||
ledcSetup(MOTORPWM_LINKS, 5000, 8); // channel 1, 50 Hz, 8-bit width
|
|
||||||
ledcAttachPin(MOTORLI_SPEED, MOTORPWM_LINKS); // Linker Motor SPEED mit Kanal 1 verbunden
|
|
||||||
analogWrite(MOTORLI_SPEED, 0); // Linken Motor sicherheitshalber ausschalten :-)
|
|
||||||
|
|
||||||
// Rechter Motor
|
|
||||||
pinMode(MOTORRE_FWRD,OUTPUT); // Rechter Motor FORWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORRE_BACK,OUTPUT); // Rechter Motor BACKWARD ist ein Ausgang.
|
|
||||||
ledcSetup(MOTORPWM_RECHTS, 5000, 8); // channel 2, 50 Hz, 8-bit width
|
|
||||||
ledcAttachPin(MOTORRE_SPEED, MOTORPWM_RECHTS); // Rechter Motor SPEED mit Kanal 2 verbunden
|
|
||||||
analogWrite(MOTORRE_SPEED, 0); // Rechten Motor sicherheitshalber ausschalten :-)
|
|
||||||
|
|
||||||
pinMode(MOTORRE_SPEED,OUTPUT); // Rechter Motor SPEED ist ein Ausgang.
|
|
||||||
digitalWrite(MOTORRE_SPEED, 0); // Rechten Motor sicherheitshalber ausschalten :-)
|
|
||||||
|
|
||||||
// LEDs
|
|
||||||
pinMode(LED_VORWAERTS, OUTPUT); // LED Vorwärts ist ein Ausgang
|
|
||||||
pinMode(LED_STOP, OUTPUT); // LED Stop ist ein Ausgang
|
|
||||||
pinMode(LED_LINKS, OUTPUT); // LED Links ist ein Ausgang
|
|
||||||
pinMode(LED_RECHTS, OUTPUT); // LED Rechts ist ein Ausgang
|
|
||||||
|
|
||||||
// alle LEDS aus
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
|
|
||||||
// Servo in die Mitte Stellen
|
|
||||||
ServoMitte();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//---- 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
|
//---- 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() {
|
void loop() {
|
||||||
|
|
||||||
// Taster abfragen
|
|
||||||
RacerStartStop();
|
|
||||||
if(true == coderracer_activ){
|
|
||||||
|
|
||||||
// Abstand messen -> nach vorn
|
// Abstand messen -> nach vorn ... um zu sehen, ob was passiert messen wir immer ... auch wenn der Racer nicht fahren soll
|
||||||
abstand_vorn_cm = AbstandMessen();
|
abstand_vorn_cm = coderacer.abstand_messen();
|
||||||
// Zum anfahren muss das Tempo höher sein - also jetzt wieder Tempo runter ...
|
|
||||||
RacerNormalTempo();
|
// Abfragen ob der Racer fahren soll oder nicht ...
|
||||||
|
if(true == coderacer.start_stop()){
|
||||||
|
|
||||||
// Abstandssensor schon verstellen ... dann hat er das bis zur nächsten Messung auch geschafft
|
// Abstandssensor schon verstellen ... dann hat er das bis zur nächsten Messung auch geschafft
|
||||||
ServoSchwenk();
|
coderacer.servo_schwenk();
|
||||||
|
|
||||||
// Ist die Bahn frei?
|
// Ist die Bahn frei?
|
||||||
if(abstand_vorn_cm < US_STOP_ABSTAND_CM){
|
if(abstand_vorn_cm < US_STOP_ABSTAND_CM){
|
||||||
// Nein! Der Abstand nach vorn ist kleiner als erlaubt!
|
// Nein! Der Abstand nach vorn ist kleiner als erlaubt!
|
||||||
// Racer anhalten
|
// Racer anhalten
|
||||||
RacerAnhalten();
|
coderacer.anhalten();
|
||||||
// Nach links schauen!
|
// Nach links schauen!
|
||||||
ServoLinks();
|
coderacer.servo_links();
|
||||||
// Abstand messen und merken.
|
// Abstand messen und merken.
|
||||||
abstand_links_cm = AbstandMessen();
|
abstand_links_cm = coderacer.abstand_messen();
|
||||||
// Nach rechts schauen!
|
// Nach rechts schauen!
|
||||||
ServoRechts();
|
coderacer.servo_rechts();
|
||||||
// Abstand messen und merken.
|
// Abstand messen und merken.
|
||||||
abstand_rechts_cm = AbstandMessen();
|
abstand_rechts_cm = coderacer.abstand_messen();
|
||||||
|
|
||||||
// Welcher Abstand ist größer?
|
// Welcher Abstand ist größer?
|
||||||
if(abstand_links_cm > abstand_rechts_cm){
|
if(abstand_links_cm > abstand_rechts_cm){
|
||||||
// Links ist mehr Platz!
|
// Links ist mehr Platz!
|
||||||
RacerLinks();
|
coderacer.links();
|
||||||
// Servo in die Mitte Stellen
|
// Servo in die Mitte Stellen
|
||||||
ServoMitte();
|
coderacer.servo_mitte();
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Rechts ist mehr Platz!
|
// Rechts ist mehr Platz!
|
||||||
RacerRechts();
|
coderacer.rechts();
|
||||||
// Servo in die Mitte Stellen
|
// Servo in die Mitte Stellen
|
||||||
ServoMitte();
|
coderacer.servo_mitte();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Ja! Die Bahn ist frei
|
// Ja! Die Bahn ist frei
|
||||||
RacerVorwaerts();
|
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){
|
|
||||||
RacerAnhalten();
|
|
||||||
ServoMitte();
|
|
||||||
digitalWrite(LED_STOP, HIGH);
|
|
||||||
} else {
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerAnhalten(void){
|
|
||||||
Serial.println("RACER_ANHALTEN"); // Meldung am Monitor ausgeben
|
|
||||||
// Rechten Motor abschalten
|
|
||||||
digitalWrite(MOTORRE_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor abschalten
|
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide ausschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, 0);
|
|
||||||
analogWrite(MOTORLI_SPEED, 0);
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, HIGH);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
delay(1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerNormalTempo(void){
|
|
||||||
Serial.println("RACER_NORMAL_TEMPO"); // Meldung am Monitor ausgeben
|
|
||||||
analogWrite(MOTORRE_SPEED, MOTORRE_TEMPO);
|
|
||||||
analogWrite(MOTORLI_SPEED, MOTORLI_TEMPO);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerVorwaerts(void){
|
|
||||||
Serial.println("RACER_VORWAERTS"); // Meldung am Monitor ausgeben
|
|
||||||
// Rechten Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, MOTORRE_MAX_TEMPO);
|
|
||||||
analogWrite(MOTORLI_SPEED, MOTORLI_MAX_TEMPO);
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, HIGH);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerLinks(void){
|
|
||||||
Serial.println("RACER_LINKS"); // Meldung am Monitor ausgeben
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, HIGH);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
// Rechten Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor auf rückwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORLI_BACK, HIGH);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, MOTORRE_MAX_TEMPO);
|
|
||||||
analogWrite(MOTORLI_SPEED, MOTORLI_MAX_TEMPO);
|
|
||||||
// Warten bis der RAcer sich gedreht hat
|
|
||||||
delay(RACER_LINKS_MS);
|
|
||||||
// Motoren wieder auschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, 0);
|
|
||||||
analogWrite(MOTORLI_SPEED, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerRechts(void){
|
|
||||||
Serial.println("RACER_RECHTS"); // Meldung am Monitor ausgeben
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, HIGH);
|
|
||||||
// Rechten Motor auf rückwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORRE_BACK, HIGH);
|
|
||||||
// Linken Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, MOTORRE_MAX_TEMPO);
|
|
||||||
analogWrite(MOTORLI_SPEED, MOTORLI_MAX_TEMPO);
|
|
||||||
// Warten bis der RAcer sich gedreht hat
|
|
||||||
delay(RACER_RECHTS_MS);
|
|
||||||
// Motoren wieder auschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, 0);
|
|
||||||
analogWrite(MOTORLI_SPEED, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoRechts(void){
|
|
||||||
Serial.println("SERVO_RECHTS"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_45GRAD_RECHTS); // Servo auf den Winkel rechts drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoLinks(void){
|
|
||||||
Serial.println("SERVO_LINKS"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_45GRAD_LINKS); // Servo auf den Winkel links drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoMitte(void){
|
|
||||||
Serial.println("SERVO_MITTE"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_0GRAD_MITTE); // Servo auf den Winkel links drehen
|
|
||||||
schwenkPosition = SERVO_0GRAD_MITTE; // Servo schaut direkt nach vorn
|
|
||||||
schwenkMillis = millis();
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoSchwenk(void){
|
|
||||||
if(millis() - schwenkMillis > SERVO_SCHWENK_MS){
|
|
||||||
Serial.println("SERVO_SCHWENK"); // Meldung am Monitor ausgeben
|
|
||||||
schwenkPosition = schwenkPosition + schwenkRichtung;
|
|
||||||
if(schwenkPosition <= SERVO_M10GRAD_MITTE){
|
|
||||||
schwenkPosition = SERVO_M10GRAD_MITTE;
|
|
||||||
schwenkRichtung = SERVO_SCHWENK_RE;
|
|
||||||
}
|
|
||||||
if(schwenkPosition >= SERVO_10GRAD_MITTE){
|
|
||||||
schwenkPosition = SERVO_10GRAD_MITTE;
|
|
||||||
schwenkRichtung = SERVO_SCHWENK_LI;
|
|
||||||
}
|
|
||||||
myservo.write(schwenkPosition); // Servo auf den Winkel links drehen
|
|
||||||
schwenkMillis = millis();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
long AbstandMessen(){
|
|
||||||
long abstand_cm,echo_dauer;
|
|
||||||
// Messung starten - ein kurzer Pulse "HIGH" wird zum TRIG pin des Ultraschallsensors geschickt
|
|
||||||
digitalWrite(US_TRIG,LOW);
|
|
||||||
delayMicroseconds(2);
|
|
||||||
digitalWrite(US_TRIG,HIGH);
|
|
||||||
delayMicroseconds(10);
|
|
||||||
digitalWrite(US_TRIG,LOW);
|
|
||||||
|
|
||||||
// Messung der Dauer in Mikrosekundenmeasure bis das ECHO Pin vom Ultraschallsensor HIGH wird
|
|
||||||
pinMode(US_ECHO,INPUT);
|
|
||||||
echo_dauer = pulseIn(US_ECHO,HIGH);
|
|
||||||
|
|
||||||
// convert into cm ... 344m/sec is the speed of noise - thus 34400cm/sec ... or 34,400cm/milisec ... or 0,0344cm/microsec
|
|
||||||
// the echo has to go the distance twice - forth and back - so the duration has to be the half of the measured one
|
|
||||||
// distance_cm = echo_duration/2 * 0,0344 or distance_cm = echo_duration/2 / 29,1 or distance_cm = echo_duration * 0,0172
|
|
||||||
// distance_cm = (echo_duration/2) / 29.1;
|
|
||||||
abstand_cm = echo_dauer * 0.0172;
|
|
||||||
|
|
||||||
//Messwert am Monitor anzeigen
|
|
||||||
Serial.print("ABSTAND_MESSEN. Der Abstand in cm ist:");
|
|
||||||
Serial.println(abstand_cm);
|
|
||||||
|
|
||||||
return(abstand_cm);
|
|
||||||
}
|
|
||||||
|
|
||||||
void analogWrite(uint8_t pin, uint8_t speed){
|
|
||||||
if(pin == MOTORLI_SPEED){ledcWrite(MOTORPWM_LINKS, speed);}
|
|
||||||
if(pin == MOTORRE_SPEED){ledcWrite(MOTORPWM_RECHTS, speed);}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,253 +0,0 @@
|
||||||
#include <ESP32Servo.h>
|
|
||||||
#include "esp32-hal-ledc.h"
|
|
||||||
|
|
||||||
//----- 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_45GRAD_LINKS 136 // Wert um den Servo 45 Grad nach links zu drehen ... der kann je nach Servo anders sein
|
|
||||||
#define SERVO_45GRAD_RECHTS 45 // Wert um den Servo 45 Grad nach rechtss zu drehen ... der kann je nach Servo anders sein
|
|
||||||
#define SERVO_0GRAD_MITTE 90 // Wert um den Servo in die Mitte zu drehen ... der kann je nach Servo anders sein
|
|
||||||
|
|
||||||
//----- Werte für den Ultraschallsensor -----
|
|
||||||
#define US_TRIG 35 // 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 34 // 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 10 // Wenn der gemessene Abstand kleiner ist, hält der CodeRacer an
|
|
||||||
|
|
||||||
//----- Werte für die Motoren -----
|
|
||||||
#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 0 // 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 MOTORRE_TEMPO 150 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255
|
|
||||||
#define MOTORLI_SPEED 17 // 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 18 // 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 5 // 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 MOTORLI_TEMPO 150 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255
|
|
||||||
#define RACER_LINKS_MS 500 // Die Zeit in Millisekunden, die der Racer braucht um sich 45 Grad nach links zu drehen
|
|
||||||
#define RACER_RECHTS_MS 500 // 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;
|
|
||||||
|
|
||||||
//----- Objekte die wir haben. z.B. den Servo ----
|
|
||||||
Servo myservo; // ein Servo-Objekt anlegen, um den Servo Motor steuern zu können
|
|
||||||
|
|
||||||
//---- 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.
|
|
||||||
|
|
||||||
// Ultraschallsensor
|
|
||||||
pinMode(US_TRIG, OUTPUT); // Ultraschallsensor: TRIG ist ein Ausgangspin. Es wird ein Signal zum Ultraschallsensor gesendet
|
|
||||||
pinMode(US_ECHO, INPUT); // Ultraschallsensor: ECHO ist ein Eingangspin. Es wird ein Signal vom Ultraschallsensor empfangen
|
|
||||||
|
|
||||||
// Servo
|
|
||||||
myservo.attach(SERVOPIN); // dem Servo Objekt "sagen" an welchen Pin am Schaltkreis der Server angeschlossen ist
|
|
||||||
|
|
||||||
// Linker Motor
|
|
||||||
pinMode(MOTORLI_FWRD,OUTPUT); // Linker Motor FORWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORLI_BACK,OUTPUT); // Linker Motor BACKWARD ist ein Ausgang.
|
|
||||||
ledcSetup(15, 5000, 8); // channel 1, 50 Hz, 8-bit width
|
|
||||||
ledcAttachPin(MOTORLI_SPEED, 1); // Linker Motor SPEED mit Kanal 1 verbunden
|
|
||||||
analogWrite(MOTORLI_SPEED, 0); // Linken Motor sicherheitshalber ausschalten :-)
|
|
||||||
|
|
||||||
// Rechter Motor
|
|
||||||
pinMode(MOTORRE_FWRD,OUTPUT); // Rechter Motor FORWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORRE_BACK,OUTPUT); // Rechter Motor BACKWARD ist ein Ausgang.
|
|
||||||
ledcSetup(14, 5000, 8); // channel 2, 50 Hz, 8-bit width
|
|
||||||
ledcAttachPin(MOTORRE_SPEED, 2); // Rechter Motor SPEED mit Kanal 2 verbunden
|
|
||||||
analogWrite(MOTORRE_SPEED, 0); // Rechten Motor sicherheitshalber ausschalten :-)
|
|
||||||
|
|
||||||
pinMode(MOTORRE_SPEED,OUTPUT); // Rechter Motor SPEED ist ein Ausgang.
|
|
||||||
digitalWrite(MOTORRE_SPEED, 0); // Rechten Motor sicherheitshalber ausschalten :-)
|
|
||||||
|
|
||||||
// LEDs
|
|
||||||
pinMode(LED_VORWAERTS, OUTPUT); // LED Vorwärts ist ein Ausgang
|
|
||||||
pinMode(LED_STOP, OUTPUT); // LED Stop ist ein Ausgang
|
|
||||||
pinMode(LED_LINKS, OUTPUT); // LED Links ist ein Ausgang
|
|
||||||
pinMode(LED_RECHTS, OUTPUT); // LED Rechts ist ein Ausgang
|
|
||||||
|
|
||||||
// alle LEDS aus
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---- 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() {
|
|
||||||
|
|
||||||
// Servo in die Mitte Stellen
|
|
||||||
ServoMitte();
|
|
||||||
|
|
||||||
// Abstand messen -> nach vorn
|
|
||||||
abstand_vorn_cm = AbstandMessen();
|
|
||||||
|
|
||||||
// Ist die Bahn frei?
|
|
||||||
if(abstand_vorn_cm < US_STOP_ABSTAND_CM){
|
|
||||||
// Nein! Der Abstand nach vorn ist kleiner als erlaubt!
|
|
||||||
// Racer anhalten
|
|
||||||
RacerAnhalten();
|
|
||||||
// Nach links schauen!
|
|
||||||
ServoLinks();
|
|
||||||
// Abstand messen und merken.
|
|
||||||
abstand_links_cm = AbstandMessen();
|
|
||||||
// Nach rechts schauen!
|
|
||||||
ServoRechts();
|
|
||||||
// Abstand messen und merken.
|
|
||||||
abstand_rechts_cm = AbstandMessen();
|
|
||||||
|
|
||||||
// Welcher Abstand ist größer?
|
|
||||||
if(abstand_links_cm > abstand_rechts_cm){
|
|
||||||
// Links ist mehr Platz!
|
|
||||||
RacerLinks();
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
// Rechts ist mehr Platz!
|
|
||||||
RacerRechts();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
// Ja! Die Bahn ist frei
|
|
||||||
RacerVorwaerts();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------- Funktionen und Prozeduren -------------------------
|
|
||||||
|
|
||||||
void RacerAnhalten(void){
|
|
||||||
Serial.println("RACER_ANHALTEN"); // Meldung am Monitor ausgeben
|
|
||||||
// Rechten Motor abschalten
|
|
||||||
digitalWrite(MOTORRE_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor abschalten
|
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide ausschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, 0);
|
|
||||||
analogWrite(MOTORLI_SPEED, 0);
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, HIGH);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerVorwaerts(void){
|
|
||||||
Serial.println("RACER_VORWAERTS"); // Meldung am Monitor ausgeben
|
|
||||||
// Rechten Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, MOTORRE_TEMPO);
|
|
||||||
analogWrite(MOTORLI_SPEED, MOTORLI_TEMPO);
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, HIGH);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerLinks(void){
|
|
||||||
Serial.println("RACER_LINKS"); // Meldung am Monitor ausgeben
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, HIGH);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
// Rechten Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor auf rückwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORLI_BACK, HIGH);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, MOTORRE_TEMPO);
|
|
||||||
analogWrite(MOTORLI_SPEED, MOTORLI_TEMPO);
|
|
||||||
// Warten bis der RAcer sich gedreht hat
|
|
||||||
delay(RACER_LINKS_MS);
|
|
||||||
// Motoren wieder auschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, 0);
|
|
||||||
analogWrite(MOTORLI_SPEED, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerRechts(void){
|
|
||||||
Serial.println("RACER_RECHTS"); // Meldung am Monitor ausgeben
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, HIGH);
|
|
||||||
// Rechten Motor auf rückwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORRE_BACK, HIGH);
|
|
||||||
// Linken Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, MOTORRE_TEMPO);
|
|
||||||
analogWrite(MOTORLI_SPEED, MOTORLI_TEMPO);
|
|
||||||
// Warten bis der RAcer sich gedreht hat
|
|
||||||
delay(RACER_RECHTS_MS);
|
|
||||||
// Motoren wieder auschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, 0);
|
|
||||||
analogWrite(MOTORLI_SPEED, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoRechts(void){
|
|
||||||
Serial.println("SERVO_RECHTS"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_45GRAD_RECHTS); // Servo auf den Winkel rechts drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoLinks(void){
|
|
||||||
Serial.println("SERVO_LINKS"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_45GRAD_LINKS); // Servo auf den Winkel links drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoMitte(void){
|
|
||||||
Serial.println("SERVO_MITTE"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_0GRAD_MITTE); // Servo auf den Winkel links drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
long AbstandMessen(){
|
|
||||||
long abstand_cm,echo_dauer;
|
|
||||||
// Messung starten - ein kurzer Pulse "HIGH" wird zum TRIG pin des Ultraschallsensors geschickt
|
|
||||||
digitalWrite(US_TRIG,LOW);
|
|
||||||
delayMicroseconds(2);
|
|
||||||
digitalWrite(US_TRIG,HIGH);
|
|
||||||
delayMicroseconds(10);
|
|
||||||
digitalWrite(US_TRIG,LOW);
|
|
||||||
|
|
||||||
// Messung der Dauer in Mikrosekundenmeasure bis das ECHO Pin vom Ultraschallsensor HIGH wird
|
|
||||||
pinMode(US_ECHO,INPUT);
|
|
||||||
echo_dauer = pulseIn(US_ECHO,HIGH);
|
|
||||||
|
|
||||||
// convert into cm ... 344m/sec is the speed of noise - thus 34400cm/sec ... or 34,400cm/milisec ... or 0,0344cm/microsec
|
|
||||||
// the echo has to go the distance twice - forth and back - so the duration has to be the half of the measured one
|
|
||||||
// distance_cm = echo_duration/2 * 0,0344 or distance_cm = echo_duration/2 / 29,1 or distance_cm = echo_duration * 0,0172
|
|
||||||
// distance_cm = (echo_duration/2) / 29.1;
|
|
||||||
abstand_cm = echo_dauer * 0.0172;
|
|
||||||
|
|
||||||
//Messwert am Monitor anzeigen
|
|
||||||
Serial.print("ABSTAND_MESSEN. Der Abstand in cm ist:");
|
|
||||||
Serial.println(abstand_cm);
|
|
||||||
|
|
||||||
return(abstand_cm);
|
|
||||||
}
|
|
||||||
|
|
||||||
void analogWrite(uint8_t pin, uint8_t speed){
|
|
||||||
ledcWrite(1, speed);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,25 +1,42 @@
|
||||||
#include <ESP32Servo.h>
|
#include <ESP32Servo.h>
|
||||||
|
#include "esp32-hal-ledc.h"
|
||||||
|
|
||||||
|
//----- Taster ------------
|
||||||
|
#define TASTERPIN 17
|
||||||
|
|
||||||
//----- Werte für den Servo -----
|
//----- 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 SERVOPIN 16 // Pin an dem der Servomotor angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88.
|
||||||
#define SERVO_45GRAD_LINKS 136 // Wert um den Servo 45 Grad nach links zu drehen ... der kann je nach Servo anders sein
|
#define SERVO_45GRAD_LINKS 140 // Wert um den Servo 45 Grad nach links zu drehen ... der kann je nach Servo anders sein
|
||||||
#define SERVO_45GRAD_RECHTS 45 // Wert um den Servo 45 Grad nach rechtss zu drehen ... der kann je nach Servo anders sein
|
#define SERVO_45GRAD_RECHTS 35 // Wert um den Servo 45 Grad nach rechtss zu drehen ... der kann je nach Servo anders sein
|
||||||
#define SERVO_0GRAD_MITTE 90 // Wert um den Servo in die Mitte zu drehen ... der kann je nach Servo anders sein
|
#define SERVO_0GRAD_MITTE 90 // Wert um den Servo in die Mitte zu drehen ... der kann je nach Servo anders sein
|
||||||
|
#define SERVO_10GRAD_MITTE 135
|
||||||
|
#define SERVO_M10GRAD_MITTE 40
|
||||||
|
#define SERVO_SCHWENK_LI -5
|
||||||
|
#define SERVO_SCHWENK_RE 5
|
||||||
|
#define SERVO_SCHWENK_MS 15
|
||||||
|
|
||||||
//----- Werte für den Ultraschallsensor -----
|
//----- 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_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_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 20 // Wenn der gemessene Abstand kleiner ist, hält der CodeRacer an
|
#define US_STOP_ABSTAND_CM 15 // Wenn der gemessene Abstand kleiner ist, hält der CodeRacer an
|
||||||
|
|
||||||
//----- Werte für die Motoren -----
|
//----- Werte für die Motoren -----
|
||||||
|
#define MOTORRE_MAX_TEMPO 255 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255
|
||||||
|
#define MOTORRE_TEMPO 205 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255
|
||||||
|
#define MOTORLI_MAX_TEMPO 255 // 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_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_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 0 // 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 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 17 // 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_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 18 // 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_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 5 // 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 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_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
|
#define RACER_RECHTS_MS 200 // Die Zeit in Millisekunden, die der Racer braucht um sich 45 Grad nach rechts zu drehen
|
||||||
|
#define MOTORPWM_LINKS 5 // PWM-Kanal für linken Motor
|
||||||
|
#define MOTORPWM_RECHTS 6 // PWM-Kanal für rechten Motor
|
||||||
|
|
||||||
//----- Werte für die LEDs -----
|
//----- 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_VORWAERTS 26 // Pin an dem die VORWÄRTS LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88.
|
||||||
|
@ -30,7 +47,14 @@
|
||||||
//----- Variablen, die wir brauchen um uns Werte zu merken ----
|
//----- Variablen, die wir brauchen um uns Werte zu merken ----
|
||||||
long abstand_vorn_cm, abstand_links_cm, abstand_rechts_cm;
|
long abstand_vorn_cm, abstand_links_cm, abstand_rechts_cm;
|
||||||
|
|
||||||
|
int schwenkPosition = SERVO_0GRAD_MITTE;
|
||||||
|
int schwenkRichtung = SERVO_SCHWENK_LI;
|
||||||
|
long schwenkMillis = millis();
|
||||||
|
|
||||||
|
bool coderracer_activ = false;
|
||||||
|
|
||||||
//----- Objekte die wir haben. z.B. den Servo ----
|
//----- Objekte die wir haben. z.B. den Servo ----
|
||||||
|
Servo dummy_myservo; // ein Servo-Objekt anlegen, um den Servo Motor steuern zu können (Timer 0 überspringen)
|
||||||
Servo myservo; // ein Servo-Objekt anlegen, um den Servo Motor steuern zu können
|
Servo myservo; // ein Servo-Objekt anlegen, um den Servo Motor steuern zu können
|
||||||
|
|
||||||
//---- Hier startet der Code zum Einstellen aller wichtigen Dinge. Setup() wird einmal ausgeführt. ----
|
//---- Hier startet der Code zum Einstellen aller wichtigen Dinge. Setup() wird einmal ausgeführt. ----
|
||||||
|
@ -38,6 +62,9 @@ void setup() {
|
||||||
// Monitor
|
// Monitor
|
||||||
Serial.begin(115200); // Serial Monitor aktivieren. Mit dem Monitor kann man sich Werte und Meldungen anzeigen lassen.
|
Serial.begin(115200); // Serial Monitor aktivieren. Mit dem Monitor kann man sich Werte und Meldungen anzeigen lassen.
|
||||||
|
|
||||||
|
// Taster
|
||||||
|
pinMode(TASTERPIN,INPUT_PULLUP);
|
||||||
|
|
||||||
// Ultraschallsensor
|
// Ultraschallsensor
|
||||||
pinMode(US_TRIG, OUTPUT); // Ultraschallsensor: TRIG ist ein Ausgangspin. Es wird ein Signal zum Ultraschallsensor gesendet
|
pinMode(US_TRIG, OUTPUT); // Ultraschallsensor: TRIG ist ein Ausgangspin. Es wird ein Signal zum Ultraschallsensor gesendet
|
||||||
pinMode(US_ECHO, INPUT); // Ultraschallsensor: ECHO ist ein Eingangspin. Es wird ein Signal vom Ultraschallsensor empfangen
|
pinMode(US_ECHO, INPUT); // Ultraschallsensor: ECHO ist ein Eingangspin. Es wird ein Signal vom Ultraschallsensor empfangen
|
||||||
|
@ -48,14 +75,19 @@ void setup() {
|
||||||
// Linker Motor
|
// Linker Motor
|
||||||
pinMode(MOTORLI_FWRD,OUTPUT); // Linker Motor FORWARD ist ein Ausgang.
|
pinMode(MOTORLI_FWRD,OUTPUT); // Linker Motor FORWARD ist ein Ausgang.
|
||||||
pinMode(MOTORLI_BACK,OUTPUT); // Linker Motor BACKWARD ist ein Ausgang.
|
pinMode(MOTORLI_BACK,OUTPUT); // Linker Motor BACKWARD ist ein Ausgang.
|
||||||
pinMode(MOTORLI_SPEED,OUTPUT); // Linker Motor SPEED ist ein Ausgang.
|
ledcSetup(MOTORPWM_LINKS, 5000, 8); // channel 1, 50 Hz, 8-bit width
|
||||||
digitalWrite(MOTORLI_SPEED,LOW); // Linken Motor sicherheitshalber ausschalten
|
ledcAttachPin(MOTORLI_SPEED, MOTORPWM_LINKS); // Linker Motor SPEED mit Kanal 1 verbunden
|
||||||
|
analogWrite(MOTORLI_SPEED, 0); // Linken Motor sicherheitshalber ausschalten :-)
|
||||||
|
|
||||||
// Rechter Motor
|
// Rechter Motor
|
||||||
pinMode(MOTORRE_FWRD,OUTPUT); // Rechter Motor FORWARD ist ein Ausgang.
|
pinMode(MOTORRE_FWRD,OUTPUT); // Rechter Motor FORWARD ist ein Ausgang.
|
||||||
pinMode(MOTORRE_BACK,OUTPUT); // Rechter Motor BACKWARD ist ein Ausgang.
|
pinMode(MOTORRE_BACK,OUTPUT); // Rechter Motor BACKWARD ist ein Ausgang.
|
||||||
|
ledcSetup(MOTORPWM_RECHTS, 5000, 8); // channel 2, 50 Hz, 8-bit width
|
||||||
|
ledcAttachPin(MOTORRE_SPEED, MOTORPWM_RECHTS); // Rechter Motor SPEED mit Kanal 2 verbunden
|
||||||
|
analogWrite(MOTORRE_SPEED, 0); // Rechten Motor sicherheitshalber ausschalten :-)
|
||||||
|
|
||||||
pinMode(MOTORRE_SPEED,OUTPUT); // Rechter Motor SPEED ist ein Ausgang.
|
pinMode(MOTORRE_SPEED,OUTPUT); // Rechter Motor SPEED ist ein Ausgang.
|
||||||
digitalWrite(MOTORRE_SPEED,LOW); // Rechten Motor sicherheitshalber ausschalten
|
digitalWrite(MOTORRE_SPEED, 0); // Rechten Motor sicherheitshalber ausschalten :-)
|
||||||
|
|
||||||
// LEDs
|
// LEDs
|
||||||
pinMode(LED_VORWAERTS, OUTPUT); // LED Vorwärts ist ein Ausgang
|
pinMode(LED_VORWAERTS, OUTPUT); // LED Vorwärts ist ein Ausgang
|
||||||
|
@ -69,54 +101,87 @@ void setup() {
|
||||||
digitalWrite(LED_LINKS, LOW);
|
digitalWrite(LED_LINKS, LOW);
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
digitalWrite(LED_RECHTS, LOW);
|
||||||
|
|
||||||
// Servo am Anfang in die Mitte Stellen
|
// Servo in die Mitte Stellen
|
||||||
ServoMitte();
|
ServoMitte();
|
||||||
}
|
}
|
||||||
|
|
||||||
//---- 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
|
//---- 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() {
|
void loop() {
|
||||||
|
|
||||||
|
// Taster abfragen
|
||||||
|
RacerStartStop();
|
||||||
|
if(true == coderracer_activ){
|
||||||
|
|
||||||
|
// Abstand messen -> nach vorn
|
||||||
|
abstand_vorn_cm = AbstandMessen();
|
||||||
|
// Zum anfahren muss das Tempo höher sein - also jetzt wieder Tempo runter ...
|
||||||
|
RacerNormalTempo();
|
||||||
|
// Abstandssensor schon verstellen ... dann hat er das bis zur nächsten Messung auch geschafft
|
||||||
|
ServoSchwenk();
|
||||||
|
|
||||||
// Abstand messen -> nach vorn
|
// Ist die Bahn frei?
|
||||||
abstand_vorn_cm = AbstandMessen();
|
if(abstand_vorn_cm < US_STOP_ABSTAND_CM){
|
||||||
|
// Nein! Der Abstand nach vorn ist kleiner als erlaubt!
|
||||||
|
// Racer anhalten
|
||||||
|
RacerAnhalten();
|
||||||
|
// Nach links schauen!
|
||||||
|
ServoLinks();
|
||||||
|
// Abstand messen und merken.
|
||||||
|
abstand_links_cm = AbstandMessen();
|
||||||
|
// Nach rechts schauen!
|
||||||
|
ServoRechts();
|
||||||
|
// Abstand messen und merken.
|
||||||
|
abstand_rechts_cm = AbstandMessen();
|
||||||
|
|
||||||
// Ist die Bahn frei?
|
// Welcher Abstand ist größer?
|
||||||
if(abstand_vorn_cm < US_STOP_ABSTAND_CM){
|
if(abstand_links_cm > abstand_rechts_cm){
|
||||||
// Nein! Der Abstand nach vorn ist kleiner als erlaubt!
|
// Links ist mehr Platz!
|
||||||
// Racer anhalten
|
RacerLinks();
|
||||||
RacerAnhalten();
|
// Servo in die Mitte Stellen
|
||||||
// Nach links schauen!
|
ServoMitte();
|
||||||
ServoLinks();
|
}
|
||||||
// Abstand messen und merken.
|
else{
|
||||||
abstand_links_cm = AbstandMessen();
|
// Rechts ist mehr Platz!
|
||||||
// Nach rechts schauen!
|
RacerRechts();
|
||||||
ServoRechts();
|
// Servo in die Mitte Stellen
|
||||||
// Abstand messen und merken.
|
ServoMitte();
|
||||||
abstand_rechts_cm = AbstandMessen();
|
}
|
||||||
|
|
||||||
// Welcher Abstand ist größer?
|
|
||||||
if(abstand_links_cm > abstand_rechts_cm){
|
|
||||||
// Links ist mehr Platz!
|
|
||||||
RacerLinks();
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// Rechts ist mehr Platz!
|
// Ja! Die Bahn ist frei
|
||||||
RacerRechts();
|
RacerVorwaerts();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Servo am Anfang in die Mitte Stellen
|
|
||||||
ServoMitte();
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
// Ja! Die Bahn ist frei
|
|
||||||
RacerVorwaerts();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------- Funktionen und Prozeduren -------------------------
|
//-------------- 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){
|
||||||
|
RacerAnhalten();
|
||||||
|
ServoMitte();
|
||||||
|
digitalWrite(LED_STOP, HIGH);
|
||||||
|
} else {
|
||||||
|
digitalWrite(LED_STOP, LOW);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RacerAnhalten(void){
|
void RacerAnhalten(void){
|
||||||
Serial.println("RACER_ANHALTEN"); // Meldung am Monitor ausgeben
|
Serial.println("RACER_ANHALTEN"); // Meldung am Monitor ausgeben
|
||||||
// Rechten Motor abschalten
|
// Rechten Motor abschalten
|
||||||
|
@ -126,13 +191,20 @@ void RacerAnhalten(void){
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
digitalWrite(MOTORLI_FWRD, LOW);
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
digitalWrite(MOTORLI_BACK, LOW);
|
||||||
// Motoren beide ausschalten
|
// Motoren beide ausschalten
|
||||||
digitalWrite(MOTORRE_SPEED,LOW);
|
analogWrite(MOTORRE_SPEED, 0);
|
||||||
digitalWrite(MOTORLI_SPEED,LOW);
|
analogWrite(MOTORLI_SPEED, 0);
|
||||||
// LEDs setzen
|
// LEDs setzen
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
digitalWrite(LED_VORWAERTS, LOW);
|
||||||
digitalWrite(LED_STOP, HIGH);
|
digitalWrite(LED_STOP, HIGH);
|
||||||
digitalWrite(LED_LINKS, LOW);
|
digitalWrite(LED_LINKS, LOW);
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
digitalWrite(LED_RECHTS, LOW);
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RacerNormalTempo(void){
|
||||||
|
Serial.println("RACER_NORMAL_TEMPO"); // Meldung am Monitor ausgeben
|
||||||
|
analogWrite(MOTORRE_SPEED, MOTORRE_TEMPO);
|
||||||
|
analogWrite(MOTORLI_SPEED, MOTORLI_TEMPO);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RacerVorwaerts(void){
|
void RacerVorwaerts(void){
|
||||||
|
@ -144,14 +216,13 @@ void RacerVorwaerts(void){
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
digitalWrite(MOTORLI_FWRD, HIGH);
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
digitalWrite(MOTORLI_BACK, LOW);
|
||||||
// Motoren beide anschalten
|
// Motoren beide anschalten
|
||||||
digitalWrite(MOTORRE_SPEED, HIGH);
|
analogWrite(MOTORRE_SPEED, MOTORRE_MAX_TEMPO);
|
||||||
digitalWrite(MOTORLI_SPEED, HIGH);
|
analogWrite(MOTORLI_SPEED, MOTORLI_MAX_TEMPO);
|
||||||
// LEDs setzen
|
// LEDs setzen
|
||||||
digitalWrite(LED_VORWAERTS, HIGH);
|
digitalWrite(LED_VORWAERTS, HIGH);
|
||||||
digitalWrite(LED_STOP, LOW);
|
digitalWrite(LED_STOP, LOW);
|
||||||
digitalWrite(LED_LINKS, LOW);
|
digitalWrite(LED_LINKS, LOW);
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
digitalWrite(LED_RECHTS, LOW);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RacerLinks(void){
|
void RacerLinks(void){
|
||||||
|
@ -168,13 +239,13 @@ void RacerLinks(void){
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
digitalWrite(MOTORLI_FWRD, LOW);
|
||||||
digitalWrite(MOTORLI_BACK, HIGH);
|
digitalWrite(MOTORLI_BACK, HIGH);
|
||||||
// Motoren beide anschalten
|
// Motoren beide anschalten
|
||||||
digitalWrite(MOTORRE_SPEED, HIGH);
|
analogWrite(MOTORRE_SPEED, MOTORRE_MAX_TEMPO);
|
||||||
digitalWrite(MOTORLI_SPEED, HIGH);
|
analogWrite(MOTORLI_SPEED, MOTORLI_MAX_TEMPO);
|
||||||
// Warten bis der RAcer sich gedreht hat
|
// Warten bis der RAcer sich gedreht hat
|
||||||
delay(RACER_LINKS_MS);
|
delay(RACER_LINKS_MS);
|
||||||
// Motoren wieder auschalten
|
// Motoren wieder auschalten
|
||||||
digitalWrite(MOTORRE_SPEED,LOW);
|
analogWrite(MOTORRE_SPEED, 0);
|
||||||
digitalWrite(MOTORLI_SPEED,LOW);
|
analogWrite(MOTORLI_SPEED, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RacerRechts(void){
|
void RacerRechts(void){
|
||||||
|
@ -191,13 +262,13 @@ void RacerRechts(void){
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
digitalWrite(MOTORLI_FWRD, HIGH);
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
digitalWrite(MOTORLI_BACK, LOW);
|
||||||
// Motoren beide anschalten
|
// Motoren beide anschalten
|
||||||
digitalWrite(MOTORRE_SPEED, HIGH);
|
analogWrite(MOTORRE_SPEED, MOTORRE_MAX_TEMPO);
|
||||||
digitalWrite(MOTORLI_SPEED, HIGH);
|
analogWrite(MOTORLI_SPEED, MOTORLI_MAX_TEMPO);
|
||||||
// Warten bis der RAcer sich gedreht hat
|
// Warten bis der RAcer sich gedreht hat
|
||||||
delay(RACER_RECHTS_MS);
|
delay(RACER_RECHTS_MS);
|
||||||
// Motoren wieder auschalten
|
// Motoren wieder auschalten
|
||||||
digitalWrite(MOTORRE_SPEED,LOW);
|
analogWrite(MOTORRE_SPEED, 0);
|
||||||
digitalWrite(MOTORLI_SPEED,LOW);
|
analogWrite(MOTORLI_SPEED, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServoRechts(void){
|
void ServoRechts(void){
|
||||||
|
@ -215,9 +286,29 @@ void ServoLinks(void){
|
||||||
void ServoMitte(void){
|
void ServoMitte(void){
|
||||||
Serial.println("SERVO_MITTE"); // Meldung am Monitor ausgeben
|
Serial.println("SERVO_MITTE"); // Meldung am Monitor ausgeben
|
||||||
myservo.write(SERVO_0GRAD_MITTE); // Servo auf den Winkel links drehen
|
myservo.write(SERVO_0GRAD_MITTE); // Servo auf den Winkel links drehen
|
||||||
|
schwenkPosition = SERVO_0GRAD_MITTE; // Servo schaut direkt nach vorn
|
||||||
|
schwenkMillis = millis();
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ServoSchwenk(void){
|
||||||
|
if(millis() - schwenkMillis > SERVO_SCHWENK_MS){
|
||||||
|
Serial.println("SERVO_SCHWENK"); // Meldung am Monitor ausgeben
|
||||||
|
schwenkPosition = schwenkPosition + schwenkRichtung;
|
||||||
|
if(schwenkPosition <= SERVO_M10GRAD_MITTE){
|
||||||
|
schwenkPosition = SERVO_M10GRAD_MITTE;
|
||||||
|
schwenkRichtung = SERVO_SCHWENK_RE;
|
||||||
|
}
|
||||||
|
if(schwenkPosition >= SERVO_10GRAD_MITTE){
|
||||||
|
schwenkPosition = SERVO_10GRAD_MITTE;
|
||||||
|
schwenkRichtung = SERVO_SCHWENK_LI;
|
||||||
|
}
|
||||||
|
myservo.write(schwenkPosition); // Servo auf den Winkel links drehen
|
||||||
|
schwenkMillis = millis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
long AbstandMessen(){
|
long AbstandMessen(){
|
||||||
long abstand_cm,echo_dauer;
|
long abstand_cm,echo_dauer;
|
||||||
// Messung starten - ein kurzer Pulse "HIGH" wird zum TRIG pin des Ultraschallsensors geschickt
|
// Messung starten - ein kurzer Pulse "HIGH" wird zum TRIG pin des Ultraschallsensors geschickt
|
||||||
|
@ -228,6 +319,7 @@ long AbstandMessen(){
|
||||||
digitalWrite(US_TRIG,LOW);
|
digitalWrite(US_TRIG,LOW);
|
||||||
|
|
||||||
// Messung der Dauer in Mikrosekundenmeasure bis das ECHO Pin vom Ultraschallsensor HIGH wird
|
// Messung der Dauer in Mikrosekundenmeasure bis das ECHO Pin vom Ultraschallsensor HIGH wird
|
||||||
|
pinMode(US_ECHO,INPUT);
|
||||||
echo_dauer = pulseIn(US_ECHO,HIGH);
|
echo_dauer = pulseIn(US_ECHO,HIGH);
|
||||||
|
|
||||||
// convert into cm ... 344m/sec is the speed of noise - thus 34400cm/sec ... or 34,400cm/milisec ... or 0,0344cm/microsec
|
// convert into cm ... 344m/sec is the speed of noise - thus 34400cm/sec ... or 34,400cm/milisec ... or 0,0344cm/microsec
|
||||||
|
@ -243,4 +335,8 @@ long AbstandMessen(){
|
||||||
return(abstand_cm);
|
return(abstand_cm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void analogWrite(uint8_t pin, uint8_t speed){
|
||||||
|
if(pin == MOTORLI_SPEED){ledcWrite(MOTORPWM_LINKS, speed);}
|
||||||
|
if(pin == MOTORRE_SPEED){ledcWrite(MOTORPWM_RECHTS, speed);}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,17 @@
|
||||||
long abstand_vorn_cm, abstand_links_cm, abstand_rechts_cm;
|
long abstand_vorn_cm, abstand_links_cm, abstand_rechts_cm;
|
||||||
|
|
||||||
CodeRacer coderacer;
|
CodeRacer coderacer;
|
||||||
|
// Das kann der coderacer:
|
||||||
|
// coderacer.start_stop() Abfragen ob der Racer fahren soll oder nicht ... wenn er fahren soll kommt der Wert 'true' zurück, wenn er stopppen soll der Wert 'false'
|
||||||
|
// coderacer.servo_schwenk() Abstandssensor hin und her verstellen
|
||||||
|
// coderacer.abstand_messen(); Abstand messen - es kommt ein Wert in cm zurück
|
||||||
|
// coderacer.servo_mitte(); nach vorn "schauen"
|
||||||
|
// coderacer.servo_rechts(); nach rechts "schauen"
|
||||||
|
// coderacer.servo_links(); nach links "schauen"
|
||||||
|
// coderacer.links(); nach links drehen
|
||||||
|
// coderacer.rechts(); nach rechts drehen
|
||||||
|
// coderacer.vorwaerts(); Vorwaerts fahren
|
||||||
|
// coderacer.anhalten(); Racer anhalten
|
||||||
|
|
||||||
//---- Hier startet der Code zum Einstellen aller wichtigen Dinge. Setup() wird einmal ausgeführt. ----
|
//---- Hier startet der Code zum Einstellen aller wichtigen Dinge. Setup() wird einmal ausgeführt. ----
|
||||||
void setup() {
|
void setup() {
|
||||||
|
@ -19,6 +30,7 @@ void setup() {
|
||||||
// CodeRacer initialisieren
|
// CodeRacer initialisieren
|
||||||
coderacer.begin();
|
coderacer.begin();
|
||||||
|
|
||||||
|
// nach links und rechts schauen ... :-)
|
||||||
coderacer.servo_links();
|
coderacer.servo_links();
|
||||||
delay(10);
|
delay(10);
|
||||||
coderacer.servo_rechts();
|
coderacer.servo_rechts();
|
||||||
|
@ -30,48 +42,17 @@ void setup() {
|
||||||
//---- 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
|
//---- 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() {
|
void loop() {
|
||||||
|
|
||||||
|
// Abstand messen -> dort wo der coderacer gerade "hinschaut". Der gemessene Abstand ist in abstand_vorn_cm gespeichert
|
||||||
// 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();
|
abstand_vorn_cm = coderacer.abstand_messen();
|
||||||
|
|
||||||
// Abfragen ob der Racer fahren soll oder nicht ...
|
// Abfragen ob der Racer fahren soll oder nicht ...
|
||||||
if(true == coderacer.start_stop()){
|
if(true == coderacer.start_stop()){
|
||||||
|
|
||||||
// Abstandssensor schon verstellen ... dann hat er das bis zur nächsten Messung auch geschafft
|
// Abstandssensor verstellen ...
|
||||||
coderacer.servo_schwenk();
|
coderacer.servo_schwenk();
|
||||||
|
|
||||||
// Ist die Bahn frei?
|
// hier kommt Euer Code zu steuern des coderacers hinein ...
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,253 +0,0 @@
|
||||||
#include <ESP32Servo.h>
|
|
||||||
#include "esp32-hal-ledc.h"
|
|
||||||
|
|
||||||
//----- 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_45GRAD_LINKS 136 // Wert um den Servo 45 Grad nach links zu drehen ... der kann je nach Servo anders sein
|
|
||||||
#define SERVO_45GRAD_RECHTS 45 // Wert um den Servo 45 Grad nach rechtss zu drehen ... der kann je nach Servo anders sein
|
|
||||||
#define SERVO_0GRAD_MITTE 90 // Wert um den Servo in die Mitte zu drehen ... der kann je nach Servo anders sein
|
|
||||||
|
|
||||||
//----- Werte für den Ultraschallsensor -----
|
|
||||||
#define US_TRIG 35 // 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 34 // 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 10 // Wenn der gemessene Abstand kleiner ist, hält der CodeRacer an
|
|
||||||
|
|
||||||
//----- Werte für die Motoren -----
|
|
||||||
#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 0 // 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 MOTORRE_TEMPO 150 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255
|
|
||||||
#define MOTORLI_SPEED 17 // 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 18 // 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 5 // 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 MOTORLI_TEMPO 150 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255
|
|
||||||
#define RACER_LINKS_MS 500 // Die Zeit in Millisekunden, die der Racer braucht um sich 45 Grad nach links zu drehen
|
|
||||||
#define RACER_RECHTS_MS 500 // 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;
|
|
||||||
|
|
||||||
//----- Objekte die wir haben. z.B. den Servo ----
|
|
||||||
Servo myservo; // ein Servo-Objekt anlegen, um den Servo Motor steuern zu können
|
|
||||||
|
|
||||||
//---- 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.
|
|
||||||
|
|
||||||
// Ultraschallsensor
|
|
||||||
pinMode(US_TRIG, OUTPUT); // Ultraschallsensor: TRIG ist ein Ausgangspin. Es wird ein Signal zum Ultraschallsensor gesendet
|
|
||||||
pinMode(US_ECHO, INPUT); // Ultraschallsensor: ECHO ist ein Eingangspin. Es wird ein Signal vom Ultraschallsensor empfangen
|
|
||||||
|
|
||||||
// Servo
|
|
||||||
myservo.attach(SERVOPIN); // dem Servo Objekt "sagen" an welchen Pin am Schaltkreis der Server angeschlossen ist
|
|
||||||
|
|
||||||
// Linker Motor
|
|
||||||
pinMode(MOTORLI_FWRD,OUTPUT); // Linker Motor FORWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORLI_BACK,OUTPUT); // Linker Motor BACKWARD ist ein Ausgang.
|
|
||||||
ledcSetup(15, 5000, 8); // channel 1, 50 Hz, 8-bit width
|
|
||||||
ledcAttachPin(MOTORLI_SPEED, 1); // Linker Motor SPEED mit Kanal 1 verbunden
|
|
||||||
analogWrite(MOTORLI_SPEED, 0); // Linken Motor sicherheitshalber ausschalten :-)
|
|
||||||
|
|
||||||
// Rechter Motor
|
|
||||||
pinMode(MOTORRE_FWRD,OUTPUT); // Rechter Motor FORWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORRE_BACK,OUTPUT); // Rechter Motor BACKWARD ist ein Ausgang.
|
|
||||||
ledcSetup(14, 5000, 8); // channel 2, 50 Hz, 8-bit width
|
|
||||||
ledcAttachPin(MOTORRE_SPEED, 2); // Rechter Motor SPEED mit Kanal 2 verbunden
|
|
||||||
analogWrite(MOTORRE_SPEED, 0); // Rechten Motor sicherheitshalber ausschalten :-)
|
|
||||||
|
|
||||||
pinMode(MOTORRE_SPEED,OUTPUT); // Rechter Motor SPEED ist ein Ausgang.
|
|
||||||
digitalWrite(MOTORRE_SPEED, 0); // Rechten Motor sicherheitshalber ausschalten :-)
|
|
||||||
|
|
||||||
// LEDs
|
|
||||||
pinMode(LED_VORWAERTS, OUTPUT); // LED Vorwärts ist ein Ausgang
|
|
||||||
pinMode(LED_STOP, OUTPUT); // LED Stop ist ein Ausgang
|
|
||||||
pinMode(LED_LINKS, OUTPUT); // LED Links ist ein Ausgang
|
|
||||||
pinMode(LED_RECHTS, OUTPUT); // LED Rechts ist ein Ausgang
|
|
||||||
|
|
||||||
// alle LEDS aus
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---- 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() {
|
|
||||||
|
|
||||||
// Servo in die Mitte Stellen
|
|
||||||
ServoMitte();
|
|
||||||
|
|
||||||
// Abstand messen -> nach vorn
|
|
||||||
abstand_vorn_cm = AbstandMessen();
|
|
||||||
|
|
||||||
// Ist die Bahn frei?
|
|
||||||
if(abstand_vorn_cm < US_STOP_ABSTAND_CM){
|
|
||||||
// Nein! Der Abstand nach vorn ist kleiner als erlaubt!
|
|
||||||
// Racer anhalten
|
|
||||||
RacerAnhalten();
|
|
||||||
// Nach links schauen!
|
|
||||||
ServoLinks();
|
|
||||||
// Abstand messen und merken.
|
|
||||||
abstand_links_cm = AbstandMessen();
|
|
||||||
// Nach rechts schauen!
|
|
||||||
ServoRechts();
|
|
||||||
// Abstand messen und merken.
|
|
||||||
abstand_rechts_cm = AbstandMessen();
|
|
||||||
|
|
||||||
// Welcher Abstand ist größer?
|
|
||||||
if(abstand_links_cm > abstand_rechts_cm){
|
|
||||||
// Links ist mehr Platz!
|
|
||||||
RacerLinks();
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
// Rechts ist mehr Platz!
|
|
||||||
RacerRechts();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
// Ja! Die Bahn ist frei
|
|
||||||
RacerVorwaerts();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------- Funktionen und Prozeduren -------------------------
|
|
||||||
|
|
||||||
void RacerAnhalten(void){
|
|
||||||
Serial.println("RACER_ANHALTEN"); // Meldung am Monitor ausgeben
|
|
||||||
// Rechten Motor abschalten
|
|
||||||
digitalWrite(MOTORRE_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor abschalten
|
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide ausschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, 0);
|
|
||||||
analogWrite(MOTORLI_SPEED, 0);
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, HIGH);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerVorwaerts(void){
|
|
||||||
Serial.println("RACER_VORWAERTS"); // Meldung am Monitor ausgeben
|
|
||||||
// Rechten Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, MOTORRE_TEMPO);
|
|
||||||
analogWrite(MOTORLI_SPEED, MOTORLI_TEMPO);
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, HIGH);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerLinks(void){
|
|
||||||
Serial.println("RACER_LINKS"); // Meldung am Monitor ausgeben
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, HIGH);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
// Rechten Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor auf rückwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORLI_BACK, HIGH);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, MOTORRE_TEMPO);
|
|
||||||
analogWrite(MOTORLI_SPEED, MOTORLI_TEMPO);
|
|
||||||
// Warten bis der RAcer sich gedreht hat
|
|
||||||
delay(RACER_LINKS_MS);
|
|
||||||
// Motoren wieder auschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, 0);
|
|
||||||
analogWrite(MOTORLI_SPEED, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerRechts(void){
|
|
||||||
Serial.println("RACER_RECHTS"); // Meldung am Monitor ausgeben
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, HIGH);
|
|
||||||
// Rechten Motor auf rückwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORRE_BACK, HIGH);
|
|
||||||
// Linken Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, MOTORRE_TEMPO);
|
|
||||||
analogWrite(MOTORLI_SPEED, MOTORLI_TEMPO);
|
|
||||||
// Warten bis der RAcer sich gedreht hat
|
|
||||||
delay(RACER_RECHTS_MS);
|
|
||||||
// Motoren wieder auschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, 0);
|
|
||||||
analogWrite(MOTORLI_SPEED, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoRechts(void){
|
|
||||||
Serial.println("SERVO_RECHTS"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_45GRAD_RECHTS); // Servo auf den Winkel rechts drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoLinks(void){
|
|
||||||
Serial.println("SERVO_LINKS"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_45GRAD_LINKS); // Servo auf den Winkel links drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoMitte(void){
|
|
||||||
Serial.println("SERVO_MITTE"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_0GRAD_MITTE); // Servo auf den Winkel links drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
long AbstandMessen(){
|
|
||||||
long abstand_cm,echo_dauer;
|
|
||||||
// Messung starten - ein kurzer Pulse "HIGH" wird zum TRIG pin des Ultraschallsensors geschickt
|
|
||||||
digitalWrite(US_TRIG,LOW);
|
|
||||||
delayMicroseconds(2);
|
|
||||||
digitalWrite(US_TRIG,HIGH);
|
|
||||||
delayMicroseconds(10);
|
|
||||||
digitalWrite(US_TRIG,LOW);
|
|
||||||
|
|
||||||
// Messung der Dauer in Mikrosekundenmeasure bis das ECHO Pin vom Ultraschallsensor HIGH wird
|
|
||||||
pinMode(US_ECHO,INPUT);
|
|
||||||
echo_dauer = pulseIn(US_ECHO,HIGH);
|
|
||||||
|
|
||||||
// convert into cm ... 344m/sec is the speed of noise - thus 34400cm/sec ... or 34,400cm/milisec ... or 0,0344cm/microsec
|
|
||||||
// the echo has to go the distance twice - forth and back - so the duration has to be the half of the measured one
|
|
||||||
// distance_cm = echo_duration/2 * 0,0344 or distance_cm = echo_duration/2 / 29,1 or distance_cm = echo_duration * 0,0172
|
|
||||||
// distance_cm = (echo_duration/2) / 29.1;
|
|
||||||
abstand_cm = echo_dauer * 0.0172;
|
|
||||||
|
|
||||||
//Messwert am Monitor anzeigen
|
|
||||||
Serial.print("ABSTAND_MESSEN. Der Abstand in cm ist:");
|
|
||||||
Serial.println(abstand_cm);
|
|
||||||
|
|
||||||
return(abstand_cm);
|
|
||||||
}
|
|
||||||
|
|
||||||
void analogWrite(uint8_t pin, uint8_t speed){
|
|
||||||
ledcWrite(1, speed);
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,246 +0,0 @@
|
||||||
#include <ESP32Servo.h>
|
|
||||||
|
|
||||||
//----- 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_45GRAD_LINKS 136 // Wert um den Servo 45 Grad nach links zu drehen ... der kann je nach Servo anders sein
|
|
||||||
#define SERVO_45GRAD_RECHTS 45 // Wert um den Servo 45 Grad nach rechtss zu drehen ... der kann je nach Servo anders sein
|
|
||||||
#define SERVO_0GRAD_MITTE 90 // Wert um den Servo in die Mitte zu drehen ... der kann je nach Servo anders sein
|
|
||||||
|
|
||||||
//----- 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 20 // Wenn der gemessene Abstand kleiner ist, hält der CodeRacer an
|
|
||||||
|
|
||||||
//----- Werte für die Motoren -----
|
|
||||||
#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 0 // 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 17 // 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 18 // 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 5 // 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;
|
|
||||||
|
|
||||||
//----- Objekte die wir haben. z.B. den Servo ----
|
|
||||||
Servo myservo; // ein Servo-Objekt anlegen, um den Servo Motor steuern zu können
|
|
||||||
|
|
||||||
//---- 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.
|
|
||||||
|
|
||||||
// Ultraschallsensor
|
|
||||||
pinMode(US_TRIG, OUTPUT); // Ultraschallsensor: TRIG ist ein Ausgangspin. Es wird ein Signal zum Ultraschallsensor gesendet
|
|
||||||
pinMode(US_ECHO, INPUT); // Ultraschallsensor: ECHO ist ein Eingangspin. Es wird ein Signal vom Ultraschallsensor empfangen
|
|
||||||
|
|
||||||
// Servo
|
|
||||||
myservo.attach(SERVOPIN); // dem Servo Objekt "sagen" an welchen Pin am Schaltkreis der Server angeschlossen ist
|
|
||||||
|
|
||||||
// Linker Motor
|
|
||||||
pinMode(MOTORLI_FWRD,OUTPUT); // Linker Motor FORWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORLI_BACK,OUTPUT); // Linker Motor BACKWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORLI_SPEED,OUTPUT); // Linker Motor SPEED ist ein Ausgang.
|
|
||||||
digitalWrite(MOTORLI_SPEED,LOW); // Linken Motor sicherheitshalber ausschalten
|
|
||||||
|
|
||||||
// Rechter Motor
|
|
||||||
pinMode(MOTORRE_FWRD,OUTPUT); // Rechter Motor FORWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORRE_BACK,OUTPUT); // Rechter Motor BACKWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORRE_SPEED,OUTPUT); // Rechter Motor SPEED ist ein Ausgang.
|
|
||||||
digitalWrite(MOTORRE_SPEED,LOW); // Rechten Motor sicherheitshalber ausschalten
|
|
||||||
|
|
||||||
// LEDs
|
|
||||||
pinMode(LED_VORWAERTS, OUTPUT); // LED Vorwärts ist ein Ausgang
|
|
||||||
pinMode(LED_STOP, OUTPUT); // LED Stop ist ein Ausgang
|
|
||||||
pinMode(LED_LINKS, OUTPUT); // LED Links ist ein Ausgang
|
|
||||||
pinMode(LED_RECHTS, OUTPUT); // LED Rechts ist ein Ausgang
|
|
||||||
|
|
||||||
// alle LEDS aus
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
|
|
||||||
// Servo am Anfang in die Mitte Stellen
|
|
||||||
ServoMitte();
|
|
||||||
}
|
|
||||||
|
|
||||||
//---- 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() {
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Abstand messen -> nach vorn
|
|
||||||
abstand_vorn_cm = AbstandMessen();
|
|
||||||
|
|
||||||
// Ist die Bahn frei?
|
|
||||||
if(abstand_vorn_cm < US_STOP_ABSTAND_CM){
|
|
||||||
// Nein! Der Abstand nach vorn ist kleiner als erlaubt!
|
|
||||||
// Racer anhalten
|
|
||||||
RacerAnhalten();
|
|
||||||
// Nach links schauen!
|
|
||||||
ServoLinks();
|
|
||||||
// Abstand messen und merken.
|
|
||||||
abstand_links_cm = AbstandMessen();
|
|
||||||
// Nach rechts schauen!
|
|
||||||
ServoRechts();
|
|
||||||
// Abstand messen und merken.
|
|
||||||
abstand_rechts_cm = AbstandMessen();
|
|
||||||
|
|
||||||
// Welcher Abstand ist größer?
|
|
||||||
if(abstand_links_cm > abstand_rechts_cm){
|
|
||||||
// Links ist mehr Platz!
|
|
||||||
RacerLinks();
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
// Rechts ist mehr Platz!
|
|
||||||
RacerRechts();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Servo am Anfang in die Mitte Stellen
|
|
||||||
ServoMitte();
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
// Ja! Die Bahn ist frei
|
|
||||||
RacerVorwaerts();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------- Funktionen und Prozeduren -------------------------
|
|
||||||
|
|
||||||
void RacerAnhalten(void){
|
|
||||||
Serial.println("RACER_ANHALTEN"); // Meldung am Monitor ausgeben
|
|
||||||
// Rechten Motor abschalten
|
|
||||||
digitalWrite(MOTORRE_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor abschalten
|
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide ausschalten
|
|
||||||
digitalWrite(MOTORRE_SPEED,LOW);
|
|
||||||
digitalWrite(MOTORLI_SPEED,LOW);
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, HIGH);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerVorwaerts(void){
|
|
||||||
Serial.println("RACER_VORWAERTS"); // Meldung am Monitor ausgeben
|
|
||||||
// Rechten Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
digitalWrite(MOTORRE_SPEED, HIGH);
|
|
||||||
digitalWrite(MOTORLI_SPEED, HIGH);
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, HIGH);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerLinks(void){
|
|
||||||
Serial.println("RACER_LINKS"); // Meldung am Monitor ausgeben
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, HIGH);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
// Rechten Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor auf rückwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORLI_BACK, HIGH);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
digitalWrite(MOTORRE_SPEED, HIGH);
|
|
||||||
digitalWrite(MOTORLI_SPEED, HIGH);
|
|
||||||
// Warten bis der RAcer sich gedreht hat
|
|
||||||
delay(RACER_LINKS_MS);
|
|
||||||
// Motoren wieder auschalten
|
|
||||||
digitalWrite(MOTORRE_SPEED,LOW);
|
|
||||||
digitalWrite(MOTORLI_SPEED,LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerRechts(void){
|
|
||||||
Serial.println("RACER_RECHTS"); // Meldung am Monitor ausgeben
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, HIGH);
|
|
||||||
// Rechten Motor auf rückwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORRE_BACK, HIGH);
|
|
||||||
// Linken Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
digitalWrite(MOTORRE_SPEED, HIGH);
|
|
||||||
digitalWrite(MOTORLI_SPEED, HIGH);
|
|
||||||
// Warten bis der RAcer sich gedreht hat
|
|
||||||
delay(RACER_RECHTS_MS);
|
|
||||||
// Motoren wieder auschalten
|
|
||||||
digitalWrite(MOTORRE_SPEED,LOW);
|
|
||||||
digitalWrite(MOTORLI_SPEED,LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoRechts(void){
|
|
||||||
Serial.println("SERVO_RECHTS"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_45GRAD_RECHTS); // Servo auf den Winkel rechts drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoLinks(void){
|
|
||||||
Serial.println("SERVO_LINKS"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_45GRAD_LINKS); // Servo auf den Winkel links drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoMitte(void){
|
|
||||||
Serial.println("SERVO_MITTE"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_0GRAD_MITTE); // Servo auf den Winkel links drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
long AbstandMessen(){
|
|
||||||
long abstand_cm,echo_dauer;
|
|
||||||
// Messung starten - ein kurzer Pulse "HIGH" wird zum TRIG pin des Ultraschallsensors geschickt
|
|
||||||
digitalWrite(US_TRIG,LOW);
|
|
||||||
delayMicroseconds(2);
|
|
||||||
digitalWrite(US_TRIG,HIGH);
|
|
||||||
delayMicroseconds(10);
|
|
||||||
digitalWrite(US_TRIG,LOW);
|
|
||||||
|
|
||||||
// Messung der Dauer in Mikrosekundenmeasure bis das ECHO Pin vom Ultraschallsensor HIGH wird
|
|
||||||
echo_dauer = pulseIn(US_ECHO,HIGH);
|
|
||||||
|
|
||||||
// convert into cm ... 344m/sec is the speed of noise - thus 34400cm/sec ... or 34,400cm/milisec ... or 0,0344cm/microsec
|
|
||||||
// the echo has to go the distance twice - forth and back - so the duration has to be the half of the measured one
|
|
||||||
// distance_cm = echo_duration/2 * 0,0344 or distance_cm = echo_duration/2 / 29,1 or distance_cm = echo_duration * 0,0172
|
|
||||||
// distance_cm = (echo_duration/2) / 29.1;
|
|
||||||
abstand_cm = echo_dauer * 0.0172;
|
|
||||||
|
|
||||||
//Messwert am Monitor anzeigen
|
|
||||||
Serial.print("ABSTAND_MESSEN. Der Abstand in cm ist:");
|
|
||||||
Serial.println(abstand_cm);
|
|
||||||
|
|
||||||
return(abstand_cm);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,159 +0,0 @@
|
||||||
#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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,246 +0,0 @@
|
||||||
#include <ESP32Servo.h>
|
|
||||||
|
|
||||||
//----- 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_45GRAD_LINKS 136 // Wert um den Servo 45 Grad nach links zu drehen ... der kann je nach Servo anders sein
|
|
||||||
#define SERVO_45GRAD_RECHTS 45 // Wert um den Servo 45 Grad nach rechtss zu drehen ... der kann je nach Servo anders sein
|
|
||||||
#define SERVO_0GRAD_MITTE 90 // Wert um den Servo in die Mitte zu drehen ... der kann je nach Servo anders sein
|
|
||||||
|
|
||||||
//----- 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 20 // Wenn der gemessene Abstand kleiner ist, hält der CodeRacer an
|
|
||||||
|
|
||||||
//----- Werte für die Motoren -----
|
|
||||||
#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 0 // 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 17 // 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 18 // 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 5 // 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;
|
|
||||||
|
|
||||||
//----- Objekte die wir haben. z.B. den Servo ----
|
|
||||||
Servo myservo; // ein Servo-Objekt anlegen, um den Servo Motor steuern zu können
|
|
||||||
|
|
||||||
//---- 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.
|
|
||||||
|
|
||||||
// Ultraschallsensor
|
|
||||||
pinMode(US_TRIG, OUTPUT); // Ultraschallsensor: TRIG ist ein Ausgangspin. Es wird ein Signal zum Ultraschallsensor gesendet
|
|
||||||
pinMode(US_ECHO, INPUT); // Ultraschallsensor: ECHO ist ein Eingangspin. Es wird ein Signal vom Ultraschallsensor empfangen
|
|
||||||
|
|
||||||
// Servo
|
|
||||||
myservo.attach(SERVOPIN); // dem Servo Objekt "sagen" an welchen Pin am Schaltkreis der Server angeschlossen ist
|
|
||||||
|
|
||||||
// Linker Motor
|
|
||||||
pinMode(MOTORLI_FWRD,OUTPUT); // Linker Motor FORWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORLI_BACK,OUTPUT); // Linker Motor BACKWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORLI_SPEED,OUTPUT); // Linker Motor SPEED ist ein Ausgang.
|
|
||||||
digitalWrite(MOTORLI_SPEED,LOW); // Linken Motor sicherheitshalber ausschalten
|
|
||||||
|
|
||||||
// Rechter Motor
|
|
||||||
pinMode(MOTORRE_FWRD,OUTPUT); // Rechter Motor FORWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORRE_BACK,OUTPUT); // Rechter Motor BACKWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORRE_SPEED,OUTPUT); // Rechter Motor SPEED ist ein Ausgang.
|
|
||||||
digitalWrite(MOTORRE_SPEED,LOW); // Rechten Motor sicherheitshalber ausschalten
|
|
||||||
|
|
||||||
// LEDs
|
|
||||||
pinMode(LED_VORWAERTS, OUTPUT); // LED Vorwärts ist ein Ausgang
|
|
||||||
pinMode(LED_STOP, OUTPUT); // LED Stop ist ein Ausgang
|
|
||||||
pinMode(LED_LINKS, OUTPUT); // LED Links ist ein Ausgang
|
|
||||||
pinMode(LED_RECHTS, OUTPUT); // LED Rechts ist ein Ausgang
|
|
||||||
|
|
||||||
// alle LEDS aus
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
|
|
||||||
// Servo am Anfang in die Mitte Stellen
|
|
||||||
ServoMitte();
|
|
||||||
}
|
|
||||||
|
|
||||||
//---- 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() {
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Abstand messen -> nach vorn
|
|
||||||
abstand_vorn_cm = AbstandMessen();
|
|
||||||
|
|
||||||
// Ist die Bahn frei?
|
|
||||||
if(abstand_vorn_cm < US_STOP_ABSTAND_CM){
|
|
||||||
// Nein! Der Abstand nach vorn ist kleiner als erlaubt!
|
|
||||||
// Racer anhalten
|
|
||||||
RacerAnhalten();
|
|
||||||
// Nach links schauen!
|
|
||||||
ServoLinks();
|
|
||||||
// Abstand messen und merken.
|
|
||||||
abstand_links_cm = AbstandMessen();
|
|
||||||
// Nach rechts schauen!
|
|
||||||
ServoRechts();
|
|
||||||
// Abstand messen und merken.
|
|
||||||
abstand_rechts_cm = AbstandMessen();
|
|
||||||
|
|
||||||
// Welcher Abstand ist größer?
|
|
||||||
if(abstand_links_cm > abstand_rechts_cm){
|
|
||||||
// Links ist mehr Platz!
|
|
||||||
RacerLinks();
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
// Rechts ist mehr Platz!
|
|
||||||
RacerRechts();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Servo am Anfang in die Mitte Stellen
|
|
||||||
ServoMitte();
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
// Ja! Die Bahn ist frei
|
|
||||||
RacerVorwaerts();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------- Funktionen und Prozeduren -------------------------
|
|
||||||
|
|
||||||
void RacerAnhalten(void){
|
|
||||||
Serial.println("RACER_ANHALTEN"); // Meldung am Monitor ausgeben
|
|
||||||
// Rechten Motor abschalten
|
|
||||||
digitalWrite(MOTORRE_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor abschalten
|
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide ausschalten
|
|
||||||
digitalWrite(MOTORRE_SPEED,LOW);
|
|
||||||
digitalWrite(MOTORLI_SPEED,LOW);
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, HIGH);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerVorwaerts(void){
|
|
||||||
Serial.println("RACER_VORWAERTS"); // Meldung am Monitor ausgeben
|
|
||||||
// Rechten Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
digitalWrite(MOTORRE_SPEED, HIGH);
|
|
||||||
digitalWrite(MOTORLI_SPEED, HIGH);
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, HIGH);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerLinks(void){
|
|
||||||
Serial.println("RACER_LINKS"); // Meldung am Monitor ausgeben
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, HIGH);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
// Rechten Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor auf rückwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORLI_BACK, HIGH);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
digitalWrite(MOTORRE_SPEED, HIGH);
|
|
||||||
digitalWrite(MOTORLI_SPEED, HIGH);
|
|
||||||
// Warten bis der RAcer sich gedreht hat
|
|
||||||
delay(RACER_LINKS_MS);
|
|
||||||
// Motoren wieder auschalten
|
|
||||||
digitalWrite(MOTORRE_SPEED,LOW);
|
|
||||||
digitalWrite(MOTORLI_SPEED,LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerRechts(void){
|
|
||||||
Serial.println("RACER_RECHTS"); // Meldung am Monitor ausgeben
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, HIGH);
|
|
||||||
// Rechten Motor auf rückwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORRE_BACK, HIGH);
|
|
||||||
// Linken Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
digitalWrite(MOTORRE_SPEED, HIGH);
|
|
||||||
digitalWrite(MOTORLI_SPEED, HIGH);
|
|
||||||
// Warten bis der RAcer sich gedreht hat
|
|
||||||
delay(RACER_RECHTS_MS);
|
|
||||||
// Motoren wieder auschalten
|
|
||||||
digitalWrite(MOTORRE_SPEED,LOW);
|
|
||||||
digitalWrite(MOTORLI_SPEED,LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoRechts(void){
|
|
||||||
Serial.println("SERVO_RECHTS"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_45GRAD_RECHTS); // Servo auf den Winkel rechts drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoLinks(void){
|
|
||||||
Serial.println("SERVO_LINKS"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_45GRAD_LINKS); // Servo auf den Winkel links drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoMitte(void){
|
|
||||||
Serial.println("SERVO_MITTE"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_0GRAD_MITTE); // Servo auf den Winkel links drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
long AbstandMessen(){
|
|
||||||
long abstand_cm,echo_dauer;
|
|
||||||
// Messung starten - ein kurzer Pulse "HIGH" wird zum TRIG pin des Ultraschallsensors geschickt
|
|
||||||
digitalWrite(US_TRIG,LOW);
|
|
||||||
delayMicroseconds(2);
|
|
||||||
digitalWrite(US_TRIG,HIGH);
|
|
||||||
delayMicroseconds(10);
|
|
||||||
digitalWrite(US_TRIG,LOW);
|
|
||||||
|
|
||||||
// Messung der Dauer in Mikrosekundenmeasure bis das ECHO Pin vom Ultraschallsensor HIGH wird
|
|
||||||
echo_dauer = pulseIn(US_ECHO,HIGH);
|
|
||||||
|
|
||||||
// convert into cm ... 344m/sec is the speed of noise - thus 34400cm/sec ... or 34,400cm/milisec ... or 0,0344cm/microsec
|
|
||||||
// the echo has to go the distance twice - forth and back - so the duration has to be the half of the measured one
|
|
||||||
// distance_cm = echo_duration/2 * 0,0344 or distance_cm = echo_duration/2 / 29,1 or distance_cm = echo_duration * 0,0172
|
|
||||||
// distance_cm = (echo_duration/2) / 29.1;
|
|
||||||
abstand_cm = echo_dauer * 0.0172;
|
|
||||||
|
|
||||||
//Messwert am Monitor anzeigen
|
|
||||||
Serial.print("ABSTAND_MESSEN. Der Abstand in cm ist:");
|
|
||||||
Serial.println(abstand_cm);
|
|
||||||
|
|
||||||
return(abstand_cm);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,253 +0,0 @@
|
||||||
#include <ESP32Servo.h>
|
|
||||||
#include "esp32-hal-ledc.h"
|
|
||||||
|
|
||||||
//----- 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_45GRAD_LINKS 136 // Wert um den Servo 45 Grad nach links zu drehen ... der kann je nach Servo anders sein
|
|
||||||
#define SERVO_45GRAD_RECHTS 45 // Wert um den Servo 45 Grad nach rechtss zu drehen ... der kann je nach Servo anders sein
|
|
||||||
#define SERVO_0GRAD_MITTE 90 // Wert um den Servo in die Mitte zu drehen ... der kann je nach Servo anders sein
|
|
||||||
|
|
||||||
//----- Werte für den Ultraschallsensor -----
|
|
||||||
#define US_TRIG 35 // 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 34 // 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 10 // Wenn der gemessene Abstand kleiner ist, hält der CodeRacer an
|
|
||||||
|
|
||||||
//----- Werte für die Motoren -----
|
|
||||||
#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 0 // 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 MOTORRE_TEMPO 150 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255
|
|
||||||
#define MOTORLI_SPEED 17 // 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 18 // 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 5 // 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 MOTORLI_TEMPO 150 // Geschwindigkeit Motor1 ... ein Wert zwischen 0 und 255
|
|
||||||
#define RACER_LINKS_MS 500 // Die Zeit in Millisekunden, die der Racer braucht um sich 45 Grad nach links zu drehen
|
|
||||||
#define RACER_RECHTS_MS 500 // 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;
|
|
||||||
|
|
||||||
//----- Objekte die wir haben. z.B. den Servo ----
|
|
||||||
Servo myservo; // ein Servo-Objekt anlegen, um den Servo Motor steuern zu können
|
|
||||||
|
|
||||||
//---- 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.
|
|
||||||
|
|
||||||
// Ultraschallsensor
|
|
||||||
pinMode(US_TRIG, OUTPUT); // Ultraschallsensor: TRIG ist ein Ausgangspin. Es wird ein Signal zum Ultraschallsensor gesendet
|
|
||||||
pinMode(US_ECHO, INPUT); // Ultraschallsensor: ECHO ist ein Eingangspin. Es wird ein Signal vom Ultraschallsensor empfangen
|
|
||||||
|
|
||||||
// Servo
|
|
||||||
myservo.attach(SERVOPIN); // dem Servo Objekt "sagen" an welchen Pin am Schaltkreis der Server angeschlossen ist
|
|
||||||
|
|
||||||
// Linker Motor
|
|
||||||
pinMode(MOTORLI_FWRD,OUTPUT); // Linker Motor FORWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORLI_BACK,OUTPUT); // Linker Motor BACKWARD ist ein Ausgang.
|
|
||||||
ledcSetup(15, 5000, 8); // channel 1, 50 Hz, 8-bit width
|
|
||||||
ledcAttachPin(MOTORLI_SPEED, 1); // Linker Motor SPEED mit Kanal 1 verbunden
|
|
||||||
analogWrite(MOTORLI_SPEED, 0); // Linken Motor sicherheitshalber ausschalten :-)
|
|
||||||
|
|
||||||
// Rechter Motor
|
|
||||||
pinMode(MOTORRE_FWRD,OUTPUT); // Rechter Motor FORWARD ist ein Ausgang.
|
|
||||||
pinMode(MOTORRE_BACK,OUTPUT); // Rechter Motor BACKWARD ist ein Ausgang.
|
|
||||||
ledcSetup(14, 5000, 8); // channel 2, 50 Hz, 8-bit width
|
|
||||||
ledcAttachPin(MOTORRE_SPEED, 2); // Rechter Motor SPEED mit Kanal 2 verbunden
|
|
||||||
analogWrite(MOTORRE_SPEED, 0); // Rechten Motor sicherheitshalber ausschalten :-)
|
|
||||||
|
|
||||||
pinMode(MOTORRE_SPEED,OUTPUT); // Rechter Motor SPEED ist ein Ausgang.
|
|
||||||
digitalWrite(MOTORRE_SPEED, 0); // Rechten Motor sicherheitshalber ausschalten :-)
|
|
||||||
|
|
||||||
// LEDs
|
|
||||||
pinMode(LED_VORWAERTS, OUTPUT); // LED Vorwärts ist ein Ausgang
|
|
||||||
pinMode(LED_STOP, OUTPUT); // LED Stop ist ein Ausgang
|
|
||||||
pinMode(LED_LINKS, OUTPUT); // LED Links ist ein Ausgang
|
|
||||||
pinMode(LED_RECHTS, OUTPUT); // LED Rechts ist ein Ausgang
|
|
||||||
|
|
||||||
// alle LEDS aus
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---- 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() {
|
|
||||||
|
|
||||||
// Servo in die Mitte Stellen
|
|
||||||
ServoMitte();
|
|
||||||
|
|
||||||
// Abstand messen -> nach vorn
|
|
||||||
abstand_vorn_cm = AbstandMessen();
|
|
||||||
|
|
||||||
// Ist die Bahn frei?
|
|
||||||
if(abstand_vorn_cm < US_STOP_ABSTAND_CM){
|
|
||||||
// Nein! Der Abstand nach vorn ist kleiner als erlaubt!
|
|
||||||
// Racer anhalten
|
|
||||||
RacerAnhalten();
|
|
||||||
// Nach links schauen!
|
|
||||||
ServoLinks();
|
|
||||||
// Abstand messen und merken.
|
|
||||||
abstand_links_cm = AbstandMessen();
|
|
||||||
// Nach rechts schauen!
|
|
||||||
ServoRechts();
|
|
||||||
// Abstand messen und merken.
|
|
||||||
abstand_rechts_cm = AbstandMessen();
|
|
||||||
|
|
||||||
// Welcher Abstand ist größer?
|
|
||||||
if(abstand_links_cm > abstand_rechts_cm){
|
|
||||||
// Links ist mehr Platz!
|
|
||||||
RacerLinks();
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
// Rechts ist mehr Platz!
|
|
||||||
RacerRechts();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
// Ja! Die Bahn ist frei
|
|
||||||
RacerVorwaerts();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------- Funktionen und Prozeduren -------------------------
|
|
||||||
|
|
||||||
void RacerAnhalten(void){
|
|
||||||
Serial.println("RACER_ANHALTEN"); // Meldung am Monitor ausgeben
|
|
||||||
// Rechten Motor abschalten
|
|
||||||
digitalWrite(MOTORRE_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor abschalten
|
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide ausschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, 0);
|
|
||||||
analogWrite(MOTORLI_SPEED, 0);
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, HIGH);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerVorwaerts(void){
|
|
||||||
Serial.println("RACER_VORWAERTS"); // Meldung am Monitor ausgeben
|
|
||||||
// Rechten Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, MOTORRE_TEMPO);
|
|
||||||
analogWrite(MOTORLI_SPEED, MOTORLI_TEMPO);
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, HIGH);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerLinks(void){
|
|
||||||
Serial.println("RACER_LINKS"); // Meldung am Monitor ausgeben
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, HIGH);
|
|
||||||
digitalWrite(LED_RECHTS, LOW);
|
|
||||||
// Rechten Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORRE_BACK, LOW);
|
|
||||||
// Linken Motor auf rückwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORLI_BACK, HIGH);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, MOTORRE_TEMPO);
|
|
||||||
analogWrite(MOTORLI_SPEED, MOTORLI_TEMPO);
|
|
||||||
// Warten bis der RAcer sich gedreht hat
|
|
||||||
delay(RACER_LINKS_MS);
|
|
||||||
// Motoren wieder auschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, 0);
|
|
||||||
analogWrite(MOTORLI_SPEED, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RacerRechts(void){
|
|
||||||
Serial.println("RACER_RECHTS"); // Meldung am Monitor ausgeben
|
|
||||||
// LEDs setzen
|
|
||||||
digitalWrite(LED_VORWAERTS, LOW);
|
|
||||||
digitalWrite(LED_STOP, LOW);
|
|
||||||
digitalWrite(LED_LINKS, LOW);
|
|
||||||
digitalWrite(LED_RECHTS, HIGH);
|
|
||||||
// Rechten Motor auf rückwärts stellen
|
|
||||||
digitalWrite(MOTORRE_FWRD, LOW);
|
|
||||||
digitalWrite(MOTORRE_BACK, HIGH);
|
|
||||||
// Linken Motor auf vorwärts stellen
|
|
||||||
digitalWrite(MOTORLI_FWRD, HIGH);
|
|
||||||
digitalWrite(MOTORLI_BACK, LOW);
|
|
||||||
// Motoren beide anschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, MOTORRE_TEMPO);
|
|
||||||
analogWrite(MOTORLI_SPEED, MOTORLI_TEMPO);
|
|
||||||
// Warten bis der RAcer sich gedreht hat
|
|
||||||
delay(RACER_RECHTS_MS);
|
|
||||||
// Motoren wieder auschalten
|
|
||||||
analogWrite(MOTORRE_SPEED, 0);
|
|
||||||
analogWrite(MOTORLI_SPEED, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoRechts(void){
|
|
||||||
Serial.println("SERVO_RECHTS"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_45GRAD_RECHTS); // Servo auf den Winkel rechts drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoLinks(void){
|
|
||||||
Serial.println("SERVO_LINKS"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_45GRAD_LINKS); // Servo auf den Winkel links drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
void ServoMitte(void){
|
|
||||||
Serial.println("SERVO_MITTE"); // Meldung am Monitor ausgeben
|
|
||||||
myservo.write(SERVO_0GRAD_MITTE); // Servo auf den Winkel links drehen
|
|
||||||
delay(1000); // Kurz warten, dass der Servo die Stellung erreicht
|
|
||||||
}
|
|
||||||
|
|
||||||
long AbstandMessen(){
|
|
||||||
long abstand_cm,echo_dauer;
|
|
||||||
// Messung starten - ein kurzer Pulse "HIGH" wird zum TRIG pin des Ultraschallsensors geschickt
|
|
||||||
digitalWrite(US_TRIG,LOW);
|
|
||||||
delayMicroseconds(2);
|
|
||||||
digitalWrite(US_TRIG,HIGH);
|
|
||||||
delayMicroseconds(10);
|
|
||||||
digitalWrite(US_TRIG,LOW);
|
|
||||||
|
|
||||||
// Messung der Dauer in Mikrosekundenmeasure bis das ECHO Pin vom Ultraschallsensor HIGH wird
|
|
||||||
pinMode(US_ECHO,INPUT);
|
|
||||||
echo_dauer = pulseIn(US_ECHO,HIGH);
|
|
||||||
|
|
||||||
// convert into cm ... 344m/sec is the speed of noise - thus 34400cm/sec ... or 34,400cm/milisec ... or 0,0344cm/microsec
|
|
||||||
// the echo has to go the distance twice - forth and back - so the duration has to be the half of the measured one
|
|
||||||
// distance_cm = echo_duration/2 * 0,0344 or distance_cm = echo_duration/2 / 29,1 or distance_cm = echo_duration * 0,0172
|
|
||||||
// distance_cm = (echo_duration/2) / 29.1;
|
|
||||||
abstand_cm = echo_dauer * 0.0172;
|
|
||||||
|
|
||||||
//Messwert am Monitor anzeigen
|
|
||||||
Serial.print("ABSTAND_MESSEN. Der Abstand in cm ist:");
|
|
||||||
Serial.println(abstand_cm);
|
|
||||||
|
|
||||||
return(abstand_cm);
|
|
||||||
}
|
|
||||||
|
|
||||||
void analogWrite(uint8_t pin, uint8_t speed){
|
|
||||||
ledcWrite(1, speed);
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue