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 :

Construction d’un système d’alarme (Partie 3)

ba

Dans la première partie je vous avais rapidement exposé le projet tandis que dans la deuxième, j’avais fait du shoping pour trouver les composants nécessaires au module de détection de mouvement.

 

Dans cette troisième partie j’aimerais vous parler plus en détail du circuit imprimé, de la tentative de réduction de consommation du système et de la programmation associée.

 

J’avais commencé par graver moi-même un premier prototype du circuit imprimé du détecteur de mouvement grâce à la technique dont je vous avais parlé il y a quelques mois.

 

RevB_circuit imprimé

Figure 1 - Capture du logiciel Fritzing, circuit du détecteur de mouvements

 

Le cœur du circuit est un microcontrôleur Atmel ATMEGA328. Celui-ci communique avec un module radio nRF24L01+ par l’intermédiaire d’un bus SPI.

 

Après avoir validé ce circuit, je l’ai fait fabriquer afin que celui-ci ait une apparence plus professionnelle et soit plus résistant.

J’ai utilisé le service d’Elecrow qui m’a permis d’avoir 10 copies de cette carte pour un prix d’environ 13€.

 

clip_image004 clip_image006

Figure 2 - Photos recto/verso du circuit imprimé

 

Je voulais tester un circuit imprimé de couleur blanche, et je trouve que ça rend super bien. En revanche les pistes ne sont plus très visibles et le circuit est bien plus salissant lors de la soudure.

 

Monté, le circuit est identique au prototype :

clip_image008

Figure 3 - Photo de l'intérieur du module de détection de mouvement monté

 

Comme expliqué dans la partie 2, j’ai préféré utiliser plusieurs modules tout fait plutôt que de réaliser ces circuits moi-même :

· Un circuit de charge de la batterie Lithium-ion par USB

clip_image009

· Le circuit de traitement du signal du capteur de mouvement (PIR)

clip_image010

· Le circuit du module radio nRF24L01+

clip_image011

Cela permet de diminuer la complexité du travail et surement même d’économiser de l’argent.

 

Concernant la consommation du module, j’utilise maintenant la bibliothèque Arduino Low-power.

Elle me permet de faire chuter la consommation électrique grâce à un système d’interruption.

 

Le petit circuit du détecteur de mouvement infrarouge que j’utilise contient un circuit de traitement de signal et offre une sortie de type tout-ou-rien. C’est-à-dire que lorsque que le capteur voit quelque chose devant lui, sa sortie est à l’état 1 (5V) et s’il ne vois rien sa sortie est à 0.

clip_image013

Figure 4 - Photo du dos du module de détecteur infrarouge (PIR)

 

Cette sortie tout-ou-rien est reliée à la broche D2 du microcontrôleur Arduino. Cette broche dispose d’une fonction d’interruption, c’est-à-dire qu’elle peut réveiller l’Arduino lorsque qu’un changement d’état lui est appliqué.

 

L’Arduino est donc plongé dans un sommeil très peu consommateur d’énergie jusqu’à ce que le module infrarouge détecte un mouvement et fasse changer d’état cette broche d’interruption.

 

En utilisant la bibliothèque « sleep » standard, j’obtenais une consommation en veille de 180µA sous 4,2V. Maintenant la consommation chute à 70µA, ce qui nous fait en théorie une autonomie de 2 ans et 3 mois pour une batterie de 2Ah.

L’autonomie réelle n’attendra surement jamais ça, mais la facilité de rechargement des détecteurs (une simple prise USB comme un téléphone) l’emporte.

 

Elément

Consommation en veille sous 4,2V

Microcontrôleur ATMEGA328

11µA

Module radio nRF24L01+

1,8µA

Capteur PIR

57µA

Figure 5 - Consommation électrique des différents éléments du module de détections de mouvements

 

Le système n’est bien évidement pas toujours en veille, voici les différentes phases de fonctionnement et leur consommation associés. Je n’ai pas pu chronométrer la durée de ces phases mais elles sont extrêmement courtes :

 

Veille

Mouvement détecté, envoi de l’alerte

Mise en veille

Veille

70µA

240µA

170µA

70µA

Figure 6 - Phases de fonctionnements et leur consommation

 

Et pour finir voici le programme Arduino utilisé : Programme détecteur de mouvement.

 

A bientôt.