Hé! Vous semblez être en United States, souhaitez-vous utiliser notre site English ?
Switch to English site
Skip to main content

Dotez votre robot des mêmes commandes de mobilité qu'un Mars Rover : deuxième partie

Exomars_2020_rover_639aed83bdad346d81206ebef4eed0f9de24b4c6.jpg

La partie 1 abordait la théorie de la commande PID, une méthode largement utilisée pour s'assurer que la sortie mécanique d'un actionneur (vitesse, position, etc.) correspond bien à la valeur demandée par son programme de contrôle. J'ai montré comment une théorie complexe se traduisait par un calcul arithmétique relativement simple capable de fonctionner sur un microcontrôleur de base. Voyons maintenant un peu de code écrit pour un robot à deux roues motrices entraînées par des servomoteurs en continu. J'ai utilisé un contrôleur de signal numérique dsPIC33 16 bits de Microchip, un microcontrôleur PIC24 avec extensions DSP, mais la plupart des questions pratiques sont applicables aux projets basés sur d'autres microcontrôleurs.

Capture des données de rotation des roues

Le dispositif de détection de la vitesse de rotation de la roue se compose de deux parties : la roue elle-même avec 32 fentes radiales et un module de faisceau infrarouge fixé au châssis et aligné sur les fentes (Fig. 1). Le principe de fonctionnement est simple.

PID2_blog_1_93c48846aacf29ccfaeda3842692300c288f3bdb.png

Le module de capteur se compose d'une LED infrarouge (IR) et d'une photodiode placées côte à côte et pointant sur les fentes de la roue. Lorsque la roue tourne, le faisceau passe par une des fentes et n'est donc pas capté par la photodiode, mais il est reflété en direction de la diode entre les fentes. Le résultat est un train d'impulsions dont le taux de répétition est proportionnel à la vitesse de rotation de la roue. Nous avons besoin d'un moyen permettant de mesurer ce taux de rotation. Fort heureusement, la plupart des microcontrôleurs modernes disposent de cette fonction dans un composant matériel intégré appelé "Capture d'entrée" (Fig. 2).

PID2_blog_21_ffc2f0e97c38c35ee61ff2019b1922b13b4eb4a6.png

En principe, vous pouvez mesurer la vitesse à l'aide d'un compteur directement sur le capteur. En échantillonnant le compteur à intervalles fixes et en le remettant à zéro à chaque fois, vous pouvez obtenir la valeur de la vitesse. Le problème est qu'à vitesse lente, l'intervalle d'échantillonnage est trop long pour capturer un nombre assez important. Ceci peut être résolu en prenant le problème dans l'autre sens : incrémenter le compteur avec une horloge rapide et échantillonner ou "capturer" sa valeur à l'aide des impulsions du capteur. Nous obtenons une mesure de la période d'impulsion. L'unité de capture d'entrée dsPIC (IC) comporte tout le matériel nécessaire et n'a besoin que de quelques lignes de code en assembleur pour fonctionner. Malheureusement, il y a une complication : il y a deux unités de capture indépendantes sur la puce que j'utilise, mais l'un des minuteurs est nécessaire pour une autre fonction. Il y a une solution : le minuteur restant peut être partagé grâce à un autre composant dans l'unité de capture. Les deux unités IC sont configurées pour utiliser le minuteur 3 dans ce cas, qui compte continuellement de 0000 à FFFF, repasse à 0000 et répète le décompte. Voici le compromis : le compteur ne peut pas être redémarré au début de chaque période d'échantillonnage, car les deux unités seront échantillonnées à des moments différents (Fig. 3).

PID2_blog_3_faf8c318a724180d0b0a24934781fe010062ea22.png

La forme d'onde représente le compteur d'impulsions allant de 0000 à FFFF en boucle. La forme d'onde d'impulsion du capteur de rotation est affichée ci-dessous et "capture" le compteur du minuteur sur chaque arête en montée. Le matériel de capture d'entrée enregistre cet instantané dans son tampon FIFO et génère simultanément une interruption pour le processeur.

Calcul de la vitesse

Le code de service d'interruption prend alors une valeur de comptage enregistrée lors de l'interruption précédente, la soustrait de la dernière valeur et obtient un nombre représentant la période d'impulsion du capteur. Dans le schéma, l'instantané compte C1, C2 pris à T1, T2 et C2 - C1 correspond à l'intervalle entre T2 et T1. C'est simple. Mais deux problèmes se posent lorsque la roue commence à tourner :

  • Il n'y a pas de valeur de "décompte précédent" valide lorsque la première interruption du capteur se produit, et la première vitesse calculée est donc incorrecte.
  • Il y a une limitation de vitesse minimale en ce que la période d'impulsion du capteur ne peut pas être plus longue que celle que prend le minuteur pour compter de 0000 à FFFF. Il y a aussi une limitation de vitesse maximum, mais il est peu probable que ce soit un problème !

