sketch_28_auto_us_hinderniserkenn_servo

sketch_28_auto_us_hinderniserkenn_servo
  /*Dieser Sketch laesst das Auto programmiert fahren. Der Fahrablauf wird festgelegt, indem die Fahrablauf_Module aufgerufen werden.
    Der jeweilige Fahrzustand wird auch im Serial Monitor angezeigt.
    Die Entferung zu einem Hindernis wird mit einem Ultraschallsensor HC-SR04 gemessen und auch angezeigt im Serial Monitor.
    Das Fahren vorwaerts wird gestoppt, wenn ein Hindernis auftaucht mit Abstand <40cm. 
    Dann ertoent auch der Buzzer (Piezo-Summer). 
    Der Servo dreht den Ultraschallsensor nach rechts.
    Wenn in diese Richtung kein Hindernis erkannt wird, schwenkt das Auto etwas nach rechts und faehrt wieder geradeaus.
    Der Servo wird wieder in die Mitte gedreht. 
    Falls auch rechts ein Hindernis erkannt wird, wird die ganze Aktion mit links ausgefuehrt.
    Wenn geradeaus, rechts und links ein Hindernis sein sollte, stoppt das Auto dauerhaft (Sketch wird beendet)*/
  
  /*Binde den Programmablauf von us_hindernisabfrage.h ein*/
  #include "us_hindernisabfrage.h"
  /*Binde den Programmablauf von Fahrablauf_Module.h ein*/
  #include "Fahrablaufmodule.h"
  /*Binde den Programmablauf von servo_nachmitte.h ein*/
  #include "servo_nachmitte.h"
  /*Binde den Programmablauf von servo_nachrechts.h ein*/
  #include "servo_nachrechts.h"
  /*Binde den Programmablauf von servo_nachlinks.h ein*/
  #include "servo_nachlinks.h"
  
  void setup()
  {
  /*Programmiere Arduino Pins Ausgang (fuer Motoren)*/  
    pinMode(6, OUTPUT);                //Motoren LINKS PWM (Geschwindigkeit)
    pinMode(5, OUTPUT);                //Motoren RECHTS PWM (Geschwindigkeit)
    pinMode(11, OUTPUT);               //Motoren LINKS Bruecke
    pinMode(8, OUTPUT);                //Motoren LINKS Bruecke
    pinMode(7, OUTPUT);                //Motoren RECHTS Bruecke
    pinMode(17, OUTPUT);               //Motoren RECHTS Bruecke
    /*Programmiere Arduino Pins D2 ...19 fuer den US-Sensor, den Buzzer und den Servo*/  
    pinMode(2, OUTPUT);                //Signal Trig zum HC-SR04
    pinMode(19, INPUT);                //Signal Echo vom HC-SR04, Pin A5=D19
    pinMode(4, OUTPUT);                //Tonsignal zum Passive Buzzer  
    pinMode(9, OUTPUT);                //Positionssignal an Servo
    
    Serial.begin(9600);                //Serial Monitor aktivieren, 9600 Baud
    servo_nachmitte();                 //Servo in die Mitte stellen 
    stopp(); 
    delay(100);             
  }
  
  void loop()
  {   
   forward();                          //void forward wird aufgerufen
   us_hindernisabfrage();              //us-hindernisabfrage wird aufgerufen
   
   if (hindernis==1)                   //wenn geradeaus ein Hindernis da ist... 1.if-Schleife 
   {
    back();                            //...fahre 0,5s rueckwaerts
    delay(500);
    stopp();
    servo_nachrechts();
    us_hindernisabfrage();             //us-hindernisabfrage wird aufgerufen - Hindernis rechts vorn?
    
    if (hindernis==1)                  //wenn auch rechts vorn ein Hindernis ist...   2.if-Schleife
    {
     servo_nachlinks();
     us_hindernisabfrage();            //us-hindernisabfrage wird aufgerufen - Hindernis links vorn?
     
     if (hindernis==1)                 //wenn auch links vorn ein Hindernis ist...     3.if-Schleife
     {
      servo_nachmitte();
      tone(4,2000,2000);               //...sende Signale zum Passive Buzzer, Arduino erzeugt an D4 einen Ton 2000Hz fuer Dauer 2s
      delay(1000);
      for(;;){}                        //Beende sketch 
     }
     else                              //wenn links vorn kein Hindernis ist...
     {
      servo_nachmitte();
      left();                          //Drehe Auto etwas nach links
      delay(700);                      //fuer 0,7 s , dann wieder zum Beginn der loop-Schleife, d.h. weiterfahren
     }
    }                                  //Schliessen 2.if-Schleife
    else                               //wenn rechts vorn kein Hindernis ist  (else zu 2.if-Schleife)
    {
     servo_nachmitte();  
     right();                          //Drehe Auto etwas nach rechts
     delay(700);                       //fuer 0,7 s , dann wieder zum Beginn der loop-Schleife, d.h. weiterfahren      
    }
   }                                   //Schliessen 1.if-Schleife
   else                                //Wenn geradeaus kein Hindernis ist  (else zu 1.if-Schleife)
   {                                   //Keine Aktion, wieder zum Beginn der loop-Schleife, d.h. weiterfahren
   }                                   
  }
