🛠 Piloter les GPIO et périphériques avec l'Encoder Motor Driver Unit
Objectifs
Ce tutoriel avancé vise à démontrer comment utiliser les ressources internes de l'Encoder Motor Driver Unit (basée sur STM32G031) au-delà du simple pilotage moteur. Nous allons configurer la LED RGB WS2812C, lire les entrées GPIO disponibles via l'interface Grove, et comprendre l'interaction entre le microcontrôleur et le pont en H DRV8837. L'objectif est de créer une logique de feedback visuel et de contrôle externe.
Matériel nécessaire
- 1x M5Stack Encoder Motor Driver Unit (DRV8837DSGR)
- 1x Contrôleur M5Stack (Core2, CoreS3, ou Atom Lite avec Grove)
- 1x Câble Grove Grove
- 1x Moteur à engrenages 6 fils avec encodeur AB (3-15 PPR)
- 1x Alimentation DC 6-12V
- IDE Arduino avec bibliothèque M5Stack et M5Unified
Étapes
Installez les bibliothèques nécessaires. L'unité utilise une adresse I2C par défaut de 0x2F. ``cpp #include <M5Unified.h> #include <M5_I2CEncoderMotor.h> ``
- Configuration de l'environnement
Initialisez le bus I2C et l'objet moteur. Vérifiez la connexion avec le microcontrôleur STM32G031. ``cpp M5_I2CEncoderMotor motor; void setup() { M5.begin(); Wire.begin(); motor.init(0x2F); motor.setMotorMode(MOTOR_MODE_PWM); // Mode bas niveau pour test GPIO } ``
- Initialisation et communication I2C
La LED intégrée sert d'indicateur d'état. Utilisez la fonction dédiée pour changer la couleur selon la vitesse ou les erreurs. ``cpp void loop() { // Exemple : LED rouge si erreur, verte si actif if(motor.isRunning()) { motor.setLedColor(0, 255, 0); // Vert } else { motor.setLedColor(255, 0, 0); // Rouge } } ``
- Contrôle de la LED RGB (WS2812C)
L'unité expose des pins via le connecteur Grove. Pour lire un capteur externe (ex: bouton), configurez le pin correspondant en entrée. Notez que la logique interne du STM32 gère le multiplexage. ``cpp // Exemple générique de lecture via le bus I2C si le capteur est connecté en série // Ou utilisation directe des pins Grove si mappés sur le MCU principal ``
- Utilisation des GPIO via Grove
Implémentez une boucle qui ajuste la PWM en fonction d'une entrée externe simulée ou réelle, tout en mettant à jour la LED. ``cpp int speed = 100; // Lecture d'une valeur (simulée ou via capteur I2C) speed = constrain(speed + random(-10, 10), 0, 255); motor.setMotorSpeed(speed); delay(100); ``
- Boucle de contrôle avancée
Vérification
- La LED RGB change de couleur en temps réel selon l'état du moteur.
- Le moteur répond aux changements de vitesse envoyés via I2C.
- Aucun message d'erreur I2C n'apparaît dans le moniteur série.
Pour aller plus loin
Explorez le mode de contrôle en boucle fermée de position en utilisant les données de l'encodeur AB pour asservir la vitesse. Vous pouvez aussi configurer l'adresse I2C (0x08-0x77) pour gérer plusieurs unités sur le même bus.
Autres tutoriels pour cette carte
- Premier branchement et mise en route de l'Encoder Motor Driver Unit
- Maîtriser les entrées-sorties avec l'Encoder Motor Driver Unit
- Automatiser un mouvement précis avec l'Encoder Motor Driver
- Première mise en route du Driver Moteur Encoder
- Pilotage GPIO et LED RGB sur l'Encoder Motor Driver Unit
- Automatisation par retour d'encodeur avec la DRV8837
Exemples de code pour cette carte
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