Volver al Blog
Electrónica24 de julio de 2026

Guía Completa del Controlador Servos 16 Canales Pca9685 Pwm

Tutorial de Implementación del Controlador Servos 16 Canales Pca9685 Pwm

A

Administrador

Equipo de Pixelnova

Guía Completa del Controlador Servos 16 Canales Pca9685 Pwm

Introducción

El PCA9685 es un controlador PWM (Modulación por Ancho de Pulso) de 16 canales con interfaz I2C, diseñado específicamente para controlar servomotores y LEDs con alta precisión. Este chip representa una solución elegante para proyectos que requieren múltiples salidas PWM sin consumir los valiosos pines del microcontrolador.

Con el PCA9685, puedes controlar hasta 16 servomotores simultáneamente utilizando solo 2 pines del microcontrolador (SDA y SCL de I2C). Además, es posible encadenar hasta 62 módulos en un mismo bus I2C, lo que te permite controlar hasta 992 servos o salidas PWM en total.


Características Principales

Especificaciones Técnicas

ParámetroValor
Canales de salida16 canales independientes
Resolución12 bits (4096 niveles)
InterfazI2C (2 pines)
Rango de direcciones I2C0x40 - 0x7F (6 pines de selección)
Frecuencia PWMAjustable hasta ~1.6 KHz
Tensión de operación3.3V - 5.5V
Tensión de salidaHasta 5.5V
Modos de salidaPush-pull o open-drain configurable

Ventajas del PCA9685

  • Control independiente: Cada canal tiene su propio contador y registro de 12 bits
  • Free-running: El controlador PWM funciona de manera autónoma sin consumir ciclos del microcontrolador
  • Compatibilidad 5V: Puede ser controlado desde un microcontrolador de 3.3V mientras gestiona salidas de hasta 5.5V
  • Máxima flexibilidad: 6 pines de selección de dirección permiten hasta 62 dispositivos en un bus I2C
  • Protección integrada: Resistencias en serie de 220 ohmios en todas las líneas de salida

Aplicaciones Típicas

El PCA9685 es ideal para proyectos que requieren:

  1. Robótica: Control de hexápodos, robots articulados y brazos robóticos
  2. Animatrónica: Control preciso de múltiples servos para efectos especiales
  3. Iluminación: Control PWM de múltiples LEDs con alta resolución
  4. Arte cinético: Instalaciones artísticas con múltiples partes móviles
  5. Sistemas de cámara: Plataformas pan-tilt para cámaras y sensores

Pinout y Conexiones

Pines del Módulo PCA9685

┌─────────────────────────────────────────────────┐
│                    PCA9685                      │
│                                                 │
│  VCC  GND  SDA  SCL  OE  ADDR  ~  16x Servo    │
│                                                 │
│  ─────────────────────────────────────────────  │
│  Bloque de terminales para alimentación         │
└─────────────────────────────────────────────────┘

Descripción de Pines

PinDescripción
VCCAlimentación principal (4.5V - 5.5V) para los servos
GNDMasa común
V+Entrada de alimentación alternativa (terminal block)
SDALínea de datos I2C
SCLLínea de reloj I2C
OEOutput Enable - permite deshabilitar todas las salidas
ADDR6 pines de selección de dirección I2C (A0-A5)
Conectores de servo16 grupos de 3 pines (Señal, VCC, GND)

Conexión Básica con Arduino

Arduino          PCA9685
──────          ───────
5V    ────────── VCC
GND   ────────── GND
A4    ────────── SDA
A5    ────────── SCL

Nota importante: Para alimentación de servos, se recomienda usar una fuente externa conectada al terminal block, ya que los servos pueden consumir corrientes elevadas que podrían dañar el regulador del Arduino.


Configuración de Direcciones I2C

El PCA9685 viene con dirección I2C predeterminada de 0x40. Mediante los 6 pines de selección de dirección (ADDR), puedes modificar esta dirección en incrementos de 1, permitiendo hasta 62 dispositivos únicos en el mismo bus I2C.

Tabla de Direcciones I2C

Jumpers CerradosDirección I2C
Ninguno0x40
A00x41
A10x42
A0 + A10x43
......
A0-A5 todos0x7F

Librerías Recomendadas

Para Arduino

La biblioteca oficial de Adafruit es la más utilizada y mejor mantenida:

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

// Crear instancia del controlador
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

void setup() {
  pwm.begin();
  pwm.setPWMFreq(60);  // Frecuencia típica para servos (50-60Hz)
}

