Dank der mit der Arduino Entwicklungsumgebung gelieferten Servo Library ist der Anschluss und die Ansteuerung eines Servomotors (Wikipedia) recht einfach.

Alle benötigten Teile gibt es z.B. in diesen Sets:

Ein kleiner Standardservo, wie er zum Beispiel im Modellbau verwendet wird, benötigt neben der Stromversorgung nur einen weiteren Pin als Steuerleitung. Für die Stromversorgung reichen die 5V vom Arduino Board aus. Das Steuersignal, welches den gewünschten Einstellwinkel angibt, wird mit Hilfe der Pulsweitenmodulation (Wikipedia) übertragen. Mit den aktuellen Servo-Librarys kann aber ein beliebiges Pin am Arduino gewählt werden.

An die Steuerleitung wird alle 20 ms ein zwischen 1 und 2 ms langer Puls gesendet, wobei eine Pulsdauer von 1 ms für 0 Grad und 2 ms für 180 Grad Einstellwinkel stehen. Ein Puls von 1.5 ms Länge würde den Servo also auf 90 Grad setzen.

Wie ein Servo intern funktioniert, ist hier ganz gut erklärt:
http://www.electronicsplanet.ch/Roboter/Servo/intern/intern.htm

Der Aufbau der Schaltung:

servo-ansteuern-800px

Im Beispielprojekt koppeln wir die Position des Servos an die Stellung eines Potentiometers.

Dazu wird der Wert des Potentiometers an A5  eingelesen, aus dem Wertebereich von 0-1023 nach 0-180 umgerechnet und als Einstellwinkel an den Servo gesendet. Den komplizierten Teil mit der Umwandlung in ein korrektes PWM-Signal übernimmt dabei glücklicherweise die Arduino Servo Library für uns.

Und hier der Arduino Sketch dafür:

// Servo Library einbinden
#include <Servo.h>

// Neues Servo Objekt erstellen
Servo myservo;
// Wert des Potentiometers hier speichern
int val;

// setup() wird einmal zu Programmbeginn ausgeführt
void setup()
{
  // Servo an Pin 9 koppeln
  myservo.attach(9);
  // Serielle Kommunikation starten
  Serial.begin(9600);
}

// loop() wird endlos wiederholt
void loop()
{
  // Stellung des Potentiometers an Anlog-Eingang 5 auslesen
  val = analogRead(5);
  // 10-bit Wert des Analogeingangs (0-1023) in Winkel 0-180 umrechnen
  val = map(val, 0, 1023, 0, 180);
  
  // Errechneten Winkel zur Kontrolle an den PC übertragen (Seriellen Monitor starten!)
  Serial.println(val);
  // Einstellwinkel in Grad an das Servo-Objekt schicken
  myservo.write(val);
  // Kurze Pause, damit der Servo die neue Position anfahren kann
  delay(50);
}
Code-Sprache: Arduino (arduino)

Das Video zum Projekt gibts hier:

