Bouton poussoir

. Par : Dominique, Guillaume, Jean-Luc. URL : https://www.locoduino.org/spip.php?article74

Nombreux sont les montages Arduino qui nécessitent des organes d’interaction entre l’utilisateur et le programme. Le Bouton Poussoir en est un parmi les plus importants : la preuve, toutes les cartes Arduino disposent d’un bouton de Reset !

Introduction

Les boutons poussoirs sont des interrupteurs temporaires : sitôt relâché, le BP (abréviation de Bouton Poussoir) revient à sa position de base, contrairement au commutateur qui peut avoir 2 positions stables ou plus.
Ils sont associés à des contacts électriques et l’appui sur le bouton modifie l’état du contact : il l’établit ou le rompt. En relâchant le bouton, c’est l’inverse qui se produit.

Ce sont des interrupteurs (au sens large, ce terme inclus les poussoirs !) qui vont nous fournir énormément de possibilités dans le modélisme. C’est un composant peu onéreux qui pourra donc servir dans de multiples cas.

Types de Bouton Poussoir

Il existe deux types :

  • le BP normalement ouvert NO : le courant à l’état de base du BP ne passe pas, le circuit est ouvert. En appuyant le circuit devient fermé.
  • BP normalement fermé NF : le courant à l’état de base du BP passe, le circuit est fermé. En appuyant, le circuit devient ouvert.

    A l’état appuyé, le circuit va donc changer d’état, qui sera opposé à l’état de base..

Exemples de BP

Ceci est un BP à souder très répandu. Nous voyons quatre pattes qui sont reliées deux à deux. Une des manières de savoir lesquelles font partie d’une même paire est d’utiliser un multimètre. Mais il suffit de connecter deux pattes en diagonale pour être certain de prendre une patte de chaque paire et ainsi nul besoin de multimètre.
Toutefois, c’est quand même mieux de vérifier !

Les BP peuvent revêtir de nombreuses formes :

Reconnaître le type NO ou NF d’un BP est facile. Connectons en série une résistance de 330 Ohms, une Led et le BP à tester (en prenant les pattes aux diagonales comme indiqué plus haut) et appliquons une tension de 5V environ (une pile de 4,5V fera bien l’affaire).

Si la LED s’allume, c’est un BP normalement fermé et si elle reste éteinte, c’est un BP normalement ouvert.

Des boutons poussoirs qui n’en sont pas mais fonctionnent de la même façon

Ce titre étrange ne sert qu’à attirer votre attention sur d’autres dispositifs qui seront gérés par votre logiciel comme des boutons poussoirs : cet article est bien plus général qu’il en a l’air !

On trouve ici des ILS (interrupteurs à lame souple), des contacts de relais, des détecteurs d’occupation (la sortie d’un opto-coupleur se comporte comme un BP). Nul doute que vous en trouverez d’autres.

Connecter un BP à une broche de l’Arduino

Le but de cette connexion est d’indiquer qu’on appuie ou non sur le BP en faisant changer d’état (haut ou bas) une broche de l’Arduino.

On relie donc une des pattes du BP à la broche choisie de l’Arduino.

Et à quoi relie-t-on l’autre broche ?

Il y a plusieurs possibilités :

1/ BP relié au 5V

Selon ce schéma, lorsque le contact du BP est fermé, on amène le 5V sur la broche 5. Et lorsque le contact est ouvert, il faut "tirer" la broche 5 au 0V à l’aide d’une résistance (10K c’est bien). On l’appelle alors « résistance de pull down ».

Le but est de ne jamais laisser la broche de l’Arduino « en l’air », c’est à dire non connectée pendant qu’elle est définie comme une entrée : elle se comporterait alors comme une antenne qui capterait tous les parasites environnantes, votre programme se sentirait mal et vous ne comprendriez pas pourquoi.

L’initialisation de la broche de l’Arduino est :

pinMode(bp, INPUT);

Ce n’est pas mon schéma préféré !

2/ BP relié au 0V avec résistance de pull-up au +5V

Une résistance de pull-up est une résistance comme les autres. Elle permet de fixer l’entrée numérique à l’état haut lorsque rien n’est connecté pour ne pas rester « en l’air », comme indiqué ci-dessus.

