encoder rotativo incrementa solo

Salve a tutti,
sono in possesso di un encoder rotativo e l'ho impiegato per fare un voltante joystick da pc attraverso un Arduino uno; il vero problema è che da qualsiasi dei due versi di rotazione io giri l'albero dell'encoder il counter si incrementa solo! Cosa posso fare?
Come sketch ho usato il classico con gli interrupt (non posso farlo senza perché il programma fa altro oltre che controllare l'encoder) Di seguito vi lascio per sicurezza la parte del programma che eseguo con l'interrupt

void setup()   {
  pinMode (outputA, INPUT);
  pinMode (outputB, INPUT);
  aLastState = digitalRead(outputA);
  attachInterrupt(digitalPinToInterrupt(outputA), doEncoder, CHANGE);
}


void doEncoder() {
  aState = digitalRead(outputA); // Reads the "current" state of the outputA
  // If the previous and the current state of the outputA are different, that means a Pulse has occured
  if (aState != aLastState) {
    // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
    if (digitalRead(outputB) != aState) {
      counter -= 550;
    } else {
      counter += 550;
    }
  }
  aLastState = aState; // Updates the previous state of the outputA with the current state
  sterzo = constrain(counter, -32768, 32767);

}

Grazie a tutti coloro che mi risponderanno

Magari mettere l’intero programma…

E non chiamare output gli input…

Standardoil:
Non chiamare output gli input...

Per esempio, chiama gli ingressi encoderA e encoderB.

Sì effettivamente c’avete ragione, ho sbagliato a scrivere!
vi allego l’intero file

calibrazione_potenziometri.ino (2.72 KB)

Potrebbe essere un problema di Arduino? Vedo però che anche cambiando il secondo pin non cambia il risultato

Magari sapessimo anche che encoder stai usando, ottico, meccanico?? Ha già dei pullup/pulldown e dei condensatori antirimbalzo? Oppure è ottico con uscite open collector?
Se dici che incrementa da solo può facilmente essere dovuto ai problemi sopra elencati.

Ciao, Ale.

Dice che incrementa solamente... non che lo faccia da solo.

Potrebbe essere un problema di Arduino?

Gira e rigira la colpa è sempre di arduino...

enrico03:
Potrebbe essere un problema di Arduino? Vedo però che anche cambiando il secondo pin non cambia il risultato

L'unica cosa che noto è che le variabili che modifichi dentro all'interrupt devi definirle "volatile":

...
volatile long int counter = 0;
volatile int aState;
volatile int aLastState;
volatile int sterzo = 0;
...

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.