Skip to Content

Positions- versus kontinuierliche Servos

Positions- versus kontinuierliche Servos

Servomotoren werden in vielen Anwendungen eingesetzt. In diesem Blogbeitrag untersuchen wir die Unterschiede zwischen Positions- und Dauerlauf-Servos und helfen dir zu verstehen, welcher Typ am besten für dein Projekt geeignet ist.

Positionsservos, wie der Name schon sagt, sind dafür ausgelegt, sich zu einer bestimmten Position zu bewegen und diese zu halten, bis ein neues Signal empfangen wird. Sie werden häufig in Anwendungen eingesetzt, bei denen Genauigkeit und Stabilität entscheidend sind. Diese Servos haben einen begrenzten Bewegungsbereich, typischerweise etwa 180 Grad, und sind ideal für Anwendungen, die eine präzise Steuerung der Motorposition erfordern, wie z. B. Roboterarme, RC-Auto-Lenkung und Drohnensteuerung.

Dauerlauf-Servos hingegen sind dafür ausgelegt, sich kontinuierlich in beide Richtungen zu drehen. Im Gegensatz zu Positionsservos haben sie keine feste Position, die sie halten müssen. Sie werden in Anwendungen eingesetzt, bei denen eine kontinuierliche Bewegung erforderlich ist, wie z. B. bei Radrobotern oder Pan-Tilt-Kamerasystemen.

Ein sehr beliebter Servo, der sowohl als Positions- als auch als Dauerlauf-Typ erhältlich ist, ist der SG90. Im Folgenden betrachten wir die Besonderheiten der SG90 Micro Servos, wie man sie anschließt und die Unterschiede in der Steuerung zwischen Positions- und Dauerlauf-Servos.

Benötigte Materialien

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Für dieses Projekt benötigst du folgende Materialien. Beachte, dass Positions- und Dauerlauf-Servos äußerlich identisch aussehen können! Achte auf eine Beschreibung oder ein Etikett, das „continuous“ oder „360 degrees“ für Dauerlauf-Servos und „180 degrees“ oder „positional“ für Positions-Servos angibt.

Arduino Uno

Dupont wire set

Dupont-Kabelset

USB Data Sync cable Arduino

USB-Kabel für Arduino UNO

basic servo motor

Positions-SG90 Servo

basic servo motor

Dauerlauf-SG90 Servo

Besonderheiten der SG90 Micro Servos

Der SG90 Micro Servo ist ein beliebter und weit verbreiteter Servomotor in verschiedenen Anwendungen. Er ist bekannt für seine kompakte Größe, Erschwinglichkeit und Vielseitigkeit. Hier sind einige wichtige Details zum SG90 Micro Servo:

Größe und Gewicht

Der SG90 Micro Servo ist ein kleiner Servomotor mit den Maßen ca. 23 mm x 12,2 mm x 29 mm. Er ist leicht und wiegt etwa 9 Gramm, was ihn für Projekte geeignet macht, bei denen Platz und Gewicht eine Rolle spielen.

Betriebsspannung

Der SG90 Micro Servo arbeitet im Spannungsbereich von 4,8 V bis 6 V. Damit ist er kompatibel mit den meisten gängigen Stromquellen wie LiPo-Akkus oder Netzteilen.

Drehmoment und Geschwindigkeit

Der SG90 Micro Servo bietet für seine Größe ein ordentliches Drehmoment. Typischerweise liefert er etwa 1,6 kg/cm bei 4,8 V und 2,2 kg/cm bei 6 V. Die Geschwindigkeit beträgt ca. 0,12 Sekunden pro 60 Grad bei 4,8 V und 0,10 Sekunden pro 60 Grad bei 6 V.

Steuersignal

Der SG90 Micro Servo verwendet ein standardmäßiges PWM-Signal (Pulsweitenmodulation) für die Steuerung. Er benötigt ein Steuersignal mit einer Frequenz von 50 Hz und einer Pulsbreite zwischen 1 ms und 2 ms. Die Pulsbreite bestimmt die Position der Servoachse bei Positionsservos oder die Drehgeschwindigkeit bei Dauerlauf-Servos.

Kompatibilität

Der SG90 Micro Servo ist kompatibel mit den meisten Mikrocontrollern und Entwicklungsboards wie Arduino, Raspberry Pi und ESP32. Er lässt sich leicht mit Softwarebibliotheken und Programmiersprachen steuern, die in der Maker-Community üblich sind.

