Go Down

Topic: arduino nano lettura encoder rotativo (Read 1 time) previous topic - next topic

carlob

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:
Code: [Select]

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

questo codice:
Code: [Select]
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.

uwefed

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.

Quote
Dove sbaglio? cosa posso usare per avere i valori a passi di 1
Un altro sketch o dividere per 4.

Ciao Uwe

carlob

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

rslogix52

#3
Dec 09, 2017, 07:41 pm Last Edit: Dec 09, 2017, 07:41 pm by rslogix52
Ciao ti consiglio di leggere questa guida di mauro alfieri:
guida
rslogix52

carlob

È 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.

rslogix52

#5
Dec 09, 2017, 08:48 pm Last Edit: Dec 09, 2017, 08:57 pm by rslogix52
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

carlob

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


astrobeed

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.
Scientia potentia est

Etemenanki

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 ... ;)
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

Go Up