Servo

Fast jeder, der mit RC-Modellbau zu tun hat oder hatte, kennt Sie, die Servos. Von den ganz kleinen Microservos in den Zimmerhelies, bis zu den dicken Servos bei den Schleppern, von Segelwinden bis zu den superschnellen Digitalservos für unsere flügellos fliegenden Freunde der Quadrocopterfraktion. Es gibt davon so viele verschiedene Sorten, aber fast alle funktionierne nach dem gleichen Prinzip. EIn Stück Elektronikhardware, normalerweise Poti, nimmt die aktuelle Stellung des Servos auf. Diese wird mit der PPM codierten Sollstellung vergliechen und dementsprechend der Motor vorwärts oder rückwärts gesteuert. Um nun einen Servo mit dem Arduino zu steuern, müssen wir nur das PPM Signal erzeugen. Wie genau dieses Signal aufgebaut ist, dazu hab ich ein eigenes Kapitel. An dieser Stelle nur soviel, wie müssen einen Impuls von min 1ms bis max 2ms und einer Frequenz von 50Hz erzeugen. Glücklicherweise nimmt uns die Erzeugung dieses Signals die Bibliothek hier ab, sodass wir uns direkt auf das wesentliche konzentrieren können. Die Library schafft bis zu 12 Servos zu steuern. d.h. wir können an jedem Pin D0..12 einen Servo betreiben.
Aber wie schlissen wir den Servo an?

Dazu hier ein Schaubild:

(images developed using Fritzing. For more circuit examples, see the Fritzing project page)

Aber bitte macht das nicht mit 12 Servos. Dazu ist die Stromversorgung auf dem Arduino nicht ausgelegt. Aber für 1-2 Microservos solllte das wohl schon reichen.

Welche Funktionen bietet die Bibliothek?

Die Bibliothek bietet ein sog. Objekt. Also kann man pro Servo ein Servo Objekt erzeugen. Das geht einfach so:

Servo servo1;

An diesem Objekt gibt es verschiedene Funktionen (sog. Methoden).

servo.attach(Pin)
servo.attach(Pin, Min, Max) 

Damit wird der Servo einem Pin zugeordnet. Das ist die Initialisierung. Min und Max sind die Impulsweiten in Microsekunden, die für die beiden Endstellungen verwendet werden sollen. (Voreingestellt Min: 544, Max: 2400) Ab jetzt werden PPM Signale erzeugt.

servo.write(Winkel);

Der Servo wird auf den Winkel eingestellt. Der Wert für den Winkel darf im Bereich von 0-180 liegen. Ob dieser Wert aber nun tatsächlich mit dem Winkel des Servos stimmt, hängt sowohl vom Servo ab, wie auch von den eingestellten Parametern ab. (Min und Max vom attach() Befehl)

servo.writeMicroseconds(uS);

Manchmal ist es nötig, anstatt einer Gradzahl direkt die Impulslänge zu definieren. Dazu dient dieser Befehl. Normalerweise reagieren Servos auf den Bereich zwischen 1000 und 2000 us. Manchmal kann das aber auch mehr oder weniger sein. Manche Servos mögen es auch überhaupt nicht, wenn man Sie mit falschen Werten füttert.

servo.read();

Ließt den augenblicklich eingestellten Winkel in Grad aus.

servo.attached()

Hiermit kann man nachfragen, ob eine Servovariable bereits zu einem Pin zugeordnet wurde. Beispiel:

if (!servo1.attached()) {
  servo1.attach(SERVO_1);
}
servo.detach();

Mit dieser Funktion wird die Servovariable wieder vom Pin gelöst. Nun werden auch keine PPM Signale mehr erzeugt.

So jetzt können wir schon Servos betreiben…