Encoder rotativo arduino
Encoder rotativo incrementale arduino
Quando vengono usati come controllo, gli encoder rotativi possono essere molto più versatili di un potenziometro. Possono essere utilizzati quando si ha bisogno di un controllo molto preciso, e non sono soggetti alla deriva dovuta alla temperatura.
Un encoder rotativo, che può anche essere chiamato un encoder ad albero, è un dispositivo elettromeccanico che può convertire la posizione angolare (rotazione) di un albero in un segnale di uscita analogico o digitale. Oggi ci concentreremo sui dispositivi digitali.
Ci sono due tipi principali di encoder rotativi: assoluto e incrementale. La differenza è che l’encoder assoluto fornisce la posizione precisa dell’albero in gradi, mentre l’encoder incrementale riporta quanti incrementi l’albero si è spostato, ma non la sua posizione effettiva.
Poiché ci sono due sensori in due posizioni diverse, entrambi produrranno gli stessi impulsi, tuttavia, saranno fuori fase, poiché un sensore pulserà prima dell’altro. Quale sensore va per primo è determinato dal senso di rotazione.
L’encoder di controllo che useremo è un dispositivo molto comune, ed è disponibile da diverse fonti. È anche incluso nel famigerato kit di sensori “37 in uno” che è disponibile in molti negozi di elettronica e online.
L’encoder rotativo di arduino non funziona
Se tutto va bene, dovreste vedere l’output seguente sul monitor seriale.Se la rotazione riportata è l’opposto di quella che vi aspettate, provate a scambiare le linee CLK e DT.Spiegazione del codice:Lo sketch inizia con la dichiarazione dei pin di Arduino a cui sono collegati i pin CLK, DT e SW dell’encoder.#define CLK 2
unsigned long lastButtonPress = 0;Ora nella sezione Setup, definiamo prima le connessioni all’encoder come ingressi, poi abilitiamo la resistenza di pullup di ingresso sul pin SW. Alla fine leggiamo il valore attuale del pin CLK e lo memorizziamo nella variabile lastStateCLK.pinMode(CLK,INPUT);
Arduino Code – Using InterruptsIn order for rotary encoder to work, we need to continuously monitor changes in DT and CLK signals.To determine when such changes occur, we can continuously poll them (like we did in our previous sketch). Tuttavia, questa non è la soluzione migliore per i seguenti motivi.Una soluzione ampiamente adottata è l’uso di un interrupt.Con gli interrupt non è necessario eseguire costantemente il polling dell’evento specifico. Questo libera l’Arduino per fare qualche altro lavoro senza perdere l’evento.CablaggioCome la maggior parte degli Arduino (incluso Arduino UNO) hanno solo due interrupt esterni, possiamo solo monitorare i cambiamenti nei segnali DT e CLK. Questo è il motivo per cui abbiamo rimosso la connessione del pin SW dallo schema di cablaggio precedente.Quindi ora il cablaggio appare così:Alcune schede (come Arduino Mega 2560) hanno più interrupt esterni. Se ne avete una, potete mantenere la connessione per il pin SW ed estendere lo sketch sottostante per includere il codice per il pulsante.Codice ArduinoEcco lo sketch che dimostra l’uso degli interrupt durante la lettura di un encoder rotativo.// Ingressi encoder rotativo
Piedinatura dell’encoder rotativo di arduino
Un encoder rotativo è un tipo di sensore di posizione che converte la posizione angolare (rotazione) di una manopola in un segnale di uscita che viene utilizzato per determinare la direzione di rotazione della manopola. Grazie alla loro robustezza e al controllo digitale fine, sono utilizzati in molte applicazioni tra cui la robotica, le macchine CNC e le stampanti. Ci sono due tipi di encoder rotativi – assoluto e incrementale. L’encoder assoluto ci dà la posizione esatta della manopola in gradi, mentre l’encoder incrementale riporta quanti incrementi l’albero si è spostato (passi).L’encoder rotativo utilizzato in questo tutorial è di tipo incrementale.
Nell’esempio animato qui sotto, potete vedere come funziona un encoder. All’interno dell’encoder abbiamo alcune piazzole di rame (colore marrone nell’animazione). Questi sono collegati a GND. Poi abbiamo due pin, clock e dati, con un pullup a 5V. In questo modo, quando il pin è in circuito aperto, sarà “HIGH” o 5V. Durante la rotazione, questi due perni toccheranno i pad di rame, tirando l’uscita a GND poiché i pad sono direttamente collegati a GND. Così, ogni volta che tocchiamo un pad di rame, abbiamo un impulso “LOW”. Contando questi impulsi, possiamo contare i passi. Se rileviamo 10 impulsi per esempio, allora l’encoder ha saltato 10 pad di rame. Sapendo quanti pad (passi) ha l’encoder, possiamo calcolare l’angolo di rotazione.
Segnale dell’encoder rotativo
Se tutto va bene, dovreste vedere l’output qui sotto sul monitor seriale.Se la rotazione riportata è il contrario di quello che vi aspettate, provate a scambiare le linee CLK e DT.Spiegazione del codice:Lo sketch inizia con la dichiarazione dei pin di Arduino a cui sono collegati i pin CLK, DT e SW dell’encoder.#define CLK 2
unsigned long lastButtonPress = 0;Ora nella sezione Setup, definiamo prima le connessioni all’encoder come ingressi, poi abilitiamo la resistenza di pullup di ingresso sul pin SW. Alla fine leggiamo il valore attuale del pin CLK e lo memorizziamo nella variabile lastStateCLK.pinMode(CLK,INPUT);
Arduino Code – Using InterruptsIn order for rotary encoder to work, we need to continuously monitor changes in DT and CLK signals.To determine when such changes occur, we can continuously poll them (like we did in our previous sketch). Tuttavia, questa non è la soluzione migliore per i seguenti motivi.Una soluzione ampiamente adottata è l’uso di un interrupt.Con gli interrupt non è necessario eseguire costantemente il polling dell’evento specifico. Questo libera l’Arduino per fare qualche altro lavoro senza perdere l’evento.CablaggioCome la maggior parte degli Arduino (incluso Arduino UNO) hanno solo due interrupt esterni, possiamo solo monitorare i cambiamenti nei segnali DT e CLK. Questo è il motivo per cui abbiamo rimosso la connessione del pin SW dallo schema di cablaggio precedente.Quindi ora il cablaggio appare così:Alcune schede (come Arduino Mega 2560) hanno più interrupt esterni. Se ne avete una, potete mantenere la connessione per il pin SW ed estendere lo sketch sottostante per includere il codice per il pulsante.Codice ArduinoEcco lo sketch che dimostra l’uso degli interrupt durante la lettura di un encoder rotativo.// Ingressi encoder rotativo