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.
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
- Le filtrage en électronique
- https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
Tout a fait exact. Merci beaucoup de l’avoir remarqué.
Au lieu de
« if ((millis() – lastDebounceTime) > debounceDelay) {‘
ce serait :
« if ((millis() – lastDebounceTime) >= debounceDelay) {‘
erreur de copié-collé?
Oui, merci. Il y a une erreur HTML.
« > » ou « >= » les deux fonctionnent
Effectivement, une erreur d’html s’est glissée dans le code mais le code a bien été testé 😉 . Toutes mes excuses.