Zum Inhalt springen

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_spt5435lv in hardware/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):

  1. DC-Motor. Der SPT5435LV verwendet einen Motor mit Eisenanker (cored).
  2. 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).
  3. Potentiometer. Es sitzt auf der Abtriebswelle und wandelt den Wellenwinkel in eine Spannung, sodass der Servo immer weiß, wo sein Abtrieb steht.
  4. 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:

PulsbreiteWelle des SPT5435LV-180W
500 µsein Ende (−90° von neutral)
1500 µsNeutralpunkt (Mitte)
2500 µsanderes Ende (+90°)

Innerhalb dieses Fensters ist die Zuordnung linear: Der Winkel θ aus der Neutralstellung ist proportional dazu, wie weit die Pulsbreite tp von 1500μs entfernt ist,

θ=tp−1500μsk,k=2500μs−500μs180∘≈11.1μs/∘=2000μsπrad≈636.6μs/rad

Die Radiant-Form von k ist die Konstante 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 T=1/f=5ms. Das passt zur 200-Hz-Regelschleife der Firmware, sodass jedes neue Gelenkziel den Servo im nächsten Frame erreicht.

Allgemein in PWM-Begriffen hat ein Puls der Breite tp, der alle T wiederholt wird, ein Tastverhältnis D=tp/T. Der Neutralpuls bei 200 Hz ist D=1500μs/5000μs=30%, die Extreme 10 % und 50 %. Der Servo ignoriert D und misst nur tp, weshalb der Wechsel der Framerate von 50 Hz auf 200 Hz die Welle nicht bewegt, solange die Lücke zwischen den Pulsen lang genug bleibt, damit der Servo jeden einzeln erkennt.

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):

Δtstep=T212=T4096200Hz: 5000μs4096≈1.22μs,50Hz: 20000μs4096≈4.88μs

Bei 200 Hz entspricht ein Schritt 1.22μs/636.6μs/rad≈1.9mrad≈0.11∘ Wellenweg.

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 V6,0 V
Blockiermoment29 kg·cm35 kg·cm
Geschwindigkeit (ohne Last)0,16 s / 60°0,14 s / 60°
Nennstrom1,4 A
Blockierstrom3,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, τ=Fr, und die Kraft von 1 kg ist ihr Gewicht mg, also

1kgcm=1kg×9.81m/s2×0.01m=0.0981Nm35kgcm×0.0981Nmkgcm=3.43Nm

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, τm=ktI, mit der Drehmomentkonstante kt des Motors; das Getriebe multipliziert das Motormoment mit seiner Übersetzung. Der Strom steigt also grob proportional zum gelieferten Drehmoment, und beim vollen Blockiermoment zieht der SPT5435LV seinen Blockierstrom, 3,5 A. Deshalb berücksichtigt die Auslegung der Stromversorgung Blockierfälle:

6×3.5A=21A>15A (UBEC peak rating),12×3.5A=42A total

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, ω0=60∘/0.14s=(π/3)rad/0.14s≈7.5rad/s. Plötzliche Sprünge würden sonst Stromstöße nahe dem Blockierstrom ziehen. Das Drehmoment eines DC-Motors fällt grob linear vom Blockiermoment bei Drehzahl null auf null bei ω0, τ(ω)≈τstall(1−ω/ω0); siehe Statik und Dynamik.

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.

ServohornAnz.GelenkBefestigt mit
25T-Aluminium-Scheibenhorn4Oberschenkel: Femur und Femur-Servoverbinder, 4 × M3 × 20M3 × 8 Zentralschraube
25T-Aluminium-Scheibenhorn4Hüfte: Beinmodul, 2 × M3 × 8M3 × 8 Zentralschraube
25T-Aluminium-Klemmarmhorn4KniekurbelM3 × 8 Zentralschraube

25T bedeutet 25 Zähne an der Verzahnung. Jeder Zahn entspricht 360∘/25=14.4∘, das Servohorn kann also nur in Schritten von 14,4° sitzen. Ein „um einen Zahn versetzt“ aufgestecktes Servohorn ist um 14,4° falsch, etwa 14.4∘×11.1μs/∘≈160μs Puls. Servohörner eines anderen Verzahnungsstandards (zum Beispiel 24T oder 23T) passen nicht richtig und scheren ab.

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:

bash
strido-cli --port <usb port> center   # 1500 µs on every channel

Bei Welle in Neutralstellung wird jedes Servohorn in der Montage-Referenzpose aufgesteckt:

GelenkReferenz bei 1500 µs
HüfteBein senkrecht
OberschenkelFemur 45° nach hinten
Kniekurbel35°

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):

FeldBedeutung
direction+1 oder −1: Gespiegelte Servos links und rechts drehen sich für dieselbe Gelenkbewegung entgegengesetzt
neutral_usPuls, der das Gelenk auf seinen Referenzwinkel stellt (Standard 1500)
zero_radder Referenzwinkel selbst
min_us, max_ushartes Pulsfenster

Die Firmware wandelt einen Aktuatorwinkel in einen Puls um mit:

tp=tneutral+sk(θ−θ0)

mit tneutral = neutral_us, dem Vorzeichen s = direction, k=636.6μs/rad und dem Referenzwinkel θ0 = 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:

θ−θ0=60∘−45∘=15∘=0.262radtp≈1500μs+0.262×636.6μs≈1500μs+167μs=1667μs

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 ​

  1. Warum kann der Roboter den wahren Winkel eines Gelenks nicht melden?
  2. Welche Pulsbreite sendet die Firmware für ein Gelenk 10° über seiner Referenz, mit direction = −1 und neutral_us = 1500?
  3. Warum wird die Servoschiene auf 6,0 V geregelt, statt direkt vom 7,4-V-Akkupack versorgt zu werden?
  4. Ein Servohorn sitzt auch nach dem Zentrieren sichtbar schief. Wie groß darf der Fehler sein, bevor Sie es um einen Zahn versetzen sollten?
  5. Warum trägt jeder UBEC in docs/verification/electronics.md eine Blockierwarnung?
Antworten
  1. Die Positionsrückmeldung (Potentiometer) wird nur im Servo verwendet. Nichts liest sie zurück, daher meldet die Firmware die von ihr befohlenen Winkel.
  2. 10∘=0.1745rad; 0.1745×636.6μs≈111μs; mit Richtung −1 ist der Puls 1500−111≈1389μs.
  3. 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.
  4. 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°).
  5. Sechs blockierte Servos ziehen 6×3.5A=21A, mehr als der Spitzenwert des UBEC von 15 A.

Weiterführende Literatur ​

MIT-Lizenz. Mechanik abgeleitet von Yertle (Jerome Graves). CAD, Simulation und native Tests sind kein Hardware-Nachweis – siehe Verifikation.