Toutefois, lors de la mise à l'essai de votre circuit, vous constatez que la LED réagit de façon aléatoire à vos commandes: une fois sur deux, il ne se passe rien lorsque vous appuyez sur le bouton!
La raison: votre bouton poussoir rebondit à la manière d'un ballon de basket. Pendant une fraction de seconde, l'interrupteur se met successivement en état "fermé" et "ouvert" plusieurs fois de suite... Même si vous n'avez appuyé qu'une seule fois sur le bouton, le reste du circuit a reçu plusieurs signaux consécutifs en provenance de l'interrupteur.
Si votre bouton poussoir est relié à un microcontrôleur (Arduino, par exemple), la solution anti-rebond généralement préconisée est purement logicielle: lorsque le microcontrôleur détecte que le bouton est pressé, on le fait attendre quelques dizaines de millisecondes, le temps que les rebonds soient terminés (voir le sketch fourni avec l'IDE Arduino: Fichier - Exemples - 02.Digital - Debounce).
Mais je n'aime pas trop cette solution: elle alourdit le code, et pour des raisons qui demeurent nébuleuses, je n'obtiens pas toujours des résultats impeccables lorsque je l'applique. De plus, on n'a pas le choix de procéder autrement si le bouton actionne autre chose qu'un microcontrôleur (une bascule, par exemple).

Lorsque le bouton n'est pas enfoncé, aucun courant ne peut circuler dans la résistance et cette dernière n'est donc soumise à aucune différence de potentiel; le condensateur est chargé, puisqu'il est soumis à une différence de potentiel de 5 V (le signal de sortie est de 5 V). Lorsqu'on appuie sur le bouton, le signal de sortie chute à 0, mais pas instantanément, car le condensateur doit d'abord se décharger. Lors d'un rebond du bouton, le contact est trop bref pour que le condensateur ait le temps de se décharger et le signal de sortie n'a pas le temps de descendre à zéro.


J'ai testé mes 6 boutons sans rebond avec un Arduino et le sketch ci-dessous: résultat impeccable.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/***************** Toggle *********************** | |
Pour tester mon module 6 boutons sans rebond. | |
6 boutons branchés à 2-3-4-5-6-7 contrôlent des | |
LEDs branchées à 8-9-10-11-12-13. | |
Aucune routine anti-rebond dans le code | |
http://electroniqueamateur.blogspot.com/2014/01/boutons-sans-rebond-bascules-de-schmitt.html | |
***************************************************/ | |
int LED1On = 0; | |
int LED2On = 0; | |
int LED3On = 0; | |
int LED4On = 0; | |
int LED5On = 0; | |
int LED6On = 0; | |
int previousLED1On = 0; | |
int previousLED2On = 0; | |
int previousLED3On = 0; | |
int previousLED4On = 0; | |
int previousLED5On = 0; | |
int previousLED6On = 0; | |
void setup() { | |
pinMode(8, OUTPUT); | |
pinMode(9, OUTPUT); | |
pinMode(10, OUTPUT); | |
pinMode(11, OUTPUT); | |
pinMode(12, OUTPUT); | |
pinMode(13, OUTPUT); | |
pinMode(2, INPUT); | |
pinMode(3, INPUT); | |
pinMode(4, INPUT); | |
pinMode(5, INPUT); | |
pinMode(6, INPUT); | |
pinMode(7, INPUT); | |
} | |
void loop(){ | |
if (digitalRead(2) && (LED1On != previousLED1On)) { | |
LED1On = !LED1On; | |
} | |
if (!digitalRead(2) && (LED1On == previousLED1On)){ | |
previousLED1On = !previousLED1On; | |
} | |
if (digitalRead(3) && (LED2On != previousLED2On)) { | |
LED2On = !LED2On; | |
} | |
if (!digitalRead(3) && (LED2On == previousLED2On)){ | |
previousLED2On = !previousLED2On; | |
} | |
if (digitalRead(4) && (LED3On != previousLED3On)) { | |
LED3On = !LED3On; | |
} | |
if (!digitalRead(4) && (LED3On == previousLED3On)){ | |
previousLED3On = !previousLED3On; | |
} | |
if (digitalRead(5) && (LED4On != previousLED4On)) { | |
LED4On = !LED4On; | |
} | |
if (!digitalRead(5) && (LED4On == previousLED4On)){ | |
previousLED4On = !previousLED4On; | |
} | |
if (digitalRead(6) && (LED5On != previousLED5On)) { | |
LED5On = !LED5On; | |
} | |
if (!digitalRead(6) && (LED5On == previousLED5On)){ | |
previousLED5On = !previousLED5On; | |
} | |
if (digitalRead(7) && (LED6On != previousLED6On)) { | |
LED6On = !LED6On; | |
} | |
if (!digitalRead(7) && (LED6On == previousLED6On)){ | |
previousLED6On = !previousLED6On; | |
} | |
digitalWrite(8, LED1On); | |
digitalWrite(9, LED2On); | |
digitalWrite(10, LED3On); | |
digitalWrite(11, LED4On); | |
digitalWrite(12, LED5On); | |
digitalWrite(13, LED6On); | |
} |
Ma source d'inspiration principale pour ce projet: How to debounce a switch using CMOS and TTL
Yves Pelletier (Twitter: @ElectroAmateur)
C'est génial. Il y a longtemps que je cherchais une solution à mon problème et je l'ai enfin trouvé. Merci
RépondreSupprimer