sketch_25_auto_fahren_us_geraeusch

sketch_25_auto_fahren_us_geraeusch
  /*Dieser Sketch laesst das Auto programmiert fahren. Der Fahrablauf wird festgelegt, indem die Fahrablauf-Module aufgerufen werden.
    Der jeweilige Fahrzustand wird im Serial Monitor angezeigt.
    Das Fahren vorwaerts wird gestoppt, wenn ein Hindernis auftaucht mit Abstand  kleiner als 25cm. 
    Dann ertoent auch der Buzzer (Piezo-Summer). Aber nur sehr kurz, da das Mikro den Ton hoert und in die ISR InterruptServiceRoutine geht.
    Die Entferung wird mit einem Ultraschallsensor HC-SR04 gemessen und im Serial Monitor angezeigt.
    Das Fahren vorwaerts wird auch gestoppt, wenn ein Geraeusch (lauter als das Fahrgeraeusch) den Eingang vom Mikrophon von HIGH auf LOW setzt.
    Das geschieht durch eine ISR InterruptServiceRoutine, geschrieben im Tab stoppgeraeusch.h
    Die Ausloeseschwelle des Mikros muss etwas unempfindlicher eingestellt werden, sonst stoppt bereits das Fahrgeraeusch*/
  
  /*Binde den Programmablauf von Fahrablauf_Module.h ein*/
  #include "Fahrablauf_Module.h"
  /*Binde den Programmablauf von us_hindernisabfrage.h ein*/
  #include "us_hindernisabfrage.h"
  /*Binde den Programmablauf (die ISR) von stoppgeraeusch ein*/
  #include "stoppgeraeusch.h"
  
  void setup()
  {
  /*Programmiere Arduino Pins als 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,D4 und A5=D19 als Ausgang bzw Eingang fuer HC-SR04*/  
    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  
  /*Serial Monitor aktivieren, 9600 Baud*/
    Serial.begin(9600); 
  
   /*Programmiere den Arduino-Pin D3 als Eingang vom Mikrophon.
    An D3 ist ein Interrupt moeglich:INT1 (auch an D2: INT0)*/
    pinMode(3, INPUT);                                                  //Signaleingang vom Mikrophon 
   /*Definition der ISR (Auslösung Interrupt an Pin D3, wenn an Pin D3 die Eingangsspannung von LOW auf HIGH wechselt*/         
    attachInterrupt(digitalPinToInterrupt(3),stoppgeraeusch,FALLING);   
  }
  
  void loop()
  {
    delay(500);                           //Warte 0,5 Sekunde bis das Auto losfaehrt
    forward();                            //void forward wird aufgerufen
    { 
    us_hindernisabfrage();                //us-hindernisabfrage wird aufgerufen           
    delay(200);                           //Das delay sorgt ca. aller 200 Millisekunden fuer einen neuen Messvorgang
    } 
  }
Fahrablauf_Module.h
  void forward()
  {   
    digitalWrite(7, HIGH);            // Schalte Motoren RECHTS ein 
    digitalWrite(17, LOW);                                                      
    analogWrite(5, 120);              // Setze die Geschwindigkeit auf 120 (zwischen 0...255)
    digitalWrite(11, HIGH);           // Schalte Motoren LINKS ein 
    digitalWrite(8, LOW);                                
    analogWrite(6, 120);              // Setze die Geschwindigkeit auf 120 (zwischen 0...255)
    Serial.println("FORWARD");
  }
  
  void back()
  {   
    digitalWrite(7, LOW);            // Schalte Motoren RECHTS ein 
    digitalWrite(17, HIGH);                                                      
    analogWrite(5, 120);             // Setze die Geschwindigkeit auf 120 (zwischen 0...255)
    digitalWrite(11, LOW);           // Schalte Motoren LINKS ein 
    digitalWrite(8, HIGH);                                
    analogWrite(6, 120);             // Setze die Geschwindigkeit auf 120 (zwischen 0...255)
    Serial.println("BACK");
  }
  
  void left()
  {   
    digitalWrite(7, HIGH);           // Schalte Motoren RECHTS ein 
    digitalWrite(17, LOW);                                                      
    analogWrite(5, 120);             // Setze die Geschwindigkeit auf 120 (zwischen 0...255)
    digitalWrite(11, LOW);           // Schalte Motoren LINKS ein 
    digitalWrite(8, HIGH);                                
    analogWrite(6, 120);             // Setze die Geschwindigkeit auf 120 (zwischen 0...255)
    Serial.println("LEFT");
  }
  
  void right()
  {   
    digitalWrite(7, LOW);            // Schalte Motoren RECHTS ein 
    digitalWrite(17, HIGH);                                                      
    analogWrite(5, 120);             // Setze die Geschwindigkeit auf 120 (zwischen 0...255)
    digitalWrite(11, HIGH);          // Schalte Motoren LINKS ein 
    digitalWrite(8, LOW);                                
    analogWrite(6, 120);             // Setze die Geschwindigkeit auf 120 (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");  
  }
stoppgeraeusch.h
  void stoppgeraeusch()
  {
    digitalWrite(7, LOW);             // Schalte alle Motoren aus
    digitalWrite(17, LOW);  
    digitalWrite(11, LOW); 
    digitalWrite(8, LOW);  
    Serial.print("Stopp durch Geraeusch");
    for (;;) {}                      //Beende Sketch
  } 
us_hindernisabfrage.h
  /*Zunaechst werden einige Variablen definiert*/
    long dauer=0;                         // in der Variablen "dauer" wird die Zeit gespeichert, die eine Schallwelle bis zur Reflektion und zurueck benoetigt 
    long entfernung=0;                    // in der Variablen "entfernung" soll die berechnete Entfernung gespeichert werden 
  
  
  void us_hindernisabfrage()
  {
  /*Dieser Programmteil ermittelt die Entferung zu einem Hindernis und stoppt das Auto sowie aktiviert den Buzzer gegebenenfalls*/
    digitalWrite(2, LOW);                   //Hier nimmt man die Spannung fuer kurze Zeit vom Trig-Pin, fuer ein rauschfreies Signal 
    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 Mikrosekunden sein, hier gewaehlt 15
    digitalWrite(2, LOW);                   //Wenn das Trig-Signal wieder auf LOW geht, sendet der HC-SR04 Ultraschallwellen aus (8 mal, Frequenz 40kHz)
    dauer = pulseIn(19, HIGH);              //Der Arduino zaehlt die Zeit in Mikrosekekunden, bis der reflektierte Schall zum Sensor 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 "cm" angezeigt sowie die Anzeigezeile gewechselt werden (CR)
    if (entfernung < 25)                    //Wenn der Wert fuer die Entfernung unter 25 Zentimeter betraegt dann... 
    {
    tone(4,1000,1000);                      //...sende Signal zum Buzzer (Arduino erzeugt an D4 einen Ton 1000Hz fuer Dauer 1000ms)
    digitalWrite(9, LOW);                   // Schalte alle Motoren aus   
    digitalWrite(8, LOW);  
    digitalWrite(7, LOW); 
    digitalWrite(6, LOW);  
    for (;;) {}                             //Beende Sketch
    }
    else                                    //Und wenn das nicht so ist...
    {
    digitalWrite (4, LOW);                  //tue nichts, gehe zurueck zu void loop
    }
  }