Banner Ausblenden
Kleines Logo

Willkommen auf PSI-Online

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:

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*/

Erstellt: Florian Porth (06.05.2020) Letzte Änderung: Florian Porth (31.05.2020)