Rotary encoder....

Buongiorno a tutti!
Volevo sperimentare un encoder rotativo...ma mi sono subito arenato...
Uso un arduino mega, ed ho connesso il centrale del rotativo a gnd ed i 2 pin agli estremi del rotativo sui pin 18 e 19 dell'arduino mega...
Poi ho preso questo esempio (ho solo cambiato i pin encoderPin1 e encoderPin2 per adattarli all'arduino mega, come scritot nella documentazione qui: attachInterrupt() - Arduino Reference )

Il problema è che nel terminale vedo solo "0" quando ruoto l'encoder.
Idee?

int encoderPin1 = 18;
int encoderPin2 = 19;

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); 
}

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
}

Risolto...devo usare int 4 e int 5 per il mega....spero possa essere utile ad altri...

Invece di hardcodare i numeri degli Interrupt, usa la macro digitalPinToInterrupt(), è fatta apposta.

SukkoPera:
... hardcodare ...

AAARGH ... BLASFEMO !!! ... ANAT(R)EMA !! ... al rogo, al rogo ...

(scusa, non ho resistito :stuck_out_tongue: :D)

SukkoPera:
Invece di hardcodare i numeri degli Interrupt, usa la macro digitalPinToInterrupt(), è fatta apposta.

ok! la prox volta faccio così :slight_smile:

A proposito, a che velocita' lo devi far girare ? ... e' tipo un'encoder attaccato ad un motore, o un'encoder "a scatti" da pannello, da azionare manualmente, per cambiare opzioni o valori ?

Nel secondo caso, dato che piu velocemente di tanto non potrai mai farlo girare, usa un solo interrupt ... per come sono fatti quegli encoder a scatti, nel momento in cui uno dei due canali cambia stato, l'altro e' sempre stabile ed ha sempre lo stesso valore secondo il senso di rotazione, quindi per rilevare incremento o decremento ti basta controllare lo stato di una uscita nel momento in cui l'altra, attaccata all'interrupt, sale (o scende, dipende dal tipo del tuo encoder) ...

> michelinok: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post iniziale (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Grazie,

Guglielmo

Secondo me un encoder meccanico (quello di tipo manopola per girare) e interrupt non vanno bene insieme. Manca il debounce.

Se é un encoder attacato a un motore motrebbe girare troppo veloce.

Dacci piú info.
Ciao Uwe