Décompte d'impulsion problématique sur interruption

J'utilise Arduino Uno et l'IDE 1.8.13 sous Windows 10 pour commander une machine tournante : deux fourches optiques comptent les tours de deux disque à fentes non solidaires, Ces fourches délivrent des signaux carrés qui me semblent corrects à l'oscillo et sont reliées aux interruptions des broches 3 et 4 . Mais le décompte fourni par l'un des deux disques est farfelu : je compte visuellement 10 tours et Arduino indique 1900 par exemple.
L'échange des broches ne change pas le problème. Est-ce que vous avez eu ce genre de problème ? Avez-vous une idée ou un conseil à me donner? Merci

Pardon : je viens d'essayer de changer le circuit de miseen forme du signal (trigger de Schmitt) et tout est rentré dans l'ordre. Pourtant l'oscillo ne montrait pas d'anomalie. Parasites ? Désolé pour la perte de temps.

hello
sur UNO tu as les interruptions sur D2 et D3.
j'aurais aimé voir ton programme.

Bonjour
Voici mon programme (machine à bobiner-débobiner) pour débobiner et mesurer la longueur de fil

//Générique débobinage 20/11/2022

//Déclarations spécifiques
int delai = 5000;
int pasparcouche = 2400;
int N = 12;

//Déclarations générales
unsigned long now = 0;
unsigned long old = 0;
bool sens;
volatile int flaghall = 0;
volatile int ODO = 0;
volatile int HALL = 0;
int pinHall = 2;
int pinOdo = 3;
int motor_pin_1 = 4;
int motor_pin_2 = 6;
int pinFc = 10;
int pinStop = 11;
int pinDp = 12;
int pinEn = 13;
int pas_courant = 1;
int nbrpas=0;
int I=0;
int SPIRES=0;

void setup() {
  pinMode(pinHall, INPUT);
  pinMode(pinOdo, INPUT);
  pinMode(pinDp, INPUT);
  pinMode(pinFc, INPUT);
  pinMode(motor_pin_1, OUTPUT);
  pinMode(motor_pin_2, OUTPUT);
  pinMode(pinEn, OUTPUT);
  pinMode(pinStop, OUTPUT);
  digitalWrite(pinStop, LOW);
  attachInterrupt(digitalPinToInterrupt(pinHall), hall, RISING);
  attachInterrupt(digitalPinToInterrupt(pinOdo), odo, RISING);
  Serial.begin(9600);
  Serial.println("départ"); 
  old = micros();
  //home
  digitalWrite(pinEn, HIGH);
  sens = false;
  while (digitalRead(pinFc) == LOW) {
    now = micros();
    if (now - old >= delai) {
      stepper(pas_courant, sens);
      old = micros();;    
    }
  }
  digitalWrite(pinEn, LOW);
  sens = true; 
}

void loop() { 
  Serial.println("boucle");
  while (digitalRead(pinDp) == HIGH) {
    if (nbrpas == pasparcouche) {
      sens = !sens;
      nbrpas = 0;
      Serial.println("Changement de sens");
    }
    if (flaghall == 1) {
      old = micros();
      flaghall = 0;
      digitalWrite(pinEn, HIGH);
      I = 1;
      while (I <= N) {
        now = micros();
        if (now - old >= delai) {
          stepper(pas_courant,sens);
          nbrpas++;
          I++;
          old=micros();
        }
      }
      digitalWrite(pinEn, LOW);
      SPIRES=SPIRES + N;
    }
  }
  digitalWrite(pinStop, HIGH);
  Serial.print("Valeur ODO : ");
  Serial.print(ODO);
  Serial.print(", correspondant à ");
  Serial.print(ODO * 9.5 / 100);
  Serial.print(" mètres de fil. Nombre de spires :");
  Serial.println(SPIRES);
  while (digitalRead(pinDp) == LOW) {
    delay(1000);
    old = micros();
  }
}

void stepper(int pas, bool dir) {
  if (dir) {
    pas++;
    if (pas == 4) {pas = 0;}
  }
  else {
    pas--;
    if (pas == -1) { pas = 3;}
  }
  pas_courant=pas;
  switch (pas) {
    case 0:  // 01
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, HIGH);
      break;
    case 1:  // 11
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, HIGH);
      break;
    case 2:  // 10
      digitalWrite(motor_pin_1, HIGH);
      digitalWrite(motor_pin_2, LOW);
      break;
    case 3:  // 00
      digitalWrite(motor_pin_1, LOW);
      digitalWrite(motor_pin_2, LOW);
  }
}

void hall() {
  flaghall = 1;
  HALL++;
}

void odo() {
  ODO++;
}

ok, merci :+1: