Une bibliothèque C modulaire et robuste pour piloter les moteurs pas-à-pas en boucle fermée MKS SERVO42E via une liaison RS485 (module MAX3485) depuis une Raspberry Pi Pico 2 et trois paa5100je pour génerer une odométrie. Le système communique désormais de manière autonome et asynchrone avec un Raspberry Pi 5 via Micro-ROS, en utilisant les deux cœurs du Pico 2 pour garantir des performances temps réel.
Le Pico 2 exécute un nœud Micro-ROS nommé pico_robot_node.
Le Pico communique en série (UART0) sur les broches TX: 12 et RX: 13. Pour établir la communication, lancez l'agent Micro-ROS sur le Pi 5 avec la commande suivante :
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyAMA0 -b 115200Note : Le Pico 2 se reconnectera automatiquement en cas de perte de l'agent.
| Nom du Topic | Type de Message | Sens | Description |
|---|---|---|---|
/pico/cmd_simple |
geometry_msgs/msg/Point32 |
📥 Sub | Consigne de vitesse (RPM). x = Avant, y = Gauche, z = Droit. |
/pico/odom_simple |
std_msgs/msg/Float32MultiArray |
📤 Pub | Odométrie & Twist (50Hz). [X, Y, Theta, Vx, Vy, Vz, Timestamp] |
/pico/reset_odom |
std_msgs/msg/Empty |
📥 Sub | Remet l'odométrie (X, Y, Theta) à zéro. |
Le robot possède un chien de garde (Watchdog) matériel strict pour éviter les accidents :
- 0.5 seconde sans message : Freinage actif (Vitesse = 0, couple maintenu).
- 10 secondes sans message : Coupure de l'énergie (Roue libre pour économiser la batterie). 👉 Il est donc impératif de publier la consigne en continu (par exemple à 10 Hz) pour faire rouler le robot.
Faire tourner les moteurs (Publication à 10 Hz grâce à -r 10) :
ros2 topic pub -r 10 /pico/cmd_simple geometry_msgs/msg/Point32 "{x: 50.0, y: -50.0, z: 0.0}"Pour stopper le robot, faites Ctrl+C. Le timeout de sécurité coupera les moteurs 500ms plus tard.
Lire la position calculée par les capteurs optiques :
ros2 topic echo /pico/odom_simpleRemettre l'odométrie à zéro :
ros2 topic pub --once /pico/reset_odom std_msgs/msg/Empty La LED RGB intégrée au Pico 2 indique l'état en temps réel du robot :
- 🔴 Rouge : Démarrage et initialisation.
- 🟪 Violet : Moteurs RS485 configurés.
- 🟨 Jaune : En attente de l'Agent Micro-ROS (Recherche de la Pi 5).
- 🟩 Vert : Connecté à ROS 2, prêt à recevoir des ordres !
- 🟦 Bleu (Flash) : Réception et exécution d'une commande de vitesse en cours.
Pour que l'odométrie soit précise, il est crucial de calibrer deux types de paramètres :
- Les constantes de conversion (
C1,C2,C3) : Elles transforment les "ticks" bruts de chaque capteur en mètres. - Le rayon du robot (
R_ROBOT) : Il est utilisé pour calculer la rotation à partir des déplacements des capteurs.
Nous utilisons une procédure d'auto-calibration par rotation pure (sur place), permettant de s'affranchir des imprécisions des tests en ligne droite.
-
Connaissance du rayon :
- Assurez-vous que la constante
R_ROBOTdanssrc/odom.cppcorrespond exactement à la donnée CAO (distance centre robot <-> centre optique d'un capteur).
- Assurez-vous que la constante
-
Mesure des ticks en rotation :
- Dans
src/robot.cpp, activez le Mode 1 :#define CALIBRATION_MODE 1. - Flashez le Pico. Le robot attend 5 secondes, puis se met à tourner sur lui-même à vitesse constante.
- Chronométrez le temps exact pour faire 1 tour complet en millisecondes.
- Coupez le robot, et inscrivez ce temps dans
src/robot.cpp:#define CALIB_ONE_TURN_MS 4500(remplacez 4500 par votre temps). - Passez en Mode 2 :
#define CALIBRATION_MODE 2. - Flashez. Posez le robot, il va effectuer exactement 10 tours puis s'arrêter tout seul (LED Cyan).
- Lancez l'agent Micro-ROS sur la Pi 5 et relevez les ticks finaux de l'axe tangentiel (
x) sur les 3 topics :ros2 topic echo /pico/capteur1(lire la valeurx)ros2 topic echo /pico/capteur2(lire la valeurx)ros2 topic echo /pico/capteur3(lire la valeurx)
- Dans
-
Calcul des Constantes (C1, C2, C3) :
- La distance théorique parcourue par chaque capteur lors de ces 10 tours est :
Distance = 10 * 2 * PI * R_ROBOT - Calculez vos gains :
C_nouveau = Distance / ticks_mesures - Inscrivez ces 3 nouvelles valeurs dans
src/odom.cpp.
- La distance théorique parcourue par chaque capteur lors de ces 10 tours est :
-
Finalisation :
- Remettez
#define CALIBRATION_MODE 0et flashez. - Le robot publiera alors son odométrie complète et son "Twist" (Vitesses linéaires et angulaire) au format
Float32MultiArrayprêt à être reconstruit côté Pi 5.
- Remettez
Cette bibliothèque décompose la logique de communication pour offrir un contrôle total sur l'assemblage et l'envoi des trames :
- Vitesse et Direction (Commande
F6) avec gestion de l'accélération. - Activation / Désactivation du moteur (Commande
F3) pour remplacer le fil physique "Enable". - Arrêt contrôlé (Commande
F6avec vitesse à 0) pour une décélération douce. - Arrêt d'urgence (Commande
F7) pour couper immédiatement le mouvement. - Lecture de l'acquittement (
ACK) avec timeout pour valider la bonne réception par le moteur.
Les trames MKS n'ont pas toutes la même longueur selon la commande envoyée. Attention à bien ajuster les tailles lors du calcul du Checksum (CRC) et de l'envoi.
On initialise toujours un buffer (ex: uint8_t ma_trame[7];) dans le main avant d'assembler les blocs.