Problema lettura/invio valori encoder rotativo

Salve a tutti, sto cercando di leggere i valori di un encoder rotativo per un’applicazione midi, ma ho un po’ di difficoltà perchè non posso utilizzare il programma a doppio interrupt, in quanto utilizzo già un interrupt nel progetto…e sto avendo problemi.

Si tratta di un encoder alps, metallico, a 5 pin (questo: http://it.rs-online.com/web/p/products/7295630/), di cui i due posteriori dovrebbero essere “dummy” cioè non collegati mentre i tre davanti hanno piedinatura a-c-b.

Collegamento: ho collegato il pin centrale dell’encoder a +5V, il pin di destra al digitale 2 e il pin di sx al digitale 4 di arduino (UNO).

Programma:

//pin per encoder
#define encPinA 2
#define encPinB 4

volatile unsigned int enc0Pos = 0;

void setup {

	//Serial.begin(31250); //uso protocollo midi che gira a 31250
        Serial.begin(9600); //per il debug

	pinMode(encPinA, INPUT); 
  	digitalWrite(encPinA, HIGH);       // accende la res di pullup
  	pinMode(encPinB, INPUT); 
  	digitalWrite(encPinB, HIGH);       // accende la res di pullup

  	attachInterrupt(0, doEnc, CHANGE);


}

void doEnc() {

  /* If pinA and pinB are both high or both low, it is spinning
   * forward. If they're different, it's going backward.
   *
   * For more information on speeding up this process, see
   * [Reference/PortManipulation], specifically the PIND register.
   */

if (digitalRead(encPinA) == digitalRead(encPinB)) {
    enc0Pos++;
  } else {
    enc0Pos--;
  }

if (enc0Pos < 0) {

    enc0Pos = enc0Pos + 127; //il segnale midi va da zero a 127 per cui devo limitare la variabile
   
}

else if (enc0Pos > 127) {

    enc0Pos = enc0Pos -127; //il segnale midi va da zero a 127 per cui devo limitare la variabile

}

else {

  Serial.println (enc0Pos, DEC);
  //midiCC(0xB0, 0, enc0Pos); //questa è una funzione per inviare il segnale midi, non cito la funzione, ma sono sicuro che va

}
}

Qualche suggerimento sul perchè non funzioni?

Puoi generare un interrupt ciclico ad alta velocità tramite il Timer0, esempio ogni 100uSec, alla risposta all'irq fai il polling dei 2 canali A e B comparandoli con lo stato precedente per vedere se è cambiato, in questo modo non usi pin di irq esterni e usi un solo timer che comunque può essere utilizzato come RTC per tutti i delay del sistema

icio: Puoi generare un interrupt ciclico ad alta velocità tramite il Timer0, esempio ogni 100uSec, alla risposta all'irq fai il polling dei 2 canali A e B comparandoli con lo stato precedente per vedere se è cambiato, in questo modo non usi pin di irq esterni e usi un solo timer che comunque può essere utilizzato come RTC per tutti i delay del sistema

Mentirei se dicessi che ho capito mezza parola di quello che hai detto :astonished: comunque intanto è una risposta, ed è meglio che niente, se fossi così gentile da tradurre per i niubbi come me sarebbe favoloso :)

Risolto banalmente mettendo a GND il centrale dell'encoder...ero sicurissimo di averci già provato..e invece, l'unica cosa è che la lettura è un po' instabile...nel senso che a volte manda segnali a caso al midi o salta degli scatti (l'encoder serve a scorrere i programmi..capita che passi dal programma 3 al 6 di botto, poi torni al 5 e di nuovo al 6, ruotando nella stessa direzione)..può essere la breadboard che crea questi problemi o è un'instabilità dovuta al circuito in se o al programma?

Può essere che con una resistenza al posto giusto si risolva?

ciao volevo usare anche io l’encoder utilizzando i seguenti collegamenti:
A su PIN 2
B su PIN 4
C su VCC

ho allegato nr. 2 immagini come schema ipotetico,
potete indicarmi se l’idea di collegamento è corretto?
grazie anticipatamente.

encoder rotativo 2.JPG

encoder rotativo 1.JPG