arduino nano lettura encoder rotativo

Sono ai primi passi con arduino e sto facendo un po’ di prove, per cui scusate le domande che potrebbere essere banali. ho fatto un po’ di ricerche, ma non ho trovato nulla che potesse fare al caso mio.

Sto cercando di capire come mai utilizzando un encoder rotativo ed un arduino nano non originale ottengo sempre 4 letture dell’encoder e non solo una. Provando i diversi sketch che ho trovato in rete e che utilizzano il metodo degli interrupt, ottengo dall’encoder sì una sequenza di numeri, ma con un passo di 4 (letti sul monitor seriale) p.e. 4, 8, 12 …

Mi sono studiato il grafico dello stato dei due pin dell’ encoder, ed ho visto che effettivamente ci sono 4 possibilità.

ho provato a richiamare nella funzione:

 attachInterrupt(0, updateEncoder, CHANGE);
 attachInterrupt(1, updateEncoder, CHANGE);

questo codice:

void updateEncoder(){
  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit
 
  int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value
 
  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
 
  lastEncoded = encoded; //store this value for next time
}

ma le letture sono sempre ogni 4 passi

Dove sbaglio? cosa posso usare per avere i valori a passi di 1

Grazie e scusate le domande banali

Carlo B.

Un encoder da 2 segnali rettangolari sfasati di 90°.
Si puó leggere solo un passagggi L-H di una fase e usare la seconda fase per la direzione ddi rotazione
oppure si usa tutti i passaggio L-H e H-L di entrambe le fasi e si ha una risoluzione 4 volte maggiore e ad ogni step un incremento o decremento di 4 numeri.

Dove sbaglio? cosa posso usare per avere i valori a passi di 1

Un altro sketch o dividere per 4.

Ciao Uwe

grazie per la risposta

Ho provato a dividere per 4, ma i risultati sono irregolari, se invece prendo direttamente il valore dai pin dell'encoder, sono binari ...

qualcuno mi sa suggerire uno sketch dal quale prendere spunto, anche per poter imparare

Ciao ti consiglio di leggere questa guida di mauro alfieri:
guida
rslogix52

È stata una delle prime guide che ho visto.

ho copiato e installato il primo sketch, ma mi da i valori di 4 in 4, se lo divido per 4, diventano instabili, specie decrescendo. Ho provato a cambiare con altri encoder, ma la sistuazione rimane la stessa.

L'encoder di che tipo è ,elettronico o meccanico, perché se é del tipo meccanico devi prevedere a un dobuce per non avere delle false letture anche se è il fatto che moltiplica 4 è strano.Leggi anche questo e questo
rslogix52

L'encoder è di tipo meccanico, esattamente come quelli dei link che mi hai indicato.

Forse mi sono espresso male, ma volevo dire che, utilizzando il codice che ho postato (e che ho copiato prorio dalla pagina che hai indicato) sul il monitor seriale posso osservare 4 valori uguali ad ogni scatto dell'encoder:

senso orario

posizione di partenza: 0 0 0 0
primo scatto: 4 4 4 4
secondo scatto: 8 8 8 8
terzo scatto 12 12 12 12

poi se passo al senso antiorario cominciano ad esserci valori apparentemente casuali

9 9 9 9
5 5 5 5
3 3 3 3
-1 -1 -1 -1

Gli encoder meccanici fanno sempre un ciclo completo delle due fasi per ogni click, ovvero hai un totale di quattro cambi stato su i due canali, da qui il conteggio di quattro se intercetti tutti i cambi stato delle fasi.
Il tuo codice è sbagliato nel come calcola gli incrementi, con gli encoder meccanici tieni sotto interrupt un canale, A o B a piacere, considerando solo il rising o il falling, in questo modo hai un singolo count per ogni scatto, tramite xor col secondo canale, collegato ad un qualunque pin a tua scelta senza interrupt, sai se ruoti in senso orario o antiorario.
Più semplicemente usa questa libreria che funziona benissimo con gli encoder meccanici, in tutti i casi è di vitale importanza il debounce hardware, rete RC, per non avere falsi conteggi.

Se proprio non vuoi usare librerie, leggi semplicemente una delle uscite con l'interrupt (uno solo), e poi nella ISR controlli l'altra uscita ... siccome le sequenze sono sempre uguali per ogni click, se, ad esempio, al momento della salita dell'uscita 1, la 2 e' zero, stai per forza girando in un senso, se e' 1 stai per forza girando nell'altro, sempre ... ovviamente questo e' valido solo se non ti fermi a meta' di uno scatto e torni indietro senza averlo completato ... :wink: