Composant · Actionneur

N20 Encoder Gearmotor

Le N20 : petit moteur à réducteur métal avec codeur magnétique, l'entraînement des robots équilibristes qui ont besoin de couple et de position de roue.

Présentation

Le N20 est le petit moteur à réducteur métal qu’on trouve partout où un robot a besoin de vrai couple dans très peu de place. Le moteur nu fait environ la taille d’une pile AA ; le réducteur à l’avant échange sa très haute vitesse contre du couple utilisable, et sur la version à codeur un disque magnétique sur l’arbre arrière rapporte de combien il a tourné.

Cette dernière partie lui vaut sa place dans un robot équilibriste. Sans retour de roue, un robot équilibriste peut rester debout mais n’a aucune idée d’où il est — il tiendra la verticale magnifiquement tout en errant dans la pièce. Le codeur comble cet écart.

Chronogramme des deux voies de sortie d'un codeur en quadrature. La voie A est dessinée au-dessus de la voie B en signaux carrés de même fréquence, B décalée d'un quart de cycle derrière A. Quatre lignes verticales en pointillés marquent les quatre transitions d'un cycle électrique, numérotées de un à quatre, avec l'annotation que compter les quatre donne 1200 pas par tour depuis un codeur 300 CPR. Une note pointe le déphasage et explique que B en retard sur A signifie marche avant et B en avance signifie que la roue recule.
Les deux voies décalées d'un quart de cycle sont ce qui vaut à ce moteur ses fils supplémentaires : l'ordre des phases donne le sens, et le compte des fronts donne la distance. Télécharger le SVG

Pourquoi le réducteur métal compte ici

Un moteur à réducteur plastique comme le motoréducteur TT convient parfaitement à un suiveur de ligne, qui roule surtout en avant. Un robot équilibriste est une autre charge : il inverse le sens en continu, des centaines de fois par seconde, par petits incréments.

Tout réducteur a du jeu — une petite zone morte où les engrenages se sont désengagés et la sortie ne bouge pas jusqu’à ce que les dents se retrouvent de l’autre côté. Dans un réducteur plastique, cette zone morte est large, et dans un robot équilibriste elle tombe exactement où la correction compte le plus : à l’instant de l’inversion, quand le robot a besoin que les roues répondent maintenant. Le résultat est un robot qui oscille autour de la verticale sans jamais se stabiliser, aussi soigneusement que les gains soient réglés.

Les engrenages métal ne suppriment pas le jeu mais le réduisent assez pour que la boucle fasse son travail. Ce qu’il en reste est un nombre mesurable en dix minutes — voici comment.

Lire le codeur

Le codeur produit deux signaux carrés déphasés de 90° — de la quadrature standard. La relation de phase donne le sens ; compter les fronts donne la distance.

Fil (typique) Se connecte à Notes
M1, M2 Sorties du contrôleur de moteurs Le moteur lui-même ; la polarité fixe le sens
VCC 3,3 V ou 5 V Alimentation du codeur, pas l’alimentation moteur
GND Masse Commune avec le contrôleur
C1 Broche capable d’interruption Voie A du codeur
C2 Toute broche numérique Voie B du codeur

Les couleurs de fils varient selon les fournisseurs, donc vérifiez l’annonce plutôt que supposer. Le piège classique est d’alimenter le codeur depuis le rail moteur : le codeur veut une alimentation logique propre, et l’alimenter en tension moteur le détruira ou remplira vos comptes de bruit à chaque commutation du moteur.

Mettez la voie A sur une broche capable de lever une interruption. Scruter un codeur depuis loop() sur un robot équilibriste perdra des pas, et des pas perdus signifient que la boucle externe perd lentement la trace d’où est le robot.

Choisir un rapport

