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