Zum Inhalt springen
Arduino Servo Motor

So steuerst du einen Servo mit Arduino

    Einen Servo mit Arduino zu steuern ist relativ einfach. Wenn man ein paar Dinge beachtet, dann erweitert man die blinkende und piepsende Arduino-Welt schnell mit Bewegungen und kinetischer Interaktion! In diesem Beitrag wird die Schaltung und der Code erklärt.

    Wir benötigen Ihre Zustimmung um den Inhalt von YouTube laden zu können.

    Mit dem Klick auf das Video werden durch den mit uns gemeinsam Verantwortlichen Youtube [Google Ireland Limited, Irland] das Video abgespielt, auf Ihrem Endgerät Skripte geladen, Cookies gespeichert und personenbezogene Daten erfasst. Damit kann Google Aktivitäten im Internet verfolgen und Werbung zielgruppengerecht ausspielen. Es erfolgt eine Datenübermittlung in die USA, diese verfügt über keinen EU-konformen Datenschutz. Weitere Informationen finden Sie hier.

    Jmx0O2RpdiBjbGFzcz0mcXVvdDtudi1pZnJhbWUtZW1iZWQmcXVvdDsmZ3Q7Jmx0O2lmcmFtZSB0aXRsZT0mcXVvdDtXaWUgYmF1dCBtYW4gZWluIFdhbGtpbmcgRGVhZCBab21iaWUgQXVnZSBtaXQgQXJkdWlubz8mcXVvdDsgd2lkdGg9JnF1b3Q7MTIwMCZxdW90OyBoZWlnaHQ9JnF1b3Q7Njc1JnF1b3Q7IHNyYz0mcXVvdDtodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9IbHlIWEJJYU1mMD9mZWF0dXJlPW9lbWJlZCZxdW90OyBmcmFtZWJvcmRlcj0mcXVvdDswJnF1b3Q7IGFsbG93PSZxdW90O2FjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmUmcXVvdDsgYWxsb3dmdWxsc2NyZWVuJmd0OyZsdDsvaWZyYW1lJmd0OyZsdDsvZGl2Jmd0Ow==

    Servo: Aufbau und Anschluss

    Ein Servo besteht aus einer Motorsteuerung (1), einem Elektromotor (2), einem Getriebe (3) und einem Potentiometer zur Positionsbestimmung (4). Alle Komponenten sind in einem robusten Gehäuse untergebracht.

    Arduino Servo Aufbau

    Angeschlossen wird er über ein dreipoliges Kabel. Dabei handelt es sich um zwei Versorgungsleitungen (Plus und GND) und um eine Datenleitung.


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    Arduino Servo Fritzing Schaltung
    Grafik erstellt mit Fritzing

    Je nach Hersteller können die Kabelfarben abweichen. Gebräuchlich sind die Kombinationen Braun-Rot-Orange (GND, Plus, Daten) oder Schwarz-Rot-Gelb (GND, Plus, Daten). Ein Blick in die Beschreibung des Servomotors ist auf jeden Fall angebracht, um sicherzugehen, dass er richtig angeschlossen wird. Ein falsches Anschließen kann hier zu Schäden führen.

    Schaltung und Beispiel-Programm-Code

    Im Beispiel ist ein Standard-Servomotor mit dem GND, 5V+ und dem digitalen Pin 9 verbunden. Des Weiteren ist ein Potentiometer am analogen Pin 2 angeschlossen.

    Bei dem Programm handelt es sich um das Knob-Beispiel aus der Arduino Software (Datei > Beispiele > Servo > Knob).

    #include <Servo.h>
    
    Servo myservo; // erstellt ein Servo-Objekt, um einen Servomotor zu steuern
    
    int potpin = 0; // Analog Pin, an dem das Potentiometer angeschlossen ist
    int val; // Variable um den Wert des Analogen Pin zwischenzuspeichern
    
    void setup() {
      myservo.attach(9); // verknüpft den Servomotor an Pin 9 mit dem Servo-Objekt
    }
    
    void loop() {
      val = analogRead(potpin); // liest das Potentiometer aus (Wert zwischen 0 und 1023)
      val = map(val, 0, 1023, 0, 180); // rechnet den Wert in den Wertebereich des Servomotors (zwischen 0 und180)
      myservo.write(val); // überträgt die Zielposition an den Servomotors
      delay(15); // lässt dem Servomotor Zeit, die Zielposition zu erreichen
    }

    In diesem Beispiel wird der Servomotor auf eine Position gesteuert, die mittels des Potentiometers festgelegt wird. Der Befehl myservo.write(val) stellt den Servomotor in eine bestimmte Position zwischen 0 und 180 Grad.

    Viele Servomotoren mit Arduino steuern

    Ein Servomotor benötigt für die Bewegungen relativ viel Strom. Wenn man mehr als einen Servomotor verwenden will, empfiehlt es sich, ein Servo-Shields wie das Adafruit Robot Shield* zu benutzen. Dabei handelt es sich um eine aufsteckbare Erweiterung für das Arduino-Board mit dessen Hilfe sich bis zu 16 Servomotoren gleichzeitig steuern lassen. Es bedarf allerdings eines externen Netzteils. Angenehmer Nebeneffekt ist, dass man nicht pro Servomotor einen wertvollen Kanal des Arduinos belegt.

    Das Shield wird per I2C angesteuert. Hierbei handelt es sich um eine digitale Datenverbindung zwischen dem Arduino und dem Servo Shield, dass lediglich zwei Pins des Boards belegt.

    Wir benötigen Ihre Zustimmung um den Inhalt von YouTube laden zu können.

    Mit dem Klick auf das Video werden durch den mit uns gemeinsam Verantwortlichen Youtube [Google Ireland Limited, Irland] das Video abgespielt, auf Ihrem Endgerät Skripte geladen, Cookies gespeichert und personenbezogene Daten erfasst. Damit kann Google Aktivitäten im Internet verfolgen und Werbung zielgruppengerecht ausspielen. Es erfolgt eine Datenübermittlung in die USA, diese verfügt über keinen EU-konformen Datenschutz. Weitere Informationen finden Sie hier.

    Jmx0O2RpdiBjbGFzcz0mcXVvdDtudi1pZnJhbWUtZW1iZWQmcXVvdDsmZ3Q7Jmx0O2lmcmFtZSB0aXRsZT0mcXVvdDtTZXJ2byBwYXJ0eSAtIEFkYWZydWl0IDE2LUNoYW5uZWwgMTItYml0IFBXTS9TZXJ2byBTaGllbGQgLS0gSTJDIGludGVyZmFjZSZxdW90OyB3aWR0aD0mcXVvdDsxMjAwJnF1b3Q7IGhlaWdodD0mcXVvdDs2NzUmcXVvdDsgc3JjPSZxdW90O2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLzdNckphQTFHV0RjP2ZlYXR1cmU9b2VtYmVkJnF1b3Q7IGZyYW1lYm9yZGVyPSZxdW90OzAmcXVvdDsgYWxsb3c9JnF1b3Q7YWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSZxdW90OyBhbGxvd2Z1bGxzY3JlZW4mZ3Q7Jmx0Oy9pZnJhbWUmZ3Q7Jmx0Oy9kaXYmZ3Q7

    Um diese Kommunikation einzurichten, gibt es eine Library von Adafruit, die sich im Handumdrehen einbinden und verwenden lässt.

    Alternativ zum Adafruit Robot Servo Shield gibt es noch eine günstigere Variante von SunFounder*.

    Servo Lego Technik Halter

    Tipp: Leider passen normale Servos nicht an LEGO Technik. Mit diesem kleinen 3D-Modell geht das dann aber doch. Ausgedruckt auf dem Wanhao Duplicator i3.

    Spezialform Servo-Winde

    Dabei handelt es sich um einen kräftigeren Servomotor. Er lässt sich nicht nur auf 180°, sondern je nach Typ auf 360° oder 720° drehen. Winden werden im Modellbau z.B. in Segelschiffen verbaut. Hier kann man sich das Produkt auf Amazon*ansehen.

    Expertenwissen: Steuerung ohne Library

    Zum Steuern des Servomotors verwendet man ein sich alle 20 Millisekunden wiederholendes Signal. Es besteht aus einem HIGH-Impuls, der zwischen 1 und 2 Millisekunden lang ist, und einem LOW-Impuls. Die Dauer des HIGH-Impulses bestimmt den Zielwinkel (normalerweise von 0 bis 180°). In der Arduino-Software kann hierfür der Befehl delayMicroseconds(x); verwenden:

    digitalWrite(myServo,HIGH);
    delayMicroseconds(1500);
    digitalWrite(myServo,LOW);
    delayMicroseconds(18500);

    Da der Servo einige Zeit benötigt, um sich auf den gewünschten Zielwinkel einzustellen, muss das Signal mindestens so lange wiederholt werden, bis der Servo die Position erreicht hat.

    Servomotoren überprüfen ihren eigenen Stellwinkel mit einem eingebauten Potentiometer. Es kommt hierbei vor, dass eine gewünschte Position nicht exakt erreicht werden kann. Der Servo korrigiert sich dann kontinuierlich selbst, was zu einem »Zittern« des Servos führt. Um das zu verhindern, sollte der Impuls nach erreichen des Zielwinkels auf LOW geschaltet werden.

    Alternativ zum selbst programmierten Signal, kann man die Servo-Library benutzen. Sie kommt mit der Arduino-Software. Im Beispiel Sweep (File>Examples>Servo>Sweep), wird gezeigt, wie man einen Servo mit der Servo-Library verwendet.

    // Sweep
    // by BARRAGAN
    
    #include <Servo.h>
    Servo myservo;    // erzeugt ein Servomotor-Objekt
    // maximal können acht Servomotor-Objekte erzeugt werden
    
    int pos = 0;      // Variable, die die Servoposition (Winkel) speichert
    
    void setup(){
      myservo.attach(9);  // an welchem Pin ist der Servomotor angeschlossen
    }
    
    void loop(){
      for(pos = 0; pos < 180; pos += 1) {  // von 0 bis 180 Grad, in Schritten von einem Grad
        myservo.write(pos);                   // sagt dem Servomotor, in welche Position sich drehen soll      
        delay(15);                            // wartet 15 Millisekunden   
      }    
      for(pos = 180; pos>=1; pos-=1) {     // und das gleiche zurück
        myservo.write(pos);
        delay(15);
      }
    }

    Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!

    • Die beliebtesten Arduino-Projekte von StartHardware
    • Inklusive Schaltplan, Beschreibung und Code
    • Arduino-Schnellstart-Kapitel
    • Kompakter Programmierkurs


    13 Gedanken zu „So steuerst du einen Servo mit Arduino“

    1. Pingback: Gruseliger Halloween-Süßigkeitenspender mit Arduino

    2. Pingback: So baust du einen berührungslosen Seifenspender mit Arduino

    3. Der Sketch kann nicht kopiert werden. So wird er nicht funktionieren. Es müssen folgende Zeilen geändert werden:

      #include // hier fehlte die Datei
      int potpin=2; // In der Abbildung ist er an 2 und nicht 0 angeschlossen

    4. Es ist zwar schönüberall die gleichen Beispiele zu finde, aber leider sind sie nur kopiert und nicht getestet. Was passiert, wenn so ein Beispiel auf einenm UNO, vorausgesetzt es hat vorher schon mal funktioniert, einen Servo in Dauerlauf versetzt? Er sollte ja nur von 0 bis 180 Grad laufen bzw. zurück und nicht weiter und nach 360 merkt man nur einen kurze Verlangsamung und dann wieder volle Power.
      Antwort: Nicht nur den Pin deklarieren, sondern auch den Wertebereich.

    5. Früher im Ferienlager haben wir damit rumgespielt. Dat war große Sahne. Isch kann mich noch daran erinnern wie wir mit den Gurken gespielt haben, obwohl wie diese essen sollten. Der gute Willie war auch mit dabei. Ich bin nicht mehr der jüngste aber wer eine kleine Nummer schieben will soll sich melden.

      Lange Lunte

    6. Was passiert, wenn ich einen Servo von einem Meccanoid G15 Roboter anschließe und diesen um über 180 Grad drehen lasse? Schaltet der intern dann ab oder wird er dadurch zerstört?

    7. Ja du kannst eine Pause einlegen, dafür kannst du im Programm was du geschrieben/ abgeschrieben hast im void loop() teil ein weiteren digital pin hinzufügen, der für eine bestimmte zeit Strom bekommt aber ja nichts machen muss und da hast du dann deine Pause.

    8. Gibt es in der Servo-Libery eine Variable mit der man die Stellgeschwindigkeit des Servos einstellen kann? Ich möchte auf meiner Modellbahn einen Kran mit einem Servo steuern. Wenn ich das Poti zu schnell drehe dreht sich der Kran irrsinnig schnell. Ich möchte erreichen, dass mit dem Poti die Position eingestellt wird und der Kran sich dann langsam auf dies Position dreht.

    9. Hallo :)
      Ich möchte gerne einen Servo (Digitales Segelwindservo RS-10 von Conrad : Betriebsspannung: 4,8- 7,2 V, max. Laufweg 5 x 360 Grad) mit dem Arduino so ansteuern, dass er sich um 180 Grad dreht und eine Pause einlegt. Meine Fragen sind jetzt nun: Brauche ich einen zusätzlichen Motortreiber und wenn ja welchen? Wie muss ich das genau verbinden, evt. auch mit einem zusätzlichen Netzteil? Benötige ich noch zusätzliche Bauelemente? Ist es überhaupt möglich eine Pause einzulegen, in der sich der Motor nicht bewegt? Wie schreibe ich dies in den Programmcode, da ich bisher leider nur Programmcodes gefunden habe, in denen sich der Servomotor ohne Pause dreht. Ich freue mich sehr über eine Antwort. Vielen Dank.

      Liebe Grüße

    10. digitalWrite(myServo,HIGH);
      delayMicroseconds(1500);
      digitalWrite(myServo.LOW);
      delayMicroseconds(18500);

      bei digitalWrite(myServo.LOW); gehört ein “,”, nicht ein Punkt

    Die Kommentarfunktion ist deaktiviert.