Fahrablaufmodule.h
  void forward()
  {   
    digitalWrite(7, HIGH);            // Schalte Motoren RECHTS ein 
    digitalWrite(17, LOW);                                                      
    analogWrite(5, 100);              // Setze die Geschwindigkeit auf 100 (zwischen 0 und 255)
    digitalWrite(11, HIGH);           // Schalte Motoren LINKS ein 
    digitalWrite(8, LOW);                                
    analogWrite(6, 100);              // Setze die Geschwindigkeit auf 100 (zwischen 0 und 255)
    Serial.println("FORWARD");
  }
  
  void back()
  {   
    digitalWrite(7, LOW);            // Schalte Motoren RECHTS ein 
    digitalWrite(17, HIGH);                                                      
    analogWrite(5, 100);             // Setze die Geschwindigkeit auf 100 (zwischen 0 und 255)
    digitalWrite(11, LOW);           // Schalte Motoren LINKS ein 
    digitalWrite(8, HIGH);                                
    analogWrite(6, 100);             // Setze die Geschwindigkeit auf 100 (zwischen 0 und 255)
    Serial.println("BACK");
  }
  
  void left()
  {   
    digitalWrite(7, HIGH);           // Schalte Motoren RECHTS ein 
    digitalWrite(17, LOW);                                                      
    analogWrite(5, 100);             // Setze die Geschwindigkeit auf 100 (zwischen 0 und 255)
    digitalWrite(11, LOW);           // Schalte Motoren LINKS ein 
    digitalWrite(8, HIGH);                                
    analogWrite(6, 100);             // Setze die Geschwindigkeit auf 100 (zwischen 0 und 255)
    Serial.println("LEFT");
  }
  
  void right()
  {   
    digitalWrite(7, LOW);            // Schalte Motoren RECHTS ein 
    digitalWrite(17, HIGH);                                                      
    analogWrite(5, 100);             // Setze die Geschwindigkeit auf 100 (zwischen 0 und 255)
    digitalWrite(11, HIGH);          // Schalte Motoren LINKS ein 
    digitalWrite(8, LOW);                                
    analogWrite(6, 100);             // Setze die Geschwindigkeit auf 100 (zwischen 0 und 255)
    Serial.println("RIGHT");
  }
  
  void stopp()
  {
    digitalWrite(7, LOW);            // Schalte alle Motoren aus
    digitalWrite(17, LOW);  
    digitalWrite(11, LOW); 
    digitalWrite(8, LOW);  
    Serial.println("STOP");  
  }
