L'essentiel sur ESP8266 / NodeMCU : séquence découverte.



Dans la continuité de mon projet de fiabilisation de ma solution domotique, j’ai décidé de remplacer un capteur fait maison à base d’émetteurs/récepteurs RF433 par un autre capteur fait maison mais à base d’ESP8266.
Mon projet est de construire un « objet connecté » qui sera placé dans ma cuve de récupération d’eau de pluie et qui communiquera le niveau, de manière régulière, au serveur domoticz.

Je souhaite que cet objet soit fiable, peu consommateur en énergie et surtout que je puisse rebooter, modifier, mettre à jour des paramètres à distance. Par exemple je ne veux pas devoir intervenir sur le matériel ou reprogrammer quoi que ce soit si je décide de changer l'identifiant du capteur domoticz associé ou encore le mot de passe de mon réseau Wifi. 
Après plusieurs mois de réflexion et de recherche de la solution idéale, j’ai découvert les microcontrôleurs ESP8266 qui sont de vraies petites merveilles. 

Si vous voulez vous en procurer un qui sera compatible avec les informations et le code de mes articles vous en trouverez en suivant ce lien : http://amzn.to/2ophnQo (votre achat me permettra de gagner 10cts ! Merci ).

Dans cet article je vais présenter mon projet et constituer une mini base de données des connaissances pratiques que j’ai dû acquérir pour le réaliser. 

Note au 16/12/2017 : Cet article est en cours de rédaction. 
Note du 14/01/2018 : Bien que j'ajouterai des informations complémentaires au besoin, l'article est dans une version stable. 






Présentation de l’ESP8266


