Un bouton par broche
Un seul bouton
Ce montage est décrit en long et en large un peu partout.
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.
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.
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.