Erweiterung des Roboters
Hier der Link zum ursprünglichen Sketch:
Sketch [Betaversion_29.03.20]
Erweiterungen:
Der Roboter soll nun um folgende Komponenten/Funktionen erweitert werden:
-
Ein LCD Display, auf dem - während der Fahrt - aktuelle Informationen angezeigt werden
Eine separate Erlärung hierzu befindet sich demnächst hier: LCD anschließen und programmieren
- Beleuchtung vorne und hinten
- "Bremslicht"
- Definition, was passieren soll, wenn sich der Roboter "festgefahren" hat, d.h. wenn weder links noch rechts genug Platz ist, um die Fahrt fortzusetzen
Zuordnung der Pins:
Die angegebenen Pins, sind die digitalen Pins auf dem Sensorshield
Pin | Funktion |
---|---|
d3 | Signalpin für den Servomotor |
d4 | rechts v+h rückwärts |
d5 | rechts v+h vorwärts |
d6 | links v+h rückwärts |
d7 | links v+h vorwärts |
d8 | Beleuchtung |
d9 | echoPin Ultraschallsensor |
d10 | triggerPin Ultraschallsensor |
d11 | Bremslicht |
~Der Anschluss des LCD - Displays wird noch ergänzt!~
Grafik:
Die fritzing© Grafik ist in Arbeit, aufgrund der Komplexität dauert es ein bisschen. Sobald sie fertig ist, wird sie hier zu finden sein.
Sketch:
Der hier gezeigt Sketch wurde noch nicht getestet und ist nur aus Überlegungen heraus entstanden. Die funktionierende Endversion wird hier veröffentlich, sobald ein Test möglich ist.
Der folgende Link enthält den Sketch im .ino Format zurNutzung mit der Arduino IDE Software:
4WD_Roboter_2020_erweitert_Florian_Porth
Hier folgt nun der Sketch:
/*
* Dieser Sketch, steuert die 4 Motoren sowie den Ultraschallsensor (Abstandsmessung),
* welcher auf einem Servomotor montiert ist, sodass er den Abstamd in versch.
* Richtungen messen kann.
*
* Motor:
* - Pin4: rechts Rückwärts
* - Pin5: rechts Vorwärts
* - Pin6: links Rückwärts
* - Pin7: links. Vorwärts
* Ultraschallsensor:
* - Pin10: triggerPin
* - Pin9: echoPin
* Servomotor:
* - Pin3: Signal Servo
*
* Das System soll nun um folgendes erweitert werden:
*
* - Beleuchtung vorne und hinten inklusive Bremslicht
* - Ein LCD Display, welches aktuelle Statusinformationen während der Fahrt anzeigt
* - Eine "exit-Funktion" falls sich der Roboter festfährt
*
*/
#include //Einbinden der Library zur Steuerung des Servomotors
#include //LCD-Bibliothek einbinden
int trigPin = 10;
int echoPin = 9; //Definition der Pins, die für den Ultraschallsensor benötigt werden
int rf = 5 //right forward; Pin 5; durch ein Signal an Pin 5, drehen sich die beiden rechten Räder vorwärts
int rb = 4 //right backward; Pin 4; " Pin 4 " rückwärts
int lf = 7 //left forward; Pin 7; " Pin 7 drehen sich die beiden linken Räder vorwärts
int lb = 6 //left backward; Pin 6; " Pin 6 " rückwärts
int svs = 3 //Servomotor - Signal; Pin 3
int servonormal = 90 //Normalstellung des Servomotors - überprüfen!!!!
int servolinks = 0 //Servo ist nach links gedreht - überprüfen!!!!
int servorechts = 180 //Servo ist nach rechts gedreht - überprüfen!!!!
int drehzeit = 100 //Zeit in Millisec, die der Roboter für die Drehung benötigt - überprüfen!!!!
int light = 8 //Beleuchtung des Roboters; läuft gesammelt auf Pin 8
int brakelight = 11 //Bremslicht; Pin 11
void setup() {
// put your setup code here, to run once:
lcd.begin(16, 2); //Setup des Displays; Anzahl der Zeilen und Stellen pro Zeile
Serial.begin (9600);
pinMode(1, OUTPUT); //Definiere die u.g. Pins als OUTPUT
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, INPUT); //Definiere Pin 9 als INPUT (echoPin Ultraschall)
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
servo.write(servonormal); //Am Anfang wird der Servomotor in die Neutralstellung gebracht
digitalWrite(light,1); //Einschalten der Beleuchtung
lcd.setCursor(0, 0); //Position des Curors bestimmen (Zeile 0, Stelle 0);
lcd.print("Guten Tag); //Schriftzug "Guten Tag"
delay(1000);
lcd.setCursor(0, 1);
lcd.print("Laden...");
delay(2000);
}
void loop() {
// put your main code here, to run repeatedly:
lcd.clear(); //Display zurücksetzen
lcd.setCursor(0, 0);
lcd.print("kein Hindernis");
lcd.setCursor(1, 0);
lcd.print("fahren");
digitalWrite(lf,1);
digitalWrite(rf,1); //Der Roboter fährt mit allen 4 Rädern vorwärts
//Ultraschallsensor:
long dauer, distance
digitalWrite(trigPin,0);
delayMicroseconds(2);
digitalWrite(trigPin,1);
delayMicroseconds(10);
digitalWrite(trigPin,0); //Der Ultraschallsensor soll während der Fahrt kontrollieren, ob der Weg frei ist
dauer = pulseIn(echoPin,1);
distance = (dauer/2) / 25; //Berechnung der Distanz
Serial.println(distance); //Die errechnete Distanz wird auf dem seriellen Monitor protokolliert
if(distance <= 5)
{
lcd.clear();
digitalWrite(brakelight,1); //Bremslicht aktivieren
digitalWrite(rf,0);
digitalWrite(lf,0); //Der Roboter stoppt
lcd.setCursor(0, 0);
lcd.print("Hindernis erkannt");
//Der Servomotor dreht den Ultraschallsensor und misst die jeweilige Entfernung zum nächsten Objekt
//nach links
lcd.setCursor(1, 0);
lcd.print("messe links");
servo.write(servolinks); //Der Servo dreht den Ultraschallsensor nach links
long dauerlinks, distancelinks
digitalWrite(trigPin,0);
delayMicroseconds(2);
digitalWrite(trigPin,1);
delayMicroseconds(10);
digitalWrite(trigPin,0);
dauerlinks = pulseIn(echoPin,1);
distancelinks = (dauer/2) / 25; //Die errechnete Distanz erscheint auf dem seriellen Monitor
Serial.println("Entfernung links:");
Serial.println(distancelinks);
delay(200);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hindernis erkannt");
//nach rechts
lcd.setCursor(1, 0);
lcd.print("messe rechts");
servo.write(servorechts); //Der Servo dreht den Ultraschallsensor nach rechts
long dauerrechts, distancerechts
digitalWrite(trigPin,0);
delayMicroseconds(2);
digitalWrite(trigPin,1);
delayMicroseconds(10);
digitalWrite(trigPin,0);
dauerrechts = pulseIn(echoPin,1);
distancerechs = (dauer/2) / 25; //Die errechnete Distanz erscheint auf dem seriellen Monitor
Serial.println("Entfernung rechts:");
Serial.println(distancerechts);
delay(200);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hindernis erkannt");
servo.write(servonormal); //Der Servomotor fährt wieder in die Ausgangsposition
//Vergleich beider Messwerte:
lcd.setCursor(1, 0);
lcd.print("rechne...");
if(distancerechts > distancelinks) //Wenn rechts mehr Platz ist als links...
{
lcd.clear();
lcd,setCursor(0, 0);
lcd.print("neue Fahrtrichtung:");
lcd.setCursor(1, 0);
lcd.print("rechts");
digitalWrite(brakelight,0); //Bremslicht deaktivieren
digitalWrite(lf,1);
digitalWrite(rb,1; //Drehung des Roboters
delay(drehzeit); //Drehzeit muss noch definiert werden
digitalWrite(lf,0);
digitalWrite(rb,0); //STOP
delayMicroseconds(100);
digitalWrite(lf,1);
digitalWrite(rf,1); //Der Roboter dreht sich nach rechts und fährt weiter
}
else //Wenn die if-Bedingung nicht erfüllt ist, muss links mehr Platz sein -> Der Roboter soll nach links fahren
{
if(distancelinks < 4) //Wenn links (und aufgrund der Schleife auch rechts) nicht genug Platz ist...
{
lcd.clear();
lcd,setCursor(0, 0);
lcd.print("Fehler: links/");
lcd.setCursor(1, 0);
lcd.print("rechts<4cm"); //Auf dem LCD Dispplay erscheint folgende Fehlermeldung: "Fehler: links/rechts<4cm"
digitalWrite(light,0); //Die Lichter am Roboter blinken
delay(500);
digitalWrite(light,1);
delay(500);
digitalWrite(light,0);
delay(500);
digitalWrite(light,1);
delay(500);
digitalWrite(light,0);
delay(500);
digitalWrite(light,1);
delay(500);
digitalWrite(light,0);
delay(500);
digitalWrite(light,1);
delay(500);
digitalWrite(light,0);
delay(500);
digitalWrite(light,1);
delay(500);
digitalWrite(light,0);
delay(500);
digitalWrite(light,1);
delay(500);
digitalWrite(light,0);
delay(500);
digitalWrite(light,1);
delay(500);
digitalWrite(light,0);
delay(500);
digitalWrite(light,1);
delay(500);
digitalWrite(light,0); //Die Lichter am Roboter blinken
delay(180000); //3min warten; das sollte ausreichen um den Roboter zu "befreien" und ggf neu zu starten
}
else
{
continue
}
lcd.clear();
lcd,setCursor(0, 0);
lcd.print("neue Fahrtrichtung:");
lcd.setCursor(1, 0);
lcd.print("links");
digitalWrite(brakelight,0); //Bremslicht deaktivieren
digitalWrite(lb,1);
digitalWrite(rf,1; //Drehung
delay(drehzeit); //Drehzeit muss noch definiert werden
digitalWrite(lb,0);
digitalWrite(rf,0); //STOP
delayMicroseconds(100);
digitalWrite(lf,1);
digitalWrite(rf,1); //Der Roboter dreht sich nach links und fährt weiter
}
}
else
{
delay (490);
continue
/*
* Wenn die erste if-Bedingung nicht erfüllt ist - d.h. kein Hindernis zu erkennen ist, soll nach insg. 500 Millisekunden erneut gemessen werden
*/
}
delay(10);
} //Das Programm startet von vorne
/*Florian Porth_2020_10b_10WU_PÖR*/