void loop() {
  // Controlar servo en el canal 0
  pwm.setPWM(0, 0, 300);  // Posición mínima
  delay(1000);
  pwm.setPWM(0, 0, 600);  // Posición central
  delay(1000);
  pwm.setPWM(0, 0, 900);  // Posición máxima
  delay(1000);
}

Para Raspberry Pi (Python/CircuitPython)

import board
import busio
from adafruit_pca9685 import PCA9685

# Inicializar el bus I2C
i2c = busio.I2C(board.SCL, board.SDA)

# Crear instancia del PCA9685
pca = PCA9685(i2c, address=0x40)

# Configurar frecuencia para servos
pca.frequency = 60

# Controlar servo en el canal 0
pca.channels[0].duty_cycle = 0x1000  # Posición mínima

Configuración de Frecuencia PWM

La frecuencia del PWM se puede ajustar según la aplicación:

Para Servomotores

  • Frecuencia recomendada: 50Hz - 60Hz
  • Resolución típica: 4µs por paso a 60Hz

Para LEDs

  • Frecuencia recomendada: 1KHz - 1.6KHz
  • Evita el parpadeo visible utilizando frecuencias superiores a 100Hz

Cálculo de Frecuencia

// Función interna de la librería
void setPWMFreq(double freq) {
  prescale = 25000000.0;  // Oscilador interno de 25MHz
  prescale /= 4096;
  prescale /= freq;
  prescale -= 1;
  // ... configuración del registro
}

Control de Posición de Servos

Relación Pulso-Posición

Los servomotores estándar responden a pulsos de:

  • 1ms (1000µs): Posición mínima (0°)
  • 1.5ms (1500µs): Posición central (90°)
  • 2ms (2000µs): Posición máxima (180°)

Conversión a Valores PWM (12 bits)

Con una frecuencia de 60Hz (periodo de ~16.67ms):

Valor PWM = (Duración del pulso en µs / Periodo en µs) × 4096

Ejemplo para 1.5ms a 60Hz:
Valor = (1500 / 16667) × 4096 ≈ 369

Valores Típicos por Posición

PosiciónDuración (µs)Valor PWM (60Hz)
500123
45°750184
90°1500369
135°1750430
180°2000491

Nota: Los valores pueden variar según el modelo de servo. Calibra cada servo individualmente para obtener el rango exacto.


Ejemplos de Código

Ejemplo 1: Escaneo de Servos

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

void setup() {
  Serial.begin(9600);
  pwm.begin();
  pwm.setPWMFreq(60);
  
  Serial.println("Escaneando servos...");
  
  // Escanear todos los canales
  for (int channel = 0; channel < 16; channel++) {
    Serial.print("Canal ");
    Serial.println(channel);
    
    // Mover servo de 0 a 4095 y volver
    for (int pulse = 0; pulse < 4095; pulse += 5) {
      pwm.setPWM(channel, 0, pulse);
      delay(1);
    }
    for (int pulse = 4095; pulse > 0; pulse -= 5) {
      pwm.setPWM(channel, 0, pulse);
      delay(1);
    }
  }
}

void loop() {
  // Nothing here
}

Ejemplo 2: Control de Hexápodo

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

// Definición de canales para cada articulación
#define COXA_FL 0   // Coxa Frente Izquierda
#define FEMUR_FL 1  // Fémur Frente Izquierda
#define TIBIA_FL 2  // Tibia Frente Izquierda
// ... definir resto de canales

void setup() {
  pwm.begin();
  pwm.setPWMFreq(50);
  
  // Inicializar todas las patas en posición de reposo
  setHomePosition();
}

void loop() {
  // Secuencia de marcha tripedal
  walkForward();
  delay(1000);
  walkBackward();
  delay(1000);
}

void setHomePosition() {
  // Posición central para todos los servos
  for (int i = 0; i < 16; i++) {
    pwm.setPWM(i, 0, 350);  // Ajustar según calibración
  }
}

void walkForward() {
  // Implementar secuencia de movimiento
  // ...
}

Alimentación y Consideraciones de Energía

Requisitos de Alimentación

ComponenteTensiónCorriente Típica
PCA9685 (chip)3.3V - 5.5V10mA
Servo micro (SG90)4.8V - 6V100mA - 500mA
Servo estándar (MG996R)4.8V - 6.6V500mA - 2A
Servo high-torque6V - 7.4V1A - 3A

