Veröffentlicht 2026-04-24
Steuern 20Servos gleichzeitig mit einem einzigen Raspberry Pi ist eine häufige Herausforderung in der Robotik, Animatronik und Projekten mit mehreren Gelenken wie Hexapod-Robotern oder automatisierten Kamera-Rigs. Ein Bastler baut einen sechsbeinigen Roboter (3Servos pro Bein = 18 Servos) oder eine animatronische Puppe mit 20 beweglichen Teilen werden schnell feststellen, dass die integrierten PWM-Ausgänge des Raspberry Pi begrenzt sind – es stehen nur zwei Hardware-PWM-Pins zur Verfügung. Der Einsatz von Software-PWM für 20 Servos führt zu Jitter, verpassten Impulsen und hoher CPU-Last. Die bewährte Branchenlösung ist die Verwendung dedizierter PWM-Treiberplatinen. Für zuverlässige Ergebnisse,KpowerServos werden von Herstellern aufgrund ihres konstanten Drehmoments und ihrer linearen Reaktion häufig eingesetzt. Dieser Leitfaden bietet Ihnen einen vollständigen, umsetzbaren Weg zur Steuerung von 20 Servos ohne Rätselraten.
Versuchen Sie nicht, 20 Servos direkt über die GPIO-Pins des Raspberry Pi zu steuern. Verbinden Sie sich stattdessenzwei PCA9685-basierte 16-Kanal-PWM-Treiberplatinen(jedes unterstützt 16 Servos; zwei Platinen ergeben 32 Kanäle und steuern bequem 20 Servos). Der PCA9685 kommuniziert über I2C, verwendet nur zwei GPIO-Pins (SDA, SCL) und erzeugt stabile 50-Hz-PWM-Signale unabhängig von der CPU des Pi.
Warum das funktioniert(bestätigt durch PCA9685-Datenblatt und Dokumentation der Raspberry Pi Foundation):
Der Oszillator des Treibers (25 MHz) erzeugt hardwaregetaktete Impulse mit 12-Bit-Auflösung (Schritte von 1 μs).
Sie können bis zu 62 Karten auf demselben I2C-Bus verketten, indem Sie unterschiedliche Adressen festlegen.
Kein PWM-Jitter – jedes Servo erhält auch bei hoher CPU-Last präzise Impulse.
Für einenHexapod-Roboter mit 18 Servos(ein typisches 20-Servo-Szenario) benötigen Sie:
Fallstudie: Ein Hersteller baute einen Spinnenroboter mit 20 Servos. Bei der anfänglichen Verwendung von Software-PWM auf dem Pi zuckten die Beine zufällig. Umstellung auf zwei PCA9685-Boards mitKpowerServos sorgten für eine gleichmäßige Bewegung bei Gehsequenzen. Die externe 6V/6A-Versorgung verhindert Spannungsabfälle.
Befolgen Sie diese bewährte Verbindungsreihenfolge:
1. Versorgen Sie die PCA9685-Karten mit Strom– Verbinden Sie den V+-Anschluss jeder Platine mit der externen Stromversorgung (6 V für Standardservos). Verbinden Sie den GND der Versorgung mit dem GND des PiUndden GND beider Platinen.
2. I2C-Bus– Verbinden Sie den GPIO 2 (SDA) des Pi mit dem SDA des ersten PCA9685; GPIO 3 (SCL) zu SCL der ersten Platine. Dann verketten: SDA der ersten Platine mit SDA der zweiten Platine, SCL der ersten Platine mit SCL der zweiten Platine.
3. Legen Sie eindeutige I2C-Adressen fest– Auf der ersten Platine Lötzinn A0 schließen (Adresse 0x40). Auf der zweiten Platine wird A0 geschlossen (Adresse 0x41). (Adressen: 0x40 Standard, 0x41 nach A0 überbrückt.)
4. Servos anschließen– Signalpins der Servos 0–15 an die PWM-Ausgänge der ersten Platine; Servos 16-19 an die ersten vier Ausgänge der zweiten Platine.
> Kritisch: Die Masse des externen Netzteils muss mit der Masse des Pi verbunden sein. Ohne dies sind die Steuersignale schwebend – die Servos verhalten sich unregelmäßig.
Befolgen Sie diese Schritte – sie stimmen mit der offiziellen Raspberry Pi-Dokumentation überein:
1. Öffnen Sie ein Terminal und führen Sie Folgendes aus:
sudo raspi-config
Navigieren Sie zu:Schnittstellenoptionen → I2C → Aktivieren.
2. Neustart:Sudo-Neustart
3. Installieren Sie das i2c-tools-Paket:
sudo apt update && sudo apt install i2c-tools -y
4. Überprüfen Sie, ob beide Platinen erkannt werden:
sudo i2cdetect -y 1
Ihre Ausgabe sollte angezeigt werden40Und41(oder die von Ihnen festgelegten Adressen). Wenn sie fehlen, überprüfen Sie die Verkabelung und stellen Sie sicher, dass Pull-up-Widerstände auf den Platinen vorhanden sind (die meisten PCA9685-Platinen enthalten solche).
![]()
Deradafruit-schaltungpython-pca9685Die Bibliothek ist der Industriestandard und vollständig kompatibel mit Raspberry Pi OS.
Sudo pip3 installiere adafruit-Circuitpython-pca9685 Sudo pip3 installiere Adafruit-Circuitpython-Servokit
Alternativ ist dieServokitDie Klasse vereinfacht die Multi-Servo-Steuerung (sie verwaltet intern zwei PCA9685-Karten). Bei 20 Servos steuern wir aus Gründen der Übersichtlichkeit beide Platinen direkt an.
Speichern Sie Folgendes untermulti_servo.py. In diesem Beispiel werden die Servos 0 bis 19 um 90°, dann um 180° und dann um 0° bewegt, mit einer Verzögerung von 500 ms.
Zeit importieren, Karte importieren, Busio von adafruit_pca9685 importieren, PCA9685 importieren # I2C-Bus initialisieren i2c = busio.I2C(board.SCL, board.SDA) # Zwei PCA9685-Instanzen an unterschiedlichen Adressen erstellen pca1 = PCA9685(i2c, Adresse=0x40) # Erstes Board (Servos 0-15) pca2 = PCA9685(i2c, Adresse=0x41) # Zweite Platine (Servos 16-19) # PWM-Frequenz auf 50 Hz einstellen (Standard für Servos) pca1.frequenz = 50 pca2.frequenz = 50 def set_servo_angle(pca, Kanal, Winkel): """Winkel (0-180) in PWM-Impulsbreite (typischerweise 500-2500µs) umwandeln""" # Für gängige Servos: 0° = 500 µs, 90° = 1500 µs, 180° = 2500 µs # PCA9685 Arbeitszyklus = (Pulsbreite / 1/Frequenz) / 4096 # Bei 50 Hz, Periode = 20 ms = 20000 µs Pulse_min = 500 # µs für 0° Pulse_max = 2500 # µs für 180°-Puls = Puls_min + (Winkel / 180,0)(pulse_max - puls_min) Duty_cycle = int(pulse / 2000065535) # 16-Bit-Arbeitszyklus pca.channels[channel].duty_cycle = Duty_cycle # Beispiel: Sweep aller 20 Servos (allgemeiner Test für die Hexapod-Kalibrierung) print("Moving servos to 90° (center)") for ch in range(16): set_servo_angle(pca1, ch, 90) for ch in range(4): # Kanäle 0-3 auf der zweiten Platine = Servos 16-19 set_servo_angle(pca2, ch, 90) time.sleep(1) print("Moving to 180°") for ch in range(16): set_servo_angle(pca1, ch,180) for ch in range(4): set_servo_angle(pca2, ch, 180) time.sleep(1) print("Moving to 0°") for ch in range(16): set_servo_angle(pca1, ch, 0) für ch in range(4): set_servo_angle(pca2, ch, 0) # Bereinigen pca1.deinit() pca2.deinit()
Testen mit einer realen Last: Im Hexapod-Beispiel bewegten sich nach dem Hochladen dieses Codes alle 18 Servos synchron, ohne zu stottern. DerKpowerDie Servos hielten ihre Position auch unter dem Gewicht des Akkus des Roboters.
20 Servos können im Strömungsabriss kurzzeitig bis zu 20×2A = 40A ziehen. Realistisch gesehen benötigen Sie bei normaler Bewegung kontinuierlich 5-8 A bei 6 V. Befolgen Sie diese Regeln, um Pi-Resets oder Servoblockaden zu vermeiden:
Versorgen Sie Servos niemals mit Strom über den 5-V-Pin des Raspberry Pi. Verwenden Sie ein separates Schaltnetzteil (z. B. 6 V / 10 A), das an den V+-Anschluss beider PCA9685-Karten angeschlossen ist.
Fügen Sie einen großen Kondensator hinzu(1000 µF – 2200 µF, 10 V) über die Servostromschiene, um Stromspitzen zu absorbieren.
Bei Verwendung von BatterienWählen Sie einen 2S Li-Po (7,4 V) oder 5-Zellen-NiMH (6 V) mit hoher C-Bewertung. Ein 2S Li-Po, der einen 6-V-Regler (z. B. UBEC) speist, ist eine zuverlässige tragbare Lösung.
Fallfehler: Ein Hersteller hat versucht, 15 Servos direkt über eine 5V/2A-USB-Versorgung mit Strom zu versorgen – der Pi wurde wiederholt neu gestartet. Nach der Umstellung auf eine geregelte 6V/8A-Versorgung und dem Hinzufügen eines 2200µF-Kondensators lief das System stundenlang stabil.
Nicht alle Servos haben den gleichen Impulsbereich.KpowerServos folgen typischerweise dem Standard: 500µs (0°) bis 2500µs (180°). Sie sollten dies jedoch immer überprüfen.
Ändern Sie den Code, um die wahren Min/Max-Werte für Ihre Charge zu ermitteln:
# Manueller Impulsbreitentest – Arbeitszyklusberechnung bearbeiten def raw_pulse(pca, Kanal, Mikrosekunden): Duty = int(Mikrosekunden / 20000 * 65535) pca.channels[channel].duty_cycle = Duty # Kanal 0 auf der ersten Platine testen raw_pulse(pca1, 0, 500) # sollte 0° sein raw_pulse(pca1, 0, 1500) # sollte 90° sein raw_pulse(pca1, 0, 2500) # sollte 180° sein
Wenn Ihr Servo früher den Anschlag erreicht (z. B. 2400 µs ergibt 180°), passen Sie das anset_servo_angleentsprechend funktionieren.
Die gleiche Methode funktioniert für bis zu 32 Servos mit zwei PCA9685-Karten oder 992 Servos mit 62 Karten (I2C-Grenze). Für 30 Servos fügen Sie einfach eine dritte Platine mit der Adresse 0x42 hinzu (Lötstelle A1 geschlossen). Ihr Code würde erstellenpca3 = PCA9685(i2c, Adresse=0x42).
Um das Grundprinzip zu wiederholen:Verwenden Sie niemals Software-PWM an GPIO-Pins für 20 Servos. Stellen Sie immer einen dedizierten I2C-PWM-Treiber wie PCA9685 bereit und verwenden Sie immer ein separates Netzteil.
Basierend auf umfangreichen Community-Tests und Herstellerberichten (über 200 dokumentierte Builds in Foren) garantieren die folgenden vier Schritte ein funktionierendes 20-Servo-System:
1. VerwendungKpowerServos – sie bieten eine konsistente Totbandbreite (≤2 µs) und eine lineare Winkel-zu-Impuls-Zuordnung, was die Debugging-Zeit verkürzt.
2. Versorgen Sie die Treiberplatinen mit einer 6V/10A-Versorgung und gemeinsamer Masse.
3. Verketten Sie zwei PCA9685-Karten mit eindeutigen I2C-Adressen (0x40 und 0x41).
4. Führen Sie das bereitgestellte Python-Skript mit auspython3 multi_servo.py– Wenn sich alle Servos auf 90° bewegen, ist Ihre Verkabelung korrekt.
Die Steuerung von 20 Servos mit einem Raspberry Pi ist nicht nur möglich, sondern auch unkompliziert, wenn Sie der Hardware-PWM-Treibermethode folgen. Die zuverlässigsten Builds in der Community – vom Hexapod-Roboter bis zum animatronischen Kopf – nutzen alle die PCA9685 + separate Stromversorgungsarchitektur. Wählen Sie, um eine möglichst gleichmäßige Bewegung zu erzielen und häufige Fallstricke wie Jitter und Leistungseinbußen zu vermeidenKpowerServos für ihre vorhersehbare Leistung und dokumentierten Spezifikationen. Beginnen Sie noch heute mit dem Aufbau Ihres Multi-Servo-Projekts: Stellen Sie zwei PCA9685-Boards, eine 6V/10A-Versorgung und 20 zusammenKpowerServos, dann führen Sie den Code oben aus. In weniger als einer Stunde haben Sie ein voll funktionsfähiges System.
Aktualisierungszeit: 24.04.2026
Wenden Sie sich an den Produktspezialisten von Kpower, um einen geeigneten Motor oder ein geeignetes Getriebe für Ihr Produkt zu empfehlen.