Anschluss des SG90 Micro Servos

Folge diesen Schritten, um den SG90 Micro Servo anzuschließen:

servo-motor-with-arduino-uno-wiring-diagram-schematic-circuit-tutorial
  1. Beginne damit, die Stromversorgung mit dem Servo zu verbinden. Der SG90 Micro Servo arbeitet im Spannungsbereich von 4,8 V bis 6 V. Verbinde den positiven (roten) Draht des Servos mit dem 5V-Pin deines Mikrocontrollers oder Netzteils.
  2. Dann verbinde den negativen (schwarzen oder braunen) Draht des Servos mit dem Ground (GND)-Pin.
  3. Als Nächstes verbindest du das Steuersignalkabel des Servos mit PIN 9 deines Mikrocontrollers. Das Steuersignalkabel ist üblicherweise gelb, weiß oder orange.

Beachte, dass wenn du mehrere Servos an ein Arduino anschließt, besonders wenn die Servos unter Last stehen, das Arduino möglicherweise nicht genug Strom für alle Servos gleichzeitig liefern kann. Dies kann zu unregelmäßigen Servo-Bewegungen, verminderter Leistung oder sogar zum Reset oder Einfrieren des Arduino führen! In diesem Fall benötigst du eine zusätzliche Stromversorgung für die Servos.

Jetzt, wo du weißt, wie man den SG90 Micro Servo anschließt, schauen wir uns im nächsten Abschnitt die wichtigsten Merkmale von Positionsservos an.

Wichtige Merkmale von Positionsservos

Positionsservos, auch Standardservos genannt, werden aufgrund ihrer präzisen Steuerung der Winkelposition in vielen Anwendungen eingesetzt. Hier sind einige wichtige Merkmale von Positionsservos:

Winkelsteuerung : Positionsservos ermöglichen eine präzise Steuerung der Winkelposition der Servoachse. Sie können sich innerhalb eines definierten Bereichs, typischerweise zwischen 0 und 180 Grad, zu einem bestimmten Winkel drehen.

Positionsrückmeldung : Diese Servos sind mit Positionsrückmeldemechanismen wie Potentiometern oder Encodern ausgestattet, die Informationen über die aktuelle Position der Servoachse liefern. Diese Rückmeldung ermöglicht eine genaue Positionierung und Steuerung.

Drehmoment : Positionsservos sind darauf ausgelegt, ein hohes Drehmoment zu liefern, sodass sie eine beträchtliche Kraft ausüben können. Das macht sie geeignet für Anwendungen, bei denen Objekte mit Widerstand bewegt oder manipuliert werden müssen.

Stabilität : Positionsservos sind bekannt für ihre Stabilität und die Fähigkeit, eine erreichte Position zu halten. Sie verfügen über eine eingebaute Schaltung, die hilft, die gewünschte Position auch unter äußeren Kräften oder Laständerungen beizubehalten.

Insgesamt sind Positionsservos ideal für Anwendungen, die präzise Winkelsteuerung, Stabilität und hohes Drehmoment erfordern. Sie werden häufig in Robotik, RC-Fahrzeugen, industrieller Automatisierung und anderen Projekten eingesetzt, bei denen genaue Positionierung entscheidend ist.

Code zur Steuerung von Positionsservos

Normalerweise steuert man einen Servo nicht, indem man den Code zur Erzeugung der benötigten PWM-Signale selbst schreibt, sondern man verwendet eine Bibliothek. Die bekannteste Bibliothek dafür ist die Servo -Bibliothek. In deren Dokumentation findest du folgendes code Beispiel:

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

Dieser Code soll den Servo von der 0-Grad- zur 180-Grad-Position bewegen und dann wieder zurück.

Allerdings funktioniert das bei manchen Marken von SG90-Servos oft nicht! In meinem Fall stoppt der Servo beispielsweise nicht bei 0 Grad, sondern führt eine volle Drehung in die falsche Richtung aus, um zur nächsten Position zu gelangen. Der Grund ist, dass Hersteller manchmal nicht strikt die Timing-Standards für das PWM-Signal einhalten (link).

Feinabstimmung der Winkel

Deshalb müssen wir etwas nachjustieren, damit es funktioniert. Unten findest du ein verbessertes Codebeispiel:

#include <Servo.h>

const int range = 780;
const int mid = 1600;  // 90 degrees
Servo servo;

void setup() {
  servo.attach(9);  // PIN 9
}

void rotate(int angle, int wait) {
  angle = map(angle, 0, 180, mid - range, mid + range);
  servo.writeMicroseconds(angle);
  delay(wait);
}

void loop() {
  rotate(0, 1000);
  rotate(90, 1000);
  rotate(180, 1000);
  rotate(90, 1000);
}

Beachte, dass sich das Verhalten etwas unterscheidet. Statt die Position schrittweise zu ändern, bewegen wir uns direkt von 0 Grad zu 90 Grad, dann zu 180 Grad und schließlich zurück zu 90 Grad, mit einer Wartezeit von 1000 ms dazwischen. Das dient der Einfachheit. Du könntest den Code so ändern, dass er wie im obigen Beispiel funktioniert, indem du die loop Funktion wie folgt anpasst:

void loop() {  
  for (int angle = 0; angle <= 180; angle += 1) {
    rotate(angle, 15);
  }	
  for (int  angle = 180; angle >= 0; angle -= 1) {
    rotate(angle, 15);
  }
}

Der wichtige Teil hier ist die rotate() Funktion, die einen angle (und eine Wartezeit) übernimmt und maps diesen Winkel in eine Pulsdauer umwandelt. Theoretisch entspricht eine Pulsdauer von 1000 ms der vollen Gegen-Uhrzeigerrichtung (0 Grad), 2000 ms der vollen Uhrzeigerrichtung (180 Grad) und 1500 ms der Mitte (90 Grad). Das gilt für die gängigsten Positionsservos mit einem Winkelbereich von 0 bis 180 Grad.

Feinabstimmung des Mittelpunkts

In der Praxis sind die tatsächlich benötigten Pulsdauern unterschiedlich, weshalb sich der Servo nicht wie erwartet bewegt. Wir beginnen damit, den Mittelpunkt, den 90-Grad-Winkel, einzustellen, der bei 1500 ms Pulsdauer liegen sollte. Dazu befestigst du den Servo-Horn, setzt die Konstante mid auf 1500 und änderst die loop Funktion wie folgt:

void loop() {
  rotate(90, 1000);
}

Je nach Verzahnung sitzt der Horn möglicherweise nicht genau im gewünschten Winkel. Angenommen, du möchtest, dass 90 Grad wie im Bild unten aussehen, aber der Horn ist tatsächlich leicht versetzt.

Das können wir beheben, indem wir die mid Konstante anpassen, bis die perfekte Ausrichtung erreicht ist. Im obigen Codebeispiel musste ich mid=1600 setzen, um dies zu erreichen.

Feinabstimmung der Endpunkte

Als Nächstes passen wir die 0- und 180-Grad-Positionen an, indem wir die range Konstante ändern. Dazu modifizieren wir den Code in der loop-Funktion wie folgt:

void loop() {
  rotate(0, 1000);
  rotate(180, 1000);
}

Wir lassen den Servo laufen, beobachten die Endpositionen und passen die range Konstante an, beginnend mit einem Wert von 500, bis wir die unten dargestellten Winkel erreichen.

Zum Beispiel musste ich im obigen Codebeispiel die range=780 Konstante für meine Servos anpassen, um dies zu erreichen. Beachte, dass diese angepassten Parameterwerte für die Pulsdauer deutlich von den Standardwerten abweichen. Es ist also einiges an Feinabstimmung nötig, damit die Servos wie gewünscht funktionieren.

Für weitere Details schau dir unser Tutorial zu How to control servo motors with Arduino an.

Als Nächstes betrachten wir die wichtigsten Merkmale von Dauerlauf-Servos.

Wichtige Merkmale von Dauerlauf-Servos

Dauerlauf-Servos, auch als Continuous Rotation Servos oder 360-Grad-Servos bekannt, drehen sich kontinuierlich in beide Richtungen. Im Gegensatz zu Positionsservos, die einen begrenzten Bewegungsbereich von typischerweise 180 Grad haben, drehen sich Dauerlauf-Servos ohne physische Endanschläge. Hier sind einige wichtige Merkmale von Dauerlauf-Servos:

