Lire les codeurs

Objectif

Récupérer le signal de chaque codeur et obtenir la distance parcourue par la roue.

Pré-requis

Vous avez vérifié le bon fonctionnement des codeurs, tel que décrit dans la partie « Mise ne route d’un PAMI ».

Codeurs relatifs et signaux en quadrature

Les codeurs relatifs sont des capteurs qui mesurent un déplacement. Ils émettent une impulsion à chaque fois qu’une distance connue est parcourue. En comptant les impulsions renvoyées, nous calculons la distance parcourue. C’est le premier principe de ces capteurs.

Le second principe consiste à doubler le dispositif de détection pour obtenir un second signal décalé par rapport au premier. La combinaison des deux signaux permet de déduire le sens de rotation de déplacement.

#IMG – Signaux des codeurs

Nous pouvons formuler ceci de deux façons :

  1. Lors d’un front sur une voie, la valeur de l’autre voie indique le sens de déplacement
  2. Considérons que les valeurs des deux voies forment un état C1C2, dans notre exemple, les transitions 11 → 01, 01 → 00, 00 → 10, 10 → 11 indiquent un déplacement positif tandis que les transitions 11 → 10, 10 → 00, 00 → 01, 01 → 11 indiquent un déplacement négatif. Les transitions 00 ↔ 11 et 10 ↔ 01 Montrent qu’un état a été raté et nous ne pouvons pas conclure sur le sens du déplacement.

Les deux formulations sont équivalentes. La première est peut-être plus intuitive, la seconde plus facile à coder.

D’abord, ne pas coder !

C’est une tâche qu’il ne faut pas laisser au cœur de votre microcontrôleur. Celui-c aura plein d’autres tâches que de guetter ces impulsions.

Utilise des interruptions ? C’est peut-être la plus mauvaise des solutions acceptables. Si votre microcontrôleur est assez rapide…

Dans les bonnes solutions, vous utilisez un composant externe spécial, nommé parfois Quadrature Counter, qui décode ces signaux et qui communiquera en I2C ou SPI avec votre microcontrôleur. Ou mieux, vous avez un microcontrôleur qui intègre un module de décodage de signaux en quadrature (QEI), de la même manière qu’il intègre un module PWM.

Est-ce que le RP2040 intègre un tel module ? Non, mais il dispose de PIO – comme des mini-cœurs annexes – qui peuvent reproduire des modules QEI, sans impacter les performances du cœur principal. Nous utiliserons l’exemple fourni par la Raspberry Pi Fondation comme base pour notre code.

Structure du code

Pour ce module, nous créerons ces trois fonctions :

  • QEI_init() : initialisation du module ;
  • QEI_update() : lit les codeurs, calcule le déplacement par rapport au précédent appel ;
  • QEI_get_mm() : renvoie le déplacement calculé entre les deux derniers appels de QEI_update().

C’est dans ce module que se trouve la constante de conversion des pas de l’encodeur en millimètres parcourus par la roue.

Code de démonstration

Envoyez, pour chaque codeur, la vitesse et la position, en unité arbitraire :

  • Mettre la constante de conversion des pas en millimètres à 1.
  • Pour obtenir une image de la vitesse, envoyez simplement la valeur de QEI_get_mm() en appelant QEI_update() à intervalle régulier.
  • La position sera la somme des valeurs retournées par QEI_get_mm().

Plus vous appelez QEI_update() fréquemment, plus la résolution de votre vitesse sera faible. Dans un premier temps essayez d’appeler la fonction QEI_update() toutes les millisecondes. Puis refaite un essai avec un appel toutes les 10 millisecondes.

C'est le moment de calibrer votre facteur de conversion entre les pas du codeur et la distance parcourue par la roue en millimètre !

Spécificités du RP2040

Avec le RP2040, vous devrez modifier votre fichier CMakeLists.txt pour que votre code compile !

# Fournir les modifications

Vous devriez obtenir ce type de graphique où le lien de dérivation entre la position et la vitesse est clairement identifiable

#IMG Capture Teleplot

Débogage

Si vos valeurs restent à 0 :

  • Vérifier la bonne connexion de vos codeurs (voir Mise en route d’un PAMI)
  • Assurez-vous d’avoir bien initialisé le module
  • Envoyez directement le retour de la fonction qui lit le module QEI. C’est quadrature_encoder_get_count() avec le SDK du RP2040
  • Vérifiez la concordance des types dans vos envois de données, surtout si vous utilisez printf.