Servo Motor

English version.

Ich habe bereits gezeigt, wie ein Schrittmotor am Arduino genutzt wird. Nun will ich zeigen, wie man einen Servomotor steuern kann, und was dahinter steckt.

MG995

Ich nutze meistens den MG995 Servomotor, da er im Vergleich zu anderen Servomotoren mit einem Drehmoment von ~1,47Nm bei 6V viel bietet. Die Betriebsspannung liegt im Bereich zwischen 4,8-7,2 Volt, ich bewege mich eher im Bereich um 6V, das rührt aber eher von der Verwendeung von Batterien. Er hat zudem ein Getriebe aus Stahl und ist zweifach Kugelgelagert (Festlager abtriebsseitig). Der Motor ist zwar teuerer, dafür ist er als Stoßfest deklariert und seine Lebensdauer ist weit höher, als bei Motoren mit Kunststoffgetrieben. Er hat einen Rotationsbereich von 180° (+- 90° vom Nullpunkt), und eine maximale Stellgeschwindigkeit von 0.24 s/90° bei 6V (ohne Last).

mg995.jpg

Der MG955 darf nicht über das Arduino (oder einen anderen Controller) mit Spannung versorgt werden, da er mehr Strom benötigt, als der Spannungswandler oder ein Output-Pin des Arduinos zur Verfügung stellen kann – der Wandler würde überhitzen. Deshalb nutze ich, wie zuvor kurz erwähnt, Batterien, Akkus oder ein Netzteil. Der Controller dient nur als Steuerung für den Motor.

Die Funktionsweise

Der Servoantrieb besteht aus einem Motor (Servomotor) und einer Regelelektronik. Der Motor kann dabei als Gleichstrommotor, Synchron- oder Asynchronmotor ausgeführt sein. Die Regelung dahinter ist in vielen Anwendungen eine Positionsregelung für den Winkel, sie kann aber auch als Geschwindigkeits- oder Momentenregelung ausgeführt sein, oder eine Kombination aus den genannten.

Wer sich den Inhalt zum Schrittmotor durchgelesen hat, und dann den Schrittmotor mit einen Drehgeber und einer Regelung ausstatten würde, der hätte sich so selbst einen Servomotor gebaut. Oft werden aber Servomotoren mit Servos, wie auch der MG995 einer ist, gleichgesetzt. Der Unterschied ist, dass ein ‚Servo‘ lediglich eine Form eines Servomotors ist.

Die Regelung des Servos (ich beziehe mich jetzt auf den MG995 und ähnliche Modelle) erfolgt über den Vergleich zwischen Soll-Wert, also jenem Wert, welcher vom Mikrocontroller vorgegeben wird, und dem Ist-Wert. Der Ist-Wert wird über ein integriertes Potentiometer ermittelt, welches ebenso nur eine Form von Drehgeber ist. Die Elektronik im Servo erledigt den Rest und stellt die Abtriebswelle über das Getriebe auf die gewünschte Position.

pulse

Die obige Grafik zeigt die, wie der Ist-Wert am MG995, oder auch auf anderen gängigen Servos, eingestellt wird. Es ist ersichtlich, dass der Wert über ein 50Hz-Signal eingestellt wird. Für die tatsächliche Positionierung des Winkels wird die Dauer der logisch High und der logsich Low Phase gemessen. Die Grafik macht deutlich, dass 1ms High in der Periodendauer von 20ms einen Winkel von bedeutet. 2ms High korreliert mit 180°.

Kurzer Einfwurf: Ich bin mir nicht sicher, ob das Datenblatt des MG995 einen Fehler hat, oder ob ich doch einen anderen Servo vor mir liegen habe, denn laut Datenblatt sollte dieser nur 120° weit drehen, doch er dreht volle 180°.

Der elektrische Aufbau

Viel bedarf es nicht, lediglich der folgenden paar Bauteile.

Stk. Komponente Ausführung Beschreibung
1 Servo MG995 Antrieb
1 Arduino UNO/Nano Controller
1 Batterie oder Netzteil 6V Versorgung
n Drahtbrücken

Das sind jene Komponenten, um den Servo mit allem zu versorgen, was er benötigt. Das Arduino muss selbst noch mit Spannung versorgt werden. Dies kann entweder über USB oder über den Power-Plug erfolgen.

components

Das Signal, also der Puls, kommt von einem der PWM-Anschlüsse des Boards, dieser kann frei gewählt werden. Neue Servos werden via PPM angesteuert. Wo genau der Unterschied liegt, erkläre etwas weiter unten.

basic_shematic

Sowohl der Ground vom Controller, als auch vom Servo und der Batterien müssen miteinander verbunden sein, da ansonsten die Signalleitung kein gemeinsames Potential hat – der Schaltkreis wäre nicht geschlossen.

Pulsweitenmodulation PWM