Geschwindigkeitssteuerung : Dauerlauf-Servos ermöglichen eine präzise Steuerung der Drehgeschwindigkeit. Durch Anpassung des PWM-Signals kannst du die Drehgeschwindigkeit regeln. Das macht Dauerlauf-Servos ideal für Anwendungen, die variable Geschwindigkeitskontrolle erfordern, wie z. B. Radroboter.

Bidirektionale Drehung : Dauerlauf-Servos können sich sowohl im Uhrzeigersinn als auch gegen den Uhrzeigersinn drehen.

Keine Positionsrückmeldung : Im Gegensatz zu Positionsservos liefern Dauerlauf-Servos keine Positionsrückmeldung. Das bedeutet, dass du die Position oder den Winkel der Servoachse nicht genau steuern kannst. Du kannst nur die Drehgeschwindigkeit und Drehrichtung kontrollieren.

Dauerlauf-Servos bieten gegenüber Positionsservos einzigartige Vorteile, insbesondere in Anwendungen, die kontinuierliche Bewegung und variable Geschwindigkeitssteuerung erfordern. Allerdings fehlt ihnen die Fähigkeit, die Position der Servoachse genau zu kontrollieren.

Code zur Steuerung von Dauerlauf-Servos

Der Steuerungscode für einen Dauerlauf-Servo ist im Wesentlichen identisch mit dem für einen Positionsservo. Wir ändern nur die Namen der Variablen und Konstanten, um die Absicht des Codes klarer zu machen:

#include <Servo.h>

const int maxspeed = 700;
const int stop = 1500;
Servo servo;

void setup() {
  servo.attach(9); // PIN 9
}

void rotate(int speed, int wait) {
  speed = map(speed, -100, +100, stop - maxspeed, stop + maxspeed);
  servo.writeMicroseconds(speed);
  delay(wait);
}

void loop() {
  rotate(0, 1000);
  rotate(-100, 1000);
  rotate(+100, 1000);
}

Ein wichtiger Unterschied liegt jedoch in der Zuordnung. Dort map ordnen wir Geschwindigkeiten von -100 % bis +100 % (im Gegensatz zu Winkeln) den für die Steuerung des Servos benötigten Pulsdauern zu.

Wie zuvor würde theoretisch eine Pulsdauer von 1000 ms für volle Geschwindigkeit gegen den Uhrzeigersinn, 2000 ms für volle Geschwindigkeit im Uhrzeigersinn und 1500 ms für Stillstand des Servos verwendet.

Bei meinen Servos führte eine Pulsdauer von 1500 ms tatsächlich zum Stillstand. Die Maximalgeschwindigkeiten wurden jedoch bei 1500 ms – 700 ms = 800 ms und 1500 ms + 700 ms = 2200 ms erreicht, was über den Standardwerten von 1000 ms und 2000 ms liegt.

Ähnlich wie bei der Feinabstimmung eines Positionsservos beginnst du mit der Suche nach dem Mittelpunkt, also dem Wert für die stop Konstante, bei dem sich der Servo nicht bewegt. Dann erhöhst du die maxspeed Konstante (beginnend bei 500 ms), bis keine weiteren Verbesserungen der Drehgeschwindigkeit beobachtet werden.

Für weitere Details schau dir unser Tutorial zu How to Control a 360 Degree Servo Motor with Arduino an.

Wahl zwischen Positions- und Dauerlauf-Servos

Hier eine kurze Zusammenfassung der Faktoren, die bei der Wahl zwischen Positions- und Dauerlauf-Servos zu beachten sind.

Positionsservos

Positionsservos sind dafür ausgelegt, sich zu einem bestimmten Winkel zu drehen und diese Position zu halten. Daher sind Positionsservos ideal für Aufgaben, bei denen Objekte an bestimmte Orte oder Winkel bewegt werden müssen.

Wichtige Merkmale von Positionsservos sind:

  • Positionskontrolle : Positionsservos ermöglichen es dir, den gewünschten Drehwinkel einzustellen, und sie halten diese Position, bis eine andere Anweisung erfolgt.
  • Rückmeldemechanismus : Diese Servos verfügen typischerweise über ein Potentiometer oder einen Encoder, der eine Rückmeldung über die aktuelle Position des Servos liefert.
  • Drehmoment : Positionsservos sind bekannt für ihr hohes Drehmoment, was sie für Anwendungen geeignet macht, die das Bewegen schwerer Lasten erfordern.

