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.

Diagramma temporale dei due canali di uscita di un encoder in quadratura. Il canale A è tracciato sopra il canale B come onde quadre della stessa frequenza, con B sfasato di un quarto di ciclo dietro A. Quattro linee verticali tratteggiate indicano le quattro transizioni di un ciclo elettrico, numerate da uno a quattro e annotate che contarle tutte fornisce 1200 conteggi per rivoluzione con un encoder da 300 CPR. Una nota indica lo sfasamento di fase e spiega che B in ritardo rispetto ad A indica moto in avanti, mentre B in anticipo rispetto ad A indica che la ruota sta girando al contrario.
Un ciclo, quattro fronti contabili. Il canale in anticipo indica la direzione; quanti fronti conti decide se le distanze sono corrette o sbagliate di un fattore quattro. Scarica SVG

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.

Per approfondire

Fonti