Site icon AranaCorp

Implémentation de la logique anti-rebond sur Arduino

La logique anti-rebond ou debouncing permet d’éviter la détection de changements d’état parasites d’un capteur. Lors de l’utilisation de capteur renvoyant des états discrets, comme un bouton poussoir, il arrive, pour des raisons mécaniques ou autres, de détecter des changements d’état qui ne correspondent pas à ce que nous voulons détecter. On peut améliorer la fiabilité de ces mesures en utilisant une logique anti-rebond que nous allons voir dans ce tutoriel.

Matériel

Principe de fonctionnement

Lorsqu’un système physique change d’état, il y a souvent des oscillations pendant la période transitoire pour des raisons physiques (mécanique, temps de réponse, etc.). Il faut donc laisser un temps suffisant pour que l’état puisse se stabiliser. Cela peut être rendu possible par filtrage électronique ou mécanique ou bien numériquement grâce au programme qui traite la mesure.

Schéma

La stratégie anti-rebond peut être utilisé pour améliorer la détection de l’état d’un bouton par exemple. Pour tester le code, nous plaçons un bouton entre les broches GND et 2.

Code

Nous allons créer deux variables qui vont garder en mémoire l’état présent et passé du capteur. Nous allons lire l’entrée digitale et valider son état en fonction de l’état précédent et d’un délai anti-rebond. Cette méthode peut être implémentée avec la fonction delay() mais l’utilisation de la fonction millis() est plus propre et plus adéquate.

//Parameters
const int didPin  = 2;

//Variables
bool didStatus  = false;
bool oldDidStatus  = false;
unsigned long lastDebounceTime  = 0;
unsigned long debounceDelay  = 50;

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init digital input
  pinMode(didPin, INPUT_PULLUP);
}

void loop() {
  debounceDid();
}

void debounceDid( ) { /* function debounceDid */
  ////debounce DigitalDebounce
  int reading = digitalRead(didPin);
  if (reading != oldDidStatus) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime)>= debounceDelay) {
    if (reading != didStatus) {
      didStatus = reading;
      Serial.print(F("Sensor state : ")); Serial.println(didStatus);
    }
  }
  oldDidStatus = reading;
}



Résultat

Si vous variez le paramètre debounceDelay, vous pouvez voir l’effet de la logique anti-rebond sur la prise en compte de l’état du bouton. En prenant un temps suffisamment grand, la mesure devient fiable et il n’y a qu’un changement d’état par pression.

Ce tutoriel permet de comprendre et d’implémenter la logique anti-rebond. Pour un plus grand simplicité d’utilisation, vous pouvez écrire une librairie ou utiliser une librairie existante comme OneButton.h.

Applications

Sources

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Quitter la version mobile