Salve a tutti,
premetto che è il mio primo post sul forum pertanto spero di riuscire da subito a non infrangerne alcuna regola di comportamento. Altro particolare importante è che essendomi avvicinato all'elettronica ed alla programmazione da poco ed in via del tutto amatoriale, spero riusciate a porvi a me come se doveste spiegare qualcosa ad un giovane ragazzo (per non dire a un bambino).
Ma veniamo al dunque:
ho usato questo codice per testare il più economico encoder rotativo acquistabile su amazon ma quando provo a ruotarlo, anzicchè ottenere aumenti o diminuzioni unitarie dell'"encoderValue", come primo valore incrementale ottengo 2 e quelli successivi si avvicendano a multipli di 4 e cioè: 6,10,14...ecc. (situazione speculare per i numeri negativi).
Perchè questo risultato inatteso? Come faccio ad ottenere letture unitarie?
Quasi dimenticavo, uso un Arduino Mega 2560
int encoderPin1 = 2;
int encoderPin2 = 3;
volatile int lastEncoded = 0;
volatile int encoderValue = 0;
long lastencoderValue = 0;
int lastMSB = 0;
int lastLSB = 0;
void setup() {
Serial.begin (9600);
pinMode(encoderPin1, INPUT);
pinMode(encoderPin2, INPUT);
digitalWrite(encoderPin1, HIGH);
digitalWrite(encoderPin2, HIGH);
attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);
}
void loop(){
Serial.println(encoderValue);
delay(1000);
}
void updateEncoder(){
int MSB = digitalRead(encoderPin1);
int LSB = digitalRead(encoderPin2);
int encoded = (MSB << 1) |LSB;
int sum = (lastEncoded << 2) | encoded;
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
lastEncoded = encoded;
}