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 peut arriver pour des raisons mécaniques ou autres de détecter des changements d’état qui ne correspondent pas à ce que nous voulons détecter. Il est possible d’améliorer la fiabilité de ces mesures en utilisant une logique anti-rebond que nous allons voir dans ce tutoriel.




Matériel

  • Ordinateur
  • ArduinoUNO
  • Câble USB A Mâle/B Mâle
  • DigitalDebounce


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

Le DigitalDebounce doit être connecté selon le schéma suivant.

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);
}

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

En faisant varier 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 plaçant un bouton entre la broche 2 et GND, et en mettant un temps suffisamment grand, la mesue devient fiable et il n’y a qu’un changement d’état par pression.




Applications

  • Gestion d’un bouton poussoir


Sources

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