9 thoughts on “Arduino Projekt: Servo ansteuern

  • 12. November 2015 at 22:14
    Permalink

    Habe den Code probiert und er funktioniert perfekt. Jetzt möchte ich den Code erweitern. Ich habe hier einen Tilt Sensor mit dem ich das Servo auf die Nullposition fahren möchte wenn dieser Sensor sich neigt. Also ich kann das Servo von 0-180 Grad steuern und wenn der Sensor sich z.B. 90° neigt schaltet dieser und stellt das Servo sofort zurück auf 0. Es gibt das Poti erst wieder frei wenn der Sensor wieder unter die 90° kommt. Kannst du mir einen Tip geben wie ich den Code erweitern müsste damit das funktioniert?

    Reply
    • 13. November 2015 at 11:14
      Permalink

      Hallo Florian,
      in der einfachsten Version brauchst du da nur auf das Digitalpin schauen, an dem der Tilt-Sensor hängt und abhängig von dessen Zustand mit einem IF-Statement rund um das myservo.write(val); das Signal an den Servo ändern, also z.B. sowas wie

      if (tiltPin == HIGH) { // Tilt Sensor geneigt
      myservo.write(0);
      }
      else { // Tilt Sensor nicht geneigt
      myservo.write(val);
      }

      Der Status vom Tilt Sensor kann auch umgekehrt sein, abhängig von der Anschlussart. Damit wird der Servo beim Tilt immer auf 0 gehalten und im anderen Fall darf er den vom Poti geliefertem Wert ansteuern.

      Ich hoffe ich hab deine Frage richtig verstanden und das hilft dir weiter.

      lg, Adi

      Reply
  • 21. April 2016 at 15:51
    Permalink

    Ist es möglich das Signal auch per Funkmodul (2,4GHz oder 433MHz) an das Servo zu übertragen?
    Gruß Moritz

    Reply
  • 22. November 2016 at 19:00
    Permalink

    Hallo Adi,
    Tolle Anwendung und eine super Erklärung!!! Perfekt für einen blutigen Anfänger, wie mich ;-) Ich würde jetzt gerne den Servo nur von 0° auf 15° auslenken (das war für mich kein Problem), aber dafür ein externes digitales Signal als Schalter verwenden (TTL, 5V). Da ich immer nur zw. 0° und 15° hin- und herschalten möchte brauche ich das Potentiometer dabei wohl nicht. Nach einer Ausrichtung auf 15° soll nach gewissen Zeit (z.B. 500 ms) der Servo dann wieder auf 0° zurückfahren. Ich bräuchte hierfür beim Code und Aufbau ein wenig Hilfestellung. Ich hoffe, mein Problem ist nicht zu trivial!?
    LG, Marco

    Reply
    • 23. November 2016 at 12:11
      Permalink

      Hallo Marco, wenn du ein externes 5V-Signal hast, dann kannst du das ja direkt an einen Digitalpin des Arduino leiten und in der loop()-Methode des Sketch anstatt des Potentiometer-Wertes auf den Wert des Pins schauen. Sobald sich dieser von 0 auf 1 ändert, fährst du den Servo in die Zielstellung und – falls der Arduino nichts anderes zu tun hat und in der Zwischenzeit keine weiteren Signale verarbeitet werden sollen – nach einem delay(500) wieder zurück auf 0. Einfachste Realisierung wäre ein Sketch wie hier http://www.makerblog.at/2015/01/tilt-sensor-mit-dem-arduino-abfragen/ – nur dass statt der for()-Schleife im Inneren der Servo angesteuert wird. Hilft dir das schon weiter?

      Reply
  • 17. Mai 2017 at 17:23
    Permalink

    wie kann ich zwei kontinuierlich drehende servos ansteuern, sodass sie per tasterdruck links bzw. rechts rum laufen? Servos (Tower Pro 995) 360

    Reply
  • 17. Mai 2017 at 19:05
    Permalink

    Ich wollte 5 servos mit 5 potenriometer ansteuern wie müsste dann der scratch aussehen. Müsste sich ja nicht viel ändern oder?.

    Reply
  • 11. Oktober 2017 at 22:00
    Permalink

    Hi, tolle Beschreibung. Ich bin blutiger Anfänger und bei Dir gelandet. Ich möchte für eine Absauganlage sogenannte Blast Gates mit einem Servo öffnen und schließen. Aufbau wäre dabei: 230v-Maschine läuft, servo dreht sich um 180 grad und öffnet dabei den Blast Gate, Maschine aus, 5 sec warten, (da die Absaugung eine Nachlaufverzögerung hat) Servo geht wieder auf 0 Grad und schließt damit das Bladt Gate.
    Was bräuchte ich für diesen Aufbau? Wie wäre der Programmierweg und wie löse ich es mit 5 unterschiedlichen Maschinen (Kreissäge, Schleifteller, Bandsäge…), die jeweils einen Impuls geben und jeweils einen Servo benötigen? Brauche ich da entsprechend viele ardoidos oder kann ich das mit einem machen…? Schließlich wäre immer nur eine Maschine in Aktion.
    Danke für hilfreiche Tipps. Hoffe, ich konnte den Zweck anschaulich verdeutlichen. Lg Paul

    Reply
  • 22. Januar 2018 at 16:12
    Permalink

    Wie kann ich den Servowert der Nullstellen auslesen und damit ich ihn später wieder auf einen anderen Wert von null aus stellen kann.

    Reply

Schreibe einen Kommentar zu Adi Dax Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Time limit is exhausted. Please reload the CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.