Bouton poussoir

Le bouton poussoir permet de couper ou laisser passer le passage du courant dans un circuit.

Bouton poussoir
Bouton poussoir - Fiche technique

Il existe deux types de boutons poussoirs :

  • Normalement ouvert (NO) : quand on appuie le courant passe Bouton poussoir - Normalement Ouvert

  • Normalement fermé(NF) : quand on appuie le courant ne passe plusBouton poussoir - Normalement Fermé

Un Bouton poussoir a quatre pattes (A,B,C,D) :

  • A et B sont reliées entre elles

  • C et D sont reliées entre elles

Pour un NO :

  • Au repos, les deux paires sont séparées

  • Quand on appuie les quatre pattes se retrouvent reliées.

Pour ne pas confondre les pattes, on peut utiliser deux pattes sur une diagonale. On est sûr qu'elles sont séparées.

DéfinitionPrincipe

La broche d'un composant lorsqu'elle n'est pas reliée à la masse ou au Vcc est dans un état indéterminé.

Pour lire une tension sur une des entrées de l'Arduino, il faut donc la relier à la masse (GND) ou à l'alimentation (Vcc).

Pour cela on peut utiliser un montage PullDown (résistance qui tire vers le bas, reliée en bas vers la masse 0V) ou PullUp (résistance qui tire vers le haut, reliée vers le haut au Vcc 5V).

DéfinitionPULLDOWN

Une patte du bouton est relié au Vcc.

Une autre à une résistance de rappel et à la sortie (ici broche 7).

Dans le montage PullDown, la résistance de rappel est reliée à la masse.

Circuit Bouton poussoir - Pulldown
  • Quand le bouton est relâché, le circuit est ouvert. La broche 7 est reliée au GND par l'intermédiaire de la résistance. La tension est de 0 V.

  • Quand le bouton est appuyé, le circuit est fermé. La broche 7 est directement reliée au Vcc. La tension est de 5 V.

Schema - PullDown

Dans le croquis, on définit la broche 7 en entrée (INPUT). On utilise digitalRead() pour lire la valeur de l'entrée (5V = 1, 0V = 0).

1
const int BP = 7;
2
3
void setup() {
4
  Serial.begin(9600);
5
  pinMode(BP, INPUT);
6
}
7
8
void loop() {
9
  int etat = digitalRead(BP);
10
  Serial.println(etat);
11
}

Quand le bouton est relâché, Le moniteur affiche 0.

Quand le bouton est appuyé, Le moniteur affiche 1.

DéfinitionPULLUP

Une patte du bouton est relié à la masse.

Une autre à une résistance de rappel et à la sortie (ici broche 7).

Dans le montage PulUp, la résistance de rappel est reliée au Vcc.

Circuit Bouton poussoir - Pullup
  • Quand le bouton est relâché, le circuit est ouvert. La broche 7 est relié au Vcc. Il n'y a pas de courant qui circule. La tension est de 5 V.

  • Quand le bouton est appuyé, le circuit est fermé. La broche 7 est relié au GND. La tension est de 0 V.

Schema - PullUp

Dans le croquis, on définit la broche 7 en entrée (INPUT). On utilise digitalRead() pour lire la valeur de l'entrée (5V = 1, 0V = 0).

1
const int BP = 7;
2
3
void setup() {
4
  Serial.begin(9600);
5
  pinMode(BP, INPUT);
6
}
7
8
void loop() {
9
  int etat = digitalRead(BP);
10
  Serial.println(etat);
11
}

Quand le bouton est relâché, Le moniteur affiche 1.

Quand le bouton est appuyé, Le moniteur affiche 0.

DéfinitionINPUT_PULLUP

L'utilisation de résistance de rappel étant souvent utilisé, Arduino a intégré un système d'activation d'un PullUp sur ses entrées.

Mais, pour utiliser ces PullUp vous devez remplacer INPUT par INPUT_PULLUP dans la fonction pinMode.

