Un bouton-poussoir comporte habituellement deux connecteurs. Mais il peut aussi en posséder trois ou quatre, selon le modèle. Il faut alors identifier à quoi ils correspondent :
Un bouton-poussoir agit sur un ou plusieurs contact, à ouverture ou à fermeture de circuit.
Le connecteur logique d'un microcontrôleur, configuré en mode lecture,
doit être relié électriquement soit au 5 V (Vcc), soit au 0 V (GND).
Sinon, on dit du connecteur qu'il est en l’air
, son état logique est indéterminé.
Pour cela, il existe différents montages.
Pour un bouton-poussoir à trois connecteurs, on retient le montage ci-dessous.
Dans cet exemple, le connecteur 8 de la carte Arduino Uno est configuré en entrée.
void setup() { pinMode(8, INPUT); } void loop() { if (digitalRead(8)==LOW) { ... } if (digitalRead(8)==HIGH) { ... } }
Souvent, le bouton-poussoir comporte deux connecteurs. Deux montages sont alors possibles. On utilise une résistance de rappel, de valeur importante (10 kΩ), pour relier électriquement l'entrée au 0 V ou au 5 V.
Les cartes Arduino Uno sont équipées de résistances internes. Elles permettent de simplifier les câblages en économisant la résistance de rappel. Le montage devient alors :
La paramètre INPUT
de la fonction pinMode()
est remplacé par INPUT_PULLUP
pour prendre en compte la résistance interne.
void setup() { pinMode(8, INPUT_PULLUP); } void loop() { ... }
Du fait de la manière dont ils sont fabriqués, les boutons-poussoirs sont sujets aux rebonds. Cela signifie qu'ils ne passent pas directement de l'état ouvert à l'état fermé, ou inversement. Sur une durée très courte, de l'ordre de la milliseconde, il peut osciller entre deux états :
Si cela ne pose pas de problème pour les applications simples, cela en pose en revanche avec les circuits basés sur le changement d'état du signal. Dans ce cas, on met en place un système anti-rebonds. On distingue les solutions logicielles ou matérielles.
Concernant la carte Arduino Uno, les solutions logicielles sont souvent basées sur la fonction delay(). Un exemple est proposé ci-après.
Elles utilisent souvent des condensateurs.
Le code ci-dessous montre comment allumer une simple DEL.
void setup() { pinMode(8, INPUT_PULLUP); pinMode(9, OUTPUT); } void loop() { boolean bp=digitalRead(8); if (bp==HIGH) { digitalWrite(9, LOW); } else { digitalWrite(9, HIGH); } delay(100); // petite attente }
Dans l'exemple ci-dessous, l'anti-rebonds est géré avec la fonction delay().
int etat; void setup() { pinMode(8, INPUT_PULLUP); pinMode(9, OUTPUT); etat=0; } void loop() { if (digitalRead(8)==LOW) { // le bouton semble actionné? delay(10); // courte attente if (digitalRead(8)==LOW) { // le bouton est effectivement actionné! while (digitalRead(8)==LOW) delay(10); // longue attente jusqu'à ce que le bouton soit relâché // changement de l'état de la mémoire if (etat==1) etat=0; else etat=1; } } // visualisation de l'état de la mémoire if (etat==0) digitalWrite(9, LOW); else digitalWrite(9, HIGH); }
La variante ci-dessous fait clignoter la DEL.
int etat; int del; void setup() { pinMode(8, INPUT_PULLUP); pinMode(9, OUTPUT); etat=0; del=0; } void loop() { if (digitalRead(8)==LOW) { // le bouton semble actionné? delay(10); // courte attente if (digitalRead(8)==LOW) { // le bouton est effectivement actionné! while (digitalRead(8)==LOW) delay(10); // longue attente jusqu'à ce que le bouton soit relâché // changement de l'état de la mémoire if (etat==1) etat=0; else etat=1; } } // visualisation de l'état de la mémoire if (etat==0) digitalWrite(9, LOW); else { if (del==0) { digitalWrite(9, LOW); del=1; } else { digitalWrite(9, HIGH); del=0; } delay(150); } }