Étiquettes : ,
5
(2)

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

  • Ordinateur
  • Arduino UNO
  • Câble USB A Mâle/B Mâle
  • Un bouton poussoir (ou autre capteur tout ou rien)

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.

Applications

Sources

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

How useful was this post?

Click on a star to rate it!

Average rating 5 / 5. Vote count: 2

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?