🛠 Automatisation distribuée : Pilotage précis et télémétrie avec l'Encoder Motor Driver Unit
Objectifs
Ce tutoriel avancé vise à concevoir un nœud d'automatisation autonome utilisant l'Encoder Motor Driver Unit (DRV8837DSGR). L'objectif est de dépasser le simple pilotage manuel pour implémenter une stratégie de contrôle en boucle fermée (PID) basée sur les données de l'encodeur, tout en intégrant la carte dans un réseau IoT pour la télémétrie. Nous exploiterons les capacités de détection de courant INA199A pour la protection du moteur et la LED RGB pour l'indicateur d'état local.
Matériel nécessaire
- Carte principale compatible M5Stack (ex: Core2 ou AtomS3) avec support I2C.
- Unité Encoder Motor Driver (DRV8837DSGR).
- Moteur à engrenages M5Stack (compatible 6 fils avec encodeur AB).
- Alimentation externe DC 6-12V.
- Câble Grove I2C.
- Bibliothèque M5Stack pour Arduino/PlatformIO.
- Serveur MQTT ou API REST pour la réception des données.
Étapes
Connectez l'unité au port Grove I2C de votre carte principale. Assurez-vous que l'alimentation externe est branchée sur le connecteur DC de l'unité (6-12V). Par défaut, l'adresse I2C est 0x2F. Pour un réseau multi-nœuds, vous devez configurer une adresse unique (entre 0x08 et 0x77) via les lignes AD0/AD1 si disponibles, ou via la commande logicielle initiale si le firmware le permet, pour éviter les conflits de bus.
- Configuration matérielle et adressage
Dans le code, initialisez la communication I2C. Configurez le mode de fonctionnement en « Closed Loop » (boucle fermée). Calibrez la résolution de l'encodeur. L'unité supporte les encodeurs de 3 à 15 PPR (Pulses Per Revolution). Définissez la constante PPR selon votre moteur spécifique pour convertir les impulsions en degrés ou tours.
- Initialisation et calibration de l'encodeur
Ne vous contentez pas d'envoyer une consigne de vitesse. Lisez les données de position et de vitesse via les registres I2C. Implémentez un algorithme PID simple sur la carte principale : calculer l'erreur entre la position cible et la position actuelle, puis ajuster la consigne PWM envoyée à l'unité. Utilisez les modes « Start/Stop progressif » pour éviter les chocs mécaniques lors des changements de consigne.
- Implémentation de la boucle de contrôle PID
Toutes les 500ms, lisez les registres de statut : courant consommé (INA199A), vitesse actuelle, et position. Publiez ces données sur un broker MQTT. Utilisez le circuit de détection de courant pour définir un seuil de sécurité : si le courant dépasse 1.2A (limite de charge), arrêtez immédiatement le moteur pour éviter la surchauffe.
- Intégration réseau et télémétrie
Pilotez la LED WS2812C intégrée pour refléter l'état système : Vert (fonctionnement nominal), Rouge (erreur de position ou surcourant), Bleu (connexion réseau active). Cela permet un diagnostic visuel immédiat sans écran.
- Feedback visuel via LED RGB
Vérification
- Vérifiez que le moteur atteint la position cible avec une précision inférieure à 5%.
- Confirmez que la LED change de couleur lors d'un blocage mécanique (augmentation du courant détectée par l'INA199A).
- Assurez-vous que les paquets MQTT arrivent au serveur avec les coordonnées de position correctes.
Pour aller plus loin
Explorez la synchronisation multi-axes en utilisant plusieurs unités sur le même bus I2C avec des adresses distinctes. Intégrez un algorithme de filtrage de Kalman pour lisser les données de l'encodeur AB et améliorer la stabilité du contrôle PID à haute vitesse.
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