🛠 Pilotage GPIO et LED RGB sur l'Encoder Motor Driver Unit
Objectifs
Ce tutoriel vise à exploiter les capacités d'entrée/sortie de l'Encoder Motor Driver Unit (EMDU) au-delà du simple contrôle moteur. Nous allons configurer les broches GPIO disponibles pour interagir avec des capteurs ou actionneurs simples, tout en synchronisant l'état du moteur avec la LED RGB intégrée (WS2812C). L'objectif est de créer un système où la couleur de la LED reflète l'état du moteur (rouge pour arrêt, vert pour marche, bleu pour erreur ou détection de courant élevée), démontrant ainsi la polyvalence de l'interface I2C pour le contrôle périphérique.
Matériel nécessaire
- 1x M5Stack Encoder Motor Driver Unit (DRV8837DSGR)
- 1x M5Stack Core2 ou CoreS3 (ou tout contrôleur compatible Grove/I2C)
- 1x Câble Grove I2C (4 fils)
- 1x Moteur DC à encodeur (compatible 6 fils ou TT avec encodeur)
- 1x Alimentation externe DC 6-12V (adaptateur secteur ou batterie)
- 1x Bouton poussoir simple (optionnel, pour tester une entrée GPIO externe si l'unité le permet via extension, sinon utiliser les entrées logiques internes via I2C)
- Câbles Dupont (si connexion manuelle nécessaire pour tests GPIO)
Étapes
- Matériel et Connexion : Montez l'EMDU sur le bus Grove I2C de votre contrôleur M5Stack. Connectez le moteur à l'EMDU en respectant la polarité. Branchez l'alimentation externe 6-12V sur l'EMDU. Vérifiez que le moteur tourne librement.
- Configuration Logicielle : Installez la bibliothèque M5Stack pour Arduino. Incluez la bibliothèque spécifique à l'EMDU. Initialisez la communication I2C avec l'adresse par défaut 0x2F.
#include <M5Unified.h>
#include <M5_EncoderMotorDriver.h>
M5_EncoderMotorDriver emd;
void setup() {
M5.begin();
Wire.begin();
if (!emd.begin(0x2F)) {
Serial.println("Erreur d'initialisation EMDU");
while(1);
}
emd.setMode(MODE_CLOSED_LOOP_SPEED); // Boucle fermée vitesse
}
- Gestion de la LED RGB : La LED WS2812C est contrôlée via des commandes I2C spécifiques. Écrivez une fonction pour changer la couleur selon l'état.
void setLedStatus(uint8_t r, uint8_t g, uint8_t b) {
emd.setRgbLed(r, g, b); // Commande I2C dédiée
}
- Logique de Contrôle : Dans la boucle
loop(), lisez la vitesse mesurée par l'encodeur. Si la vitesse est nulle, allumez la LED en rouge. Si la vitesse est stable, allumez-la en vert. Simulez une détection de courant élevée (via la lecture du registre INA199A si exposé) pour allumer la LED en bleu.
void loop() {
int speed = emd.getSpeed();
if (speed == 0) {
setLedStatus(255, 0, 0); // Rouge
emd.stopMotor();
} else {
setLedStatus(0, 255, 0); // Vert
emd.setSpeed(100); // Vitesse cible
}
delay(100);
}
- Test des Entrées (Optionnel) : Si l'unité expose des GPIO via des registres I2C pour des entrées numériques (ex: limiteur de fin de course), configurez le registre de direction GPIO. Lisez l'état via
emd.readGpioState()et modifiez la couleur de la LED en conséquence (ex: bleu si bouton pressé).
Vérification
Ouvrez le moniteur série. Vérifiez que la LED s'allume correctement selon les changements d'état du moteur. Débranchez le moteur pour simuler une erreur ou un arrêt, observez le changement de couleur. Assurez-vous qu'aucune erreur I2C n'apparaît dans la console.
Pour aller plus loin
Explorez l'utilisation des interruptions matérielles si disponibles pour réagir instantanément aux changements d'état des GPIO sans polling. Intégrez un capteur de température externe connecté via un module Grove I2C distinct et corréléz la température avec la vitesse du moteur pour une gestion thermique avancée.
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
- Automatisation par retour d'encodeur avec la DRV8837
- Configuration avancée et validation du bus I2C
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