mardi 15 décembre 2015

Ajouter de bouton à L'ESP8266

Suite de notre petit projet connecté

Pour que notre futur boitier de jeu puisse prendre en compte les réaction du joeur, nous allons le doté de 4 boutons poussoirs.

Solution classique

Pour ce faire nous pourrions utiliser 4 entrées GPIO de l'ESP, mais cela est un peu beaucoup par rapport au nombre d'entrée/sortie disponible sur le micro-contrôleur. Nous pourrions également faire un multiplexage, et là encore cela occuperait au moins 3 entrées :
Le fonctionnement est relativement simple. Le micro-contrôleur envoie alternativement la valeur 1 et 0 à la borne E0 (programmé en sortie), puis lit les signaux disponibles sur S0 et S1.
Par exemple si E0 est l'état bas (c'est à dire autour de 0V), alors la colonne des boutons B2 et B4 sera alimentée, car E0 est connecté à une porte inverseur (le triangle). Par contre la colonne des boutons B1 et B3 sera pas alimentée.
Et si au même moment j'appuie sur B2 ou B4 alors respectivement les signaux S0 et S1 seront à l'état haut. Donc le micro-contrôleur pourra déduire que les boutons B2 et/ou B4 sont activés.
Ensuite le micro-contrôleur va positionner E0 à l'état haut, dans ce cas le colonne des boutons B1 et B3 sera alimentée, par contre l'autre colonne ne le sera plus. Si au même moment j'appuie sur les bouton B1 ou B3 alors les signaux S0 et S1 seront à l'état haut (quelque soit l'état des bouton B2 et B4).
Le schéma est relativement simplifié, car il faudrait ajouter des diodes de protection, car si nous appuyons à la fois sur B1 et B2 par exemple, avec ce schéma nous faisons un court-circuit ! c'est pas bien :-)...

Solution Analogique

Une autre solution serait d'utiliser l'entrée analogique de notre microcontrôleur ! En effet il est possible de faire un pont diviseur de tension avec nos quatre boutons puis de mesurer la tension aux bornes du pont diviseur et en déduire la combinaison des boutons :

Dans ce montage le pont diviseur est composé de la résistance Ra et de la somme des résistances R1...R4, que nous appellerons Re :

Re = R1 + R2 + R3 + R4 (si aucun bouton n'est activé)

La tension mesurée au point de mesure sera égale à :

V = Ra / (Ra+Re) * 3,3 V

Le principe de fonctionnement, c'est que nous pouvons changer la valeur de Re en court-circuitant une ou plusieurs résistances (R1...R4) en appuyant sur le bouton correspondant.
Par exemple si j'appuie sur le bouton B1, alors la résistance équivalente au niveau de  B1  sera :

   RB1 = (0 Ohm en parallèle avec une résistance R1)  =  0 Ohm.

NDR: R équivalent parallèle = Ra * Rb / (Ra + Rb)

Donc Re sera égale à 0 Ohm +  R2 + R3 + R4. Ce principe fonctionne de la même manière pour les autres boutons.
Il suffit maintenant de choisir les résistances R1, R2, R3 et R4 de manière que quelque soit la combinaison des boutons nous ayons une valeur différente de Re. Ceci nous rappel le codage binaire, en effet chaque bouton peut avoir que 2 états (On ou Off).
Donc si nous utilisons R1 = 1K, R2 = 2 x R1 = 2K, R3 = 2 x R2 = 4K et R4 = 2 x R3 = 8K, nous aurons comme un décodage binaire de l'état des bouton.
Par exemple si R1 = ON, R2 = OFF, R3 = OFF, R4 = OFF, alors Re = 0 + 2K + 4K + 8K = 14K, si R1 = OFF, R2 = ON, R3 =ON, R4 = OFF alors Re = 1K + 0 + 0 + 8K = 9K.

Avec un peu de Excel voici le calcul pour toutes les combinaisons (avec comme hypothèse que la tension d'alimentation est de 3,3 V).

Ensuite il ne reste plus qu'à connecter le point de mesure à l'entrée de l'ADC de l'ESP8266 et faire un petit programme pour détecter quels boutons sont appuyés en fonction de la tension mesurée. Je vous invite à regarder le programme disponible sur GitHub.

Bon bidouillage !

Edit: Et la petite vidéo de démo



4 commentaires:

  1. Bonjour,

    L'idée d'utiliser l'ADC avec une série de ponts diviseurs de tension est sympa, je note pour plus tard :)

    Par contre, il y a un truc qui me chagrine (dans le cas ESP8266) : le tableau fourni en fin de billet indique des tensions supérieures à un 1V. Or, si on lit les specs technique de l'ESP8266 (https://www.adafruit.com/images/product-files/2471/0A-ESP8266__Datasheet__EN_v4.3.pdf, page 23) : « The input voltage range is 0 to 1.0 V when TOUT is connected to external
    circuit. » C'est assez risqué de monter à 1,6V alors que l'entrée analogique est prévue pour 1V max :-)

    RépondreSupprimer
  2. Excellente remarque, cependant étrangement quand j'applique une tension 1/2 Vdd (soit environ 1,6V) au niveau de l'ADC je lis 612 (1/2 de 1024 qui correspond au full range de l'ADC). Je n'ai toujours pas compris pourquoi. Il faudrait allez plus loin dans le code C qui récupère la valeur lu sur l'ADC pour comprendre le pourquoi...

    RépondreSupprimer
    Réponses
    1. Effectivement, c'est assez étrange. Ton comportement se rapproche des infos Adafruit sur leur breakout ESP8266 (https://www.adafruit.com/products/2471), où ils parlent de tension max sur l'ADC à 1,8V.

      Il faudra que je vérifie avec le mien et l'alim réglable du fab lab.

      Supprimer
    2. Salut,

      J'ai finalement trouvé le pourquoi du comment sur le comportement que tu rencontres (et c'est normal). L'ADC de l'ESP8266 accepte bien une valeur maximale de 1V comme spécifié dans le datasheet.

      Par contre, si on regarde le schéma électronique du NodeMCU (https://raw.githubusercontent.com/nodemcu/nodemcu-devkit/master/Documents/NODEMCU_DEVKIT_SCH.png), il y a un pont diviseur de tension entre ADC_EXT (la broche ADC du dev kit) et ADC (la broche ADC de l'ESP8266) qui ramène la plage 0V-3,3V à 0V-1,0V (bloc ADC à droite du schéma).

      Mystère résolu :-)

      Supprimer