us_hindernisabfrage.h
  /*Dieser Programmteil ermittelt die Entferung zu einem Hindernis und stoppt das Auto sowie aktiviert den Buzzer gegebenenfalls*/
  
  long dauer=0;                             // in der Variablen "dauer" soll die Zeit gespeichert werden, die eine Schallwelle bis zur Reflektion und zurueck benoetigt 
  long entfernung=0;                        // in der Variablen "entfernung" soll die berechnete Entfernung gespeichert werden. 
  int hindernis = 0 ;                       // Definiere flag "hindernis" und setze auf 0 (kein Hindernis)
  
  void us_hindernisabfrage()
  {
    digitalWrite(2, LOW);                   // Hier nimmt man die Spannung fuer kurze Zeit vom Trig-Pin, damit man spaeter beim Senden ein rauschfreies Signal hat
    delay(5);                               // ...fuer die Dauer 5 Millisekunden
    digitalWrite(2, HIGH);                  // Ein HIGH-Signal wird zum Trig-Eingang des HC-SR04 gesendet
    delayMicroseconds(15);                  // Die Dauer muss mindestens 10 Mikrosek sein, hier gewaehlt 15 Mikrosek
    digitalWrite(2, LOW);                   // Wenn das Trig-Signal wieder auf LOW geht, sendet der HC-SR04 Ultraschallwellen aus (8mal, Frequenz 40kHz)
    dauer = pulseIn(19, HIGH);              // Der Arduino zaehlt die Zeit in Mikrosekunden Mikrosek, bis der reflektierte Schall zum Ultraschallsensor zurueckkehrt
    entfernung = (dauer/2) * 0.03432;       // Nun wird aus der Zeit die Entfernung in Zentimetern berechnet (Bsp.: 10ms entspricht Entfernung 170cm)
    Serial.print(entfernung);               // Der Wert der Entfernung wird an den Serial Monitor uebergeben
    Serial.println(" cm");                  // Hinter dem Wert der Entfernung soll die Einheit "cm" angegeben sowie die Anzeigezeile gewechselt werden
    if (entfernung < 50)                    // Wenn der Wert fuer die Entfernung unter 50 Zentimeter betraegt dann... 
    {
    tone(4,1000,1000);                      // ...sende Signal zum Passive Buzzer (Arduino erzeugt an D4 einen Ton 1000Hz fuer Dauer 1s)
    hindernis = 1;                          // Setze flag "hindernis" auf 1
    }
    else                                    // Und wenn das nicht so ist...
    {
    hindernis = 0;                          // Setze flag "hindernis" auf 0  (kein Hindernis)
    digitalWrite (4, LOW);                  // Kein Signal an Buzzer
    }
  }
servo_nachlinks.h
  /*Diese Programmteil dreht den Servo nach links etwa -50 Grad*/
  
  void servo_nachlinks()
  {
  for (int i=0; i<=100 ; i++)           // Wird 100x wiederholt, damit hat der Servo 20ms x 100 = 2s Zeit zum Drehen
    {
    digitalWrite(9,HIGH);
    delayMicroseconds(1900);            // Bei Einstellung von 1,8ms stellt sich Servo nach links 
    digitalWrite(9,LOW);
    delayMicroseconds(15000);           // Ergaenzung auf Zykluszeit 20ms (delayMicroseconds funktioniert nur bis 16383 "integer")
    delayMicroseconds(3100); 
    }
  }
servo_nachmitte.h
  /*Dieser Programmteil dreht den Servo in die Mitte 0 Grad*/
  
  void servo_nachmitte()
  {
  for (int i=0; i<=100 ; i++)           // Wird 100x wiederholt, damit hat der Servo 20ms x 100 = 2s Zeit zum Drehen
    {
    digitalWrite(9,HIGH);
    delayMicroseconds(1300);            // Bei Einstellung von etwa 1,15ms stellt sich Servo auf 0 Grad
    digitalWrite(9,LOW);
    delayMicroseconds(15000);           // Ergaenzung auf Zykluszeit 20ms (delayMicroseconds funktioniert nur bis 16383 "integer")
    delayMicroseconds(3700); 
    }
  }
servo_nachrechts.h
  /*Dieser Programmteil dreht den Servo nach rechts etwa +50 Grad*/
  
  void servo_nachrechts()
  {
  for (int i=0; i<=100 ; i++)          // Wird 100x wiederholt, damit hat der Servo 20ms x 100 = 2s Zeit zum Drehen
    {
    digitalWrite(9,HIGH);
    delayMicroseconds(700);            // Bei Einstellung von 0,6ms stellt sich Servo nach rechts
    digitalWrite(9,LOW);
    delayMicroseconds(15000);          // Ergaenzung auf Zykluszeit 20ms (delayMicroseconds funktioniert nur bis 16383 "integer")
    delayMicroseconds(4300); 
    }
  }