Component · Actuator
N20-encoder-tandwielmotor
De N20: kleine motor met metalen tandwielkast en ingebouwde encoder, de gebruikelijke keuze voor balancerende robots die koppel en wielpositie nodig hebben.
Wat het is
De N20 is de kleine motor met metalen tandwielkast die overal opduikt waar een robot veel koppel nodig heeft in heel weinig ruimte. De kale motor is ongeveer zo groot als een AA-batterij; de tandwielkast aan de voorkant ruilt zijn zeer hoge snelheid in voor bruikbaar koppel, en bij de encoderuitvoering meldt een magnetische schijf aan het achteruiteinde van de motoras hoe ver die motoras is gedraaid.
Dat laatste is wat hem een plek in een balancerende robot oplevert. Zonder wielterugkoppeling kan een balancerende robot rechtop blijven, maar weet niet waar hij is—hij blijft prachtig verticaal terwijl hij door de kamer dwaalt. De encoder sluit dat gat.
Waarom de metalen tandwielkast hier belangrijk is
Een motor met kunststof tandwielkast, zoals de TT-tandwielmotor, is prima voor een lijnvolger, die meestal vooruit rijdt. Een balancerende robot is een andere belasting: die keert continu, honderden keren per seconde, in kleine stappen om.
Elke tandwielkast heeft speling—een kleine dode zone waarin de tandwielen niet op elkaar ingrijpen en de uitgang niet beweegt totdat de tanden aan de andere kant elkaar weer raken. In een kunststof tandwielkast is die dode zone groot, en in een balancerende robot valt die precies op het moment dat de correctie het belangrijkst is: bij de omkeer, wanneer de wielen nu moeten reageren. Het resultaat is een robot die rond de verticale stand oscilleert en nooit echt stil wordt, hoe zorgvuldig de versterkingsfactoren ook zijn afgesteld.
Metalen tandwielen elimineren de speling niet, maar verminderen haar voldoende zodat de lus zijn werk kan doen. Hoeveel er overblijft, kun je in ongeveer tien minuten meten—dit is hoe.
De encoder uitlezen
De encoder levert twee blokgolven die 90° uit fase staan—standaard kwadratuur. De faseverhouding vertelt je de richting; flanken tellen vertelt je de afstand.
| Draad (typisch) | Aansluiten op | Opmerkingen |
|---|---|---|
M1, M2 |
Uitgangen van de motordriver | De motor zelf; polariteit bepaalt de richting |
VCC |
3,3 V of 5 V | Encoder-voeding, niet de motorvoeding |
GND |
Ground | Gemeenschappelijk met de besturingseenheid |
C1 |
Pin die interrupts kan afhandelen | Encoderkanaal A |
C2 |
Elke digitale pin | Encoderkanaal B |
De draadkleuren verschillen per leverancier, dus controleer de productpagina in plaats van aan te nemen dat ze hetzelfde zijn. Wat mensen vaak overkomt, is de encoder voeden uit de motorrail: de encoder wil een schone logische voeding en krijgt hij de motorspanning, dan raakt hij beschadigd of vult hij je tellingen met ruis zodra de motor schakelt.
Plaats kanaal A op een pin die een interrupt kan veroorzaken. Een encoder pollen vanuit loop() op een balancerende robot laat tellingen vallen, en verloren tellingen betekenen dat de buitenste lus langzaam uit het oog verliest waar de robot is.
Een overbrengingsverhouding kiezen
De overbrengingsverhouding bepaalt de afweging tussen koppel en snelheid, en een balancerende robot heeft allebei nodig:
- Een te hoge verhouding (1:250 en hoger) geeft ruim voldoende koppel, maar de wielen kunnen niet snel genoeg op toerental komen om een val op te vangen.
- Een te lage verhouding (1:30 en lager) draait snel, maar kan niet voldoende koppel leveren om de massa van de robot te verplaatsen.
Ongeveer 1:100 bij 12 V — ongeveer 200 RPM — is een betrouwbaar startpunt voor een kleine robot. Als jouw robot kleine verstoringen opvangt maar grotere verliest, heb je waarschijnlijk meer snelheid nodig, niet meer regelversterking.
Aansturen
Combineer de N20 met een TB6612FNG in plaats van een L298N. De reden is spanningsverlies: de L298N verliest ongeveer 2 V over zijn uitgangstrap, waardoor een groot deel van je accu de motor nooit bereikt en kleine correctiecommando’s onder de spanning vallen waarbij de motor beweegt. Op een balancerende robot ligt die dode zone precies waar de fijne correcties plaatsvinden.
Voed hem aan vanaf een accupakket dat tegelijk de aanloopstroom van beide motoren kan leveren zonder dat de spanning inzakt—een inzakkende rail herstart de microcontroller tijdens een correctie, waarna de robot omvalt om redenen die niets met de regellus te maken hebben.
Tellingen per wielomwenteling bepalen
Dit is het getal waarop elke afstandsberekening steunt, en het is het getal dat mensen het vaakst verkeerd nemen—meestal met een factor vier.
counts per wheel revolution = PPR x 4 x gear ratio
De magnetische encoder geeft 7 pulsen per motoromwenteling op elk kanaal. Kwadratuur betekent twee kanalen die 90° uit elkaar liggen, waardoor er per pulsperiode vier telbare flanken ontstaan. En de tandwielkast betekent dat de motor zich veel keer per wielomwenteling draait.
| Overbrengingsverhouding | Tellingen per wielomwenteling (×4) | Resolutie op een wiel van 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 |
Daarna volgt de afstand rechtstreeks:
mm per count = (pi x wheel_diameter_mm) / counts_per_revolution
In die eerste formule zitten twee valkuilen. De ×4 klopt alleen als je daadwerkelijk vier flanken telt—beide flanken op beide kanalen. Veel voorbeeldcode telt alleen stijgende flanken op kanaal A, dus dat is ×1; een ×4-constante gebruiken terwijl je ×1 telt, zet elke afstand precies vier keer verkeerd. En de overbrengingsverhouding die op de motor staat is vaak benaderend: een “1:100”-N20 is vaak 1:99,5 of 1:100,37. Kalibreer voor odometrie over afstand dus empirisch: duw de robot precies 2 m en deel.
Flanken tellen zonder er iets te missen
Bij 200 RPM door een tandwielkast van 1:100 draait de motoras 20000 RPM, wat neerkomt op 20000/60 × 7 × 4 ≈ 9300 flanken per seconde per motor. Twee motoren zijn bijna 19000 interrupts per seconde, en dat is bij volle snelheid zonder belasting.
De interrupt-handler moet echt klein zijn:
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;
}
Drie details die ertoe doen:
volatile, en een atomaire lezing. Een long is vier bytes op een AVR en wordt byte voor byte gelezen. Een interrupt die midden in de lezing komt, levert een waarde die half oud en half nieuw is—dat veroorzaakt af en toe een enorme sprong in je odometrie, willekeurig, ongeveer één keer per enkele duizenden lezingen.
De opzoektabel decodeert de overgang in plaats van de richting uit één kanaal te gokken. Ze wijst ook vanzelf ongeldige overgangen af (beide bits wisselen tegelijk, dus je hebt er een gemist) door nul bij te dragen.
Pinbezetting. Volledige ×4-decodering op twee motoren vraagt vier pinnen die interrupts kunnen afhandelen, en een Arduino Uno heeft er precies twee. De opties zijn: ×2-decodering gebruiken (één kanaal per motor, CHANGE), waardoor de resolutie halveert maar de richting behouden blijft; overschakelen naar een bord met meer interrupt-pins, zoals een Mega of ESP32; of pin-change-interrupts gebruiken, die elke AVR-pin ondersteunt maar waarbij je een hele poort tegelijk moet afhandelen.
Snelheid uit tellingen
Positie is een telling. Snelheid vraagt een verschil over tijd, en de manier waarop je dat neemt bepaalt of je regellus bruikbaar is.
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;
}
De dt-beveiliging is de belangrijke regel. Meet je te snel en je deelt een verschil van één of twee tellingen door een heel klein tijdsinterval, waardoor de kwantisatiefout overheerst en de “snelheid” grotendeels ruis is—een differentiatielid in een PID-lus versterkt dat daarna enthousiast.
Er zijn twee eerlijke manieren om snelheid uit een encoder te meten, en ze passen bij verschillende uiteinden van het bereik. Flanken tellen in een vast venster (de code hierboven) is goed bij hoge snelheid en slecht bij lage snelheid, waar per venster weinig flanken binnenkomen. Het interval tussen flanken meten is het omgekeerde: uitstekend bij lage snelheid, ruisachtig bij hoge snelheid. Een robot die beide uiteinden nodig heeft, schakelt meestal bij een drempel.
Problemen oplossen
| Klacht | Waarschijnlijke oorzaak | Oplossing |
|---|---|---|
| Tellingen zijn 4× te klein | Eén flank tellen met een ×4-constante | Decodeer alle vier de flanken, of corrigeer de constante |
| Tellingen nemen in beide richtingen toe | Alleen één kanaal uitlezen | Kwadratuur heeft beide kanalen nodig — gebruik de tabeldecoder |
| Af en toe een enorme sprong in de positie | Niet-atomaire lezing van een long |
Zet de lezing tussen noInterrupts() |
| Tellingen drijven wanneer de motor stilstaat | Elektrische ruis op de encoderlijnen | Encoder aan een schone voeding, niet aan de motorrail; verdraai de encoderdraden in elkaar |
| Tellingen gaan verloren bij hoge snelheid | Interrupt-handler te traag, of polling | Houd de ISR piepklein; gebruik nooit polling |
| Afstanden zijn consequent 2–3% fout | Nominale overbrengingsverhouding en wieldiameter | Kalibreer over 2 m en bepaal mm per telling |
| Eén wiel telt, het andere niet | Encoderkanaal niet op een interrupt-pin | Controleer de pinmogelijkheden; een Uno heeft alleen D2 en D3 |
| Encoder kapot na het aansluiten | Motorspanning op de encoder-VCC | De encoder wil 3,3–5 V-logica, nooit de motorrail |
| De positie van de robot drijft tijdens een lange rit | Odometrie is van nature onbegrensd | Verwacht — corrigeer dit met een absolute referentie |
N20 of TT-tandwielmotor?
| TT-tandwielmotor | N20-metalen tandwielmotor | |
|---|---|---|
| Tandwielkast | Kunststof | Metaal |
| Speling | Groot — meerdere graden aan de uitgang | Klein |
| Afmetingen | Log | Ongeveer een AA-batterij |
| Spanning | 3–6 V | Varianten van 6–12 V |
| Beschikbare verhoudingen | Vrijwel één (~1:48) | 1:30 tot 1:298 |
| Encoder | Achteraf gemonteerd, lastig | Ingebouwd magnetisch, standaard |
| Kosten | ~$2 | ~$8 |
| Beste voor | Lijnvolgers, eerste robots | Balanceren, nauwkeurige odometrie, krappe ruimtes |
De doorslaggevende factor is zelden het koppel en vrijwel altijd speling en terugkoppeling. Een lijnvolger rijdt meestal vooruit en stuurt met een sensor die naar de vloer kijkt; hij merkt nooit de speling van de tandwielkast, en een TT-motor is het juiste, goedkope antwoord. Een balancerende robot keert honderden keren per seconde in kleine stappen om, dus de dode zone bij elke omkeer is precies waar zijn correctie moet werken, en kunststof tandwielen maken de lus instabiel hoe goed je die ook afstelt.
Dezelfde logica geldt voor een doolhofoplosser: die navigeert door afstand te tellen, dus verloren beweging bij elke bocht telt meteen op tot een positiefout.
Gebruikt in
- Zelfbalancerende robot — de aandrijfmotoren, met de encoders die de buitenste positielus voeden
Verken de graaf
Gebruikt in deze bouwprojecten
Projecten, leerroutes en simulators waarin de N20-encoder-tandwielmotor voorkomt.
- ProjectBouw een GPS-waypointrover die zelfstandig rijdt
- ProjectBouw een Mecanum-robot die zijwaarts rijdt
- ProjectBouw een micromouse: robot die doolhoven oplost met flood fill
- ProjectBouw een mini-sumo robot: grip, wig en randherkenning
- ProjectBouw een robot die een gebied afdekt en de vloer veegt
- ProjectBouw een ROS 2-robot die een marker ziet en er naartoe rijdt
- ProjectBouw een zelfbalancerende robot met MPU6050 en PID
- LeerrouteHolonome aandrijving: zijwaarts bewegen zonder te draaien
Vergelijken
Alternatieven
Vragen
FAQ over de N20-encoder-tandwielmotor
Wat is een N20-encodermotor?
Een N20 is een microtandwielmotor van ongeveer 12 bij 10 bij 26 mm met een metalen tandwielkast. De encoderuitvoering voegt een klein magnetisch schijfje en een sensor aan het achteruiteinde van de motoras toe. De tandwielkast geeft hem veel meer koppel dan zijn afmetingen doen vermoeden, en de encoder meldt hoe ver de as werkelijk is gedraaid in plaats van hoe ver je hem hebt gevraagd te draaien.
Waarom gebruiken balancerende robots N20-motoren in plaats van TT-motoren?
Om twee redenen. De metalen tandwielkast heeft veel minder speling dan de kunststof tandwielkast in een TT-motor, en speling is giftig voor een balancerende robot—bij elke omkering van de motor gaat de eerste paar graden van de correctie verloren door de speling van de tandwielkast. De encoder geeft de buitenste regellus bovendien de werkelijke wielpositie, waardoor de robot op zijn plaats kan blijven in plaats van te drijven.
Hoeveel tellingen geeft een N20-encoder per wielomwenteling?
Vermenigvuldig de pulsen van de motoras met de overbrengingsverhouding. Een typische encoder geeft 7 pulsen per motoromwenteling per kanaal; bij een tandwielkast van 1:100 zijn dat 700 pulsen per uitgaande omwenteling, of 2800 tellingen als je alle vier de kwadratuurflanken decodeert. Controleer altijd het getal voor jouw specifieke motor, want zowel het aantal pulsen als de precieze verhouding verschillen per leverancier.
Kan ik een N20 rechtstreeks vanaf een Arduino-pin aansturen?
Nee. Een N20 gebruikt enkele honderden milliampères tijdens het draaien en ongeveer 700 mA bij vastlopen, ver buiten wat een pin kan leveren, en de inductieve terugslag beschadigt de pin. Gebruik een motordriver zoals de TB6612FNG, die ook een spanningsval heeft die laag genoeg is om kleine correctiecommando's de motor daadwerkelijk nog te laten bewegen.
Welke overbrengingsverhouding moet ik kiezen voor een balancerende robot?
Iets tussen 1:50 en 1:150 is de gebruikelijke afweging. Een te hoge verhouding geeft veel koppel, maar de wielen kunnen niet snel genoeg versnellen om een val te corrigeren; een te lage verhouding geeft snelheid, maar de motor heeft niet genoeg koppel om de massa van de robot te verplaatsen. Ongeveer 1:100 bij 12 V, met ongeveer 200 RPM, past bij een typische kleine balancerende robot.
Verder lezen