Arduino : créer un bouton

Un bouton, pour arduino, est un capteur. Un capteur minimal qui peut dire quand il est appuyé et quand il ne l’est pas.

Il y a toujours deux aspects à la programmation physique : le software et le hardware. Ce qu’on branche, et ce que l’on code.

Ici, nous allons dans un premier temps récupérer l’information provenant d’un bouton pour allumer ou éteindre une led.

Code de départ
Nous allons commencer par un code de base. Quand on appuie, la led s’allume, quand on relache, la led s’éteint.

int ledpin=13;
int bouton=8;

void setup(){
 pinMode(ledpin,OUTPUT);
 pinMode(bouton,INPUT);
}

void loop(){
 int val=digitalRead(bouton);
 
 if(val==HIGH){
  digitalWrite(ledpin,HIGH);
 } else {
   digitalWrite(ledpin,LOW);
 }
}

Ce code défini la pin 13 comme port de sortie, et la pin 8 comme entrée. Sur cette pin nous pourrons demander à arduino s’il y a du voltage qui arrive sur la pin désignée. La fonction utilisée sera digitaRead(), qui donne deux résutats possibles : HIGH ou LOW, 1 ou 0, le bon vieux résultat binaire.

Après avoir défini le comportement de chaque pin, la loop permet de tester très rapidement la valeur lue sur la pin et d’agir en fonction, en allumant ou éteignant la pin.

Le hardware se monte comme ceci :

Une fois les deux montés, on devrait avoir le résultat demandé : On appuie, ça s’allume, on relâche et ça s’éteint.

Un peu plus loin

Pour aller plus loin, nous allons donner un peu de mémoire à arduino : appuyer une fois allume la diode, appuyer une fois encore l’éteint. Let’s go.

Coté hardware, rien ne change, le code devient par contre celui-ci :

int ledpin=13;
int bouton=8;
int etat=0;

void setup(){
 pinMode(ledpin,OUTPUT);
 pinMode(bouton,INPUT);
}

void loop(){
 int val=digitalRead(bouton);
 
 if(val==HIGH){
   etat= 1 - etat;
 }
 
 if(etat==0){
   digitalWrite(ledpin,HIGH);
 } else {
   digitalWrite(ledpin,LOW);
 }
}

Ce code utilise une variable (etat) qui passe de 0 à 1 quand le bouton est poussé.
Mais en testant ce code, on s’aperçoit qu’il a un comportement erratique... Pourquoi ?

En fait quand le bouton est appuyé, le valeur de etat passe de 0 à 1 ou de 1 à 0. Mais comme théoriquement arduino exécute 30000 instructions par secondes, ça lui laisse le temps de passer d’une valeur à l’autre rapidement le temps que nous, pauvre humain, nous n’appuyions même "rapidement"...
Il faut donc rendre ce code plus effectif en contrôlant le l’état précédent l’appui du bouton, comme ceci :

int ledpin=13;
int bouton=8;
int etat=0;
int prev_etat=0;

void setup(){
 pinMode(ledpin,OUTPUT);
 pinMode(bouton,INPUT);
}

void loop(){
 int val=digitalRead(bouton);
 
 if((val==HIGH) && (prev_etat==LOW)){
   etat= 1 - etat;
   delay(10);
 }
 
 prev_etat=val;
 
 if(etat==0){
   digitalWrite(ledpin,HIGH);
 } else {
   digitalWrite(ledpin,LOW);
 }
}

Ici, on a ajouté une variable (prev_etat) qui stocke l’état du bouton lors de la loop précédente, et un delai (de 10 millièmes de secondes) qui permettent de traiter des mauvais contacts du a des boutons abimés.
On a donc un code pleinement fonctionnel.

Un code pour plusieurs boutons

Dans un forum d’arduino, une solution élégante pour plusieurs boutons : http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1226896251/2

Forum

  • Arduino : créer un bouton par Stéphane Noel , 20 août 2012

    Merci pour cette précision, il y a en effet erreur.