Circuit Bouton poussoir - Input_Pullup
1
const int BP = 7;
2
3
void setup() {
4
  Serial.begin(9600);
5
  pinMode(BP, INPUT_PULLUP);
6
}
7
8
void loop() {
9
  int etat = digitalRead(BP);
10
  Serial.println(etat);
11
}

DéfinitionExemple

Allumer une LED avec un bouton poussoir.

Circuit Bouton poussoir - LED
1
const int LED = 4;
2
const int BP = 7;
3
4
void setup() {
5
  pinMode(LED, OUTPUT);
6
  pinMode(BP, INPUT_PULLUP);
7
}
8
9
void loop() {
10
  int etat = digitalRead(BP);
11
  digitalWrite(LED,!etat);
12
}

!etat permet de mettre à 1 quand le bouton est appuyé.

DéfinitionAnti-Rebond

Lorsque l'on clique sur un bouton, il y a une période transitoire très courte pendant laquelle pour des raisons physiques, le contact oscille entre fermé et ouvert.

On dit qu'il y a des rebonds.

Bouton poussoir - Rebonds

Le problème est que l'Arduino est plus rapide que cette période et pense que l'on a appuyé et relâché le bouton plusieurs fois.

La solution consiste à "ralentir" l'Arduino en lui demandant de valider un changement que s'il s'est passé un certain temps entre deux changements.

Circuit Bouton poussoir - Anti-Rebond
1
const int LED1 = 3;
2
const int LED2 = 4;
3
const int BP = 7;
4
int etatOld = 1;
5
int signal1 = LOW;
6
int signal2 = LOW;
7
int interval = 10;
8
unsigned long tpsOld = millis();
9
10
void setup() {
11
  pinMode(LED1, OUTPUT);
12
  pinMode(LED2, OUTPUT);
13
  pinMode(BP, INPUT_PULLUP);
14
  Serial.begin(9600);
15
}
16
17
void loop() {
18
  int etatNew = digitalRead(BP);
19
  unsigned long tpsNew = millis();
20
  // changement 
21
  if(etatNew != etatOld && tpsNew - tpsOld > interval){
22
    etatOld = etatNew;
23
    tpsOld = tpsNew;
24
    // changement à l'appui
25
    if(etatNew == LOW){           
26
      signal1 = !signal1;
27
    }
28
    // chagement au relachement
29
    if(etatNew == HIGH){      
30
      signal2 = !signal2;
31
    }
32
  }
33
  digitalWrite(LED1,signal1);
34
  digitalWrite(LED2,signal2);
35
  Serial.println(etatNew);
36
}

tpsOld : temps du dernier changement

tpsNew : temps actuel

interval : temps minimal ente deux changements

etatOld : ancien état du bouton (1 relâché, 0 appuyé)

etatNew : état actuel du bouton

signale1 : état LED1

signale1 : état LED2

DéfinitionBounce2.h

Avec la bibliothèque Bounce2.h

1
#include <Bounce2.h>
2
3
const int LED1 = 3;
4
const int LED2 = 4;
5
const int BP = 7;
6
int signal1 = 0;
7
int signal2 = 0;
8
9
Bounce bouton = Bounce(); 
10
11
void setup() {
12
  pinMode(LED1, OUTPUT);
13
  pinMode(LED2, OUTPUT);
14
15
  bouton.attach(BP ,INPUT_PULLUP);
16
  bouton.interval(10);
17
18
  Serial.begin(9600);
19
}
20
21
void loop() {
22
  bouton.update();
23
24
  if(bouton.changed()){
25
    // changement à l'appui
26
    if(bouton.read() == 0){           
27
      signal1 = !signal1;
28
    }
29
    // chagement au relachement
30
    if(bouton.read() == 1){      
31
      signal2 = !signal2;
32
    }
33
  }
34
35
  digitalWrite(LED1,signal1);
36
  digitalWrite(LED2,signal2);
37
  Serial.println(bouton.read());
38
}

bouton : instance de la classe Bounce

attach : permet de lier la broche du bouton

interval : temps minimal ente deux changements

update : met à jour à chaque loop

changed : booléen vrai en cas de changement

read : valeur du bouton (1 relâché, 0 appuyé)