problème codeur incremental

Salut, je tente d’écrire un code qui m’affiche le nombre de ticks de mon codeur pendant que celui ci tourne. Voici mon code:

int codeurPinA = 2;
int codeurPinB = 3;
int codeurInterruptionA=0;
int codeurInterruptionB=1;
volatile unsigned int ticksCodeur = 0;

void setup() {
  
  pinMode(codeurPinA, INPUT); 
  pinMode(codeurPinB, INPUT);

  digitalWrite(codeurPinA, HIGH); //turn pullup resistor on
  digitalWrite(codeurPinB, HIGH);
  //Setup Channel A
  pinMode(12, OUTPUT); //Initiates Motor Channel A pin
  pinMode(9, OUTPUT); //Initiates Brake Channel A pin
  attachInterrupt(codeurInterruptionA, GestionInterruptionCodeurPinA,CHANGE);
  attachInterrupt(codeurInterruptionB, GestionInterruptionCodeurPinB,CHANGE);
  Serial.begin (9600);
}


void GestionInterruptionCodeurPinA()
{
  if (digitalRead(codeurPinA) == HIGH) {

                // check channel B to see which way encoder is turning
                if (digitalRead(codeurPinB) == LOW) {
                        ticksCodeur = ticksCodeur + 1;         // CW
                }
                else {
                        ticksCodeur = ticksCodeur - 1;         // CCW
                }
        }

  else   // must be a high-to-low edge on channel A
        {
                // check channel B to see which way encoder is turning
                if (digitalRead(codeurPinB) == HIGH) {
                        ticksCodeur = ticksCodeur + 1;          // CW
                }
                else {
                        ticksCodeur = ticksCodeur - 1;          // CCW
                }
        }
  Serial.println (ticksCodeur, DEC);
  Serial.println(ticksCodeur);
}
void GestionInterruptionCodeurPinB()
{
 if (digitalRead(codeurPinB) == HIGH) {

                // check channel A to see which way encoder is turning
                if (digitalRead(codeurPinA) == HIGH) {
                        ticksCodeur = ticksCodeur + 1;         // CW
                }
                else {
                        ticksCodeur = ticksCodeur - 1;         // CCW
                }
        }

        // Look for a high-to-low on channel B

        else {
                // check channel B to see which way encoder is turning
                if (digitalRead(codeurPinA) == LOW) {
                        ticksCodeur = ticksCodeur + 1;          // CW
                }
                else {
                        ticksCodeur = ticksCodeur - 1;          // CCW
                }
        }
        Serial.println (ticksCodeur, DEC);
        Serial.println(ticksCodeur);
  }

void loop() {
   
  
  
  digitalWrite(9, HIGH); //Eengage the Brake for Channel A
    
}

le problème est que ça m’affiche que des 0,1,2,-1 ou -2…
j’ai trouvé le code de base (sans le serial.print ) sur plusieurs sites internet donc il doit marcher. :roll_eyes:
j’ai joint une photo de mon montage au msg.
merci d’avance :kissing:

jujuoik9: le problème est que ça m'affiche que des 0,1,2,-1 ou -2.. j'ai trouvé le code de base (sans le serial.print ) sur plusieurs sites internet donc il doit marcher. :roll_eyes: j'ai joint une photo de mon montage au msg. merci d'avance :kissing:

bonjour quel encodeur ? cablé comment ? vitesse de rotation ? (reccurence des appels int) le serial ça prend du temps perso pour "jouer" avec les encodeurs j'utilise cette librairie qui permet l'optimisation en fonction de la vitesse souhaitée

Bonjour,

Ce qui est étrange c’est que tu ais deux traitements d’interruption.
En général on traite un canal en it et dans cette it on lit l’état de l’autre canal ce qui donnes le sens.

kamill: Bonjour,

Ce qui est étrange c'est que tu ais deux traitements d'interruption. En général on traite un canal en it et dans cette it on lit l'état de l'autre canal ce qui donnes le sens.

bonjour kamill tu peux avoir 3 cas possibles pour gerer de l'encodeur A/B 2 int 1 int polling le choixx est à faire en fonction de la vitesse attendue la lib que j'evoque permet cette selection ainsi que le X4 (gestion de chaque transition

Bonjour Artouste,

On en apprend tous les jours, moi j'ai toujours traité avec une seule interruption.

voici l'encodeur : https://www.pololu.com/product/1447 Pour l'instant je fait juste tourner l'encodeur a la main (donc pas très vite), et pour le câblage tu peux voir ça sur la photo jointe a mon premier message (enfin j’espère dites moi si vous ne voyez rien ^^). merci des réponses :) PS: ta bibliothèque a l'ai bien pratique! je vais l'utiliser je pense (mais j'aimerais bien comprendre ou est le problème dans mon code avant ^^)

jujuoik9: voici l'encodeur : https://www.pololu.com/product/1447 Pour l'instant je fait juste tourner l'encodeur a la main (donc pas très vite), et pour le câblage tu peux voir ça sur la photo jointe a mon premier message (enfin j’espère dites moi si vous ne voyez rien ^^). merci des réponses :) PS: ta bibliothèque a l'ai bien pratique! je vais l'utiliser je pense (mais j'aimerais bien comprendre ou est le problème dans mon code avant ^^)

A chaud vu l'encodeur je pense que tu joue sortie haute avec pullup teste ton code sans mettre tes entrées en pullup

commente ces 2 lignes

// digitalWrite(codeurPinA, HIGH); //turn pullup resistor on
  // digitalWrite(codeurPinB, HIGH);