Sensore di rotazione con un encoder incrementale e Arduino

In questo nuovo articolo voglio mostrarvi come usare un encoder con la nostra amata scheda Arduino.
Un encoder non è altro che un sensore di posizione che serve a determinare la posizione angolare di un albero rotante come può essere ad esempio il rotore di un motore stepper.

Gli encoder fornisco un impulso elettrico che opportunamente elaborato dal nostro scketch ci fornisce con precisione la posizione che vogliamo controllare, essi si differenziano principalmente in due macro categorie:

  • Gli encoder incrementali
  • Gli encoder assoluti

La differenza tra queste tipologie di encoder è che quelli assoluti forniscono la posizione angolare dell’albero dovunque esso si trovi mentre gli encoder incrementali forniscono solo degli impulsi che se contati restituisco il movimento angolare effettuato dal nostro albero. In questo tutorial noi prenderemo in esame quelli più semplici e più comuni gli encoder Incrementali.

Come funzionano gli encoder incrementali

[wp_bannerize group=”arduino_post” random=”1″ limit=”1″]
Gli encoder in genere sono formati da un disco rotante dentellato e due sensori montati in corrispondenza dei denti del disco, l’esempio più comune nell’utilizzo degli encoder lo possiamo trovare all’interno dei mouse con rotella che usiamo con i nostri PC.
Infatti se provassimo ad aprire un vecchio mouse non funzionante in corrispondenza della rotella ci troveremo davanti un qualcosa del genere.

come funziona il mouse

I due sensori forniscono un segnale ad onda quadra sfasato di 90 gradi elettrici e grazie a questo piccolo accorgimento riusciremo a controllare il senso di rotazione del nostro albero. Qui di seguito vediamo un grafico che mostra l’andamento del segnale elettrico in base al senso di rotazione

andamento segnale encoder

Da questo grafico possiamo vedere che per determinare il senso di rotazione è sufficiente confrontare i segnali dei due sensori. Ad esempio prendendo come riferimento il segnale del sensore A quando questo cambia stato da 0 a 1 oppure da 1 a 0 e confrontandolo con il valore letto sul sensore B se questi valori sono diversi possiamo determinare che la rotazione è avvenuta in senso orario se invece sono uguali vuol dire che la rotazione è avvenuta in senso antiorario.

Cosa ci serve per questo tutorial

In questo piccolo tutorial vedremo come utilizzare un encoder incrementale con Arduino per ottenere la posizione di un albero, se ancora non li hai puoi ordinarli dai seguenti link.

*Acquistando i componenti attraverso i link qui sopra mi aiuterai sostenendo il mio lavoro, il tuo supporto è indispensabile!

Programma per la gestione di un encoder con Arduino

[wp_bannerize group=”arduino_post” random=”1″ limit=”1″]

 #define outputA 6
 #define outputB 7
 int contatore = 0; 
 int aStato;
 int aUltimoStato;  
 void setup() { 
   pinMode (outputA,INPUT);
   pinMode (outputB,INPUT);
   
   Serial.begin (9600);
   // Leggo lo stato iniziale dell'uscita A dell'encoder
   aUltimoStato = digitalRead(outputA);   
 } 
 void loop() { 
   aStato = digitalRead(outputA); // Leggo il valore corrente del sensore A
   // Se i due valori sono diversi questo significa che è avvenuto un cambiamento di stato
   if (aStato != aUltimoStato){     
     // Se lo stato del sensore B è diverso da quello A significa che l'encoder a ruotato in senso orario
     if (digitalRead(outputB) != aStato) { 
       contatore++;
     } else {
       contatore--;
     }
     Serial.print("Posizione: ");
     Serial.println(contatore);
   } 
   aUltimoStato = aStato; // Aggiorno la variabile dell'ultima lettura
 }

Lo sketch è ampiamente commentato ma se incontrate qualche difficoltà nel capire il funzionamento non esitate a contattarmi con il box commenti qui sotto.

Commenti

  1. Carlo

    Buon giorno. Anche se sono a zero con la conoscenza di Arduino sto tentando di risolvere un problema con 2 encoder e due letture separate degli stessi. Le letture devono essere mandate ad un display i2c 20-04. Ora sono davanti ad un muro perchè non so come distinguere e separare le due letture e le due scritture.
    Che lei sappia è gia stato fatto qualcosa di simile con arduino Mega?
    Grazie per l’eventuale risposta.Carlo Carini

Lascia un commento

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