Dauerlauf-Servos

Dauerlauf-Servos hingegen sind dafür ausgelegt, sich kontinuierlich in beide Richtungen zu drehen. Daher sind Dauerlauf-Servos ideal für Aufgaben, die das Drehen von Rädern, Propellern oder anderen rotierenden Komponenten erfordern.

Wichtige Merkmale von Dauerlauf-Servos sind:

  • Kontinuierliche Rotation : Im Gegensatz zu Positionsservos können Dauerlauf-Servos sich kontinuierlich in beide Richtungen drehen.
  • Geschwindigkeitssteuerung : Diese Servos verfügen typischerweise über eine Geschwindigkeitssteuerung, mit der du die Drehgeschwindigkeit anpassen kannst.
  • Keine Positionskontrolle : Dauerlauf-Servos haben keine Positionskontrolle wie Positionsservos. Sie halten keinen bestimmten Winkel.

Die richtige Wahl des Servos

Wenn du präzise Kontrolle über die Position des Servos und hohes Drehmoment benötigst, ist ein Positionsservo die richtige Wahl. Wenn du hingegen kontinuierliche Bewegung und Geschwindigkeitssteuerung brauchst, ist ein Dauerlauf-Servo besser geeignet.

Fazit

In diesem Beitrag haben wir die Unterschiede zwischen Positions- und Dauerlauf-Servos, ihre wichtigsten Merkmale und deren Steuerung betrachtet.

Positionsservos sind dafür ausgelegt, sich innerhalb eines bestimmten Winkelbereichs zu drehen, was sie ideal für Anwendungen macht, die präzise Positionierung erfordern. Dauerlauf-Servos hingegen bieten eine kontinuierliche Rotation in beide Richtungen und eignen sich für Anwendungen, die kontinuierliche Bewegung benötigen, wie z. B. Radmotoren für kleine Roboter oder Fahrzeuge.

Bei der Entscheidung zwischen Positions- und Dauerlauf-Servos solltest du die spezifischen Anforderungen deines Projekts berücksichtigen. Wenn du präzise Positionskontrolle benötigst, ist ein Positionsservo die beste Wahl. Wenn du jedoch kontinuierliche Bewegung oder die Möglichkeit zur Modifikation des Servos für spezielle Anwendungen brauchst, ist ein Dauerlauf-Servo besser geeignet.

In diesem Blogbeitrag haben wir uns auf die Besonderheiten der SG90 Micro Servos konzentriert, die aufgrund ihrer kleinen Größe und Erschwinglichkeit häufig in Hobbyprojekten verwendet werden. Die besprochenen Konzepte gelten jedoch auch für andere Servomotoren.

Zusammenfassend ist das Verständnis der wichtigsten Merkmale und Unterschiede zwischen Positions- und Dauerlauf-Servos entscheidend, um den richtigen Servomotor für dein Projekt auszuwählen. Berücksichtige die spezifischen Anforderungen und Anwendungen und wähle entsprechend. Viel Spaß beim Experimentieren mit Servomotoren!

Hinweis

Wir implementieren eine spezielle rotate() Funktion, die eine Zuordnung von Winkeln oder Geschwindigkeiten zu Pulsdauern vornimmt. Die attach() Funktion der Servo library hat zwei zusätzliche Parameter (min und max), die einen ähnlichen Effekt erzielen.

attach(pin, min, max)

Diese erlauben jedoch keine Anpassung des Mittelpunkts, und für Geschwindigkeiten von -100 % bis +100 % wäre ohnehin eine separate Zuordnung nötig. Deshalb haben wir uns für die oben vorgestellte allgemeinere Lösung entschieden.

Fazit

In diesem Tutorial hast du die Unterschiede zwischen Positions- und Dauerlauf-Servos kennengelernt.

Für weitere Informationen zu Dauerlauf-Servos schau dir unser Tutorial zu How to Control a 360 Degree Servo Motor with Arduino an. Für Positionsservos siehe das How to control servo motors with Arduino Tutorial, und wenn du einen Servo mit einer IR-Fernbedienung steuern möchtest, lies das How to Control a Servo with an IR Remote Tutorial.

Wenn du Fragen hast, hinterlasse sie gerne im Kommentarbereich.

Viel Spaß beim Tüfteln ; )