«

»

Ago 13

Stampa Articolo

Rover 5: usare l’encoder

Il rover 5 è dotato di 4 motori indipendenti ciascuno dotato di un encoder ottico al suo interno:

rover 5 encoder

l’utilizzo dell’encoder ti aiuta a gestire molte informazioni come la direzione, il numero di giri compiuti da ciascuna ruota, ecc…

Puoi confrontare il segnale proveniente dal lato destro con quello proveniente dal lato sinistro per verificare che il rover 5 stia andando in linea retta o correggere la velocità del lato più veloce per adattarla a quella del lato più lento.

In presenza di ostacoli superati con un solo lato potresti decidere di aumentare la velocità di rotazione di quel lato per continuare a mantenere un moto lineare.

Conoscere il verso di rotazione ti permette di capire se il rover 5 si sta muovendo in avanti o indietro, certo puoi guardarlo … se lo hai vicino a te.

L’uso degli encoder in robotica è diffuso e utile in molte situazioni.

Montaggio

Il Rover 5 arriva già montato tuttavia per una curiosità personale non solo ho provato a modificarne l’assetto ma ho anche aperto uno dei blocchi motore per capire come è fatto l’encoder di cui è dotato:

rover 5 encoder

l’encoder è di tipo ottico, ossia due sensori IR leggono i passaggi di bianco e nero presenti sulla ruota dentata posta loro difronte e divisa in 8 spicchi ( 4 bianchi e 4 neri ), ora che sai come è fatto è il caso di rimontarlo, puoi seguire il mio video:

Non dovresti incontrare difficoltà.

Come funziona l’encoder

Sai già che quello di cui parliamo è un encoder ottico formato da sensori IR, ma perchè 2 e non uno solo? la risposta l’ho trovata in questo articolo da cui ho appreso non solo questa risposta ma anche la quadratura e lo sketch che ti propongo.

Il motivo del doppio sensore e quindi anche di 2 fili per ciascun encoder ( oltre al VCC = +5v e GND = negativo ) è che i due forniscono ciascuno una forma d’onda quadra sfalsata l’uno rispetto all’altro.

Rover 5 Encoder

questa differenza tra le due onde ti serve a capire in che direzione stanno girando i motori, per farlo puoi utilizzare la tabella di decodifica realizzata da OddBot, l’autore dell’articolo sopra.

In funzione del verso di rotazione puoi avere una sequenza del tipo:

  • 00 = 0
  • 01 = 1
  • 11 = 3
  • 10 = 2

oppure

  • 00 = 0
  • 10 = 2
  • 11 = 3
  • 01 = 1

Eseguendo una operazione XOR sui segnali ottieni che l’output unico dei due è quello riportato in questa figura:

Rover 5 Encoder

ossia quello della sequenza 00,01,11,10 in un verso e 00,10,11,01 nel verso contrario.

Da questi dati OddBot ha ricavato una tabella:

Rover 5 - Tabella di quadratura

in cui la X come lui stesso afferma è il momento di disallineamento tra i due lettori ottici, si verific in percentuale molto bassa e la colpa è dovuta ad una mancata lettura di uno dei due segnali o a un segnale sporco giunto ad arduino, nella matrice che poi utlizzerai per lo sketch questo valore è indicato come 2, il suggerimento è di ignorarlo se lo leggi nel codice e di passare alla lettura successiva.

lo 0, invece si presenta quando non ci sono variazioni ossia il vecchio ed il nuovo valore sono identici, questo vale sia che il valore rilevato dia 0,1,2 o 3.

Un ultima info prima di passare allo sketch ed alla parte pratica, oltre al verso potrebbe esserti utile sapere quanti giri ha eseguito l’encoder per far questo puoi prendere in considerazione il dato fornito dalla DFRobot, produttrice del Rover 5: ogni 3 giri di una ruota hai 1000 segnali inviati, contando tali segnali nel tempo T otterrai anche la velocità di rotazione, se in 2 secondi leggi 1333 impulsi allora stai eseguendo 2 giri al secondo, secondo la formula (((n. impulsi / 1000) * 3) +1).

Lo sketch

Dopo tutti i racconti teorici è il momento della pratica:

int QEM [16] = {0,-1,1,2,1,0,2,-1,-1,2,0,1,2,1,-1,0};
int inputA = 2;
int inputB = 3;
int Old = 0;
int New = 0;
int Out = 0;

void setup()
{
   Serial.begin( 9600 );
   Serial.println( "Start" );

   pinMode( inputA, INPUT );
   pinMode( inputB, INPUT );
}

void loop() {
   Old = New;
   New = digitalRead (inputA) * 2 + digitalRead (inputB);

   Out = QEM [Old * 4 + New];
   Serial.print( "XOR: " );
   Serial.println( Out );

}

Lo sketch che ti propongo l’ho realizzato partendo dalle indicazioni fornite da OddBot e dalla base teorica che hai appena letto.

La matrice QEM (Quadrature Encoder Matrix ) è il cuore dello sketch in quanto definisce quanto descritto sopra, in particolare la presenza del numero 2 è voluta per indicare un disallineamento dei segnali.

