Ardu? No!Les boutons ≫ Un bouton par broche

Un bouton par broche

Un seul bouton

Ce montage est décrit en long et en large un peu partout.

Un bouton sur une broche

Il ne faut pas que l'entrée soit en haute impédance (INPUT) sinon quand le bouton n'est pas appuyé, l'état de l'entrée n'est pas définie et on peut lire aussi bien HIGH que LOW. On mettra donc la broche en INPUT_PULLUP qui rajoute une résistance entre l'entrée et le VCC (environ 35kΩ pour une Uno). Quand le bouton n'est pas appuyé, on va lire HIGH en entrée et on aura LOW en cas d'appui. Pour certains il y aurait une gymnastique d'esprit (appuyé = 0, non appuyé = 1) mais on finit vite par s'y habituer.

On peut aussi mettre le bouton entre l'entrée et l'alimentation positive. Dans ce cas, on a appuyé = HIGH, ce qui semble plus compréhensible, mais les AVR ne disposent pas de résistances de pull-down (résistance entre la broche et la masse). D'autre part, il est mieux de mettre une masse sur un bouton qu'une alimentation. Si nous travaillons avec une AVR, il vaut mieux utiliser le montage avec une borne à la masse.

Que se soit pull-up ou pull-down, la valeur de la résistance se détermine de la même façon. La plus simple et la plus utilisée est de mettre celle qui est dans le microcontrôleur, elle est gratuite. Sinon, mettez une 10kΩ. On peut toutefois calculer les limites max et min de cette valeur, mais cela n'a pas un grand intérêt.

Pour la valeur max et en 5V, il faut que l'on garantisse d'avoir avec une pull-up au moins 70% de VCC pour garantie un HIGH. Je ne retrouve pas la consommation d'une entrée en INPUT, je vais la supposer de 1µA max.

Calcul de Rmax pour la pullup

La tension aux bornes de la résistance UR doit être de 1,5V maxi. La valeur R de la résistance doit satisfaire à:
UR = Rmax.I < 1,5V soit Rmax < 1,5V / 1µA = 1,5MΩ. Toutefois avec une telle résistance, on n'est pas bien protégé contre les perturbations.

Pour la valeur min, c'est lorsque le bouton est fermé que l'on peut faire le calcul. Quand ce dernier est fermé, il va passer un courant qui ne sert à rien dans la résistance.

Calcul de Rmin pour la pullup

La valeur maximale de ce courant dépend de l'interrupteur et de l'alimentation. En théorie, on doit pouvoir faire passer 1A ou plus (ce qui ferait une résistance de valeur Rmin = 5V/1A soit 5Ω), mais dans la pratique si la carte consomme 20mA, ce serait bien que le bouton consomme nettement moins, par exemple 1mA. Dans ce cas la résistance minimale serait de Rmin = 5V / 1mA soit max = 5kΩ.

Bilan de ce calcul: on peut prendre un peu n'importe quoi. 10kΩ par défaut, on peut descendre à 5kΩ si le milieu est perturbé ou si la ligne est longue. Dans une Uno, la résistance est de l'ordre de 35kΩ.

Plusieurs bouton

On répète plusieurs fois le schéma "un seul bouton".

Exemple de programme pour un seul bouton

const byte BOUTON = 2; // Pin2 -- bouton -- GND

byte etat; // Valeur lue
byte ancienEtat = LOW; // Permettra de ne pas trop écrire

void setup()
{
  Serial.begin(115200); // Régler aussi la console à 115200 bauds!
  pinMode(BOUTON, INPUT_PULLUP);
}

void loop()
{
  etat=digitalRead(BOUTON); // Test du bouton
  if (etat != ancienEtat) // Si on a un changement
  {
    if (etat == LOW) Serial.println("Bouton appuyé"); // Affichage du nouvel état
    else Serial.println("Bouton relâché");
    ancienEtat = etat; // Mémorisation du nouvel état
    delay(50); // Anti-rebond
  }
}

Bilan

- pas de composants supplémentaires
- lecture poly (on a l'état de tous les boutons)
- lecture simple (juste un digitalRead())
- il y a une multitude de bibliothèques pour ce type de montage
- l'utilisation d'interruption est possible (très simple avec 2 boutons et une Uno).
MAIS
- pour N boutons, il faut N sorties
- on ne peut pas utiliser les claviers pré-câblés

Montage idéal pour quelques boutons si on a assez de broches disponibles. Très courant.