🛠 Automatización distribuida: Control preciso y telemetría con la Encoder Motor Driver Unit
Objetivos
Este tutorial avanzado tiene como objetivo diseñar un nodo de automatización autónomo utilizando la Unidad Encoder Motor Driver (DRV8837DSGR). La meta es ir más allá del control manual para implementar una estrategia de control en bucle cerrado (PID) basada en datos del codificador, mientras se integra la tarjeta en una red IoT para telemetría. Aprovecharemos las capacidades de detección de corriente INA199A para la protección del motor y el LED RGB para la indicación de estado local.
Hardware Necesario
- Placa principal compatible con M5Stack (ej: Core2 o AtomS3) con soporte I2C.
- Unidad Encoder Motor Driver (DRV8837DSGR).
- Motor de engranajes M5Stack (compatible de 6 hilos con codificador AB).
- Fuente de alimentación externa DC 6-12V.
- Cable Grove I2C.
- Biblioteca M5Stack para Arduino/PlatformIO.
- Broker MQTT o API REST para la recepción de datos.
Pasos
Conecte la unidad al puerto Grove I2C de su placa principal. Asegúrese de que la fuente de alimentación externa esté conectada al conector DC de la unidad (6-12V). Por defecto, la dirección I2C es 0x2F. Para una red multinodo, debe configurar una dirección única (entre 0x08 y 0x77) a través de las líneas AD0/AD1 si están disponibles, o mediante el comando de software inicial si el firmware lo permite, para evitar conflictos de bus.
- Configuración de Hardware y Direccionamiento
Inicialice la comunicación I2C en el código. Configure el modo de funcionamiento en "Closed Loop" (bucle cerrado). Calibre la resolución del codificador. La unidad admite codificadores de 3 a 15 PPR (Pulsos por Revolución). Defina la constante PPR según su motor específico para convertir pulsos en grados o revoluciones.
- Inicialización y Calibración del Codificador
No se limite a enviar una consigna de velocidad. Lea los datos de posición y velocidad a través de los registros I2C. Implemente un algoritmo PID simple en la placa principal: calcule el error entre la posición objetivo y la posición actual, luego ajuste la consigna PWM enviada a la unidad. Utilice los modos "Start/Stop progresivo" para evitar choques mecánicos durante los cambios de consigna.
- Implementación del Bucle de Control PID
Cada 500ms, lea los registros de estado: consumo de corriente (INA199A), velocidad actual y posición. Publique estos datos en un broker MQTT. Utilice el circuito de detección de corriente para definir un umbral de seguridad: si la corriente supera 1.2A (límite de carga), detenga inmediatamente el motor para evitar el sobrecalentamiento.
- Integración de Red y Telemetría
Controle el LED WS2812C integrado para reflejar el estado del sistema: Verde (funcionamiento nominal), Rojo (error de posición o sobrecorriente), Azul (conexión de red activa). Esto permite un diagnóstico visual inmediato sin pantalla.
- Retroalimentación Visual mediante LED RGB
Verificación
- Verifique que el motor alcance la posición objetivo con una precisión inferior al 5%.
- Confirme que el LED cambie de color durante un atasco mecánico (aumento de corriente detectado por el INA199A).
- Asegúrese de que los paquetes MQTT lleguen al servidor con las coordenadas de posición correctas.
Para Ir Más Allá
Explore la sincronización multi-eje utilizando varias unidades en el mismo bus I2C con direcciones distintas. Integre un algoritmo de filtro de Kalman para suavizar los datos del codificador AB y mejorar la estabilidad del control PID a alta velocidad.
Otros tutoriales para esta placa
- Primer cableado y puesta en marcha de la Encoder Motor Driver Unit
- Dominar las E/S con la Unidad de Motor con Encoder
- Automatizar un movimiento preciso con el Controlador de Motor con Encoder
- Primer encendido del Driver Motor Encoder
- Control de GPIO y LED RGB en la Encoder Motor Driver Unit
- Automatización con realimentación de encoder DRV8837
Ejemplos de código para esta placa
m5stack-encoder-motor-i2c-esp32.inoC++ (Arduino)m5stack-encoder-motor-pwm-control.inoC++ (Arduino)m5stack-encoder-motor-closed-loop.inoC++ (Arduino)m5stack-encoder-motor-position-control.inoC++ (Arduino)m5stack-encoder-motor-led-status.inoC++ (Arduino)closed_loop_speed_pid.pyMicroPython