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)

dimanche 2 septembre 2018

Livre: Arduino, Apprivoisez l'élecronique et le codage



Arduino: Apprivoisez l'électronique et le codage
par Jean-Christophe Quetin
Éditions ENI (Collection La Fabrique), 2018
428 pages

Il est difficile de ne pas s'enthousiasmer devant la jeune collection "La Fabrique" des Éditions ENI, qui comporte déjà quelques bons ouvrages sur l'Arduino.  Certains sont très spécialisés (je pense entre autres à Arduino: Faites-le jouer au train, à paraître en octobre) ou s'adressent à un public déjà expérimenté (Arduino: S'exercer au prototypage électronique de Cédric Doutriaux).

"Arduino: Apprivoisez l'électronique" par Jean-Christophe Quetin entrerait plutôt dans la catégorie "manuel général à l'usage du débutant".  Le genre de livre que vous achetez au moment où vous souhaitez vous initier à l'Arduino, et auquel vous continuerez de vous référer à mesure que vous progresserez dans le domaine.

Je le recommande aux débutants, puisqu'il ne présuppose pas de connaissances préalables en électronique ou en programmation.  Si vous ne savez pas faire la différence entre une LED et un condensateur, ça vous sera expliqué.  Vous n'avez pas la moindre idée de ce que signifie l'expression "digitalWrite(LEDROUGE, HIGH);"?  On va vous l'expliquer aussi.  Environ la moitié du livre est consacrée aux concepts de base et à des projets simples impliquant essentiellement des LEDs, des boutons et des potentiomètres.  De plus, tout le langage Arduino est résumé de façon bien ordonnée dans le dernier chapitre.

La deuxième moitié du livre est consacrée à des capteurs et actionneurs plus spécialisés, mais très largement utilisés: photorésistance, capteur de température, télémètre à ultrasons, moteurs, afficheurs, cartes SD, etc.  Les différentes façons d'établir une communication entre deux cartes Arduino sont regroupées dans un même chapitre: I2C, liaison série, bluetooth, radio 433 MHz, infrarouge, ethernet, Wi-Fi (mais rien sur le populaire NRF24L01, toutefois).  On vous présente aussi quelques alternatives au classique Arduino Uno, comme l'ESP8266, l'ATTiny85 ou la fabrication de votre propre clone d'Arduino Uno.

Bref, de quoi vous occuper pendant plusieurs mois, jusqu'à ce que vous ne soyez plus du tout débutant.

Vous me ferez peut-être remarquer (avec raison) que des livres pour s'initier à l'Arduino, il y en a déjà bien d'autre.  Alors celui-ci, qu'est-ce qu'il a de particulier?
  • L'approche pédagogique est efficace et élégante.  Le lecteur acquiert progressivement de nouvelles connaissances en réalisant une suite de mini-projets concrets ordonnés de façon logique.  Chaque nouveau projet est une occasion d'apprendre un nouvel élément. Par exemple, les conditions (if, switch...case) et les différents types de boucles (while, do...while, for...) sont présentées au moment où elles se révèlent utiles dans un projet qui consiste à varier la luminosité d'une LED par PWM;  les tableaux (arrays) sont expliqués au moment de jouer une mélodie avec la fonction tone;  les registres à décalage sont présentés au moment de piloter un afficheur à 7 segments.  En ce qui me concerne, ce mode d'apprentissage est optimal.
  • Il va droit au but.  Vous y trouverez les informations nécessaires pour faire fonctionner les montages courants (incluant un schéma Fritzing et un exemple de code), mais les digressions non-essentielles sont rares. Avantage ou inconvénient?  Ça dépend du lecteur.  Je suppose que certaines personnes pourraient regretter l'absence de certaines informations complémentaires.
  • Les projets présentés sont très classiques: simulation de feux de circulation, jeu Simon (mémorisation musicale)...ce sont des applications éducatives déjà bien éprouvées qu'on retrouve dans d'autres livres et, bien sûr, sur de nombreux sites internet.  Au départ, je croyais que le "piano banane" était une création de l'auteur, mais non: Google m'a prouvé qu'il s'agit d'un projet bien connu déjà réalisé par des tas de gens.  L'auteur n'a pas tenté d'être original à tout prix en proposant un "piano raisin" ou des feux pour piétons contrôlables par une banane, si vous voyez ce que je veux dire.  Pour cette raison, j'hésiterais à conseiller ce livre à quelqu'un qui possède déjà d'autres livres sur l'Arduino.  (Seule exception notable:  11 pages sont consacrées à la Kitco, petite console de jeu dont je ne me souviens pas avoir entendu parler auparavant, et qui se voit ici accorder autant d'importance que l'ATTiny85,  l'ESP8266 ou le Leonardo.)
  • Le style de codage est uniforme tout le long du livre: les commentaires ainsi que les noms des variables et des routines sont en français; le nom des constantes est en majuscule et le noms des variables est en minuscules, etc. 
  • Comme les autres livres de la même collection, il a été écrit en français par un auteur francophone. En pratique, ça n'ajoute peut-être rien à la qualité intrinsèque de l'ouvrage, mais ça me semble quand même plus sympa que la traduction d'un livre précédemment publié dans une langue étrangère.
Pour terminer, je souligne quelques imperfections mineures:
  • J'ai remarqué à plus d'un endroit l'utilisation de l'expression "un courant de 5 V". Hérésie!!! (C'est bien sûr la tension qui est de 5 V.  Le courant, lui, se mesure en ampères.)
  • Je doute fortement que quelqu'un qui ne sait pas déjà comment piloter un moteur pas à pas avec une carte Arduino puisse apprendre à le faire en lisant les quelques lignes qui sont consacrées à ce sujet...il n'y a ni schéma de montage, ni indication sur la façon de brancher le moteur. C'est d'autant plus troublant que, dans les pages précédentes, le moteur à courant continu et le servomoteur sont couverts adéquatement.
  • Dans la version imprimée, les schémas Fritzing ne sont pas en couleur, ce qui complique parfois l'interprétation des schémas les plus complexes.
Si vous le désirez, vous pouvez feuilleter le livre sur le site web de la maison d'édition.

Yves Pelletier   (TwitterFacebook)