Le bouton poussoir
Un bouton poussoir est un interrupteur (ou contacteur) monostable : il retourne seul dans la position repos (« relâché »).
Il peut être :
- à fermeture = ouvert au repos :
- à ouverture = fermé au repos :
Câblage
Sur la platine
Certains boutons peuvent être fichés sur une breadboard. Attention à bien enfoncer les pattes, sans les tordre !
Schéma électrique interne :
Sur l’Arduino
Un bouton poussoir fournit une information logique (Appuyé / Relâché). Il doit donc être raccordé à un port numérique en mode
INPUT
.
Le montage ci-contre permet de fournir au port numérique D :
- 0V quand le bouton est relâché : état bas =
LOW
- 5V quand le bouton est appuyé : état haut =
HIGH
Remarque : quand le bouton est relâché, Pour ne pas laisser flottante l’entrée du port (cas d’un interrupteur mécanique par exemple), il est nécessaire d’utiliser une résistance de rappel (pull down) ou de tirage (pull up) .
Programmation
Un bouton n’est pas un objet parfait : lorsqu’on agit dessus (appuyer ou relâcher), le signal ne commute pas parfaitement de 5V à 0V (ou le contraire). Il peut se passer quelques millisecondes pendant lesquelles le signal va « rebondir » avant de se stabiliser. Ce rebond peut provoquer un comportement inattendu du programme (comptage d’appuis en trop, arrêt ou démarrage prématuré de procédures, …).
Il existe diverses solutions pour éviter cela…
En filtrant le signal
Une des solutions est d’utiliser un condensateur en parallèle avec le bouton. Ce composant permet d’absorber les rebonds en se chargeant (ou se déchargeant) progressivement. La commutation du port numérique n’a lieu qu’une fois le condensateur suffisamment chargé, soit un peu après la commutation du bouton.
Avec ce montage on peut programmer l’utilisation d’un bouton de la manière suivante :
int pin_LED = 13; // port numérique associé à la LED intégrée int pin_button = 2; // port numérique lié au bouton poussoir int state = LOW; // variable d'état de la LED void setup() { pinMode(pin_LED, OUTPUT); // réglage du port de la LED en mode SORTIE pinMode(pin_button, INPUT); // réglage du port du bouton en mode ENTREE } void loop() { if (digitalRead(pin_button) == HIGH) { // si le bouton est pressé ... state = !state; // ... inversion de la variable d'état de la LED (allumée<->éteinte) } digitalWrite(pin, state); // action sur la LED (allumage ou extinction) // Suite du programme ... simulé par une instruction d'attente delay(100); }
Il reste néanmoins un inconvénient à cette solution : si la durée d’exécution de la boucle loop()
est trop long, il peut arriver qu’un utilisateur appuie pendant un temps si court que l’instruction qui teste de l’état du bouton (if (digitalRead(pin_button) == HIGH)
) n’a pas le temps de « voir » cet appui.
Activité : tester le programme ci-dessus avec une attente de 1s … et constater le problème …
En utilisant une interruption
Les microcontrôleurs Arduino possèdent des ports supportant les interruptions matérielles : une commutation d’un de ces ports (programmé pour cela), provoque l’arrêt de l’exécution du programme pour faire une tâche particulière, puis retourner à l’exécution normale du programme.
int pin_LED = 13; // port numérique associé à la LED intégrée int pin_button = 2; // port numérique lié au bouton poussoir volatile int state = LOW; // variable d'état de la LED (précédée de volatile !!) void setup() { pinMode(pin_LED, OUTPUT); // réglage du port de la LED en mode SORTIE // Création de l'interruption attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin_LED, state); // action sur LED (allumage ou extinction) // Suite du programme ... simulé par une instruction d'attente delay(100); } void blink() { state = !state; // inversion de la variable d'état de la LED }
Dans l’exemple précédent, un changement d’état du bouton (le mode de déclenchement de l’interruption étant défini par la constante CHANGE
), provoquera aussitôt l’arrêt de l’exécution du programme pour exécuter la fonction blink()
, et ensuite retourner au programme…
Bonjour, petite coquille dans votre article « Une des solutions est d’utiliser un condensateur en parallèle avec le bouton. » cependant l’image qui suit sur le câblage montre le condensateur en parallèle avec la résistance. Cela est trompeur et n’a pas le même effet d’un placement à un l’autre du condensateur.
Cdlt
Bien vu, merci !
Bonjour,
où est déclarée la constante CHANGE et je ne comprends pas qu’un constante puisse changer d’état.
Cdlt
Bonjour
CHANGE est une constante définie dans le cœur du langage Arduino. Elle permet de choisir le mode de déclenchement de l’interruption. Il en existe 3 autres sur un UNO : voir la fonction attachInterrupt