Ich bastle gerade mit meiner Tochter (12) an einem Fahrzeug mit Ultraschallsensor(auf einem Servo als Scanner) und 2 Motoren(per 2 Transistoren) über den Uno. Der Servo soll die Umgebung scannen und bei Hindernis einen Motor anhalten.
Ohne Servoansteuerung funktioniert das auch prima. Mit Servo aber nicht. Sobald die Motoren starten fährt das Servo auf 0 Grad und macht nix mehr.
- Motoren auf dig 11 und 12 (wie gesagt über Transistorschaltung und ext. Stromversorgung)
- Servo auf 7 & 8
- Ultraschallsensor HC SR 04 auf 9, Strom über Uno
Ich komme nicht drauf was falsch ist & blamiere mich vor meiner Tochter! Habt ihr einen Tip für mich?
#include <Servo.h> //Die Servobibliothek wird aufgerufen. Sie wird benötigt, damit die Ansteuerung des Servos vereinfacht wird.
int trigger=8; // Der Trigger Pin
int echo=7; // Der Echo Pin
long dauer=0; // Hier wird die Zeitdauer abgespeichert
// die die Ultraschallwelle braucht
// um zum Sensor zurückzukommen
long entfernung=0; // Hier wird die Entfernung vom
// Hindernis abgespeichert
int Mre = 11; // Motor rechts auf Digitalpin 10 verbunden
int Mlks = 12; // Motor rechts auf Digitalpin 11 verbunden
bool Hindernis = false;
bool Richtung = false;
int Winkel = 0;
Servo servoblau; //Erstellt für das Programm ein Servo mit dem Namen „servoblau“
void setup()
{
Serial.begin(9600); // Die serielle Kommunikation starten
pinMode(trigger, OUTPUT); // Trigger Pin als Ausgang definieren
pinMode(echo, INPUT); // Echo Pin als Eingang defnieren
pinMode(13, OUTPUT);
pinMode(Mre, OUTPUT); // Setzt den Pin als output.
pinMode(Mlks, OUTPUT); // Setzt den Pin als output.
servoblau.attach(9); //Das Setup enthält die Information, dass das Servo an der Steuerleitung (gelb) mit Pin 8 verbunden wird. Hier ist natürlich auch ein anderer Pin möglich.
servoblau.write(0); //Position 1 ansteuern mit dem Winkel 0°
delay(3000); //Das Programm stoppt für 3 Sekunden
}
void loop()
{
digitalWrite(trigger, LOW); // Den Trigger auf LOW setzen um
// ein rauschfreies Signal
// senden zu können
delay(5); // 5 Millisekunden warten
digitalWrite(trigger, HIGH); // Den Trigger auf HIGH setzen um eine
// Ultraschallwelle zu senden
delay(10); // 10 Millisekunden warten
digitalWrite(trigger, LOW); // Trigger auf LOW setzen um das
// Senden abzuschließen
dauer = pulseIn(echo, HIGH); // Die Zeit messen bis die
// Ultraschallwelle zurückkommt
entfernung = (dauer/2) / 29.1; // Die Zeit in den Weg in Zentimeter umrechnen
Serial.print(entfernung); // Den Weg in Zentimeter ausgeben
Serial.println(" cm"); //
if (entfernung<30){
digitalWrite(13, HIGH);
Hindernis=HIGH;
}
else{
digitalWrite(13, LOW);
Hindernis=LOW;
}
// Motoren ansteuern
if (Hindernis==HIGH){
digitalWrite(Mre, LOW);
}
else{
digitalWrite(Mre, HIGH);
}
digitalWrite(Mlks, HIGH);
//Servo ansteuern
if (Richtung==false){
if (Winkel<90){
servoblau.write(Winkel); //Position 1 ansteuern mit dem Winkel 0°
delay(10);
Winkel++;
if (Winkel==90){
Richtung=true;
}
}
}
if (Richtung==true){
if (Winkel>0){
servoblau.write(Winkel); //Position 1 ansteuern mit dem Winkel 0°
delay(10);
Winkel--;
if (Winkel==0){
Richtung=false;
}
}
}
}