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)


dimanche 16 septembre 2018

Livre: Raspberry Pi et ESP8266

Raspberry Pi et ESP8266
Domotisez votre habitation
par Kevin Sartor
Éditions ENI, collection La Fabrique
256 pages
2018

Voici un livre dont le public cible est parfaitement défini: les bricoleurs qui souhaitent être guidés dans la réalisation d'un système domotique résidentiel constitué d'un Raspberry Pi communiquant par Wi-Fi avec un certain nombre de capteurs et d'actionneurs branchés à des modules ESP8266.

L'objectif: améliorer le confort du domicile tout en diminuant le gaspillage d'énergie,  grâce à un système réalisé soi-même à faible coût.

Vous y trouverez de précieux conseils qui vous permettront, par exemple, de surveiller votre consommation d'électricité, d'eau et de gaz, d'automatiser la ventilation d'une pièce en fonction de son degré d'humidité, de réaliser votre propre thermostat connecté, d'arroser automatiquement votre gazon (mais uniquement lorsqu'il en a besoin), d'être alerté par email lorsque vous avez oublié d'éteindre une lampe, etc.

Pour en arriver là, on vous présente:

  • Une introduction à la domotique: son historique, ses possibilités...
  • Un tour d'horizon des principaux compteurs domestiques (eau, gaz, électricité), et des capteurs et actionneurs qui peuvent être pertinents dans votre installation domotique (interrupteur à lame souple, photorésistance, capteur de température, de pression, d'humidité, détecteurs de présence, relais, moteurs, bipeurs, etc.)
  • La marche à suivre pour installer l'IDE Arduino et le configurer pour programmer un module NodeMCU (la carte de développement qui comporte un ESP8266).  
  • La marche à suivre pour configurer le Raspberry Pi 3 et y installer le logiciel Domoticz.
  • Des exemples de projets spécifiques incluant, bien entendu des schémas de circuit (Fritzing) et des sketches complets et correctement commentés.
Bien que ces projets présentent un certain niveau de complexité (on dépasse nettement le simple clignotement d'une LED...) il me semble que les informations sont suffisamment détaillées pour qu'un néophyte puisse se débrouiller sans disposer d'une très grande quantité de connaissances préalables en électronique ou en programmation.

Yves Pelletier   (TwitterFacebook)

samedi 8 septembre 2018

Servomoteur contrôlé par Wi-Fi (ESP8266 ou ESP32)

(N.B.: cet article a été mis à jour le 8 août 2019, pour assurer une compatibilité avec l'ESP32).

Il fallait s'y attendre: après avoir contrôlé un moteur à courant continu et un moteur pas à pas, je vous explique aujourd'hui comment j'ai procédé pour contrôler un servomoteur par Wi-Fi, à partir d'une page web.

Matériel

Nous utiliserons un petit servomoteur de type Tower Pro SG90 et un module ESP8266 ou ESP32. Sur la photographie ci-contre, vous pouvez constater qu'en fait j'ai utilisé une carte de développement Wemos D1 (dont je vous parlerai avec enthousiasme dans un futur billet) mais puisque le servomoteur n'occupera qu'une seule sortie de l'ESP8266, n'importe quel module ESP8266 devrait convenir (même le modeste ESP-01!).

Préparation de l'IDE Arduino

Dans l'hypothèse où il s'agirait de votre première occasion de programmer un module ESP8266 avec l'IDE Arduino, je vous réfère à un précédent billet qui vous fournit les instructions nécessaires à l'installation des fichiers requis. Pour l'ESP32, les informations pertinentes se trouvent plutôt ici.

Pour l'ESP32: installation d'une bibliothèque

Si vous utilisez un ESP8266, vous n'avez pas de bibliothèque à installer: la bibliothèque "Servo"  conventionnelle, installée par défaut dans l'IDE Arduino, fait parfaitement l'affaire. Si vous utilisez un ESP32, toutefois, vous devez installer une version de la bibliothèque Servo qui a été spécialement conçue pour l'ESP32. Heureusement, la syntaxe est la même peu importe la bibliothèque utilisée.

Circuit

Nous avons choisi d'utiliser la broche GPIO4 pour contrôler le servomoteur. Pour un seul petit servomoteur, on peu utiliser l'alimentation 3,3 V de la carte. Pour plusieurs servomoteurs, ou pour un servomoteur plus gros, il devient important d'utiliser une alimentation distincte (auquel cas, n'oubliez pas de relier une broche GND de la carte à la borne négative de l'alimentation du servomoteur).

Schéma du circuit pour une carte ESP32 (mais elles ne sont pas toutes identiques):


Schéma du circuit pour une carte Wemos D1 mini (la broche D2 de cette carte correspond à GPIO4):



Si vous utilisez plutôt un module ESP8266 et un convertisseur USB-TTL, 3 broches de votre module ESP8266 sont connectées à 3,3 V: VCC, RST et CH_PD (aussi appelée "EN" sur certains modules), et deux broches sont connectées à la masse: GND et GPIO0.

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 n'est évidemment pas nécessaire que la sortie utilisée pour le contrôle du servomoteur soit GPIO 04, puisque toutes les sorties de l'ESP8266 peuvent produire un signal PWM.

Sketch

Le contrôle du servomoteur se limite à l'utilisation de la fonction attach(), au démarrage, pour indiquer à quelle broche on l'a connecté, et la fonction write() pour modifier sa position. 

La fonction "construitPage()" retourne une chaîne de caractères contenant la totalité de la page web, en langage html.  Cette page comporte 3 boutons radio qui permettent à l'utilisateur de sélectionner 3 positions différentes du servomoteur.

Avant d'utiliser le sketch, vous devrez remplacer les astérisques par le nom de votre réseau Wi-Fi et le mot de passe qui permet d'y accéder.



Résultat

Il est utile d'afficher le moniteur série lors du démarrage du sketch, car vous y trouverez l'adresse IP du module ESP8266.



Il s'agit de coller cette adresse dans un navigateur web ayant accès à votre réseau Wi-Fi pour afficher la page web qui permet de contrôler le servomoteur.

Pour un contrôle plus fin de la position du servomoteur, vous pouvez bien sûr ajouter des boutons supplémentaires,  les remplacer par un champ texte dans lequel l'utilisateur entrera directement l'angle désiré en degrés ou encore les remplacer par un contrôle qu'on fait glisser avec la souris.

Yves Pelletier   (TwitterFacebook)