jeudi 27 septembre 2018

ESP8266 / ESP32 et afficheur à base de TM1638

Note: Cet article a été mis à jour le 28 juillet 2019 afin d'ajouter des informations concernant l'ESP32.

J'aime bien l'afficheur "LED and KEY" à base de TM1638 qui comporte huit afficheurs numériques à 7 segments, 8 LEDs et 8 boutons. J'avais déjà eu l'occasion d'utiliser ce genre de module avec un Arduino, avec un ATTiny85, et avec un STM32 Nucleo.  Cette fois-ci, en prévision d'un projet d'horloge connectée dont je vous parlerai bientôt, c'est un module ESP8266 (ou ESP32) qui pilotera l'afficheur.


Installation de la bibliothèque dans l'IDE Arduino

J'avais espéré pouvoir utiliser la bibliothèque "tm1638" par Ricardo Batista qui fonctionne très bien avec une carte Arduino mais, malheureusement, elle semble incompatible avec l'ESP8266 (voir message d'erreur ci-dessous).




Je me suis donc résigné à utiliser la bibliothèque "ErriezTM1638" qui, elle, a fonctionné sans problèmes. Malheureusement, cette bibliothèque a été conçue pour utiliser le circuit intégré TM1638 dans n'importe quel circuit, plutôt que pour les cartes de type LED and KEY en particulier.  Pour cette raison, elle est beaucoup moins simple d'utilisation que la bibliothèque de Ricardo Batista.

Tous les sketches présentés dans la suite de ce billet nécessitent la présence de la bibliothèque ErriezTM1638.

Circuit

Si vous utilisez une carte de développement complète munie d'un connecteur USB (genre Wemos, NodeMCU, etc.), les 5 broches du module TM1638 sont branchés à la carte de la façon suivante:
  • La broche VCC du module TM1638 est branchée à 3,3 V.
  • Les la broche GND du module TM1638 est branchée à GND.
  • La broche STB du TM1638 est branchée à la broche GPIO 4 de l'ESP8266 ou de l'ESP32
  • La broche CLK du TM1638 est branchée à la broche GPIO 16 de l'ESP8266 ou de l'ESP32
  • La broche DIO du TM1638 est branchée à la broche GPIO 5 de l'EP8266 ou de l'ESP32
Le schéma ci-dessous montre les connexions pour une carte Wemos D1R1 (la position des broches peut être très différente sur une autre carte):


Le circuit ci-dessous montre les connexions sur ma carte de développement ESP32:


Les instructions suivantes vous seront utiles si vous utilisez un module ESP8266 qui ne fait pas partie d'une carte de développement (un ESP-12, par exemple):
  • La broche VCC du module TM1638 ainsi que les broches VCC, RST et CH_PD (ou "EN") du module ESP8266 sont branchées à 3,3 V.
  • Les la broche GND du module TM1638 et les broches GND et GPIO0 du module ESP8266 sont branchées à la masse.
  • La broche RXD de l'ESP8266 est reliée à la broche TX du convertisseur USB-TTL, et la broche TXD de l'ESP8266 est reliée à la broche RX du convertisseur USB-TTL.

Il ne reste plus que les 3 broches du module TM1638 qui servent à la communication des données:
  • La broche STB du TM1638 est branchée à la broche GPIO 4 de l'ESP8266
  • La broche CLK du TM1638 est branchée à la broche GPIO 16 de l'ESP8266
  • La broche DIO du TM1638 est branchée à la broche GPIO 5 de l'EP8266



Afficher des nombres

Pour afficher un nombre, la bibliothèque ErriezTM1638 met à notre disposition la fonction writeData().  Cette fonction nécessite deux arguments: le premier argument est un nombre qui indique la position du chiffre sur l'afficheur, alors que le deuxième argument est un nombre qui indique lesquels des 7 segments doivent être allumés.

Par exemple, le premier chiffre à gauche de l'afficheur occupe la position "0b00000000".  Si je désire y afficher le chiffre zéro, je dois allumer tous les segments sauf le trait central et le point, ce qui correspond au nombre "0b00111111".  La commande permettant d'afficher zéro à la première position à gauche de l'afficheur sera donc:

tm1638.writeData(0b00000000, 0b00111111);

Comme vous pouvez le constater, ce qui rend l'utilisation de la bibliothèque un brin compliquée, c'est que nous devons gérer nous-mêmes l'affichage des segments (ce que j'accomplis, dans le sketch ci-dessous, à l'intérieur de la routine "afficheChiffre").  De plus, l'adresse correspondant à la position du chiffre sur l'afficheur ne respecte aucune logique. Puisque le premier chiffre à gauche correspond à la position 0b00000000, on pourrait croire que le deuxième chiffre se trouve à l'adresse 0b00000001, mais non... 0b00000001 est l'adresse d'une LED et le deuxième chiffre de l'afficheur numérique se trouve plutôt à l'adresse 0b00000110 !

Voici donc un sketch qui affiche un nombre croissant sur l'afficheur numérique.



Allumer des LEDs

Pour contrôler les 8 LEDs, on utilise encore la fonction writeData().  Le premier argument est la position de la LED (qui est, par exemple, "1" pour la première LED à gauche), et le deuxième argument est "1" pour allumer la LED, et "0" pour l'éteindre.

Le sketch ci-dessous allume les 8 LEDs à tour de rôle.



Détecter les boutons enfoncés

Pour détecter si un des 8 boutons est enfoncé, il s'agit d'utiliser la commande getKeys(), qui retourne un nombre à 32 bits dont la valeur dépend de la position du bouton enfoncé.  Si vous enfoncez le bouton "S1", getKeys() retourne "1", alors que si vous enfoncez le bouton "S2", getKeys() retourne 256 (je vous réfère au sketch pour connaître la valeur retournée par chaque bouton).

Si plusieurs boutons sont enfoncés simultanément, getKeys() retourne la somme des valeurs individuelles de chaque bouton.  Si vous enfoncez S1 et S2 en même temps, la valeur retournée sera donc 257 (qui vient de 1 + 256 ).

Le sketch ci-dessous affiche dans le moniteur série le nom du bouton enfoncé.





À lire également:

Yves Pelletier   (TwitterFacebook)


Aucun commentaire:

Enregistrer un commentaire