linee 02-03: definisci i due pin a cui colleghi i segnali provenienti dall’encoder;

linee 04-06: inizializza tre variabili di tipo integer in cui memorizzerai i dati letti e quelli calcolati ad ogni passaggio;

linee 10-11: definisci l’apertura del canale per la comunicazione seriale e stampi sul monitor seriale la stringa “Start”;

linee 13-14: definisci i pin inputA e B in modalità INPUT, sono quelli da cui leggi il segnale degli encoder, nota che utilizzando la funzione digitalWrite() è necessario che i due pin siano di tipo digitale;

linea 18: ad ogni loop() dello sketch riassegni alla variabile Old il valore della variabile New è un sistema che hai già incontrato in altri casi, assegnare quello che è il nuovo valore fino al loop() precedente alla variabile precedente, in modo da conservare il valore prima di rilevarlo nuovamente in questo loop();

linea 19: calcola il nuovo valore leggendolo dagli imput digitali A e B ( rispettivamente 2 e 3 ) secondo la formula

((A * 2) +B)

se prendi ad esempio i primi 4 step dell’onda rappresentati in questa figura

Rover 5 Encoder

ed esegui la formula sostituendo i valori rilevati ottieni:

  • step 1: ((0 * 2) + 0) = 0
  • step 2: ((0 * 2) + 1) = 1
  • step 3: ((1 * 2) + 1) = 3
  • step 4: ((1 * 2) + 0) = 2

prova a guardare in alto dove ho riportato le fasi della rotazione ed avrai chiaro come le forme d’onda restituiscano la sequenza descritta.

linea 21: imposta la variabile OUT ricavando il suo valore dall’array QEM il cui indice è calcolato come: (Old * 4) + New. anche in questo caso ti riporto un esempio, osservando la matrice ipotizza di essere al primo loop:

  • il valore di Old è 0, se New è 0 ottieni 0 => QEM[0] = 0;
  • al loop successivo Old è 0 e New è 1, ottieni 1 => QEM[1] = -1;
  • al loop successivo Old = 1 e New = 3 ottieni 7 => QEM[7] = -1
  • e così via otterrai sempre -1 fino a che il senso di rotazione non cambia;

Come indica l’autore della matrice questo sketch restituisce sempre -1 per un senso rotatorio e +1 per il senso opposto, 0 quando tutto è fermo e 2 in caso di errori dovuti a segnali sporchi o microcontrollore toppo lento rispetto all’encoder.

Infine restano le linee 22-23: in cui scrivi nel monitor seriale il risultato dell’operazione di XOR eseguita con lo sketch;

Questo semplice sketch ti aiuta sia a testare l’encoder sia a valutare la direzione del rover 5 in sketch più compelssi di gestione del tuo rover.

Buona sperimentazione.

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/rover-5-usare-lencoder.html

4 comments

3 pings

Vai al modulo dei commenti

  1. Anna

    Ciao ,
    sono molto nuova in questo campo e volevo chiedere se sai dirmi qualcosa in più su questo oggetto:
    http://www.robot-italy.com/it/12v-170rpm-gearmotor-with-encoder.html
    mi hanno assegnato questo compito e devo portarlo a termine il prima possibile…
    si tratta di un motore encoder ma sai dirmi qualcos’altro??

    1. Mauro Alfieri

      Ciao Anna,
      ho spostato il tuo commento in un articolo che tratta di encoder.
      Il link riporta al motore EMG30 motoriduttore con 30:1 ed ingranaggi in metallo, dotato di un encoder, come tu sottolinei, di tipo ad effetto Hall.
      Nella scheda ci sono anche molte altre specifiche, di cosa tratta il compito?
      Conoscendolo posso darti maggiori informazioni.

      Mauro

  2. Daniele

    ciao,
    questo articolo è molto interessante, soprattutto la matrice di quadratura dell’encoder.
    L’unico appunto che volevo fare è che tu parti sempre da 0 se c’è una nuovo lancio dello sketch, mentre avrebbe più senso mettere un new=digitalRead (inputA) * 2 + digitalRead (inputB); prima del loop, in maniera da avere già le condizioni di partenza, altrimenti rischi di perdere la prima rilevazione o di avere un iniziale lettura sbagliata (che si autocorregge con l’avanzare delle letture).

    1. Mauro Alfieri

      Grazie Daniele per il suggerimento.

      Mauro

  1. Rover5: il montaggio e il primo test - Mauro Alfieri

    […] Rover5 hai già letto altri tutorial relativi al cambiare l’assetto e sistemare i cavi ed il controllo degli encoder oggi lo assembliamo e ci carichiamo il primo […]

  2. Rotary Encoder: utilizza un encoder con Arduino - Mauro Alfieri

    […] con l’encoder e qualche sketch per Arduino. Degli encoder hai già letto nell’articolo Rover 5: usare l’encoder, in cui hai analizzato il tipo di encoder presente nel Rover5, usato in altri progetti, e la teoria […]

  3. Arduino: ottimizzare la EEPROM - Mauro Alfieri Elettronica Informatica

    […] di voler misurare la rotazione con un encoder ad impulsi, se l’albero di rotazione è fissato in modo che ad ogni giro del albero rotore […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>