Les entrées digitales d’Arduino. Les boutons poussoirs.
Il existe deux types de boutons :
- Les interrupteurs qui maintiennent leur état. Disons que l’on est pas obligé d’appuyer dessus pour qu’il reste ON ou OFF.
- Les boutons-poussoirs qui reviennent automatiquement à leur état de base si l’on arrête d’appuyer dessus.
Un bouton-poussoir (BP) connecte deux point d’un circuit entre eux lorsqu’il est appuyé. Dans pas mal de projets avec Arduino nous allons trouver ce pratique accessoire.
Cet article nous montrera comment l’utiliser correctement. D’abrod, on expliquera les différences entre les résistances pull-up et les résistances pull–down; on assemblera, par la suite, deux circuits électriques avec un BP: premièrement, on installera une résistance pull-down , et deuxièmement, une pull-up. Plus tard, on gardera une diode allumée pendant qu’on actionne le BP; et finalement, on programmera un chronomètre à deux BP et une led.
Table de matières:
Les deux principales fonctions utiles pour travailler les entrées digitales sont:
- pinMode(pin,INPUT): nous sert à configurer le pin ou broche de entrée/sortie. INPUT nous précise que c’est celui d’entrée.
- digitalRead (pin): nous sert à lire la valeur d’entrée du pin ou broche indiquée. Nous rapporte une valeur LOW ou HIGH, selon la tension reçue.
Comme récapitulatif, on sait déjà que les entrées digitales sont celles qui présentent deux valeurs: LOW et HIGH. C’est à dire, elles reçoivent une tension de 0V (LOW) ou de 5V (HIGH).
Résistances Pull-down /Pull-up.
On travaillera donc avec deux états: LOW, 0V ou HIGH, 5V. Mais parfois, il y a des perturbations, des variations dans la source d’énergie provocant que le signal soit indéterminé. Pour résoudre cela on utilise des résistances. L’image suivante montre diverses configurations dépendant d’où soit placée la résistance:
La résistance pull–down tend vers 0V. La résistance est reliée à la masse. Si le BP est appuyé le courant se dirige vers la résistance offrant une valeur LOW. Tandis que si le BP est relâché, le courant se dirige vers le pin donnant une valeur HIGH.
La résistance pull–up tend vers 5V. La résistance se relie à la source d’alimentation. Si le BP est appuyé, le courant va vers le pin offrant une valeur HIGH. Mais si le BP es relâché, le courant va à la masse donnant une valeur LOW vers le pin.
Circuit électrique avec BP et résistance pull-down.
Il est nécessaire:
- Arduino Uno ou équivalent.
- 1 plaque d’essai ou Breadboard.
- 3 câbles.
- 1 bouton poussoir (BP).
- 1 résistance de 10 KΩ .
Les connexions du BP sont, d’une part, directement reliées a la source d’alimentation et, d’une autre part, reliées à la masse à travers la résistance pull-down (10 KΩ). Il existe un troisième câble branché entre le BP et la broche 8 de la plaque d’Arduino. Cette entrée digital (8) recevra le signal nous montrant l’état du BP.
Code:
int etatBouton=0; //Gardera l'état du BP (HIGH ó LOW)
void setup(){
pinMode(8,INPUT); //Pin où est connecté le BP
Serial.begin(9600);
}
void loop() {
etatBouton=digitalRead(8);
Serial.println(etatBouton);
delay (50); //attente pour avoir plus de certitude entre les lectures
}
Circuit électrique avec BP et résistance pull-up.
Il est nécessaire:
- Arduino Uno ou équivalent.
- 1 breadboard.
- 3 câbles.
- 1 BP.
- 1 résistance de 10 KΩ.
Dans ce schéma on peut voir comment les connexion du BP se font, vers la source d’alimentation, mais cette fois à travers de la résistance pull-up (10 KΩ); et directement à la masse. Il existe un troisième câble qui relie le BP et la résistance à la broche 8 de la plaque Arduino. Cette entrée digital (8) recevra le signal nous montrant l’état du BP.
Le code antérieur est valide pour ce circuit aussi, cependant on vera que les valeurs 0 et 1 sont inversés. Autrement dit, si avec la résistance pull-down on avait une valeur HIGH sans appuyer le BP, avec la résistance pull-up, on obtiendra une valeur LOW.
Code:
int etatBouton=0; //Gardera l'état du BP (HIGH ó LOW)
void setup(){
pinMode(8,INPUT); //Pin où est connecté le BP
Serial.begin(9600);
}
void loop() {
etatBouton=digitalRead(8);
Serial.println(etatBouton);
delay (50); // attente pour plus de certitude entre les lectures
}
Illumination d’une diode en appuyant sur le BP.
Ce projet nous permettra d’illuminer une led pendant qu’on appui sur le BP, la diode s’éteindra dès qu’on relâchera le bouton.
Il est nécessaire:
- Arduino Uno ou équivalent.
- 1 breadboard.
- 6 câbles.
- 1 BP.
- 1 led.
- 2 résistances: 1 de 10 KΩ et 1 de 220 Ω.
Nous allons élaborer deux circuits indépendants: un circuit pour le montage du BP avec résistance pull-down, et un autre circuit pour l’allumage de la led.
Code:
int etatBouton=0; //Gardera l'état du BP (HIGH ó LOW)
void setup(){
pinMode(4,OUTPUT); //où est connectée la LED
pinMode(8,INPUT); //où est connecté le BP
}
void loop() {
etatBouton=digitalRead(8);
//Si BP actioné,LED allumée
if (etatBouton == HIGH) {
digitalWrite(4,HIGH);
} else {
digitalWrite(4,LOW);
}
}
Avec ce même schéma de connexions nous allons programmer un bouton interrupteur, c’est à dire, si on appui le bouton la diode s’allume et reste allumée, si on appui à nouveau, elle s’éteint.
Code:
int etatActuel=0; // on enregistre l'état actuel du BP
int etatUltime=0; //on enregistre le dernier état du BP
int compteur=0; //on enregistre le nombre de fois qu'on appui le BP
void setup(){
pinMode(4,OUTPUT); //pin où est branché la led configuré comme sortie
pinMode(8,INPUT); //pin où est branché le BP configuré comme entrée
Serial.begin(9600);
}
void loop(){
//on lit l'état actuel du BP
etatActuel=digitalRead(8);
//Si cet état actuel est différent du dernier état alors change…
if (etatActuel != etatUltime){
/* il faut vérifier que el changement soit une pression et pas une
libération. Si, par contre, on configure une résistance pull-up la
valeur à vérifier dans "etatActuel" serait LOW */
if (etatActuel == HIGH) {
compteur = compteur + 1;
Serial.print ("C'est la pression nº ");
Serial.println(compteur);
}
}
//on enregistre l'état actuel pour la suivante vérification
etatUltime= etatActuel;
/*on change l'état de la diode en comptant les fois qu'on a appuyé le
bouton, alternativement (nombre pair = LED éteinte, nombre impair =
LED allumée) On ne compte pas les relâchement seulement les pression!!)*/
if (compteur % 2 == 0 ) {
digitalWrite(4, LOW);
} else {
digitalWrite(4, HIGH);
}
}
Comment faire un chronomètre avec deux BP et une led sur Arduino.
Avec cet exercice on va travailler à l’aide de deux BP: un bouton pour commencer à compter, et un autre pour arrêter le décompte. Une diode s’illuminera pendant que le chronomètre est en marche.
Il est nécessaire:
- Arduino Uno ou équivalent.
- 1 breadboard.
- 10 câbles.
- 2 BP.
- 1 led.
- 3 résistances: 2 de 10 KΩ et 1 de 220 Ω.
Ce schéma a deux circuits BP indépendants avec des résistances pull-up. Le premier BP on le connecte au pin digital 2, et le deuxième BP, au pin 3. La led se relie au pin digital 4.
Code:
unsigned long demarrage, arret, temps;
boolean comptant;
void setup() {
Serial.begin(9600);
pinMode(4,OUTPUT); // la led nous indique le décompte
pinMode(2, INPUT); // bouton de démarrage
digitalWrite(2, HIGH); // on active la résistance pull up
pinMode(3, INPUT); // bouton d'arrêt
digitalWrite(3, HIGH); // on active la résistance pull up
Serial.println ("Bouton 1 pour démarrage et 2 pour arrêt");
comptant = false;
}
void resultats(){
float h, m, s, ms;
unsigned long over;
temps = arret - demarrage;
h = int(temps / 3600000);
over = temps % 360000;
m = int(over / 60000);
over = over % 60000;
s = int(over / 1000);
ms = over % 1000;
Serial.print("Temps ecoule en milis: ");
Serial.println(temps);
Serial.print("Temps ecoule: ");
Serial.print(h, 0);
Serial.print("h ");
Serial.print(m, 0);
Serial.print("m ");
Serial.print(s, 0);
Serial.print("s ");
Serial.print(ms, 0);
Serial.println("ms ");
Serial.println();
}
void loop() {
if(digitalRead(2) == LOW){ // attention nous sommes en PULL-UP
if(comptant){
Serial.println("On commence ");
digitalWrite(4,HIGH);
}else{
comptant = true;
demarrage = millis();
delay(200); // pour être rassurés
Serial.println("On y va...");
}
}
if(digitalRead(3) == LOW){ // attention nous sommes en PULL-UP
if(comptant){
digitalWrite(4,LOW);
comptant = false;
arret = millis();
delay(200); // pour être rassurés
resultats();
}else{
Serial.println("Presser pour recommencer...");
}
}
}