Ces deux limitations impliquent que les premières valeurs de vitesse calculées après que le robot commence à bouger sont susceptibles de ne pas être correctes. Il n'y a pas grand-chose à faire, sauf à faire en sorte que la commande PID ignore ces premières valeurs en démarrant le moteur et en le faisant tourner avec une boucle ouverte pendant un certain temps jusqu'à ce que les valeurs se trouvent dans la plage souhaitée. De nouveau dans la Fig. 3, un autre problème se présente, mais celui-ci peut être résolu. Voyez la vitesse calculée à T3. L'intervalle de T2 à T3 chevauche le dépassement du compteur, donc C3 - C2 donnera une réponse erronée. Heureusement, cette situation peut être détectée par le logiciel, C3 est inférieur à C2 et un facteur de correction est appliqué. Normalement, la dernière valeur est plus grande que la valeur plus ancienne, comme pour C1 et C2.

Code réel

La routine du service d'interruption de mon processeur dsPIC, qui calcule la vitesse et les trois valeurs brutes P, I et D sans redimensionnement et les facteurs K, figure ci-dessous dans le Listing 1.

PID2_blog_4_c1530ba7f84df84f71326ce4b7c66bc81b64ee14.png

Il s'agit de la routine d'interruption pour un des deux canaux du capteur de rotation intégré à FORTHdsPIC, mon propre langage de programmation de contrôle intégré. Même s'il est en assembleur dsPIC (ordinateur nu), il reste assez facile de voir comment l'équation PID complexe se résume à quelques additions et soustractions. Ce code s'exécute à chaque impulsion du capteur, et calcule et enregistre les valeurs PID brutes dans des variables prêtes à être traitées par le programme principal. Je parlerai du programme principal, qui prend ces variables et calcule la valeur de contrôle du moteur, dans la partie 3 de cette série. La routine d'interruption contient également une seule ligne de code qui est chargée d'une tâche de navigation vitale, l'odométrie, ou calcul de la distance parcourue.

Odomètre

Le capteur de rotation des roues ne fournit pas seulement les informations sur la vitesse (tachymétrie) : en comptant les impulsions, vous obtenez une mesure de la distance parcourue (odométrie). C'est ce que la ligne "inc ODOMTR" fait dans le Listing 1. Tous ceux qui ont conduit une voiture ou une moto savent ce qu'est un odomètre : c'est le chiffre du nombre de kilomètres parcourus sur le tableau de bord. Sur un robot, il peut avoir un rôle essentiel dans le système de mobilité. Dans le cas présent, la variable ODOMTR est incrémentée lors de chaque interruption du capteur qui correspond à une rotation de la roue d'un cran, ce qui donne un total de 32 pour chaque tour complet. Pour trouver la distance parcourue au cours d'une seule période, il suffit de diviser la circonférence de la roue πD par 32, où D est le diamètre de la roue. Ces roues ont un diamètre de 66 mm, de sorte que la résolution de l'odométrie est de 6,4 mm. Mon robot utilise une direction à vitesse différentielle et a besoin des données de vitesse de chaque roue pour aller tout droit et des données de distance parcourue pour effectuer ses manœuvres de changement de direction. Plus d'informations à ce sujet dans la partie 3.

Encodeurs en quadrature

Le capteur de rotation simple décrit plus haut a une limitation assez évidente : il ne peut pas indiquer dans quelle direction la roue tourne. Il est possible d'obtenir l'information concernant le sens de rotation en ajoutant un autre photocapteur. Le deuxième capteur est aligné de sorte que sa forme d'onde d'impulsion soit décalée précisément de 90° par rapport à la première (Fig. 4).

 

Une simple bascule D suffit à décoder ces signaux. La plupart des microcontrôleurs récents conçus pour commander un moteur comportent une paire d'entrées de canaux QE avec le matériel nécessaire sur la puce. Mon robot n'a pas besoin de marche arrière, donc un tachymètre simple suffit, mais les robots planétaires doivent être capables d'évoluer en marche arrière.

La prochaine fois dans la troisième partie

Je parlerai de la partie moteur de l'algorithme PID et comment le robot procède par estimations pour sa navigation. Je terminerai par certains problèmes pratiques, par exemple ce qui se passe sur un terrain accidenté lorsque la charge sur les moteurs varie. Découvrez comment une faille de conception dans le système de contrôle de la mobilité de Mars Curiosity a conduit à endommager ses roues. Même les scientifiques les plus expérimentés ne peuvent pas penser à tout !

Si vous avez des questions sur des aspects pratiques, suivez mes messages sur Twitter. Je mets des liens vers des articles intéressants sur l'électronique et les nouvelles technologies, je retweete des publications que j'ai repérées sur les robots, l'exploration spatiale et d'autres sujets.

Engineer, PhD, lecturer, freelance technical writer, blogger & tweeter interested in robots, AI, planetary explorers and all things electronic. STEM ambassador. Designed, built and programmed my first microcomputer in 1976. Still learning, still building, still coding today.