Plusieurs boutons sur une seule entrée Arduino

head

Si pour un projet Arduino vous venez à manquer de broches d’entrée/sorties mais qu’il vous faut encore ajouter quelques boutons de commande, cette astuce va surement vous intéresser.

 

6 boutons sur 1 entrée Arduino

 

La technique est simple et ne nécessite pas forcément un Arduino pour fonctionner, n’importe quel microcontrôleur fera l’affaire.

On utilise un pont diviseur de tension dont une des deux résistances est en réalité un jeu de résistances de valeurs différentes qui sont connecté par le biais de boutons poussoirs.

On utilise une entrée analogique du microcontrôleur pour lire la valeur de la tension à la sortie du pont diviseur. Cette tension est bien sûr dépendante du bouton sur lequel on appui, ce dernier peux donc être retrouvé facilement grâce à quelques ligne de code.

Voici un schéma pour mieux comprendre :

Copie de s8-page-001

Fig.1 : Schéma du pont diviseur multiple

 

La technique consiste alors à mesurer la valeur donnée par le convertisseur analogique-numérique du microcontrôleur pour chaque boutons poussoir.

Voilà un exemple avec un Arduino Nano (CAN 10 bits et VCC = 3,3V) :

Bouton appuyé

BP 1

BP 2

BP 3

BP 4

BP 5

BP 6

Aucun
Valeur de sortie

0

65

180

305

485

670

1023

Fig.2 : Tableau des valeurs de sortie du convertisseur analogique-numérique pour le montage de la fig.1

 

Il s’agit enfin de tester la valeur donnée par le CAN avec une valeur prise au milieu de l’écart de valeur entre deux boutons poussoir afin avoir une bonne marge :

Valeur = analogRead(A0);

if (Valeur< 32)   Serial.println("BP 1);

else if (Valeur< 119)  Serial.println("BP 2); 
else if (Valeur< 232)  Serial.println("BP 3; 
else if (Valeur< 368)  Serial.println("BP 4); 
else if (Valeur< 572)  Serial.println("BP 5); 
else if (Valeur< 846)  Serial.println("BP 6); 
else if (Valeur> 846)  Serial.println("Aucun");

Dans cet exemple j’affiche simplement dans la console série le numéro du bouton qui a été pressé mais libre à vous d’y faire ce que vous voulez.

 

6 boutons + interruption sur 2 entrées Arduino

 

Parfois il se peut que votre programme soit occupé par une tache, et pendant ce temps-là vous ne pouvez pas utiliser les boutons poussoirs connectés à votre microcontrôleur.

Heureusement celui-ci dispose de broches d’interruptions matérielles. Lorsque l’une d’elle est activée, au moindre changement d’état de celle-ci, le programme se met en pause pour exécuter une fonction particulière que vous pouvez définir.

Lorsque cette fonction a fini de s’exécuter le programme reprend là où il s’était arrêté.

On utilise le même montage que précédemment mais avec une porte OU à diode qui permet d’actionner l’interruption dès que l’un des boutons poussoir est pressé.

s8-page-001

Fig.3 : Schéma du pont diviseur multiple avec diodes d’interruptions

 

Par exemple, pour un Arduino UNO, les broches D2 et D3 peuvent être configurés avec une interruption1. Dans notre cas nous paramétrons l’interruption pour quelle se déclenche sur niveau bas :

attachInterrupt(0, Fonction_interruption, LOW); //interruption sur broche D2 (interrupt 0)

La fonction “Fonction_interruption()” est appelée dès que la broche D2 passe à l’état bas (LOW).

Voici le programme complet :

const byte bouton = A0;  //Entrée analogique des 6 boutons
byte BP_appuye = 0;  //Variable stockant le bouton appuyé

 

void setup() {
  pinMode(bouton, INPUT); //entrée analogique des boutons réglée en entrée
  attachInterrupt(0, InterruptBouton, LOW); //interruption sur pin D2 (interrupt 0)
}

 

void loop()    {

 

}

 

void InterruptBouton()  {
  int ValeurBouton = analogRead(bouton);
  if (ValeurBouton < 32) BP_appuye = 1;
  else if (ValeurBouton < 119) BP_appuye = 2;
  else if (ValeurBouton < 232) BP_appuye = 3;
  else if (ValeurBouton < 368) BP_appuye = 4;
  else if (ValeurBouton < 572) BP_appuye = 5;
  else if (ValeurBouton < 846) BP_appuye = 6;
  else if (ValeurBouton > 846) BP_appuye = 0;
}

Comme vous pouvez le voir je n’ai rien mis dans la fonction Arduino loop, à vous d’y placer votre programme.

 

Références :

1 commentaires:

  1. J'ai testé 2 simplifications avec succès :
    - j'ai directement relié D2 à A0, sans diode, ce qui fonctionne bien si la 1ere résistance, celle reliée au +, est >> à la somme des autres. 50k dans votre exemple.
    - j'ai unifié toutes les valeurs des résistances restantes à 1k, ce qui ne simplifie pas les calculs mais facilite l'approvisionnement.
    Nicolas

    RépondreSupprimer