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 "Fahrablauf_Module.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 (für Motoren)*/  
  pinMode(6, OUTPUT);                //Motoren LINKS PWM (Geschwindigkeit)
  pinMode(5, OUTPUT);                //Motoren RECHTS PWM (Geschwindigkeit)
  pinMode(11, OUTPUT);               //Motoren LINKS Brücke
  pinMode(8, OUTPUT);                //Motoren LINKS Brücke
  pinMode(7, OUTPUT);                //Motoren RECHTS Brücke
  pinMode(17, OUTPUT);               //Motoren RECHTS Brücke
  /*Programmiere Arduino Pins D2 ...19 für 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,5 sec 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 für Dauer 2s
    delay(1000);
    for(;;){}                        //Beende sketch 
   }
   else                              //wenn links vorn kein Hindernis ist...
   {
    servo_nachmitte();
    left();                          //Drehe Auto etwas nach links
    delay(700);                      //für 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);                       //für 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
 }                                   
}
Fahrablauf_Module.h
  void forward()
  {   
    digitalWrite(7, HIGH);            // Schalte Motoren RECHTS ein 
    digitalWrite(17, LOW);                                                      
    analogWrite(5, 100);              // Setze die Geschwindigkeit auf 100 (zwischen 0…255)
    digitalWrite(11, HIGH);           // Schalte Motoren LINKS ein 
    digitalWrite(8, LOW);                                
    analogWrite(6, 100);              // Setze die Geschwindigkeit auf 100 (zwischen 0…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…255)
    digitalWrite(11, LOW);           // Schalte Motoren LINKS ein 
    digitalWrite(8, HIGH);                                
    analogWrite(6, 100);             // Setze die Geschwindigkeit auf 100 (zwischen 0…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…255)
    digitalWrite(11, LOW);           // Schalte Motoren LINKS ein 
    digitalWrite(8, HIGH);                                
    analogWrite(6, 100);             // Setze die Geschwindigkeit auf 100 (zwischen 0…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…255)
    digitalWrite(11, HIGH);          // Schalte Motoren LINKS ein 
    digitalWrite(8, LOW);                                
    analogWrite(6, 100);             // Setze die Geschwindigkeit auf 100 (zwischen 0…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 zurück benötigt 
  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 für kurze Zeit vom Trig-Pin, damit man später beim Senden ein rauschfreies Signal hat
    delay(5);                               //...für die Dauer 5 Millisekunden
    digitalWrite(2, HIGH);                  //Ein HIGH-Signal wird zum Trig-Eingang des HC-SR04 gesendet
    delayMicroseconds(15);                  //Die Dauer muß mindestens 10 µs sein, hier gewählt 15µs
    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 zählt die Zeit in Mikrosekunden µs, bis der reflektierte Schall zum Ultraschallsensor zurückkehrt
    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 übergeben
    Serial.println(" cm");                  // Hinter dem Wert der Entfernung soll die Einheit "cm" angegeben sowie die Anzeigezeile gewechselt werden
    if (entfernung < 50)                    //Wenn der Wert für die Entfernung unter 50 Zentimeter beträgt dann... 
    {
    tone(4,1000,1000);                       //...sende Signal zum Passive Buzzer (Arduino erzeugt an D4 einen Ton 1000Hz für 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°*/
  
  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°*/
  
  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°
    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°*/
  
  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); 
    }
  }