Le rapport de réduction règle l’échange entre couple et vitesse, et un robot équilibriste a besoin des deux :

  • Rapport trop élevé (1:250 et plus) donne plein de couple mais les roues ne peuvent pas tourner assez vite pour repasser sous un corps qui tombe.
  • Rapport trop bas (1:30 et moins) tourne vite mais ne peut pas déplacer la masse du robot avec autorité.

Autour de 1:100 à 12 V — environ 200 tr/min — est un point de départ fiable pour un petit robot. Si le vôtre rattrape les petites perturbations mais perd les grandes, il faut probablement plus de vitesse, pas plus de gain.

Le piloter

Associez le N20 à un TB6612FNG plutôt qu’un L298N. La raison est la perte : le L298N perd environ 2 V sur son étage de sortie, donc une grande part de votre batterie n’atteint jamais le moteur, et les petites consignes de correction tombent sous la tension à laquelle le moteur bouge. Sur un robot équilibriste, cette zone morte est juste là où vivent les corrections fines.

Alimentez-le depuis un pack de batteries capable de fournir le courant de blocage des deux moteurs à la fois sans que sa tension s’affaisse — un rail qui s’affaisse réinitialise le microcontrôleur en pleine correction, et le robot tombe pour des raisons sans rapport avec votre boucle de commande.

Calculer les pas par tour de roue

C’est le nombre dont dépend tout calcul de distance, et celui qu’on se trompe le plus souvent — généralement d’un facteur quatre.

counts per wheel revolution = PPR x 4 x gear ratio

Le codeur magnétique donne 7 impulsions par tour moteur sur chaque voie. La quadrature signifie deux voies à 90°, ce qui produit quatre fronts comptables par cycle d’impulsion. Et le réducteur signifie que le moteur tourne de nombreuses fois par tour de roue.

Rapport Pas par tour de roue (×4) Résolution sur roue de 43 mm
1:30 840 0,16 mm
1:50 1400 0,10 mm
1:100 2800 0,048 mm
1:150 4200 0,032 mm
1:298 8344 0,016 mm

La distance suit ensuite directement :

mm per count = (pi x wheel_diameter_mm) / counts_per_revolution

Deux pièges vivent dans cette première formule. Le ×4 n’est correct que si vous comptez réellement quatre fronts — les deux fronts sur les deux voies. Beaucoup d’exemples comptent seulement les fronts montants de la voie A, soit ×1, et utiliser une constante ×4 avec un comptage ×1 fausse toute distance d’exactement quatre. Et le rapport imprimé sur le moteur est souvent approximatif : un N20 « 1:100 » fait souvent 1:99,5 ou 1:100,37. Pour l’odométrie sur toute distance, étalonnez empiriquement : poussez le robot sur exactement 2 m et divisez.

Compter les fronts sans en perdre

À 200 tr/min avec un réducteur 1:100, l’arbre moteur tourne à 20 000 tr/min, donnant 20000/60 × 7 × 4 ≈ 9300 fronts par seconde par moteur. Deux moteurs font près de 19 000 interruptions par seconde, et c’est à pleine vitesse sans charge.

Le gestionnaire d’interruption doit être vraiment petit :

volatile long countL = 0;

// Full x4 decoding, table-driven. Both channels, both edges.
const int8_t QUAD_TABLE[16] = {0,-1,1,0, 1,0,0,-1, -1,0,0,1, 0,1,-1,0};
volatile uint8_t prevL = 0;

void isrLeft() {
  uint8_t now = (digitalRead(ENC_L_A) << 1) | digitalRead(ENC_L_B);
  countL += QUAD_TABLE[(prevL << 2) | now];
  prevL = now;
}

void setup() {
  pinMode(ENC_L_A, INPUT_PULLUP);
  pinMode(ENC_L_B, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(ENC_L_A), isrLeft, CHANGE);
  attachInterrupt(digitalPinToInterrupt(ENC_L_B), isrLeft, CHANGE);
}

long readCount() {           // long is not atomic on an 8-bit AVR
  noInterrupts();
  long v = countL;
  interrupts();
  return v;
}

