Go Down

Topic: Debounce hardware per encoder rotativo (Read 1 time) previous topic - next topic

docdoc

Ho anche io esattamente quegli encoder, e li ho usati con la libreria, non ho mai avuto particolari problemi di debounce (forse la libreria fa di suo qualcosa), comunque ho da parte uno schema che avevo trovato e che mi riproponevo di implementare alla prima occasione, vedete se per voi possa essere di aiuto:



Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito ;-) **

the_dragonlord

Ho anche io esattamente quegli encoder, e li ho usati con la libreria, non ho mai avuto particolari problemi di debounce (forse la libreria fa di suo qualcosa), comunque ho da parte uno schema che avevo trovato e che mi riproponevo di implementare alla prima occasione, vedete se per voi possa essere di aiuto:




Io ho un Mega2560 e non c'è modo che riesca a far funzionare l'esempio che ho allegato collegando l'encoder ai pin 2 e 3...

docdoc

Io ho un Mega2560 e non c'è modo che riesca a far funzionare l'esempio che ho allegato collegando l'encoder ai pin 2 e 3...
Si ma prova anche con lo schema che ho postato e facci sapere...
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito ;-) **

the_dragonlord

Si ma prova anche con lo schema che ho postato e facci sapere...

Alla fine non voglio fare un ordine di 10 euro per 2 condensatori....ho provato ad usare l'esempio in polling invece che con interrupt della libreria e tutto funziona più che alla meraviglia senza incertezze o quant'altro per cui per il momento lo tengo così...

Grazie a tutti!
Andrea

the_dragonlord

Si ma prova anche con lo schema che ho postato e facci sapere...

Ciao, sono duvuto tornare sul discorso degli interrupt perchè la gestione in polling dell'encoder non mi va bene....non riesco in nessun modo a far funzionare gli interrupt sul Mega....non solo non riesco con nessuno degli esempi presenti nelle librerie sopra citate, ma nemmeno con l'esempio di Mauro Alfieri:

Code: [Select]
int encoderPin1 = 2;
int encoderPin2 = 3;

volatile int lastEncoded = 0;
volatile long encoderValue = 0;

long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;

void setup() {
Serial.begin(9600);

pinMode(encoderPin1, INPUT_PULLUP);
pinMode(encoderPin2, INPUT_PULLUP);

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

}

void loop() {
Serial.println(encoderValue);
delay(1000);
}

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
}


Da notare che su UNO funziona tutto per cui non è un problema dell'encoder....cosa mi sfugge??? Ah, naturalmente l'encoder è collegato ai PIN digitali 2 e 3

HELPPPPP!
Andrea

the_dragonlord

Guarda che stai parlando di un'encoder ruotato a mano per cambiare i menu, non di un'encoder da motore a 200 o piu passi per giro ... a quelle velocita', anche un solo interrupt sarebbe piu che sufficente ... ci colleghi uno dei due pin e lo agganci al corretto cambio di stato (rising se il pin chiude a VCC, falling se chiude a massa), poi nella ISR controlli lo stato dell'altro, se e' alto stai girando in un senso, se e' basso stai girando nell'altro, sempre ...

Come debounce basta un condensatorino da 10n o valori simili fra il pin e massa, anche per il click ... puoi pure recuperarli da qualche scheda, se non hai un negozio a portata di mano ...
Ciao, disturbo anche te... non riesco in nessun modo a far funzionare gli interrupt nel mio mega2560, ne' l'esempio che ho postato all'inizio ne' quello di Alfieri... sicuramente sbaglio io qualcosa ma davvero sfugge le mie attuali conoscenze... che posso fare?

brunello22

Controlla i collegamenti, perchè deve funzionare anche sulla Mega

Perchè non usi una libreria, che ti semplifica la vita

https://www.pjrc.com/teensy/td_libs_Encoder.html

the_dragonlord

eh lo so che deve ma non funziona  :).. ho già provato 3 librerie ma non questa, domani la provo, grazie!