L’ESP 8266 est un microcontrôleur permettant de se connecter en Wifi. 
Pour vous en procurer un, vous trouverez mes liens d'achat sur cette page https://framboiseaupotager.blogspot.fr/p/ma-petite-entreprise.html
Cette puce a été développée en 2014 par la société Chinoise Espressif … d’où le nom ESP ! 
La puce est fabriquée par une société tierce : AI-Thinker.
Il existe à ce jour 12 versions de ce composant. Chaque version est identifiée par une nomenclature sous la forme : ESP-01, ESP-02 ou ESP-12E … (voir http://www.esp8266.com/wiki/doku.php?id=esp8266-module-family).

Note du 07/05/2018 : Cet article va présenter essentiellement le composant ESP-12 dans son intégration en NodeMCU. Si vous recherchez un tutoriel sur l'ESP-01, qui est aussi un module basé sur le microcontrôleur Esp8266 mais intégré sur un module plus petit avec moins de fonctionnalités, vous pouvez consulter l'article "Tous les secrets de l'ESP01 : réalisation d'un contrôle d'état des volets".

Ce composant embarque un module Wifi, de la mémoire, une liaison série et gère des ports GPIO. Tout cela en quantité différente en fonction de la version.
Pour faciliter son utilisation des cartes ont été créées.  Ces cartes permettent de connecter le microcontrôleur à un PC en USB, gèrent l’énergie et fournissent un firmware permettant de programmer le microprocesseur. On parle de carte NodeMCU ou Wemos. 
En ce qui concerne NodeMCU, ce terme désigne à la fois le firmware permettant de programmer le microcontrôleur en LUA et aussi la carte complète.  La carte NodeMCU est basée le microcontrôleur ESP-12E.
En gros voilà ce qu’il faut savoir pour comprendre de quoi on parle. 

Programmation


L’ESP8266 peut se programmer de plusieurs façons :
  • Avec des scripts Lua, interprétés ou compilés, avec le firmware NodeMCU 
  • En C++, avec l’IDE Arduino
  • En JavaScript, avec le firmware Espruino 
  • En MicroPython, avec le firmware MicroPython 
  • En C, avec le SDK d’Espressif ou  avec le SDK esp-open-sdk3 

Pour ma part j’ai utilisé une carte NodeMCU, connectée en USB à mon PC et programmée avec l’IDE Arduino. Cela ressemble à cela : 


Aperçu de l'éditeur de texte de l'IDE Arduino sur PC

Pour que cela soit possible, il faut bien entendu avoir installé l’IDE, installé le driver windows pour que l’USB arrive à communiquer avec la carte (CH3406 pour ma carte), installé dans l’IDE les modules et librairies qui vont permettre de compiler pour l’ESP8266. 
Tout cela est magnifiquement décrit sur le site « Projets DIY » dans l’article https://projetsdiy.fr/programmer-esp8266-ide-arduino-librairies-gpio-web-serveur-client/
Beaucoup d’autres sites sur internet détaillent l’installation de tous les composants pour programmer l’ESP 8266 avec l’IDE Arduino. 

Bon a savoir pour programmer la bête : 

Lorsque le programme est compilé, il faut l’injecter dans le microcontrôleur. On appelle cela flasher le composant car notre programme deviendra le firmware de ce dernier. 
Normalement, la carte NodeMCU se met automatiquement en mode apprentissage et normalement il n’y a rien à faire avant de télé verser le programme depuis l'IDE Arduino.  Dans la pratique ceci ne fonctionne pas toujours. Je n'ai pas encore bien identifié les conditions préalables pour que ce mode "flash" soit toujours opérationnel automatiquement. J'ai pu constater que cela dépend de ce qui est connecté aux PINs et aussi si c'est la première fois que le composant est flashé. 
Quand le « flashage » de la carte échoue, il faut remettre la carte dans le mode apprentissage en utilisant les boutons situés de part et d'autre du port micro USB comme indiqué ci-dessous : 
  1. Appuyez sur le bouton Flash et maintenez le bouton appuyé.
  2. Appuyez sur Reset
  3. Relâchez le bouton Reset
  4. Relâchez le bouton Flash 

Ceci est valable pour les cartes NodeMcu. Pour les autres modèles, par exemple ESP-01, on accède au mode "flash" en connectant certaines PINs aux pôles V+ ou GND.

Ajout du 10/05/2018 : C'est peut être une évidence mais le NodeMCU se connecte au PC avec un câble USB de type Type A mâle - micro USB mâle. Il existe beaucoup de ces câbles dans la nature car on les utilise souvent pour raccorder un téléphone à un chargeur. Hors, souvent, ces câbles de charge n'ont que deux fils de soudés aux fiches USB. Les fils dédiés à l'alimentation électrique. Les deux dédiés aux données ne sont pas présents. Dans ce cas, bien évidement, il sera impossible d'injecter un programme au NodeMCU. Je me suis arraché les cheveux devant les messages d'erreur le l'IDE qui refusait obstinément de m'injecter mon programme. Pour savoir si le câble est correct, utilisez le pour brancher un téléphone au PC. Si le téléphone est reconnu par l'ordinateur c'est bon !

Alimentation électrique :


La tension de fonctionnement de l’ESP8266 est de 3.3v.
Il faudra donc être vigilent au niveau des GPIO à ce que les composants connectés respectent cette tension.
Il existe plusieurs possibilités pour alimenter électriquement le nodeMcu comme on peut le voir sur la page http://henrysbench.capnfatz.com/henrys-bench/arduino-projects-tips-and-more/powering-the-esp-12e-nodemcu-development-board/
Le schéma ci-dessous, qui en est extrait, montre les pins sur lesquels on peut raccorder une alimentation électrique ainsi que la tension maximum pour chacun.



Attention toutefois à ce qui est indiqué pour l’alimentation sur VIN ! Dans de nombreux documents j’ai vu que cette tension doit être comprise entre 3.3V et 9V maximum.  Il ne faudra en aucun cas dépasser cette tension d’entrée.
On voit donc que la carte s’alimente en connectant une source électrique 3.3V sur une des bornes 3.3V, en se connectant en micro USB avec câble USB ou en connectant une source sur VIN. 

Notions utiles pour la programmation : 


Bien que je détaillerai la manière de programmer le microcontrôleur dans un article suivant, je vais présenter ci-dessous des notions matérielles qui seront utiles pour la suite. 

La mémoire 


Les ESP8266 embarquent une plus ou moins grosse mémoire flash accessible en SPI. Cette mémoire peut etre intégrée au processeur ou alors associée sur la carte NodeMCU comme mémoire flash externe. 
Ce qui est intéressant à connaitre, c'est que la mémoire flash est structurée de la manière suivante : 
  • Un espace de stockage pour le firmware
  • Un espace de stockage temporaire pour les mises à jour OTA (Over The Air) du firmware
  • Un système de fichier SPIFFS
  • Un emplacement EEPROM pour la sauvegarde de données par les programmes
  • Un emplacement pour stocker la configuration du WIFI dans le cas de l’utilisation du SDK natif
Dans la carte NodeMCU v3 il y a 4M de mémoire, dont 3 peuvent être dédiés au système de fichier. Ce système de fichier peut être utilisé pour y stocker des données et des fichiers, pour un serveur web par exemple. Cependant n'y voyez pas l'équivalent d'un file system moderne. Il n'y a pas de correction d'erreur et il n'y a pas d'arborescence de fichier (répertoires et sous répertoires), tout est au même niveau. Mais comme le caractère / est accepté dans un nom de fichier, vous pouvez stocker un fichier du nom de "/web/index.htm" si vous voulez avoir quelque chose de structuré. Attention cependant les noms de fichiers sont limités à 32 caractères, y compris le '\0' de fin de chaine (donc 31 caractères utiles).
La mémoire EEPROM est particulièrement intéressante car c'est dans cette dernière que pourront être sauvegardées de données persistantes pour nos programmes. Par exemple, si une variable de notre programme sert à mémoriser un mot de passe et que ce mot de passe peut etre changer, s'il est stocké dans la mémoire EEPROM nous pourrons retrouver ce changement en cas de reboot ou de coupure électrique.

Pour faire un reboot :

On peut faire un reboot logiciel ou matériel. 

De manière logiciel :


ESP.reset() is a hard reset and can leave some of the registers in the old state which can lead to problems, its more or less like the reset button on the PC.
ESP.restart() tells the SDK to reboot, so its a more clean reboot, use this one if possible.

Toutefois cela n'a pas fonctionné sur mon NodeMCU v3. On cherchant un peu dans les forum anglo-saxon j'ai pu voir que ce dysfonctionnement est connu. 

De manière matériel :


On connecte RST sur un PIN initialisé à HIGH et on passe le pin à LOW pour rebooter.

Le mieux est de connecter le PIN D0 sur RST car ce dernier est en état HIGH dès le démarrage et surtout il est utilisé pour que le deepsleep fonctionne :

Mise en sommeil : 


Une des fonctionnalités intéressante du microcontroleur est sa capacité à passer en mode sommeil profond. Le mode "deepsleep". Nous verrons comment faire cela de manière logiciel.
Le mode deepsleep permet d'endormir quasiment toutes les fonctions présente afin d'avoir une consommation électrique minimale.
Je n'ai pas encore testé si la consommation dans ce mode pour mon NodeMCU le rend compatible avec une alimentation sur piles. En fonction des sources auxquelles je me documente, je peux lire que la consommation est soit de 20microA, soit 20mA (milli). Si c'est bien 20mA, l'alimentation sur pile est compromise car un accu de 700mA permettrait de tenir seulement 35 heures.

Il y a deux manières de sortir du mode deepSleep :

  1. Débrancher et rebrancher l’alimentation
  2. Créer une pulse vers GND sur RST. En temps normal, RST doit être maintenu à VCC ou éventuellement laissé flottant. Cette impulsion peut être crée :
  • Avec une interruption temporelle : on spécifie la durée d’endormissement dans le programme et l’ESP génère la pulse sur GPIO16 qui doit être connecté à RST.
  • Avec une interruption matérielle : on connecte un signal en pull up sur RST. Ce signal doit être exempt de rebonds, sinon l’ESP sera remis à zéro en saccades.

Utilisation des PIN 

Les PINs GPIO de l'ESP8266 s'utilisent comme sur un Arduino.

En ce qui concerne les cartes NodeMCU :
Il existe plusieurs constructeurs qui proposent des cartes Nodemcu (LoLin, Amica, … ).  On trouve aussi des cartes sans marques.
Il existe également plusieurs versions de la carte. On trouve souvent sur le net des références aux versions 0.9, 1.0, 2.0 et 3.0 (décembre 2017).

En fonction de la version de la carte, l’architecture des PIN GPIO peut varier. Mais ces variations sont souvent minimes.  
L’image ci-dessous montre les « pin map » des v2 et v3. La différence est entourée en rouge. 


Et l'image ci-dessous montre les correspondance entre les noms des ports tels qu'indiqués sur la carte, les GPIO et les fonctions spécifiques associées à chacun :




Conclusion 

Toutes ces connaissances que j'ai réussi à collecter à droite et à gauche m'ont permises de comprendre les bases du fonctionnement d'une carte nodeMCU. Ces bases seront utiles dans l'article précédent pour comprendre les concepts que nous devront manipuler dans notre programme informatique.

Si vous comptez vous équiper sur Amazon, n’hésitez pas à cliquer sur les liens ci-dessous avant de faire vos achats. Cela n’aura aucun impact pour vous mais en me faisant gagner quelques centimes sur ma cagnotte cela m’encourage à partager le fruit de mon travail de recherche. 
Sur ebay les délais de livraison seront plus long mais les composants seront légèrement moins chers : 

  • Le nodeMCU : ICI
  • Les breadboard : ICI
  • Les modules HC-SR04 qui seront utiles pour créer la sonde de profondeur dans l'article suivant : ICI
  • Les cables de connexion DUPOND pour breadboard: ICI



Et si cet article ou les autres dans ce blog vous semblent utiles, n'hésitez pas à cliquer sur le lien ci-dessous pour aller sur Amazon ! Sans vous couter quoi que ce soit, cela m'aidera à investir dans de nouveaux matériels que je ne manquerai pas de vous présenter.



Soutenez la blogoculture ...

Vous appréciez les articles frais et vitaminés de ce blog et vous voulez faire un geste pour encourager ce partage, saluer le travail, ou parce y avez trouvé des choses utiles ( et que vous êtes sympa ) ?

... c'est possible et vous avez le choix !
Si vous avez un compte Paypal et quelques euros à offrir sans vous mettre sur la paille, subventionnez la culture domotique à l'ancienne !
Vous ne dépenserez pas un radis de plus en faisant votre achat sur Amazon à partir de ce lien.
Economisez du blé avec Amazon Prime ! Offre d'essais 1 mois gratuit (et renouvelable).
Soyez chou et aidez les petits producteurs de blog à se faire connaitre auprès de vos amis facebook !

Merci

Commentaires