Der Grundgedanke war, ein analoges Signal aus einer digitalen Quelle zu bekommen – mit Digital-Analog Umsetzern. Je „schmäler“ der Puls, desto weniger Energie wird über eine Periodendauer frei, die Spannung am Ausgang ist niedrig, und vice versa. Der Grund ist, dass der Controller keine bestimmten Analogwerte am Ausgang liefern kann, sondern nur seine Operationsspannung (hier +5V).

pwm

Beim Servomotor wird allerdings kein analoges Signal genutzt. Die Pulsweite repräsentiert den Winkel am Motor (Beispiel von oben: 1.5ms = 90°). Man sieht, dass die Pulsweitenmodulation also auch Anwendung in der Steuerungstechnik findet. Ein weiteres Beispiel für eine steuerungstechnische Anwendung ist eine LED am PWM Ausgang. Diese wird schnell ein- und ausgeschalten, sodass das Auge dies als konstante Helligkeit wahrnimmt. Je schneller das passiert, desto geringer ist die reusltierende Helligkeit – so kann man das Licht einfach dimmen.

Pulsphasenmodulation PPM

PPM ist eine Erweiterung des PWM-Signals. Dabei werden hintereinander mehrere Pulse in der gleichen 20ms-Periode gesendet. Jeder Puls ist für einen anderen Servo zuständig. Der Vorteil ist klar: Mehrere Motoren können mit nur einer Signalleitung angesteuert werden, ohne dabei Zeit zu verlieren, denn die 20ms-Periode ist ohnehin auch beim „einfachen“ PWM für diese Motoren vorgegeben.

ppm

Der Code

Diesmal gibt es kein GitHub-Repu hierzu, da das Programm sehr kurz ist. Im Grunde zeige ich hier nur die Zusammenfassung des oben beschriebenen Inhalts. Ich zeige auch kein vollständiges Programm, da die Programmbibliothek von Arduino meines Erachtens nach sehr gut ist. Hier findet sich lediglich ein Einblick in den Grundgedanken hinter den Servos.

#define MinAngle 0
#define MaxAngle 180

#define POT 20000
#define MinPWM 1000
#define MaxPWM 2000

#define Multiplier (MaxPWM - MinPWM) / MaxAngle

void setup()
{
    ...
}

void loop()
{
    ...
}
 
void setServo (int Angle)
{
    int PWM = (Angle * Multiplier) + MinPWM;
    PORTD |= _BV(PORTD3);
    delayMicroseconds(PWM);
    PORTD &= ~_BV(PORTD3);
    delayMicroseconds(POT - PWM);
}

Die Definitionen zu Beginn spiegeln lediglich die Eigenschaften des Servos wieder. Der maximale Winkel, den der Servo befahren kann ist zugleich der längste Puls. MaxAngle in Grad entpricht also MaxPWM in Mikrosekunden, ebenso die Min-Werte. Die Periodendauer (Period Of Time [POT]) erhält man ebenso aus dem Datenblatt, bei den meisten Servos ist diese aber 20ms, oder 20000µs.

Der Multiplier ist jener Wert, welcher den gegebenen Winkel zufolge der gegebenen Werte so umrechnet, dass – bei diesem Servotyp – ein Winkel von einem PWM-Signal von 1000ms, und ein Winkel von 180° einem PWM-Signal von 2000ms entspricht. Da die Umrechung keiner Ganzzahldivision entspricht, ist diese mit einem Fehler behaftet.

In der setServo()-Funktion wird zuerst die Dauer des PWM-Signals ermittelt, danach wird für diese Dauer der Ausgang (Pin 3) des Controllers auf HIGH gesetzt. Danach wird die restliche Periodendauer das Signal auf LOW gehalten. Den Zugriff auf den Pin erledige ich nicht mit digitalWrite(Pin, State);, sondern mit dem C-Befehl. Mehr dazu findet man hier.

Durch das Ausführen des restlichen Codes ergibt sich eine Zeitspanne, in welcher die resultierende Periodendauer abweicht. In diesem kurzen Script spielt dies keine tragende Rolle. Sollte das Programm aber länger werden, oder gar Zeitverögernde Funktionen beinhalten, so würde die Periodendauer für die Steuerung des Servos stark abweichen. Abhilfe würde ein Timer schaffen, welcher alle 20ms das PWM-Signal über einen Interrupt triggert.

Diese Grundlogik, und weitere controllerspezifische Absicherungen sind übrigens in der Servo-Library von Arduino enthalten.

Noch eine Anmerkung zum Einschalten des Servos: Wer will, der kann die letzte Position des Servos im EEPROM des Arduinos speichern, sodass er beim Einschalten die Position hält. Das stromlos Schalten des Servos ist im Allgemeinen nicht notwendig, da die Regelung im positionierten Zustand nur wenige Milliampere benötigt.

Das war’s auch schon, ich hoffe, die Idee hinter Servos ist nun klar!

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s