L’initialisation de la broche de l’Arduino se fait de la même manière que précédemment.

Ce n’est pas non plus mon schéma préféré, parce que les Arduino actuels comportent une résistance de pull-up interne, donc déjà intégrée dans le processeur.

Nous pouvons donc faire l’économie de la résistance (il n’y a pas de petites économies !!).

Dans ce cas, pour utiliser cette résistance de pull-up, il faut déclarer l’entrée de cette façon :

pinMode(bp, INPUT_PULLUP);

Un BP, ça rebondit énormément !

Quand le BP est appuyé, l’état change sur la broche de l’Arduino, il passe de 0 à 5V ou inversement selon le type de BP ou le type de branchement. Mais entre les deux états, la transition n’est pas instantanée et il y a une phase de rebonds qui dure quelques millisecondes et qui est due au choc entre les contacts métalliques un peu élastiques.

D’où des changements d’états très rapides qui sont captés par l’Arduino, et qui peuvent entraîner des erreurs. Dans le cadre d’un compteur, pour le réglage de l’heure par exemple, un seul appui pourra être compté comme plusieurs à cause de ce phénomène.

Pour l’éviter, un condensateur de 100 nF en parallèle sur le BP, pourra être employé. Mais la valeur du condensateur doit être déterminée expérimentalement, les BP étant tous différents sur ce plan.

Il existe heureusement une autre méthode purement logicielle. Elle consiste à lire l’état de la broche et la stocker dans une variable, d’attendre quelques millisecondes et de lire une nouvelle fois la broche en la comparant à la valeur stockée. Si la valeur est la même, l’appui est confirmé.

Code

Venons-en à la partie intéressante, l’Arduino est relié aux composants selon le schéma précédent (même broche 5). La lecture de l’état de la broche impose donc de mettre la broche en entrée avec pull-up lors du setup. La lecture se fera lors de chaque boucle de loop et sera comparée à une valeur pour entraîner une action en fonction de l’appui ou non du BP.

Nous allons donc transférer dans l’Arduino, un code qui allumera une Led à savoir la diode de la broche 13 quand le BP sera appuyé (si BP normalement ouvert)

// Déclaration des broches
const byte del = 13;
const byte bp = 5;

void setup()
{
  // programmation des broches
  pinMode(del, OUTPUT);
  pinMode(bp, INPUT_PULLUP);
  // extinction de la LED
  digitalWrite(del, LOW);
}

void loop()
{
  if (digitalRead(bp) == LOW) // poussoir enfoncé
  {
    digitalWrite(del, HIGH);
  }
  else
  {
    digitalWrite(del, LOW);
  }
}

L’appui sur le bouton allume la LED si le BP est normalement ouvert et vice-versa.
Si certaines portions de code vous semblent obscures, reportez aux articles de la rubrique programmation : ici et , cela devrait vous aider.

Ce programme ne traite pas les rebonds dans ce cas simple de commande d’une Led.

L’anti-rebond avec la bibliothèque Bounce2

La bibliothèque à jour pour traiter cette question est Bounce2 que l’on peut télécharger ici : Bounce2

Une fois installée ( voir l’article "Installer une bibliothèque"), voici comment s’en servir :

// Intégration de la bibliothèque dans le code :
#include <Bounce2.h>

const byte del = 13;
const byte bp = 5;

// Création d'un objet Bounce que j'appelle bouton
Bounce bouton; 

void setup() {

  pinMode(del,OUTPUT);
  pinMode(bp,INPUT_PULLUP);

  // definition des paramètres de l'objet Bounce
  bouton.attach(bp);   // la broche du bouton poussoir
  bouton.interval(10); // l'intervalle de temps en ms

}

void loop() {
  // l'objet Bounce doit exécuter son code interne à chaque loop :
  bouton.update();

  // Lire la valeur du bp filtré :
  int value = bouton.read();

  // commande de la led en conséquence :
  if ( value == LOW ) {
    digitalWrite(del, HIGH );
  } 
  else {
    digitalWrite(del, LOW );
  }
}

Cette bibliothèque Bounce2 offre bien plus de possibilités que ce qui est décrit ci-dessus. Nous vous invitons à étudier les exemples qui sont fournis.