Go Down

Topic: encoder (Read 167 times) previous topic - next topic

andrea1191

ciao, sto facendo un progetto e purtroppo ho appena le basi di programmazione, ho gia avuto un po' d'aiuto qui sul forum.
C'e' un modo per comandare 3 pin con un encoder?
nel senso che girandolo a destra accende un pin, a sinistra un altro, e premendolo un altro?
grazie

docdoc

Dato che devi cercare di imparare, inizia a fare qualcosa di semplice come mostrare sulla seriale un valore che aumenta o diminuisce quando giri l'encoder. Ad esempio inizia da cose come QUESTA.

Una volta capito come si legge e gestisce l'encoder, allora passi alla fase successiva nella quale accendi i led a seconda della direzione del movimento. Se hai problemi, posta qui il tuo codice dicendo anche cosa fa e/o non fa, e cercheremo di aiutarti.

Ed una volta fatto questo, sicuramente quello che hai in mente non è limitato a far accendere un led per cui poi (ma NON ora!) spiegaci come vorresti impiegare l'encoder.
Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

elrospo

#2
Apr 04, 2021, 09:48 pm Last Edit: Apr 04, 2021, 09:50 pm by gpb01
ciao, sto facendo un progetto e purtroppo ho appena le basi di programmazione....
mah  dovresti spiegarti "meglio"  mentre si Accende un pin  gli altri 2 devono spegnersi?  cioe sempre uno solo acceso?

mrk88

Come dice giustamente docdoc devi prendere dimestichezza con l'encoder e la programmazione che c'è dietro, comunque se ti può essere d'aiuto guarda questa libreria Libreria ENCODER. Ti semplifica il lavoro

Datman

#4
Apr 08, 2021, 02:29 pm Last Edit: Apr 08, 2021, 02:38 pm by Datman
Il metodo di base per la lettura di un encoder è leggere il livello di uno dei due segnali nell'istante in cui l'altro cambia stato. Hardware si fa con un flip flop di tipo D.
Io solitamente faccio così:
Code: [Select]
void encoder()
{
uint8_t S; // Lettura dei due valori dell'encoder.
uint8_t So;// Lettura precedente dell'encoder.
uint8_t X; // Usato per evitare letture multiple.
E=0;
//            PD 76543210
// S=3-(PIND>>3)&B00000011; Serviva per l'encoder su PD3 e PD4.
// S=3-PIND&B00000011; Gli I/O 0 e 1 sono PD0 e PD1, perciò non devo scorrere a destra.
S=3-((PIND>>4) & B00000011); // Gli I/O 4 e 5 sono PD4 e PD5, perciò devo scorrere a destra di 4 bit.
                             // Il valore binario di S rappresenta A e B. Il centrale dell'encoder è a massa, quindi faccio complemento a 3 (11).
S^=S>>1; // Faccio XOR (^) fra S (gray) e il suo bit 1, facendolo scorrere a Dx: AB XOR A,
         // ottenendo un binario che per ogni scatto fa 0-1-2-3-0 oppure 0-3-2-1-0.
if(S!=So && S==0) X=0;
if(X==0)
  {
  if(So==1 && S==2)
    {E=1; X=1;}
  if(So==3 && S==2)
    {E=-1; X=1;}
  if(S==0)
    {E=0; X=0;}
  So=S;
  }
} // FINE Encoder().

Si può fare così, senza usare gli interrupt, se la funzione viene chiamata in continuazione. Solitamente la uso in un ciclo molto stretto solo di impostazioni e visualizzazione, dal quale poi torno al funzionamento normale del dispositivo. Ogni volta che viene chiamata, la funzione aggiorna il valore di E, che sarà 0 se l'encoder non è stato mosso, -1 se è stato ruotato in seno antiorario e 1 se è stato ruotato in senso orario. Se il risultato è opposto, bisogna scambiare i collegamenti all'encoder.
Studialo bene e impara, non usarlo come se fosse una libreria a scatola chiusa!
Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

Go Up