Ciao, ho trovato questo Sketch sulla lettura di encoder utilizzando l'interrupt nel libro “Arduino Cookbook”.
/*
RotaryEncoderInterrupt sketch
*/
const int encoderPinA = 2;
const int encoderPinB = 4;
int Pos, oldPos;
volatile int encoderPos = 0; // variables changed within interrupts are volatile
void setup(){
pinMode(encoderPinA, INPUT);
pinMode(encoderPinB, INPUT);
digitalWrite(encoderPinA, HIGH);
digitalWrite(encoderPinB, HIGH);
Serial.begin(9600);
attachInterrupt(0, doEncoder, FALLING); // encoder pin on interrupt 0 (pin 2)
}
void loop(){
uint8_t oldSREG = SREG;
cli();
Pos = encoderPos;
SREG = oldSREG;
if(Pos != oldPos){
Serial.println(Pos,DEC);
oldPos = Pos;
}
delay(1000);
}
void doEncoder(){
if (digitalRead(encoderPinA) == digitalRead(encoderPinB))
encoderPos++; // count up if both encoder pins are the same
else
encoderPos--; //count down if pins are different
}
L'ho provato su Arduino MEGA e ovviamente funziona, però non mi è del tutto chiaro. In particolare non ho capito lo scopo del comando
uint8_t oldSREG = SREG;
e della funzione
cli();
Ho bisogno di capire bene come funziona perché dovrei modificarlo per fare in modo che mi incrementi o decrementi (a seconda della rotazione) una variabile “i” ogni sette impulsi ricevuti.
Il delay è per forza necessario?
Infine ho un'altra domanda: dovendo controllare con due encoder due assi i rotazione indipendenti, è sempre possibile usare l'interrupt o sono costretto a usare due schede Arduino?
Grazie e Buona Pasqua a tutti
Ezio