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);
}
}