ARDUINO
LES BOUTONS-POUSSOIRS

Introduction

Un bouton-poussoir comporte habituellement deux connecteurs. Mais il peut aussi en posséder trois ou quatre, selon les modèles. Dans ce cas, il faut identifier à quoi correspondent ces connecteurs :

Schémas électriques :

Différents montages

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.

Bouton-poussoir à trois contacts

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) {
    ...
  }
}

Montage avec résistance de rappel

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.

Montage sans résistance de rappel

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() {
  ...
}

Dispositifs anti-rebond

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.

Solutions logicielles

Concernant la carte Arduino Uno, les solutions logicielles sont souvent basées sur la fonction delay(). Un exemple est proposé ci-après.

Solutions matérielles

Elles utilisent souvent des condensateurs.

Exemples de programmes

Allumer une DEL

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
}

Mise en place d'une mémoire

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