Tutoriel · Débutant · 17 min de lecture
Lire des encodeurs en quadrature pour distance et vitesse
Décoder un encodeur en quadrature, convertir les impulsions en distance et vitesse de roue, gérer sens et débordement, et étalonner sur un vrai robot.
Un encodeur de roue convertit la rotation en impulsions numériques. Comptez ces impulsions et vous mesurez la distance parcourue par un robot ; comptez-les dans le temps et vous estimez la vitesse. Un encodeur en quadrature fournit deux canaux d’impulsions, A et B, décalés d’un quart de cycle. Le canal qui change en premier révèle le sens.
Les encodeurs mesurent un mouvement relatif, pas une position absolue. Le compte ne prend sens qu’après le démarrage ou une remise à zéro volontaire, et il n’est utile qu’après avoir défini exactement combien d’impulsions représentent un tour de roue.
Lire le motif à deux canaux
Les états valides en quadrature sont 00, 01, 11 et 10. Tourner dans un sens parcourt cette séquence ; tourner dans l’autre l’inverse. Un seul bit doit changer à la fois. Une transition comme 00 directement vers 11 signifie qu’un front a été manqué ou que le bruit a corrompu le signal.
Il existe trois modes de comptage courants :
- Décodage 1× : compter un front sur le canal A par cycle.
- Décodage 2× : compter les deux fronts sur le canal A.
- Décodage 4× : compter tous les fronts sur les deux canaux.
Une fiche technique annonçant 12 impulsions par tour peut donc produire 12, 24 ou 48 impulsions logicielles par tour d’arbre codeur. Ajoutez le rapport de réduction si l’encodeur est monté sur le moteur plutôt que sur la roue. Écrivez la convention complète à côté de la constante ; des facteurs deux et quatre inexpliqués sont un bogue d’odométrie fréquent.
Connecter correctement les signaux
Déterminez si les sorties sont push-pull, collecteur ouvert ou drain ouvert. Les sorties ouvertes exigent des résistances de rappel, internes ou externes selon la vitesse des fronts et le câblage. Vérifiez que la tension du signal est sûre pour le contrôleur — une sortie encodeur 5 V peut endommager une entrée 3,3 V.
Éloignez le câble des fils moteur. Pour les longues distances, suivez les préconisations de câble et terminaison du fabricant de l’encodeur. Un front numérique propre vaut mieux que toute tentative de réparer de faux comptages en logiciel.
Tournez la roue lentement à la main avant de lancer le moteur. Les deux canaux doivent alterner entre niveaux logiques valides. Si l’un reste bloqué, corrigez le câblage avant de déboguer le code.
Décoder le sens sans perdre d’impulsions
À vitesse modeste, déclenchez une interruption à chaque changement du canal A et échantillonnez B pour déterminer le sens :
volatile long encoderCount = 0;
void onEncoderA() {
bool a = digitalRead(ENCODER_A);
bool b = digitalRead(ENCODER_B);
encoderCount += (a == b) ? 1 : -1;
}
Le signe dépend de l’ordre des canaux et du montage physique. Échangez A et B ou inversez le résultat pour qu’une marche avant donne un compte positif. Faites-le une fois à la frontière matérielle au lieu d’éparpiller des changements de signe dans le code d’odométrie.
À fort débit de fronts, des appels répétés à digitalRead() peuvent être trop lents. Utilisez un périphérique matériel en quadrature, une bibliothèque d’encodeurs éprouvée pour la plateforme, ou un accès direct aux ports adapté au contrôleur. Estimez le pire cas avant de choisir : fronts par seconde = impulsions par tour de roue × tours de roue par seconde au maximum.
Gardez le travail d’interruption court. Mettez le compte à jour, puis revenez. Affichages, conversions flottantes et calculs de commande appartiennent à la boucle principale.
Convertir les impulsions en distance de roue
Soit N le nombre d’impulsions décodées par tour de roue et D le diamètre effectif de roue. La circonférence vaut πD, donc :
distance = count × πD / N
Pour une roue de 65 mm et 1 440 impulsions décodées par tour de roue, chaque impulsion représente environ 0,142 mm. Cette résolution mathématique n’est pas la précision réelle : écrasement du pneu, patinage et erreur de diamètre sont généralement plus grands.
Lisez un compteur multi-octets en sécurité. Sur un petit microcontrôleur, une interruption peut le modifier en pleine lecture par la boucle principale. Désactivez brièvement les interruptions ou utilisez le mécanisme atomique de la plateforme :
noInterrupts();
long snapshot = encoderCount;
interrupts();
float distanceM = snapshot * (PI * wheelDiameterM) / countsPerWheelRev;
Utilisez un compteur signé assez large et calculez des différences entre instantanés. La soustraction modulaire non signée peut gérer le débordement, mais seulement si types et intervalle d’échantillonnage sont voulus.
Estimer la vitesse sans amplifier le bruit
À intervalle d’échantillonnage fixe, calculez la différence de comptes :
velocity = (newCount - oldCount) × distancePerCount / elapsedTime
Des intervalles courts répondent vite mais quantifient les basses vitesses en sauts de zéro et une impulsion. Des intervalles longs sont plus lisses mais ajoutent du retard. Partez près de la période de boucle de commande, puis moyennez quelques échantillons seulement si le contrôleur l’exige vraiment.
Pour les mouvements très lents, mesurer le temps entre fronts peut valoir mieux que compter les fronts dans une fenêtre fixe. Quelle que soit la méthode, horodatez avec une horloge monotone et utilisez le temps écoulé mesuré plutôt que de supposer que chaque boucle s’exécute parfaitement à l’heure.
Étalonner sur la transmission complète
Marquez la roue et tournez-la d’exactement dix tours en enregistrant les impulsions. Diviser par dix réduit l’effet d’un arrêt entre fronts individuels. Puis commandez au robot une ligne droite mesurée, comparez la distance encodeur à la distance au sol, et ajustez le diamètre effectif de roue.
Étalonnez les roues gauche et droite séparément. Si le robot annonce des distances égales mais courbe, les deux diamètres effectifs ou gains de transmission diffèrent. Conservez des facteurs d’échelle séparés ; vrais pneus et réducteurs exigent ce réglage.
Répétez à une seconde vitesse. Un grand écart suggère patinage, moyeux lâches, fronts manqués, ou un problème de temporisation plutôt qu’une simple erreur de diamètre.
Diagnostiquer les mauvaises lectures
- Le compte change à l’arrêt : bruit électrique ou entrées flottantes ; inspectez signaux et rappels.
- L’amplitude du compte est fausse d’exactement 2× ou 4× : le mode de décodage logiciel et la définition d’impulsion de la fiche se contredisent.
- Le sens s’inverse au hasard : un canal est bruité ou échantillonné trop tard ; vérifiez la qualité des fronts et la méthode de décodage.
- Les impulsions se figent à vitesse : le contrôleur ne suit pas le débit de fronts ; utilisez un décodage matériel ou réduisez le coût d’interruption.
- La distance est répétable mais fausse : étalonnez le diamètre effectif de roue et le rapport de réduction.
- La distance varie selon la surface : l’encodeur mesure la rotation de roue, pas la vérité terrain ; le patinage des roues est une vraie incertitude de mouvement.
Des impulsions fiables sont l’entrée de l’odométrie différentielle, tandis que la rétroaction de vitesse peut fermer la boucle moteur explorée dans le simulateur de contrôleur PID. Cette pose est aussi l’entrée supposée par tout suiveur de trajectoire, d’où son erreur devient la leur.
Suite
Compter n’est que la moitié. Une vitesse mesurée vaut la peine parce qu’on peut la tenir — voyez la commande de vitesse de roue en boucle fermée, qui transforme la PWM d’une tension en vitesse et empêche un robot de courber parce qu’un moteur est fatigué. Sur une base holonome, cela cesse d’être un luxe : les rapports de vitesses des quatre roues sont le braquage, et la boucle ouverte n’a rien pour les tenir.
Explorer le graphe
Fait partie de ces réalisations
Les projets et parcours d'apprentissage qui incluent ce tutoriel.
- ProjetConstruire un Micromouse : solveur de labyrinthe
- ProjetConstruire un robot de couverture qui balaie une pièce
- ProjetConstruire un robot équilibriste avec un MPU6050 et un PID
- ProjetConstruire un robot Mecanum qui roule de côté
- ProjetConstruire un robot ROS 2 qui voit et roule vers un marqueur
- ProjetConstruire un rover GPS à waypoints qui roule tout seul
- Parcours d'apprentissageCommande des moteurs pour robots : un parcours d'apprentissage
- Parcours d'apprentissageSuivi de trajectoire pour robots : un parcours d'apprentissage
- Parcours d'apprentissageTransmission holonome : aller de côté sans tourner
Pour aller plus loin