Servos
Ein Hobby-Servo ist ein kleiner Getriebemotor mit eigenem Positionsregler: Sie senden ihm eine Pulsbreite, er dreht seine Abtriebswelle auf den passenden Winkel und hält ihn dort. Strido verwendet zwölf davon, einen pro Gelenk, und alles an der Bewegung des Roboters beginnt damit, wie diese Servos angesteuert werden.
In Strido
- Teil: Digitalservo SPT5435LV-180W, 13 gekauft (12 + 1 Reserve), Stücklistenposition
servo_spt5435lvinhardware/bom.yaml. - Gelenke: Hüfte (Abduktion), Oberschenkel und Kniekurbel an jedem Bein, FL, FR, RL, RR. PCA9685-Kanäle 4–15 (
hardware/electronics.yaml,servos.channels). - Signal: PCA9685-PWM-Treiber mit 200 Hz, 500–2500 µs, 3,3-V-Logikpegel, freigegeben über die Leitung XIAO D3 → PCA9685 OE.
- Stromversorgung: die 6,0-V-Servoschiene aus zwei Hobbywing UBEC-10A, je sechs Servos, über die WAGO-Busse im vorderen und hinteren Hohlraum.
- Servohörner: 25T-Aluminium-Scheibenhörner (8) für Hüfte und Oberschenkel, 25T-Aluminium-Klemmarmhörner (4) für die Kniekurbel.
- Code:
firmware/strido_esp32s3/lib/strido_core/src/servo_map.cpp(Winkel → Puls),strido-cli center/calibrate.
Was in einem Hobby-Servo steckt
Ein Servo packt vier Dinge in ein Gehäuse von 40,5 × 20 × 40,5 mm (72 g beim SPT5435LV):
- DC-Motor. Der SPT5435LV verwendet einen Motor mit Eisenanker (cored).
- Getriebe. Ganzmetall-Zahnräder tauschen Geschwindigkeit gegen Drehmoment. Die Abtriebswelle trägt eine Verzahnung mit 25 Zähnen (Futaba 25T) und läuft in zwei Kugellagern (2BB).
- Potentiometer. Es sitzt auf der Abtriebswelle und wandelt den Wellenwinkel in eine Spannung, sodass der Servo immer weiß, wo sein Abtrieb steht.
- Steuerplatine. Sie vergleicht den befohlenen Winkel (aus der Pulsbreite) mit dem gemessenen Winkel (vom Potentiometer) und treibt den Motor, um die Differenz zu schließen. Das ist ein geschlossener Positionsregelkreis im Servo.
Der Regelkreis verlässt den Servo nie. Der Roboter befiehlt nur Winkel und kann sie nicht zurücklesen, daher meldet /joint_states die von der Firmware nach der Begrenzung befohlenen Winkel, keine gemessenen (docs/software.md).
Analog vs. digital
Ein Analogservo aktualisiert seine Motoransteuerung im Takt der eintreffenden Pulse. Ein Digitalservo hat einen Mikrocontroller, der den Puls abtastet und den Motor mit einer viel höheren internen Rate neu ansteuert. Das Ergebnis ist ein steiferes Halten, ein kleinerer Totbereich und schnellere Reaktion. Der Preis ist ein höherer Ruhestrom: Die SPT-Seite nennt 100 mA Ruhestrom. Bei einem laufenden Roboter verhindert gerade das steife Halten, dass ein Bein unter Last absackt.
Das Pulsbreitensignal (PWM)
Der Servo liest die Breite eines sich wiederholenden Logikpulses, nicht seine Frequenz oder sein Tastverhältnis:
| Pulsbreite | Welle des SPT5435LV-180W |
|---|---|
| 500 µs | ein Ende (−90° von neutral) |
| 1500 µs | Neutralpunkt (Mitte) |
| 2500 µs | anderes Ende (+90°) |
Innerhalb dieses Fensters ist die Zuordnung linear: Der Winkel
Die Radiant-Form von kUsPerRad in servo_map.h.
Der Puls wiederholt sich mit fester Rate. Klassische RC-Technik sendet alle 20 ms einen Puls (50 Hz). Der SPT5435LV akzeptiert bis zu 330 Hz, und Strido läuft mit 200 Hz (kServoFrequencyHz), ein neuer Puls alle
Allgemein in PWM-Begriffen hat ein Puls der Breite
Kaufen Sie die richtige Winkelvariante
Derselbe Pulsbereich bedeutet bei verschiedenen Varianten unterschiedliche Winkel. Bei einem 270°-Servo würden 500–2500 µs 270° abdecken, und jede Gelenkzuordnung wäre falsch. Die Stückliste verlangt die Variante -180W; bestätigen Sie den Winkel bei jedem Nicht-SPT-Händler (hardware/bom.yaml, Hinweis zu servo_spt5435lv).
Auflösung und Totbereich
Der Totbereich ist die kleinste Änderung der Pulsbreite, auf die der Servo reagiert. Die SPT-Seite nennt 4 µs, etwa 0,36°.
Der PCA9685, der die Pulse erzeugt, teilt jede Periode in 4096 Schritte (12 Bit):
Bei 200 Hz entspricht ein Schritt
Bei 50 Hz wäre ein Schritt bereits breiter als der Totbereich; bei 200 Hz löst der Treiber etwa drei Schritte darin auf. Die höhere Framerate bringt sowohl schnellere Aktualisierungen als auch feinere Positionierung.
Signalpegel
Die SPT-Seite spezifiziert einen PWM-Signalpegel von 3,3–5,0 V. Der PCA9685 läuft am 3,3-V-Spannungsregler des XIAO, daher sind seine Pulse genau 3,3 V hoch: innerhalb der Spezifikation, aber ohne Reserve. docs/verification/electronics.md markiert diese Prüfung als „bestanden, keine Reserve“. Wenn ein Servo zittert, messen Sie zuerst die 3V3-Schiene des XIAO.
Drehmoment, Geschwindigkeit und Strom
| Spezifikation (SPT-Datenblattseite) | 4,8 V | 6,0 V |
|---|---|---|
| Blockiermoment | 29 kg·cm | 35 kg·cm |
| Geschwindigkeit (ohne Last) | 0,16 s / 60° | 0,14 s / 60° |
| Nennstrom | 1,4 A | |
| Blockierstrom | 3,5 A |
Blockiermoment in SI-Einheiten
Hobby-Servos geben das Drehmoment in kg·cm an: das Gewicht einer Masse in Kilogramm an einem Arm in Zentimetern. Drehmoment ist Kraft mal Hebelarm,
Das Blockiermoment ist das Maximum, das der Servo drücken kann, wenn er sich gar nicht bewegt. Es ist eine Grenze, kein Arbeitspunkt. In MuJoCo braucht das stehende Knie etwa 0,7 N·m, grob ein Fünftel des Blockiermoments (docs/electronics.md). Diese Reserve erlaubt dem Roboter zu traben, sich von einem Stolpern zu erholen und seine 3,07 kg zu tragen (docs/design.md).
Der Strom folgt dem Drehmoment
Das Drehmoment eines DC-Motors ist proportional zu seinem Strom,
Ein Servo, der gegen einen harten Anschlag drückt oder gegen ein anderes Bein arbeitet, liegt beim Blockierstrom und erhitzt sich schnell. Daraus folgen zwei Regeln in der Dokumentation:
- Stecken Sie den Loop-Key nie ein, während Positionsbefehle laufen: Alle zwölf Servos würden gleichzeitig springen.
- Befehlen Sie nie alle Beine in harte Anschläge.
Die Firmware begrenzt außerdem die Gelenkgeschwindigkeit auf 6 rad/s (max_joint_speed_rad_s in safety.h), unter der Leerlaufgeschwindigkeit des Servos bei 6 V,
Die 6-V-Servoschiene
Der SPT5435LV ist nur für 4,8–6,0 V ausgelegt. Der 2S-LiPo schwankt zwischen 8,4 V (voll) und 6,4 V (Abschaltung), also immer über diesem Bereich. Ein direkter Anschluss an den Akkupack würde jeden Servo mit Überspannung betreiben. Zwei Hobbywing-UBEC-10A-Spannungsregler setzen den Akkupack daher auf 6,0 V herab:
- Der Ausgangs-Jumper des UBEC bleibt offen: Das wählt 6,0 V. Die Einstellung 7,4 V würde die Servos zerstören.
- Messen Sie jeden UBEC ohne Last, bevor Sie Servos anschließen, und akzeptieren Sie nur 5,8–6,0 V (Elektronik › Kabelbaum, Schritt 2).
- Unter Last bei fast leerem Akkupack wird erwartet, dass die Schiene auf etwa 5,4 V einbricht (Schätzung in
hardware/electronics.yaml). Der Servo ist dann noch im Bereich, aber schwächer: Das Drehmoment fällt grob mit der Spannung (29 kg·cm bei 4,8 V gegenüber 35 kg·cm bei 6 V).
Der PCA9685 führt nur das Signal. Der Servostrom fließt UBEC → WAGO-Bus → rote/braune Drähte des Servos und nie durch eine Logikplatine. Der V+-Pin an der PCA9685-Stiftleiste bleibt unbenutzt. Mehr Details unter Stromversorgung.
Servohörner und die 25T-Verzahnung
Das Servohorn koppelt die Abtriebsverzahnung des Servos mit der Struktur des Roboters. Strido verwendet Aluminiumhörner, weil gedruckte Teile, die an ein Kunststoffhorn geschraubt sind, die Verzahnung abscheren oder sich verbiegen würden.
| Servohorn | Anz. | Gelenk | Befestigt mit |
|---|---|---|---|
| 25T-Aluminium-Scheibenhorn | 4 | Oberschenkel: Femur und Femur-Servoverbinder, 4 × M3 × 20 | M3 × 8 Zentralschraube |
| 25T-Aluminium-Scheibenhorn | 4 | Hüfte: Beinmodul, 2 × M3 × 8 | M3 × 8 Zentralschraube |
| 25T-Aluminium-Klemmarmhorn | 4 | Kniekurbel | M3 × 8 Zentralschraube |
25T bedeutet 25 Zähne an der Verzahnung. Jeder Zahn entspricht
Schrauben, die aus Stahl in das Aluminium-Servohorn gehen, erhalten einen Tropfen mittelfeste Schraubensicherung: Metall-Metall-Verbindungen vibrieren sich sonst los (docs/assembly/README.md).
Zentrieren und Kalibrieren
Schritt 1: zentrieren, bevor Sie ein Servohorn montieren
Bevor ein Servohorn aufgesteckt wird, wird jeder Servo auf 1500 µs gefahren, seine Neutralstellung:
strido-cli --port <usb port> center # 1500 µs on every channelBei Welle in Neutralstellung wird jedes Servohorn in der Montage-Referenzpose aufgesteckt:
| Gelenk | Referenz bei 1500 µs |
|---|---|
| Hüfte | Bein senkrecht |
| Oberschenkel | Femur 45° nach hinten |
| Kniekurbel | 35° |
Das sind die Werte neutral_hip, neutral_thigh und neutral_crank in der generierten Geometrie (0, 0,785 und 0,611 rad). Da die Verzahnung nur Schritte von 14,4° erlaubt, wählen Sie den Zahn, der am nächsten kommt; der Rest wird in Software korrigiert.
Schritt 2: Feinabgleich in der Firmware
Jedes Gelenk hat einen ServoCalibration-Datensatz, der im Flash des ESP32 gespeichert ist (Preferences):
| Feld | Bedeutung |
|---|---|
direction | +1 oder −1: Gespiegelte Servos links und rechts drehen sich für dieselbe Gelenkbewegung entgegengesetzt |
neutral_us | Puls, der das Gelenk auf seinen Referenzwinkel stellt (Standard 1500) |
zero_rad | der Referenzwinkel selbst |
min_us, max_us | hartes Pulsfenster |
Die Firmware wandelt einen Aktuatorwinkel in einen Puls um mit:
mit neutral_us, dem Vorzeichen direction, zero_rad; das Ergebnis wird auf [min_us, max_us] begrenzt.
Rechenbeispiel: Um einen Oberschenkel mit direction = +1 von seiner 45°-Referenz auf 60° zu bewegen:
Mit strido-cli calibrate können Sie jedes neutral_us in Schritten von ±5 µs oder ±25 µs verschieben, bis das Gelenk genau in seiner Referenz sitzt, und dann in den Flash speichern. Der Roboter sollte dabei auf einem Ständer mit frei hängenden Beinen stehen. Ein Fehler von einem halben Zahn (7,2°) entspricht etwa 80 µs, gut innerhalb des Abgleichbereichs. Die Kalibrierung gleicht auch kleine chipspezifische Unterschiede im PCA9685-Takt aus, die jeden Puls skalieren.
Rohpulse umgehen die Gelenkgrenzen
strido-cli center und pulse senden rohe Pulsbreiten. Sie überspringen die Gelenk- und Kniekurbelgrenzen aus dem CAD-Bewegungsbereichs-Sweep. Verwenden Sie sie nur, solange die Servohörner abgenommen sind oder sich die Beine frei bewegen können.
Selbsttest
- Warum kann der Roboter den wahren Winkel eines Gelenks nicht melden?
- Welche Pulsbreite sendet die Firmware für ein Gelenk 10° über seiner Referenz, mit
direction = −1undneutral_us = 1500? - Warum wird die Servoschiene auf 6,0 V geregelt, statt direkt vom 7,4-V-Akkupack versorgt zu werden?
- Ein Servohorn sitzt auch nach dem Zentrieren sichtbar schief. Wie groß darf der Fehler sein, bevor Sie es um einen Zahn versetzen sollten?
- Warum trägt jeder UBEC in
docs/verification/electronics.mdeine Blockierwarnung?
Antworten
- Die Positionsrückmeldung (Potentiometer) wird nur im Servo verwendet. Nichts liest sie zurück, daher meldet die Firmware die von ihr befohlenen Winkel.
; ; mit Richtung ist der Puls . - Der SPT5435LV ist nur für 4,8–6,0 V ausgelegt; der Akkupack liegt im Betrieb bei 6,4–8,4 V und würde ihn mit Überspannung betreiben.
- Bis zu einem halben Zahn, 7,2° (≈ 80 µs), ist das eine Aufgabe für
strido-cli calibrate. Darüber hinaus versetzen Sie das Servohorn um einen Zahn (14,4°). - Sechs blockierte Servos ziehen
, mehr als der Spitzenwert des UBEC von 15 A.
Weiterführende Literatur
- SPT5435LV-180W-Spezifikation (SPT Servo)
- PCA9685-Datenblatt (NXP, Adafruit-Spiegel)
- Adafruit-Anleitung zum 16-Kanal-PWM/Servo-Treiber
- Referenz zu Servoverzahnungen (ServoCity)
- Verwandte Seiten: Stromversorgung, Mikrocontroller, Mechanik, Elektronik, Verkabelung und Stromversorgung
- Theorie: Regelung (der PD-Regelkreis im Servo), Statik und Dynamik (Gelenkmomente)