Esquema de Alimentación Recomendado

                    ┌─────────────────┐
                    │  Fuente 5V/10A  │
                    └────────┬────────┘
                             │
              ┌──────────────┴──────────────┐
              │                             │
         ┌────▼────┐                  ┌────▼────┐
         │ PCA9685 │                  │ Arduino │
         │  VCC    │                  │  5V     │
         └────┬────┘                  └────┬────┘
              │                             │
              └──────────┬──────────────────┘
                         │
                    ┌────▼────┐
                    │  GND    │
                    │  Común  │
                    └─────────┘

Importante: Siempre conecta el GND de la fuente de alimentación, el PCA9685 y el microcontrolador a un punto común para garantizar una referencia de tensión estable.


Solución de Problemas

Problema: Servos no se mueven

Posibles causas:

  1. Alimentación insuficiente
  2. Dirección I2C incorrecta
  3. Frecuencia PWM mal configurada

Solución:

// Verificar comunicación I2C
void setup() {
  Wire.begin();
  Serial.begin(9600);
  
  Serial.println("Escaneando bus I2C...");
  for (byte i = 0; i < 127; i++) {
    Wire.beginTransmission(i);
    if (Wire.endTransmission() == 0) {
      Serial.print("Dispositivo encontrado en: 0x");
      Serial.println(i, HEX);
    }
  }
}

Problema: Servos se mueven aleatoriamente

Posibles causas:

  1. Ruido en la alimentación
  2. Falta de condensador de filtrado
  3. Cables demasiado largos

Solución:

  • Añadir un condensador electrolítico de 100µF - 1000µF entre VCC y GND cerca del PCA9685
  • Usar cables cortos y de calibre adecuado
  • Implementar un condensador de 0.1µF cerámico en paralelo para ruido de alta frecuencia

Problema: Comunicación I2C inestable

Solución:

  • Añadir resistencias de pull-up de 4.7KΩ a 10KΩ en las líneas SDA y SCL
  • Verificar que la frecuencia de I2C no sea demasiado alta (100KHz estándar)
  • Acortar los cables I2C

Mejores Prácticas

1. Calibración Individual

Cada servo tiene características ligeramente diferentes. Calibra cada uno individualmente para obtener el rango de movimiento exacto.

2. Arranque Suave

Implementa rampas de aceleración para evitar movimientos bruscos que puedan dañar la mecánica o consumir picos de corriente elevados.

3. Supervisión de Temperatura

Los servos pueden calentarse durante uso prolongado. Implementa períodos de descanso en aplicaciones de alta demanda.

4. Protección contra Sobrecorriente

Considera añadir fusibles o protección electrónica para evitar daños en caso de atasco mecánico.

5. Backup de Configuración

Guarda las posiciones calibradas en EEPROM o Flash para no perder la configuración tras reinicios.


Proyectos Sugeridos

Nivel Principiante

  1. Control de un solo servo: Familiarízate con la configuración básica
  2. Semáforo con LEDs: Practica el control PWM para iluminación
  3. Plataforma pan-tilt: Control de dos servos para cámara

Nivel Intermedio

  1. Brazo robótico de 4 DOF: Control de 4 servos coordinados
  2. Robo-armadillo: Hexápodo simplificado con 6 servos
  3. Seguidor de sol: Sistema automático con servos y LDR

Nivel Avanzado

  1. Hexápodo completo: 18 servos (usando 2 módulos PCA9685)
  2. Robo-humanoid: 20+ servos para caminata bípeda
  3. Animatrónica interactiva: Combinación con sensores y retroalimentación

Recursos Adicionales

Documentación Oficial

Librerías

Herramientas Útiles

  • I2C Scanner: Para detectar dispositivos en el bus
  • Servo Tester: Para calibrar individualmente cada servo
  • Osciloscopio: Para verificar la señal PWM generada

Conclusión

El controlador PCA9685 es una solución versátil y económica para proyectos que requieren múltiples salidas PWM. Su interfaz I2C simplifica enormemente el cableado y libera valiosos pines del microcontrolador para otras funciones. La resolución de 12 bits proporciona un control preciso adecuado para la mayoría de aplicaciones con servomotores y LEDs.

Ya sea que estés construyendo un simple brazo robótico o un complejo hexápodo caminante, el PCA9685 te proporciona la base sólida sobre la cual desarrollar tus proyectos de robótica y automatización.


Documento creado para el Blog de Artículos de Electrónica
Última actualización: 2026