the_dragonlord

Controlla i collegamenti, perchè deve funzionare anche sulla Mega

Perchè non usi una libreria, che ti semplifica la vita

https://www.pjrc.com/teensy /td_libs_Encoder.html

ma è per Arduino questa libreria?

Etemenanki

I pin 2 e 3 dovrebbero essere interrupt sia sulla uno che sulla mega ... per cui se usi una cosa come quella che avevo suggerito io, con un solo interrupt, dovrebbe funzionare su entrambe ... vale a dire, leggi con un'interrupt uno dei due pin dell'encoder, non importa quale, e con un normale ingresso digitale l'altro ... l'interrupt deve essere impostato come rising se gli ingressi hanno i pulldown e chiudono a VCC, oppure come falling se hanno i pullup e chiudono a GND ... nella ISR basta metterci una cosa tipo if ingresso==1 direzione=1 else direzione=2, e basta, il resto dei controlli li fai al di fuori della ISR, azzerando direzione ogni volta che la trovi diversa da zero, e sei a posto ...

Se invece usi le porte, non e' che fra uno e mega devi cambiare qualcosa ? ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

the_dragonlord

I pin 2 e 3 dovrebbero essere interrupt sia sulla uno che sulla mega ... per cui se usi una cosa come quella che avevo suggerito io, con un solo interrupt, dovrebbe funzionare su entrambe ... vale a dire, leggi con un'interrupt uno dei due pin dell'encoder, non importa quale, e con un normale ingresso digitale l'altro ... l'interrupt deve essere impostato come rising se gli ingressi hanno i pulldown e chiudono a VCC, oppure come falling se hanno i pullup e chiudono a GND ... nella ISR basta metterci una cosa tipo if ingresso==1 direzione=1 else direzione=2, e basta, il resto dei controlli li fai al di fuori della ISR, azzerando direzione ogni volta che la trovi diversa da zero, e sei a posto ...

Se invece usi le porte, non e' che fra uno e mega devi cambiare qualcosa ? ...
Io sono arrivato alla conclusione che mi si sia "bruciato" il mega perchè adesso neppure in polling riesco a far funzionare l'encoder....può essere possibile secondo te?

icio

#26
Nov 16, 2017, 01:04 pm Last Edit: Nov 16, 2017, 01:04 pm by icio
Tutto si rompe, quindi sì, è possibile, non sono indistruttibili

miky_police

Ho anche io esattamente quegli encoder, e li ho usati con la libreria, non ho mai avuto particolari problemi di debounce (forse la libreria fa di suo qualcosa), comunque ho da parte uno schema che avevo trovato e che mi riproponevo di implementare alla prima occasione, vedete se per voi possa essere di aiuto:




confermo che funziona una meraviglia su arduino uno con gli interrupt e non soffre di debounce.
Io presi spunto da questa immagine un paio di mesi fa quando realizzati un pcb con un encoder, 3 pulsanti, un joystick 2 assi e uno schermo i2c da 0,96pollici oled.
Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

the_dragonlord

#28
Nov 21, 2017, 05:02 pm Last Edit: Nov 21, 2017, 05:08 pm by the_dragonlord
Mi è chiaro però allo stesso tempo mi sfugge una cosa: il mio encoder ha già due PIN VCC e GND, per realizzare questo schema dovrei quindi scollegarli?
L'encoder dell'immagine che hai linkato ha tre soli PIN:


Etemenanki

... il mio encoder ha già due PIN VCC e GND ...
Ma tu stai usando solo l'encoder, o e' montato su una breakout con gia le resistenze di pullup (o pulldown) ? ...

Se e' gia montato su una schedina dovrebbe bastare aggiungergli i condensatiri per il debounce (sempre ammesso che non ci siano gia anche quelli) ... e per sapere come chiude, basta che misuri fra GND ed un'uscita a riposo, senza ruotarlo, se leggi VCC chiude a massa, se leggi 0 chiude a VCC ... ;)
"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