Grundlagen

Servos (ich spreche hier von Servos aus dem Modellbauladen) haben grundsätzlich 3 Kabel. Braun, Rot, Gelb ist die gängigste Farbcodierung, allerdings habe ich bis jetzt auch statt eines gelben auch ein weißes kabel vorgefunden, ebenso statt einem braunem ein schwarzes kabel. In allen mir bekannten Fällen ist die Codierung dieser analogen Servos trotzdem identisch.

Verkabelung des Arduino mit dem Servo
  • SCHWARZ / BRAUN – GROUND
  • ROT – +5V
  • GELB / WEIß – SIGNAL

Da der Arduino Nano sowie die Chinesischen Clone einen +5V besitzen, eignet sich dieses Gerät sehr gut für diesen Versuch. Um das Signal für den Servo zu erzeugen muss man wissen, wie ein Servo funktioniert.

Der Servomotor verfügt über eine Elektronik, die das Signal Interpretiert und die Stellung des Motors dem Signal anpasst. Das Signal wird über Pulsweitenmodulation (kurz PWM) erzeugt. Dieses Signal hat eine Frequenz von 50Hz, was bedeutet es werden pro Sekunde 20 einzelne Signale aneinandergereiht übermittelt. In der Dauer von 20 Millisekunden ist es der Anteil an positiver Spannung in dem Signal, der die Stellung des Servos bestimmt. Bei 1ms Anteil ist der Ausschlag bei 0% also auch 0°, wo hingegen bei 2ms bereits 100% also 180° dem Servo “befohlen” werden. Unten ein Bild zur Veranschaulichung:

!Nicht maßstabsgetreu!

Die Pulslänge bleibt die Selbe, immer 20ms. Der Positive Impuls hingegen wird zwischen 1ms und 2ms moduliert. Viele Servos unterstützen auch längere und Kürzere Impulse (0.6ms bis 2.4ms) auf diese gehen wir aber nicht ein, die Funktionalität ist die Selbe, nur der Ausschlag ist größer.

Das heißt, der Arduino muss ein Solches Signal auf das gelbe kabel geben. Da sich jemand mal die Mühe gemacht hat eine Library für den Arduino zu schreiben, die aus einer Winkelangabe ein direktes PWM Signal für den Servo generiert, brauchen wir auch nicht rechnen.

Der Versuch

Wir verbinden das schwarze Kabel des Servos mit GND, das rote Kabel mit 5V und das gelbe / weiße Kabel mit D8.

Folgendes Sketch liefert die Ansteuerung:

include <Servo.h> // Die nette Library, die uns das Rechnen ersparrt

Servo servo_test; // Erstellen eines Servo-Objekts

void setup() {
   Serial.begin(9600); // Unsere Ausgabe zum gegenprüfen
   servo_test.attach(8); // Das gelbe kabel wird an D8 angeschloßen.
 }

 void loop() { 
   servo_test.write(0); // Dem Servo wird 0 Grad befohlen
   Serial.println("0 Grad"); // Info an Serialmonitor
   delay(1000);
   servo_test.write(90); // Dem Servo wird 90 Grad befohlen
   Serial.println("90 Grad"); // Info an Serialmonitor
   delay(1000);
   servo_test.write(180); // Dem Servo wird 180 Grad befohlen
   Serial.println("180 Grad"); // Info an Serialmonitor
   delay(1000);
   servo_test.write(90); // Dem Servo wird 90 Grad befohlen
   Serial.println("90 Grad"); // Info an Serialmonitor
   delay(1000); 
 }

Hier wird der Servo mit Pausen dazwischen in 3 verschiedene Stellungen gebracht.

Verwendung

Wenn man das Ganze jetzt ein wenig größer gestalten möchte, kann man noch Potentiometer ins Spiel bringen, deren Stellung ausgelesen wird und die Servostellung bestimmt.

Eine noch schönere Verwendung, wäre das Verwenden eines Gyroskops und Nutzung mehrerer Servos als Kamerastabilisator (Gimbal).

Mögliche Fragen

Kann man statt eines Servos auch einen Geschwindigkeitsregler verwenden?

Ja, der Regler (ESC) egal ob brushed oder brushless verwendet ebenfalls PWM. Da seit Einführung der Drohnen mit BLHeli und SimonK die Frequenzen der Regler stark gestiegen sind, bin ich mir nicht ganz sicher ob es ohne weiteres geht. Mit einigen Reglern hatte ich bereits das Problem, dass sich diese nicht mehr initialisieren ließen und kein Signal mehr angenommen haben.

Welche PINS des Arduino kann ich verwenden und wie viele Servos kann ich daran anschließen?

Grundsätzlich kannst du so viele Servos anschließen, wie viele digitale Pins du hast und das ist auch gleichzeitig die Antwort auf beide Teile der Frage. Servo.h ist für die Nutzung an Digitalausgängen geschrieben. Was passieren würde, wenn man analoge Ausgänge nutzen würde erübrigt sich, da Servo.h keine Möglichkeit bietet analoge Pins anzugeben.

Mein Servo bewegt sich nur kurz, danach passiert nichts mehr. Was habe ich falsch gemacht?

In dem Fall wäre erstmal anzunehmen, dass ein Fehler in der Verkabelung vorliegt. Sollte die Verkabelung passen, wird vermutlich der Ausgangsstrom des Computers zu gering sein um Arduino und Servo zu betreiben. In dem Fall einfach den VIN Pin des Arduinos nutzen um ihn extern mit Strom zu versorgen. Hier ist die maximale Eingangsspannung zu beachten. Ebenfalls sollte man da mit der Verwendung mehrerer Servos oder besonders großer Servos aufpassen, da der Arduino auch schnell an seine Belastungsgrenze kommt.

Von geekduino

Kontakt: info@geekduino.de