Servo & Motor mit analogwrite spinnt

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

 

}

Häng die mal an 2 & 4

Geht leider auch nicht auf 2 & 4. :sleepy:

Da fehlen wohl Freilauf-Dioden über den Motoren gegen EMP.

Du meinst die Motoren stören den Prozessor? Aber warum dann nur das Servo? Der Ultraschallsensor und die Motorabschaltung funktionieren ja.

Aber einen Test ist es wert. Muss ich mal nach passenden Dioden suchen...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.