Trois détails qui comptent :

volatile, et une lecture atomique. Un long fait quatre octets sur AVR, lus un octet à la fois. Une interruption tombant en pleine lecture donne une valeur moitié ancienne moitié nouvelle — ce qui produit un énorme saut occasionnel dans votre odométrie, au hasard, environ une fois toutes les quelques milliers de lectures.

La table de correspondance décode la transition plutôt que deviner le sens depuis une voie. Elle rejette aussi naturellement les transitions invalides (les deux bits changeant d’un coup, ce qui signifie qu’on en a manqué une) en apportant zéro.

Pression sur les broches. Un décodage ×4 complet sur deux moteurs veut quatre broches capables d’interruptions, et un Arduino Uno en a exactement deux. Les options : utiliser un décodage ×2 (une voie par moteur, CHANGE), qui divise la résolution par deux tout en gardant le sens ; passer à une carte avec plus de broches d’interruption comme un Mega ou un ESP32 ; ou utiliser des interruptions sur changement de broche, que toute broche AVR prend en charge mais qui exigent de gérer tout un port d’un coup.

La vitesse depuis les pas

La position est un compte. La vitesse veut une différence dans le temps, et la façon de la prendre décide si votre boucle de commande est utilisable.

long lastCount = 0;
unsigned long lastMicros = 0;

float speedMmPerSec() {
  long   c  = readCount();
  unsigned long t = micros();

  float dt = (t - lastMicros) * 1e-6f;
  if (dt < 0.005f) return lastSpeed;        // too short: quantisation dominates

  float mm = (c - lastCount) * MM_PER_COUNT;
  lastCount = c; lastMicros = t;

  lastSpeed = mm / dt;
  return lastSpeed;
}

Le garde dt est la ligne importante. Échantillonnez trop vite et vous divisez une différence d’un ou deux pas par un minuscule intervalle, donc l’erreur de quantification domine et la « vitesse » est surtout du bruit — qu’un terme dérivé dans une boucle PID amplifiera ensuite avec enthousiasme.

Il y a deux façons honnêtes de mesurer la vitesse depuis un codeur, adaptées aux extrémités opposées de la gamme. Compter les fronts dans une fenêtre fixe (le code ci-dessus) est bon à haute vitesse et mauvais à basse vitesse, où peu de fronts arrivent par fenêtre. Chronométrer l’intervalle entre fronts est l’inverse : excellent à basse vitesse, bruité à haute vitesse. Un robot qui a besoin des deux bouts bascule généralement entre eux à un seuil.

Dépannage

Symptôme Cause probable Solution
Les comptes sont 4× trop petits Comptage d’un front, constante ×4 utilisée Décodez les quatre fronts, ou corrigez la constante
Les comptes augmentent dans les deux sens Lecture d’une seule voie La quadrature veut les deux — utilisez le décodeur à table
Énorme saut de position occasionnel Lecture non atomique d’un long Enveloppez la lecture dans noInterrupts()
Les comptes dérivent moteur arrêté Bruit électrique sur les lignes du codeur Codeur sur alimentation propre, pas le rail moteur ; torsadez la paire
Pas perdus à haute vitesse Gestionnaire d’interruption trop lent, ou scrutation Gardez l’ISR minuscule ; ne scrutez jamais
Distances fausses de 2–3 % systématiquement Rapport nominal et diamètre de roue Étalonnez sur 2 m et déduisez les mm-par-pas
Une roue compte, l’autre non Voie de codeur pas sur broche d’interruption Vérifiez la capacité des broches ; un Uno n’a que D2 et D3
Codeur mort après câblage Tension moteur dans le VCC du codeur Le codeur veut du 3,3–5 V logique, jamais le rail moteur
La position du robot dérive sur un long parcours L’odométrie est non bornée par nature Normal — corrigez-la avec une référence absolue

N20 ou motoréducteur TT ?

