Tutorial · Principiante · 17 min di lettura
Leggi gli encoder in quadratura per distanza e velocità
Decodifica un encoder in quadratura, converti i conteggi in distanza e velocità, gestisci direzione e overflow ciclico e calibra le misure su un robot reale.
Un encoder di ruota trasforma la rotazione in impulsi digitali. Contando quegli impulpi puoi misurare la distanza percorsa da un robot; contando-li nel tempo puoi stimarne la velocità. Un encoder in quadratura fornisce due canali di impulsi, A e B, sfasati di un quarto di ciclo. Il canale che cambia per primo rivela la direzione.
Gli encoder misurano il moto relativo, non una posizione assoluta. Il conteggio acquisisce significato soltanto dopo l’avvio o un reset intenzionale e diventa utile soltanto dopo che hai definito esattamente quanti conteggi corrispondono a una rivoluzione della ruota.
Leggi la sequenza a due canali
Gli stati validi della quadratura sono 00, 01, 11 e 10. Ruotando in un verso si percorre questa sequenza; ruotando nel verso opposto la si percorre al contrario. Dovrebbe cambiare un solo bit alla volta. Una transizione come 00 direttamente a 11 significa che è stato perso un fronte o che il rumore ha alterato il segnale.
Esistono tre modi di conteggio comuni:
- Decodifica 1×: conta un fronte sul canale A per ciclo.
- Decodifica 2×: conta entrambi i fronti sul canale A.
- Decodifica 4×: conta ogni fronte su entrambi i canali.
Un foglio dati che indica 12 impulsi per rivoluzione può quindi produrre 12, 24 o 48 conteggi software per ogni rivoluzione dell’albero encoder. Aggiungi il rapporto di riduzione se l’encoder è montato sul motore anziché sulla ruota. Scrivi la convenzione completa accanto alla costante: fattori due e quattro non spiegati sono una causa frequente di bug nell’odometria.
Collega correttamente i segnali
Determina se le uscite sono push-pull, open-collector o open-drain. Le uscite aperte richiedono resistenze di pull-up, che possono essere interne oppure esterne a seconda della frequenza dei fronti e del cablaggio. Verifica che la tensione del segnale sia sicura per il controllore: un’uscita encoder da 5 V può danneggiare un ingresso da 3.3 V.
Tieni il cavo lontano dai fili dei motori. Per tratte più lunghe, segui le indicazioni del produttore dell’encoder su cavi e terminazione. Un fronte digitale pulito vale più di qualsiasi tentativo di correggere conteggi falsi via software.
Prima di azionare il motore, gira lentamente la ruota a mano. Entrambi i canali dovrebbero alternarsi fra livelli logici validi. Se uno resta bloccato, correggi il cablaggio prima di esaminare il codice.
Decodifica la direzione senza perdere conteggi
Per velocità moderate, genera un interrupt ogni volta che il canale A cambia e leggi B per determinare la direzione:
volatile long encoderCount = 0;
void onEncoderA() {
bool a = digitalRead(ENCODER_A);
bool b = digitalRead(ENCODER_B);
encoderCount += (a == b) ? 1 : -1;
}
Il segno dipende dall’ordine dei canali e dal montaggio fisico. Scambia A e B oppure nega il risultato, così il moto in avanti della ruota produce un conteggio positivo. Fallo una sola volta al confine hardware, invece di disseminare cambi di segno nel codice di odometria.
A frequenze di fronti elevate, chiamate ripetute a digitalRead() potrebbero essere troppo lente. Usa una periferica hardware per la quadratura, una libreria encoder collaudata per la piattaforma oppure un accesso diretto alle porte adatto al controllore. Stimola il caso peggiore prima di scegliere: edges per second = counts per wheel revolution × maximum wheel revolutions per second.
Mantieni breve il lavoro nell’interrupt. Aggiorna il conteggio, poi torna. Le stampe, le conversioni in virgola mobile e i calcoli di controllo appartengono al ciclo principale.
Converti i conteggi in distanza della ruota
Sia N il numero di conteggi decodificati per rivoluzione della ruota e D il diametro effettivo della ruota. La circonferenza è πD, quindi:
distance = count × πD / N
Per una ruota da 65 mm e 1.440 conteggi decodificati per rivoluzione, ogni conteggio rappresenta circa 0.142 mm. Questa risoluzione matematica non coincide con la precisione reale: la compressione del pneumatico, lo slittamento della ruota e l’errore sul diametro sono di solito maggiori.
Leggi in sicurezza un contatore su più byte. Su un piccolo microcontrollore, un interrupt può aggiornarlo a metà della lettura del ciclo principale. Disabilita brevemente gli interrupt oppure usa il meccanismo atomico della piattaforma:
noInterrupts();
long snapshot = encoderCount;
interrupts();
float distanceM = snapshot * (PI * wheelDiameterM) / countsPerWheelRev;
Usa un contatore con segno sufficientemente ampio e calcola le differenze fra istantanee. La sottrazione modulare di valori senza segno può gestire l’overflow ciclico, ma soltanto se tipi e intervallo di campionamento sono scelti consapevolmente.
Stima la velocità senza amplificare il rumore
A un intervallo di campionamento fisso, calcola la differenza di conteggio:
velocity = (newCount - oldCount) × distancePerCount / elapsedTime
Intervalli brevi rispondono rapidamente, ma quantizzano le basse velocità a zero e salti di un conteggio. Intervalli lunghi sono più fluidi, ma aggiungono ritardo. Parti vicino al periodo del ciclo di controllo, poi fai la media di pochi campioni soltanto se il controllore ne ha davvero bisogno.
Per moti molto lenti, misurare il tempo fra i fronti può essere migliore che contare i fronti entro una finestra fissa. Qualunque metodo usi, assegna la marca temporale con un orologio monotono e usa il tempo trascorso misurato, invece di presumere che ogni ciclo venga eseguito perfettamente nei tempi previsti.
Calibra sull’intera trasmissione
Contrassegna la ruota e falla girare esattamente dieci volte mentre registri i conteggi. La divisione per dieci riduce l’effetto delle interruzioni fra singoli fronti. Poi comanda al robot di percorrere una retta misurata, confronta la distanza dell’encoder con quella sul pavimento e correggi il diametro effettivo della ruota.
Calibra separatamente le ruote sinistra e destra. Se il robot riporta distanze uguali ma curva, i due diametri efficettivi o i guadagni della trasmissione sono diversi. Conserva fattori di scala separati: pneumatici e riduttori reali richiedono questo parametro di regolazione.
Ripeti a una seconda velocità. Una variazione rilevante suggerisce slittamento, mozzi allentati, fronti persi o un problema di temporizzazione anziché un semplice errore di diametro.
Diagnostica di letture errate
- Il conteggio cambia da fermo: rumore elettrico o ingressi flottanti; esamina segnali e resistenze di pull-up.
- L’entità del conteggio è sbagliata esattamente di un fattore 2× o 4×: la modalità di decodifica software e la definizione degli impulsi nel foglio dati non concordano.
- La direzione cambia a caso: un canale è rumoroso oppure viene campionato troppo tardi; verifica la qualità dei fronti e il metodo di decodifica.
- I conteggi si bloccano durante il moto: il controllore non riesce a gestire la frequenza dei fronti; usa la decodifica hardware o riduci il lavoro negli interrupt.
- La distanza è ripetibile ma sbagliata: calibra il diametro effettivo della ruota e il rapporto di riduzione.
- La distanza varia con la superficie: l’encoder misura la rotazione della ruota, non la verità del terreno; lo slittamento della ruota è una reale incertezza sul moto.
Conteggi affidabili sono l’ingresso dell’odometria a trazione differenziale, mentre la retroazione di velocità può chiudere l’anello del motore esplorato nel simulatore del controllore PID. Questa posa è anche l’ingresso che ogni robot seguilinea presuppone, ed è per questo che un suo errore diventa errore di tutti gli altri.
Prossimo passo
Contare è soltanto metà del lavoro. Una velocità misurata è utile perché puoi mantenerla: vedi il controllo in anello chiuso della velocità delle ruote, che trasforma il PWM da tensione in velocità ed evita che un robot curvi perché un motore è stanco. Su una base olonomica questo non è più un’agiatezza: i rapporti delle velocità delle quattro ruote costituiscono lo sterzo e l’anello aperto non ha nulla con cui mantenerli.
Esplora il grafo
Fa parte di queste costruzioni
Progetti e percorsi di apprendimento che includono questo tutorial.
- ProgettoCostruisci un Micromouse per labirinto con flood fill
- ProgettoCostruisci un robot autobilanciante con MPU6050 e PID
- ProgettoCostruisci un robot di copertura che percorre un'intera stanza
- ProgettoCostruisci un robot Mecanum che si muove lateralmente
- ProgettoCostruisci un robot ROS 2 che vede e raggiunge un marcatore
- ProgettoCostruisci un rover GPS autonomo tra punti di passaggio
- PercorsoControllo dei motori per robot: un percorso di apprendimento
- PercorsoInseguimento di percorsi per robot: un percorso di apprendimento
- PercorsoTrazione olonomica: muoviti lateralmente senza girarti
Per approfondire