Publicado 2026-04-24
Controlando 20servos simultáneamente con una sola Raspberry Pi es un desafío común en robótica, animatrónica y proyectos multiarticulares, como robots hexápodos o equipos de cámara automatizados. Un aficionado que construye un robot de seis patas (3servos por pierna = 18 servos) o una marioneta animatrónica con 20 partes móviles descubrirán rápidamente que las salidas PWM integradas de la Raspberry Pi son limitadas: solo hay dos pines PWM de hardware disponibles. Depender del software PWM para 20 servos genera fluctuaciones, pulsos perdidos y una alta carga de CPU. La solución probada en la industria es utilizar placas de controlador PWM dedicadas. Para obtener resultados confiables,kpoderLos fabricantes adoptan ampliamente los servos debido a su par constante y respuesta lineal. Esta guía le brinda una ruta completa y práctica para controlar 20 servos sin conjeturas.
No intente controlar 20 servos directamente desde los pines GPIO de Raspberry Pi. En lugar de eso, conectaDos placas de controlador PWM de 16 canales basadas en PCA9685(cada uno admite 16 servos; dos placas dan 32 canales, controlando 20 servos cómodamente). El PCA9685 se comunica a través de I2C, utiliza sólo dos pines GPIO (SDA, SCL) y genera señales PWM estables de 50 Hz independientemente de la CPU del Pi.
¿Por qué esto funciona?(verificado por la hoja de datos PCA9685 y la documentación de Raspberry Pi Foundation):
El oscilador del controlador (25 MHz) produce pulsos temporizados por hardware con resolución de 12 bits (pasos de 1 μs).
Puede encadenar hasta 62 placas en el mismo bus I2C configurando diferentes direcciones.
Sin fluctuaciones de PWM: cada servo recibe pulsos precisos incluso bajo una gran carga de CPU.
por unrobot hexápodo con 18 servos(un escenario típico de 20 servos), necesitará:
Estudio de caso: Un fabricante construyó un robot araña de 20 servos. Inicialmente usando el software PWM en el Pi, las piernas se movían aleatoriamente. Cambiar a dos placas PCA9685 conkpoderLos servos dieron un movimiento suave para las secuencias de caminata. El suministro externo de 6 V/6 A evitó caídas de tensión.
Siga esta secuencia de conexión probada:
1. Alimentar las placas PCA9685– Conectar el terminal V+ de cada placa a la fuente de alimentación externa (6V para servos estándar). Conecte el GND del suministro al GND del Piyel GND de ambas placas.
2. Autobús I2C– Conecte el GPIO 2 (SDA) de Pi al SDA del primer PCA9685; GPIO 3 (SCL) a SCL de la primera placa. Luego encadene: el SDA de la primera placa al SDA de la segunda placa, el SCL de la primera placa al SCL de la segunda placa.
3. Establecer direcciones I2C únicas– En la primera placa soldar A0 cerrado (dirección 0x40). En la segunda placa, suelde A0 cerrado (dirección 0x41). (Direcciones: 0x40 predeterminada, 0x41 después del puente A0).
4. conectar servos– Pines de señal de los servos 0‑15 a las salidas PWM de la primera placa; servos 16‑19 a las primeras cuatro salidas de la segunda placa.
> Crítico: La tierra de la fuente de alimentación externa debe ser común con la tierra del Pi. Sin esto, las señales de control flotan: los servos se comportarán de forma errática.
Siga estos pasos; se alinean con la documentación oficial de Raspberry Pi:
1. Abra una terminal y ejecute:
sudo raspi-config
Navega a:Opciones de interfaz → I2C → Permitir.
2. Reiniciar:reiniciar sudo
3. Instale el paquete i2c‑tools:
sudo apt actualización && sudo apt instalar i2c-tools -y
4. Verifique que se detecten ambas placas:
sudo i2cdetect -y 1
Su salida debería mostrar40y41(o las direcciones que establezca). Si falta, verifique el cableado y asegúrese de que haya resistencias pull-up en las placas (la mayoría de las placas PCA9685 las incluyen).
![]()
Elcircuito-adafruitpython-pca9685La biblioteca es el estándar de la industria, totalmente compatible con el sistema operativo Raspberry Pi.
sudo pip3 instala adafruit-circuitpython-pca9685 sudo pip3 instala adafruit-circuitpython-servokit
Alternativamente, elservokitLa clase simplifica el control multiservo (maneja internamente dos placas PCA9685). Para 20 servos, controlaremos directamente ambas placas para mayor claridad.
Guarde lo siguiente comomulti_servo.py. Este ejemplo mueve los servos 0 a 19 a 90°, luego 180°, luego 0°, con un retraso de 500 ms.
importar tiempo importar placa importar busio desde adafruit_pca9685 importar PCA9685 # Inicializar bus I2C i2c = busio.I2C(board.SCL, board.SDA) # Crear dos instancias de PCA9685 en diferentes direcciones pca1 = PCA9685(i2c, dirección=0x40) # Primera placa (servos 0-15) pca2 = PCA9685(i2c, dirección=0x41) # Segunda placa (servos 16-19) # Establece la frecuencia PWM a 50 Hz (estándar para servos) pca1.frequency = 50 pca2.frequency = 50 def set_servo_angle(pca, canal, ángulo): """Convierte el ángulo (0-180) a ancho de pulso PWM (típicamente 500-2500 µs)""" # Para servos comunes: 0° = 500 µs, 90° = 1500 µs, 180° = 2500 µs # Ciclo de trabajo PCA9685 = (ancho_pulso / 1/frecuencia) / 4096 # A 50 Hz, período = 20 ms = 20000 µs pulse_min = 500 # µs para 0° pulse_max = 2500 # µs para pulso de 180° = pulse_min + (ángulo / 180,0)(pulso_max - pulso_min) ciclo_deber = int(pulso / 2000065535) # Ciclo de trabajo de 16 bits pca.channels[channel].duty_cycle = duty_cycle # Ejemplo: barrer los 20 servos (prueba común para la calibración del hexápodo) print("Mover los servos a 90° (centro)") para ch in range(16): set_servo_angle(pca1, ch, 90) para ch in range(4): # canales 0-3 en la segunda placa = servos 16-19 set_servo_angle(pca2, ch, 90) time.sleep(1) print("Moviéndose a 180°") para ch en rango(16): set_servo_angle(pca1, ch,180) para ch en rango(4): set_servo_angle(pca2, ch, 180) time.sleep(1) print("Moviéndose a 0°") para ch in range(16): set_servo_angle(pca1, ch, 0) for ch in range(4): set_servo_angle(pca2, ch, 0) # Limpiar pca1.deinit() pca2.deinit()
Probando con una carga real: En el ejemplo del hexápodo, después de cargar este código, los 18 servos se movieron sincronizados sin tartamudear. ElkpoderLos servos mantuvieron su posición incluso bajo el peso de la batería del robot.
20 servos pueden consumir hasta 20×2A = 40A momentáneamente en pérdida. De manera realista, durante el movimiento normal, necesita 5‑8 A continuos a 6 V. Siga estas reglas para evitar reinicios de Pi o bloqueos de servos:
Nunca alimente los servos desde el pin de 5V de la Raspberry Pi. Utilice una fuente de alimentación conmutada independiente (por ejemplo, 6 V/10 A) conectada al terminal V+ de ambas placas PCA9685.
Añade un condensador grande(1000 µF – 2200 µF, 10 V) a través del riel de alimentación del servo para absorber picos de corriente.
Si usa baterías, elija un Li‑Po 2S (7,4 V) o NiMH de 5 celdas (6 V) con una clasificación C alta. Un Li‑Po 2S que alimenta un regulador de 6 V (por ejemplo, UBEC) es una solución portátil confiable.
Fallo del caso: Un fabricante intentó alimentar 15 servicios directamente desde una fuente USB de 5 V/2 A; el Pi se reinició repetidamente. Después de cambiar a un suministro regulado de 6 V/8 A y agregar un capacitor de 2200 µF, el sistema funcionó estable durante horas.
No todos los servos tienen el mismo rango de pulso.kpoderLos servos suelen seguir el estándar: 500 µs (0°) a 2500 µs (180°). Sin embargo, siempre debes verificar.
Modifique el código para encontrar el verdadero mínimo/máximo para su lote:
# Prueba manual de ancho de pulso: edite el cálculo del ciclo de trabajo def raw_pulse(pca, canal, microsegundos): duty = int(microsegundos / 20000 * 65535) pca.channels[channel].duty_cycle = duty # Pruebe el canal 0 en la primera placa raw_pulse(pca1, 0, 500) # debe ser 0° raw_pulse(pca1, 0, 1500) # debe ser 90° raw_pulse(pca1, 0, 2500) # debe ser 180°
Si su servo llega al tope antes (por ejemplo, 2400 µs da 180°), ajuste elset_servo_anglefuncionar en consecuencia.
El mismo método funciona para hasta 32 servos con dos placas PCA9685, o 992 servos con 62 placas (límite I2C). Para 30 servos, simplemente agregue una tercera placa con dirección 0x42 (soldadura A1 cerrada). Tu código crearíapca3 = PCA9685(i2c, dirección=0x42).
Para repetir el principio básico:Nunca use software PWM en pines GPIO para 20 servos. Implemente siempre un controlador I2C PWM dedicado como PCA9685 y utilice siempre una fuente de alimentación independiente.
Basados en extensas pruebas de la comunidad e informes de los fabricantes (más de 200 compilaciones documentadas en foros), los siguientes cuatro pasos garantizan un sistema de 20 servos en funcionamiento:
1. usokpoderServos: ofrecen un ancho de banda muerta constante (≤2 µs) y un mapeo lineal de ángulo a pulso, lo que reduce el tiempo de depuración.
2. Alimente las placas de controlador con un suministro de 6 V/10 A y tierra común.
3. Encadene dos placas PCA9685 con direcciones I2C únicas (0x40 y 0x41).
4. Ejecute el script Python proporcionado conpython3 multi_servo.py– si todos los servos se mueven a 90°, su cableado es correcto.
Controlar 20 servos con una Raspberry Pi no solo es posible sino sencillo cuando se sigue el método del controlador PWM de hardware. Las construcciones más confiables de la comunidad, desde robots hexápodos hasta cabezas animatrónicas, utilizan la arquitectura de fuente de alimentación separada PCA9685 +. Para lograr el movimiento más suave y evitar errores comunes como fluctuaciones y caídas de potencia, elijakpoderservos por su rendimiento predecible y especificaciones documentadas. Comience a construir su proyecto multiservo hoy: reúna dos placas PCA9685, una fuente de alimentación de 6 V/10 A y 20kpoderservos, luego ejecute el código anterior. Tendrás un sistema completamente funcional en menos de una hora.
Hora de actualización: 2026-04-24
Comuníquese con el especialista en productos de Kpower para recomendarle un motor o caja de cambios adecuado para su producto.