Servomotoren (Bsp. SG90)
Ein Servomotor wie er hier verwendet wird ist zunächst ein normaler Gleichstrommotor mit einem angedockten Getriebe. Das Getriebe bewirkt, dass der DC Motor viele Umdrehungen macht und sich der Ausgang langsamer aber mit einem umso größeren Drehmoment dreht. Meist dreht der Ausgang nur um ±90°. Die Anschlüsse des Servos sind Plus und Minus für die Gleichstromversorgung und zusätzlich eine Steuersignalleitung.
Über die Steuerleitung wird die gewünschte Winkelvorgabe kontinuierlich mit 50 Hz (Periodendauer: 20ms) übertragen. Das Tastverhältnis (Duty-Cycle) gibt hier den Winkel vor. Die Mittelstellung wird bei 1.5ms angefahren. Ein größeres Tastverhältnis (also Richtung 2.5ms) vergrößert den Winkel gegen den Uhrzeigersinn. Ein kleineres Tastverhältnis (in Richtung 0.5ms) im Uhrzeigersinn.
Im Servomotor eingebaut ist eine Servoelektronik die die über die Steuerleitung übertragene Winkelanforderung umsetzt und ggf. auch nachregelt. Die aktuelle Ist-Position wird dazu über ein Potentiometer erfasst und ebenfalls an die Servoelektronik übermittelt.
Schaltung und Programmcode
# define SERVO 2
int winkel= 135; // Wert zwischen 0-180°
void setup() {
pinMode(SERVO, OUTPUT);
}
void loop() {
// Berechnung des Pulses (0,5ms=0° und 2,5ms=180°
int pulsWeite = map(winkel, 0,180,500,2500);
// Puls wird alle 20ms wiederholt (50Hz)
int pulsPause = 20000 - pulsWeite;
digitalWrite(SERVO, HIGH);
delayMicroseconds(pulsWeite);
digitalWrite(SERVO, LOW);
delayMicroseconds(pulsPause);
}
Programmcode mit Bibliothek
Zum Programmieren kann man auch auf die Bibliothek Servo.h zurückgreifen. Diese Bibliothek ist bereits in der Arduino IDE enthalten.
// Die Bibliothek einbinden
# include <Servo.h>
// Pin Belegung (Red = VCC, braun = GND, orange = Daten 2)
// Instanz von Servo mit dem Namen meinMotor erstellen
Servo meinMotor;
// gewünschte Position des Motors (0-180°)
int position = 90;
void setup() {
// meinMotor an Pin 2 angeschlossen (attach) Endpositionen 500us für 0° und 2500us für 180°
meinMotor.attach(2, 500, 2500);
}
void loop() {
// Motor zur Winkelposition bewegen
meinMotor.write(position);
// Funktion um Zeitsignal direkt zu senden
/* meinMotor.writeMicroseconds(1500); */
}