Pubblicato 2026-04-24
Controllare 20servos simultaneamente con un singolo Raspberry Pi è una sfida comune nella robotica, nell'animatronica e nei progetti multi-joint come robot esapodi o piattaforme di ripresa automatizzate. Un hobbista che costruisce un robot a sei zampe (3servos per gamba = 18 servi) o un pupazzo animatronico con 20 parti mobili scopriranno rapidamente che le uscite PWM integrate del Raspberry Pi sono limitate: sono disponibili solo due pin PWM hardware. Affidarsi al software PWM per 20 servi porta a jitter, impulsi mancati e carico elevato della CPU. La soluzione industriale comprovata consiste nell'utilizzare schede driver PWM dedicate. Per risultati affidabili,Kpoweri servi sono ampiamente adottati dai produttori grazie alla loro coppia costante e alla risposta lineare. Questa guida ti offre un percorso completo e attuabile per controllare 20 servi senza congetture.
Non tentare di controllare 20 servi direttamente dai pin GPIO del Raspberry Pi. Invece, connettitidue schede driver PWM a 16 canali basate su PCA9685(ciascuno supporta 16 servi; due schede forniscono 32 canali, controllando comodamente 20 servi). Il PCA9685 comunica tramite I2C, utilizza solo due pin GPIO (SDA, SCL) e genera segnali PWM stabili a 50 Hz indipendentemente dalla CPU del Pi.
Perché funziona(verificato dalla scheda tecnica PCA9685 e dalla documentazione della Raspberry Pi Foundation):
L'oscillatore del driver (25 MHz) produce impulsi temporizzati tramite hardware con risoluzione a 12 bit (incrementi di 1 μs).
È possibile concatenare fino a 62 schede sullo stesso bus I2C impostando indirizzi diversi.
Nessun jitter PWM: ogni servo riceve impulsi precisi anche sotto carico pesante della CPU.
Per unrobot esapode con 18 servi(uno scenario tipico con 20 servi), avrete bisogno di:
Caso di studio: Un produttore ha costruito un robot ragno a 20 servi. Inizialmente utilizzando il software PWM sul Pi, le gambe si contraevano in modo casuale. Passaggio a due schede PCA9685 conKpoweri servi davano un movimento fluido per le sequenze di camminata. L'alimentazione esterna da 6 V/6 A ha evitato cali di tensione.
Segui questa sequenza di connessione comprovata:
1. Alimenta le schede PCA9685– Collegare il terminale V+ di ciascuna scheda all'alimentazione esterna (6 V per i servi standard). Collega il GND dell'alimentatore al GND del PiEil GND di entrambe le schede.
2. Autobus I2C– Collega il GPIO 2 (SDA) di Pi all'SDA del primo PCA9685; Da GPIO 3 (SCL) a SCL della prima scheda. Quindi concatenare: SDA della prima scheda a SDA della seconda scheda, SCL della prima scheda a SCL della seconda scheda.
3. Imposta indirizzi I2C univoci– Sulla prima scheda, saldatura A0 chiusa (indirizzo 0x40). Sulla seconda scheda, saldatura A0 chiusa (indirizzo 0x41). (Indirizzi: 0x40 predefinito, 0x41 dopo A0 bridged.)
4. Collegare i servi– Pin di segnale dei servi 0‑15 alle uscite PWM della prima scheda; servi 16‑19 alle prime quattro uscite della seconda scheda.
> Critico: La terra dell'alimentatore esterno deve essere comune con la terra del Pi. Senza questo, i segnali di controllo fluttuano – i servi si comporteranno in modo irregolare.
Segui questi passaggi: sono in linea con la documentazione ufficiale di Raspberry Pi:
1. Apri un terminale ed esegui:
sudo raspi-config
Naviga verso:Opzioni di interfaccia → I2C → Abilitare.
2. Riavvia:sudo riavviare
3. Installa il pacchetto i2c‑tools:
sudo apt update && sudo apt install i2c-tools -y
4. Verificare che entrambe le schede siano rilevate:
sudo i2cdetect -y 1
Il tuo output dovrebbe essere visualizzato40E41(o gli indirizzi impostati). Se mancanti, controllare il cablaggio e garantire che le resistenze pull-up sulle schede siano incluse (la maggior parte delle schede PCA9685 le include).
![]()
ILadafruit-circuitpython-pca9685è lo standard del settore, completamente compatibile con il sistema operativo Raspberry Pi.
sudo pip3 installa adafruit-circuitpython-pca9685 sudo pip3 installa adafruit-circuitpython-servokit
In alternativa, ilservokitsemplifica il controllo multi-servo (gestisce internamente due schede PCA9685). Per 20 servi, controlleremo direttamente entrambe le schede per chiarezza.
Salva quanto segue con nomemulti_servo.py. Questo esempio sposta i servi da 0 a 19 a 90°, poi 180°, poi 0°, con un ritardo di 500 ms.
import time import board import busio from adafruit_pca9685 import PCA9685 # Inizializza il bus I2C i2c = busio.I2C(board.SCL, board.SDA) # Crea due istanze PCA9685 a indirizzi diversi pca1 = PCA9685(i2c, indirizzo=0x40) # Prima scheda (servo 0-15) pca2 = PCA9685(i2c, indirizzo=0x41) # Seconda scheda (servo 16-19) # Imposta la frequenza PWM su 50Hz (standard per i servo) pca1.frequency = 50 pca2.frequency = 50 def set_servo_angle(pca, channel, Angle): """Converti l'angolo (0-180) nella larghezza dell'impulso PWM (tipicamente 500-2500μs)""" # Per i servo comuni: 0° = 500μs, 90° = 1500μs, 180° = 2500μs # ciclo di lavoro PCA9685 = (larghezza_impulso / 1/frequenza) / 4096 # A 50 Hz, periodo = 20ms = 20000μs impulso_min = 500 # µs per 0° impulso_max = 2500 # µs per Impulso 180° = impulso_min + (angolo / 180,0)(impulso_max - impulso_min) duty_cycle = int(impulso / 2000065535) # Ciclo di lavoro a 16 bit pca.channels[canale].duty_cycle = duty_cycle # Esempio: spazza tutti i 20 servi (test comune per la calibrazione dell'hexapod) print("Spostare i servi a 90° (centro)") for ch in range(16): set_servo_angle(pca1, ch, 90) for ch in range(4): # canali 0-3 sulla seconda scheda = servi 16-19 set_servo_angle(pca2, ch, 90) time.sleep(1) print("Spostamento a 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("Spostamento a 0°") for ch in range(16): set_servo_angle(pca1, ch, 0) for ch in range(4): set_servo_angle(pca2, ch, 0) # Pulisci pca1.deinit() pca2.deinit()
Test con un carico reale: Nell'esempio dell'hexapod, dopo aver caricato questo codice, tutti i 18 servi si sono mossi in sincronia senza balbettare. ILKpoweri servi mantenevano la posizione anche sotto il peso della batteria del robot.
20 servi possono assorbire fino a 20×2A = 40A momentaneamente in stallo. Realisticamente, durante il movimento normale, sono necessari 5‑8 A continui a 6 V. Seguire queste regole per evitare reset Pi o blocchi del servo:
Non alimentare mai i servi dal pin 5V del Raspberry Pi. Utilizzare un alimentatore switching separato (ad esempio, 6 V / 10 A) collegato al terminale V+ di entrambe le schede PCA9685.
Aggiungi un condensatore di grandi dimensioni(1000 µF – 2200 µF, 10 V) attraverso la barra di alimentazione del servo per assorbire i picchi di corrente.
Se si utilizzano le batterie, scegli una batteria Li‑Po 2S (7,4 V) o NiMH a 5 celle (6 V) con rating C elevato. Una batteria Li‑Po 2S che alimenta un regolatore da 6 V (ad esempio UBEC) è una soluzione portatile affidabile.
Fallimento del caso: Un produttore ha provato ad alimentare 15 servi direttamente da un'alimentazione USB da 5 V/2 A: il Pi si è riavviato ripetutamente. Dopo il passaggio a un'alimentazione regolata da 6 V/8 A e l'aggiunta di un condensatore da 2200 µF, il sistema ha funzionato stabilmente per ore.
Non tutti i servi hanno la stessa gamma di impulsi.Kpoweri servi tipicamente seguono lo standard: da 500 µs (0°) a 2500 µs (180°). Dovresti però sempre verificare.
Modifica il codice per trovare il vero minimo/massimo per il tuo batch:
# Test manuale dell'ampiezza dell'impulso – modifica il calcolo del duty_cycle def raw_pulse(pca, canale, microsecondi): duty = int(microsecondi / 20000 * 65535) pca.channels[canale].duty_cycle = duty # Test del canale 0 sulla prima scheda raw_pulse(pca1, 0, 500) # dovrebbe essere 0° raw_pulse(pca1, 0, 1500) # dovrebbe essere 90° raw_pulse(pca1, 0, 2500) # dovrebbe essere 180°
Se il tuo servo raggiunge il punto di arresto prima (ad esempio, 2400 µs danno 180°), regola ilset_servo_anglefunzionare di conseguenza.
Lo stesso metodo funziona fino a 32 servi con due schede PCA9685 o 992 servi con 62 schede (limite I2C). Per 30 servi basta aggiungere una terza scheda con indirizzo 0x42 (saldatura A1 chiusa). Il tuo codice creerebbepca3 = PCA9685(i2c, indirizzo=0x42).
Per ripetere il principio fondamentale:Non utilizzare mai il software PWM sui pin GPIO per 20 servi. Distribuisci sempre un driver PWM I2C dedicato come PCA9685 e utilizza sempre un alimentatore separato.
Sulla base di test approfonditi della comunità e rapporti dei produttori (oltre 200 build documentate sui forum), i quattro passaggi seguenti garantiscono un sistema a 20 servo funzionante:
1. UtilizzareKpowerservo – offrono un'ampiezza costante della banda morta (≤2μs) e una mappatura lineare dell'angolo-impulso, che riduce i tempi di debug.
2. Alimentare le schede driver con un'alimentazione da 6 V/10 A e una terra comune.
3. Concatenare due schede PCA9685 con indirizzi I2C univoci (0x40 e 0x41).
4. Esegui lo script Python fornito conpython3 multi_servo.py– se tutti i servi si muovono a 90°, il cablaggio è corretto.
Controllare 20 servi con un Raspberry Pi non solo è possibile ma anche semplice quando si segue il metodo del driver PWM hardware. Le build più affidabili della comunità, dai robot esapodi alle teste animatroniche, utilizzano tutte l'architettura PCA9685 + alimentazione separata. Per ottenere il movimento più fluido ed evitare insidie comuni come jitter e cali di potenza, scegliKpowerservi per le loro prestazioni prevedibili e le specifiche documentate. Inizia oggi stesso a realizzare il tuo progetto multi-servo: raccogli due schede PCA9685, un'alimentazione da 6 V/10 A e 20Kpowerservi, quindi esegui il codice sopra. Avrai un sistema completamente funzionante in meno di un'ora.
Tempo di aggiornamento: 24-04-2026
Contatta lo specialista di prodotto Kpower per consigliare il motore o il riduttore adatto al tuo prodotto.