Motoréducteur TT Motoréducteur métal N20
Réducteur Plastique Métal
Jeu Large — plusieurs degrés en sortie Faible
Taille Encombrant Environ une pile AA
Tension 3–6 V Variantes 6–12 V
Rapports disponibles Essentiellement un (~1:48) 1:30 à 1:298
Codeur Après-vente, maladroit Magnétique intégré, standard
Coût ~2 $ ~8 $
Idéal pour Suiveurs de ligne, premiers robots Équilibrage, odométrie précise, espaces serrés

Le facteur décisif est rarement le couple et presque toujours le jeu et la rétroaction. Un suiveur de ligne roule surtout en avant et braque par un capteur qui regarde le sol — il ne remarque jamais le jeu du réducteur, et un moteur TT est la bonne réponse économique. Un robot équilibriste inverse le sens des centaines de fois par seconde par minuscules incréments, donc la zone morte à chaque inversion est exactement là où sa correction doit agir, et les engrenages plastique rendent la boucle instable quel que soit le réglage.

La même logique vaut pour un solveur de labyrinthe : il navigue en comptant la distance, donc le mouvement perdu à chaque virage s’accumule directement en erreur de position.

Utilisé dans

  • Robot auto-équilibré — les moteurs d’entraînement, avec les codeurs alimentant la boucle de position externe

Explorer le graphe

Utilisé dans ces réalisations

Projets, parcours d'apprentissage et simulateurs qui intègrent le composant N20 Encoder Gearmotor.

Comparer

Alternatives

Questions

FAQ : N20 Encoder Gearmotor

Qu'est-ce qu'un moteur N20 à codeur ?

Un N20 est un micromotoréducteur d'environ 12 par 10 par 26 mm avec un réducteur métal, et la version à codeur ajoute un petit disque magnétique et un capteur à l'arrière de l'arbre moteur. Le réducteur lui donne bien plus de couple que sa taille ne suggère, et le codeur rapporte de combien l'arbre a réellement tourné plutôt que de combien on lui a demandé de tourner.

Pourquoi les robots équilibristes utilisent-ils des moteurs N20 plutôt que des moteurs TT ?

Pour deux raisons. Le réducteur métal a bien moins de jeu que le réducteur plastique d'un moteur TT, et le jeu est un poison pour un robot équilibriste — à chaque inversion du moteur, un réducteur lâche gaspille les premiers degrés de correction à ne rien faire. Le codeur donne aussi à la boucle de commande externe la vraie position des roues, ce qui permet au robot de tenir sa place au lieu de dériver.

Combien de pas de codeur un N20 donne-t-il par tour de roue ?

Multipliez les impulsions de l'arbre moteur par le rapport de réduction. Un codeur typique donne 7 impulsions par tour moteur par canal ; sur un réducteur 1:100, cela fait 700 impulsions par tour de sortie, ou 2800 pas si vous décodez les quatre fronts en quadrature. Confirmez toujours le chiffre de votre moteur précis, car impulsions et rapport exact varient selon les fournisseurs.

Peut-on piloter un N20 directement depuis une broche d'Arduino ?

Non. Un N20 tire plusieurs centaines de milliampères en marche et environ 700 mA bloqué, bien au-delà de ce qu'une broche peut fournir, et la surtension inductive l'endommagerait. Utilisez un contrôleur de moteurs comme le TB6612FNG, qui a aussi une chute de tension assez basse pour que les petites consignes de correction fassent réellement bouger le moteur.

Quel rapport choisir pour un robot équilibriste ?

Quelque chose entre 1:50 et 1:150 est le compromis habituel. Un rapport trop élevé donne plein de couple mais les roues ne peuvent pas accélérer assez vite pour rattraper une chute ; trop bas et le moteur manque de couple pour déplacer la masse du robot. Autour de 1:100 à 12 V, soit environ 200 tr/min, convient à un petit robot équilibriste typique.

Pour aller plus loin

Références