Arduino Tutorial - Servo

Ein Servo ist ein kleines Gerät, das eine Abtriebswelle hat. Sie können kleine Servomotoren direkt an einen Arduino anschließen und die Wellenposition sehr genau steuern, indem dem Servo ein codiertes Signal gesendet wird.

Solange das codierte Signal in der Eingangsleitung vorhanden ist, behält der Servo die Winkelposition der Welle bei. Wenn sich das codierte Signal ändert, ändert sich die Winkelposition der Welle.

In der Praxis werden Servomotoren verwendet, um die Position von Objekten zu steuern, Objekte zu drehen, Beine, Arme oder Hände von Robotern zu bewegen oder Sensoren mit hoher Präzision bewegen zu können. Da die Servomotoren klein sind und da integrierte Schaltkreise zur Steuerung ihrer Bewegung haben, können sie direkt an einen Arduino angeschlossen werden.

 

Wie funktioniert ein Servo?

Ein Servo verfügt über einige Steuerkreise und ein Potentiometer (einen variablen Widerstand, auch Poti genannt), der mit der Ausgangswelle verbunden ist. Mit diesem Potentiometer kann die Steuerschaltung den aktuellen Winkel des Servomotors überwachen.

Wenn sich die Welle im richtigen Winkel befindet, schaltet der Motor ab. Wenn die Schaltung feststellt, dass der Winkel nicht korrekt ist, wird der Motor in die richtige Richtung gedreht, bis der Winkel korrekt ist. Die Abtriebswelle des Servos kann sich um 180 Grad bewegen. Normalerweise liegt es irgendwo im 210-Grad-Bereich, variiert jedoch je nach Hersteller. Mit einem normalen Servo wird eine Winkelbewegung zwischen 0 und 180 Grad gesteuert. Ein normaler Servo kann sich mechanisch nicht weiterdrehen, da ein mechanischer Anschlag am Hauptausgangsgetriebe angebracht ist.
Die an den Motor angelegte Leistungsmenge ist proportional zur Entfernung, die er zurücklegen muss. Wenn also die Welle eine große Strecke drehen muss, läuft der Motor mit voller Drehzahl. Wenn nur ein geringer Betrag gedreht werden muss, läuft der Motor langsamer. Dies wird als Proportionalsteuerung bezeichnet.

Wie kommunizieren Sie den Winkel, in dem sich das Servo drehen soll? Der Steuerdraht wird verwendet, um den Winkel mitzuteilen. Der Winkel wird durch die Dauer eines Impulses bestimmt, der an den Steuerdraht angelegt wird. Dies wird als pulscodierte Modulation bezeichnet. Der Servo erwartet alle 20 Millisekunden (0,02 Sekunden) einen Impuls. Die Länge des Impulses bestimmt, wie weit sich der Motor dreht. Bei einem Impuls von 1,5 Millisekunden dreht sich der Motor beispielsweise in die 90-Grad-Position (oft als Neutralposition bezeichnet). Wenn der Impuls kürzer als 1,5 ms ist, dreht der Motor die Welle auf 0 Grad. Wenn der Impuls länger als 1,5 ms ist, dreht sich die Welle näher an 180 Grad.

 

arduino-servo-25c336824d5cfa

 

Wie Sie im Bild sehen können, bestimmt die Dauer des Impulses den Winkel der Abtriebswelle (als grüner Kreis mit dem Pfeil dargestellt). Beachten Sie, dass die Zeiten hier illustrativ sind und die tatsächlichen Zeiten vom Hersteller des Motors abhängen. Das Prinzip ist jedoch dasselbe.

 

Ansteuerung des Servos mit einem Arduino

In diesem Experiment verbinden wir die Strom- und Masse-Pins direkt mit den Arduino 5 V- und GND-Pins. Der PWM-Eingang wird an einen der digitalen Ausgangspins des Arduino angeschlossen.

Verbinden Sie den Motor mit dem Arduino wie in der folgenden Tabelle gezeigt:

  • Rotes Kabel - 5 V Pin Arduino
  • Braunes/schwarzes Kabel - Erdungspin Arduino
  • Gelbes Kabel- PWM (10) Pin Arduino

 

arduino-servo-15c3368b2870b6

 

Arduino Servo Code

/*
Arduino Servo Test sketch
*/
#include <Servo.h>
Servo servoMain; // Define our Servo
void setup()
{
servoMain.attach(10); // servo on digital pin 10
}
void loop()
{
servoMain.write(45); // Turn Servo Left to 45 degrees
delay(1000); // Wait 1 second
servoMain.write(0); // Turn Servo Left to 0 degrees
delay(1000); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(1000); // Wait 1 second
servoMain.write(135); // Turn Servo Right to 135 degrees
delay(1000); // Wait 1 second
servoMain.write(180); // Turn Servo Right to 180 degrees
delay(1000); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(1000); // Wait 1 second
}