===== Presentation ===== ESP8266 est une gamme de microcontrolleurs simples. Ces microcontrolleurs hébergent, comme les arduino, un ensemble de blocs exécutables par un microprocesseur. Ce bloc d'instructions est exécuté à l'alimentation du microcontrolleur (sous la condition qu'il soit bien en mode UART et non Flash mode, voir plus loin pour l'explication des modes) On retrouve dans la gamme d'ESP8266 : le modèle ESP01, ESP01S, ESP12 et ESP12E (ESP8266-12E) (présentation plus bas). NodeMCU correspond au nom de la carte mère minimaliste (comme celle de l'arduino), qui utilise l'esp8266. NodeMCU correspond aussi au nom du firmware installé (flashé) par défaut sur la carte ; il permet de programmer l'esp via le language lua. L'arduino classique et le NodeMcu/ESP8266 sont des microcontrolleur simple. Il n'y a pas de système d'exploitation proprement dit. Juste un firmware. Il est possible de configurer l'EPS8266 de plusieurs manières : * flasher un firmware nodeMcu ; le firmware correspond en fait à un ensemble de librairies et d'un interpréteur de commande lua. Remarque : le flash s'effectue très souvent à une vitesse de 115200 ou 230400 bauds. Par la suite, cela permet de n'envoyer à l'esp (par communication série) que les scripts lua ,qui feront eux appels aux fonctions des modules présents dans le firmware. Remarque : Le téléchargement de script se fait le plus souvent à une vitesse de 9600 bauds sur les ESP8266. * flasher un firware micropython : sans doute analogue à la méthode précédent sur beaucoup de points * utiliser Arduino IDE, comme pour un arduino classique. Dans ce dernier cas, on compile, puis on téléverseme un script de type "sketch" Plus précisement, les actions effectuées par l'IDE (Arduino IDE ou PlatformIO IDE) sont : - Récupérer les bibliotèques référencées par le script - Tenter de compiler - Si ok, téléverser en mode Flash mode le programme compilé ===== Comparaison Hardware et connectivités ESP/Arduino ===== ^ Type ^ Arduino UNO R3 ^ ESP8266-12E NodeMCU ^ | Power | 5V | 3,3V | | Fréquence | 16MHz | 80MHz | | Microcontroller | ATmega328 | ESP8266 | | Flash Memory | 32KB | 4MB | | SRAM | KB | 64 KB SRAM / 96KB DRAM | | EEPROM | 1 KB | Non, utiliser Flash | | USB | Oui | Oui | | External Power Port | Oui | Non | | Pins | 32 | 22 | | GPIO | 14 | 16 (11 Digital I/O) | | Analog I/O | 6 | 1 | | WiFi | Non | Oui ! | | PWM | 6 | 9 | | SPI / I2C | Oui | Oui | ===== ESP01 et ESP12 : les 2 modèles de ESP8266 : avec un port USB, l'autre sans ===== Le type de modèle Esp8266-12 se decline en plusieurs version. Il dispose d'un port usb. {{:node-mcu-esp-12e-pin-out-diagram2.jpg?nolink&600|}} Le type Esp8266-01 ou Esp01 (ou Esp01-S), n'a pas de port usb {{:esp8266-01.jpg?400|}} Dans les 2 cas, ils ont une liaison série via les GPIO TX et RX. **__ Remarques importante spécifiques à l'Esp01 :__** * Le pin CH_PD permet juste d'activer une fonctionnalité : alimenté mais au repos ; pour que l'esp fonctionne, il faudra que ce pin soit en 3,3V ou 5V suivant les marques, sinon rien ne se passera ==> Les pin VCC et CH_PD devront être en 3,3V ou 5V. * Les I/O GPIO0 et GPIO2 ne doivent pas être positionnés à Ground. En effet, au démarrage de l'ESP, ces I/O sont utilisés en OUTPUT et passent de LOW à HIGH pendant 30ms. Si cette séquence n'aboutit pas, l'ESP-01 reste figé et ne démarrera pas. * Connecter en serial_USB l'ancienne version. Soit on s'achète un adaptateur, qui ne fait qu'adapter les niveaux de tension entre 5V et 3.3V. Soit on en créer un soit même : [[this>../xms-documentation/technique/domotique/esp8266/esp8266_connexionserieusb.html|voir ici]] ===== Boot Le mode Flash et le mode UART ===== Les ESP peuvent être démarré soit dans un mode, soit dans un autre. Pour changer de mode, il faut les redémarrer. ==== Le mode Flash ==== Il permet de flasher l'ESP avec un firmware, ou une suite d'instruction exécutable (cas d'Arduino IDE) Ce mode opère sur les GPIO0 et GPIO2 ; il n'utilise pas les GPIO TX et RX. Par contre, pour mettre l'ESP en mode flash, il est nécessaire de positionner les pins à HIGH ou LOW au démarrage de l'ESP. Bien souvent, il s'agit de mettre le GPIO0 à GND (0V). ==== Le mode UART ==== C'est le mode de démarrage normal. Dans le cas où un firmware est installé, l'ESP démarrera sur init.lua (dans le cas du firmware NodeMCU) Dans le cas où un sketch a été téléversé à partir d'Arduino IDE, c'est le code téléversé qui sera directement exécuté. Dans ce mode, les GPIO TX et RX sont utilisés normalement, si bien qu'on pourra écrire en Arduino ou Lua Serial.begin(9600); Serial.print('Something to print'); ou print("'Something to print'"); Dans ce mode, la vitesse du port série UART de l'ESP devra être fixé à 9600, et le dispositif connecté également Dans ce mode quand votre ESP est connecté en USB à un PC, il est possible d'y accéder directement : * via putty (créer une connection SERIAL 9600 bauds sur le bon port COM) {{:techniques:esp8266:connexion-putty-port-com.png?600x300| }} * via d'autres applis précisées dans la section outillage (voir plus bas) ==== Synthèse ==== ^ GPIO ^ GPIO 0 ^ GPIO 2 ^ GPIO 15 ^ | UART Download Mode (Programming) | 0 | 1 | 0 | | Flash Startup (Normal) | 1 | 1 | 0 | | SD-Card Boot | 0 | 0 | 1 | ===== Configuration en mode firmware (NodeMCU) ===== Comme vu avant, tous les appels des programmes/scritps qui sont écrits puis téléversés sur ces bêbêtes sont interprétés puis directement exécutés, sans passer par une couche système, comme c'est le cas des OS (linux, windows, apple). L'avantage d'un ESP8266 par rapport à un arduino classique : - l'accès au WIFI, en mode station ou mode point d'accès - un (pseudo)système de fichier, permet de stocker des fichiers (exécutable ou de données). Attention néanmoins, pour l'instant, pas de dossier : le seul dossier est le dossier racine. On ne parcourt pas de dossiers ; on accède aux fichiers uniquement via leur chemin absolu. ==== Choisir son firmware NodeMCU ==== __ Les firmware NodeMcu ne sont plus téléchargeable depuis une url __ En fait, on customise son firmware, en choisissant quelles librairies installer, à partir d'un site internet : [[https://nodemcu-build.com/]] Puis un moteur de build relié au site build votre firmware et vous envoie un mail quand il est prêt. Il ne suffit plus qu'à le télécharger et le flasher dans votre ESP8266. ==== Flasher le firmware ===== Pour flasher, un firmware est disponible sous windows ou bien utiliser esptool sous linux To enable ESP8266 firmware flashing GPIO0 pin must be pulled low before the device is reset. Conversely, for a normal boot, GPIO0 must be pulled high or floating. Ceci est surtout vrai pour le modèle : le ESP-01 J'ai buildé un firmware avec les modules suivants : cron, file, gpio, http, net, node, sjson, sntp, tmr, uart, websocket, wifi, tls === Etapes avec le programme de flash sous Windows === == Etape1 == 1er ligne -> Core du firmware 2e ligne -> Modules complémentaires Attention : bien cocher les boites à cocher {{:techniques:esp8266:flash.windows.config.jpg?600|}} ==Etape2== En fonction de votre modèle, mettre les bons paramètres. Sinon, tester ... {{:techniques:esp8266:flash.windows.advanced.jpg?600|}} ==Etape3== {{:techniques:esp8266:flash.windows.operation.jpg?600|}} Sélectionner le bon port COM (en général pas COM1 ni COM2, plutot autout de 34 ...) Cliquer sur flasher et attendre. Vous devriez alors voir la led bleue de l'ESP clignoter. A la fin, si tout s'est bien passé, une adresse MAC est générée et affichée sur l'onglet "Operation". Votre ESP est flashé. Sinon, recommencer. ** Remarques :** * L'esp8266 nodeMCU fonctionne par défaut avec un firmware en language lua ; Cela signifie que vous appelerez dans vos programmes des fonctions lua propres au firmware, avec parfois le besoin de placer en début de script les directives suivantes : require * Avec le firmware NodeMcu, des scripts envoyés ne sont pas compilés ; on y retrouve les commentaires -> They all reduce the available free heap. * Mais il est néanmoins possible de compiler son programme une fois sur l'esp ; les programmes compilés ont l'extension lc. A mon avis, ils contiennent exactement le script sans les commentaires. ==== How to unbrick nodemcu esp8266 with init.lua ==== Il est très facile de bricker son ESP flashé avec le firmware nodeMCU : il suffit de lui téléverser un script init.lua buggé. Dans ce cas, l'ESP arrête l'exécution en erreur puis redémarre -> on boucle sur le démarrage. * Solution1 : Reflasher le firmware, qui par la même occasion, "efface" tout script précédent. Avec esptool (voir plus bas), effacer tout le nodeMCU, puis repartir de 0 * Solution2 : Toujours avec esptool : Retirer le script init.lua https://github.com/KuangLei/NodeMCU-RemoveInit ==== A good way to avoid to brick nodemcu esp8266 with init.lua ==== Si init.lua part en boucle infinie ou plante (dans cas, l'esp redémarrera tout de suite --> autre boucle infinie), il n'est plus possible de prendre le controle de l'esp8266. Il est comme briqué. Pour éviter que ca se reproduise, on peut mettre un timer et un boolean abort dans la fonction startup dans init.lua : function startup() if abort == true then print('startup aborted') return end print('in startup') dofile('test.lua') end tmr.alarm(0,5000,0,startup) Autre méthode : function abortInit() print(‘Press ENTER to abort startup’) uart.on(“data”, “\r”, function(data) tmr.unregister(0) uart.on(“data”) print(‘Startup aborted’) end, 0) tmr.alarm(0,5000,0, function() uart.on(“data”) print(‘Running startup’) dofile(‘main.lua’) end) end tmr.alarm(0,1000,0,abortInit) ==== Installer esptool.py : ==== E1 : Updater pip sudo pip install --upgrade pip --index-url=https://pypi.python.org/simple/ E2 : Installer esptool sudo pip install esptool === Effacer tout le nodeMcu, vraiment tout ! === esptool.py --port /dev/ttyUSB0 erase_flash ==== Reflasher le nodeMcu ==== Dans l'outil windows pour reflasher le nodeMcu, saisir les paramètres suivants avant de flasher : ^ Offset ^ Bin Path ^ | 0x00000 | INTERNAL:/ /NODEMCU | | Undefined | nodemcu-master-13 | Pour l'ancien modèle surtout (ESP-01), mettre le GPIO0 à 0V (GND) (voir début de cet article) ==== Exemple de script lua : control des GPIO ==== Les 2 scripts ci-joint, fait de mes mains permettent de : * lancer le script gpioServer.lua * gpioServer.lua permet de : - Indiquer son existence sur le réseau en requêtant régulièrement le serveur apache de mon raspberry pi - Ecouter et prendre en compte, sur le port 80, des demandes type REST de mise à jour des GPIO {{::2017.11.12_scriptluaxavier.zip|}} ==== Script lua pour lire une carte sd ==== [[https://github.com/nodemcu/nodemcu-firmware/blob/master/docs/en/sdcard.md]] ==== Glossaire NodeMCU ==== Spiffs = (Esp8266 File System) ==== Outillage et liens nodeMCu ==== - ESP8266FS : FileSystem Explorer - ESplorer : Outil permettant d'envoyer des commandes (wifi, fs, gpio) pour exécution, d'enregistrer les scripts sur l'esp et de les exécuter - LuaLoader : Equivalent de ESplorer - Espressif SDK : Equivalent de l'IDE Arduino - PlatformIO IDE : Equivalent de l'IDE Arduino - http://rextester.com/l/lua_online_compiler : compilateur lua online, pour vérifier ses programmes avant de les télécharger sur le node - http://nodemcu.readthedocs.io/en/master/ ===== Utilisation Arduino IDE ===== Comme vu avant, quand on utilise Arduino IDE, on flash le sketch comme on flash un firmware (NodeMcu) : Si c'est un ESP01, il faut mettre GPIO0 à GND pour mettre l'ESP en flash mode. Pour l'ESP12, je n'ai pas essayé encore. ==== Prérequis : ajout de la librairie ES8266 dans ArduinoIDE ==== Avant de procéder, il faut installer les bibliothèques liées aux cartes ESP. Dans Fichier > Préférences > URL gestion de cartes supplémentaire, ajouter l'url suivante : http://arduino.esp8266.com/stable/package_esp8266com_index.json Ensuite dans Outils > Type de carte > Gestionnaire de carte, trouver ESP8266 et installer la dernière version. Paramétrage : Mettre exactement ce qu'il y a dans l'image suivante pour un Esp01 ou Esp12. {{:techniques:esp8266:arduino.sketch.parametragepourflashersuresp01.jpg?900|}} Connecter votre appareil, assurer vous que le Port COM est bien trouvé, puis tenter de flasher votre sketch. Attention : 1 fois sur 4 chez moi, le flash échoue avec des message EspComm failed, ou des stacktraces. Il faut débrancher l'ESP01, attendre 3 secondes environ puis rebrancher, puis retenter. ==== Mon exemple de programme ino pour un relai ==== {{:techniques:esp8266:remoterelay.ino|}} ===== ESP01 : adaptateur USB pour flasher ou télécharger des programmes ===== Acheter 2 adaptateurs : 1 pour flasher et 1 pour télécharger des programmes lua dedans. L'adaptateur pour télécharger des programmes est opérationnel. L'adaptateur qui servira uniquement à flasher : il faut relier (via un fil) le pin GPIO 0 au pin GROUND. Moi j'ai fais ça via un cable en soudant les 2 extrémité. --> Comme ça en branche l'esp01, son pin GPIO 0 sera relié au pin GRND, ce qui le mettra en flash mode. Remarque : L'adaptateur USB gère le pin CH_PD. Il le positionne à 3,3V. Dans le cas contraire, l'esp01 ne démarrera pas. Dans le cas où l'on souhaite alimenter l'esp01 sans adaptateur USB, il faudra penser à relier le pin VCC avec le pin CH_PD. ===== Schéma électronique ===== **!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!**\\ **ATTENTION : Dans tous ce qui suit, il faut remplacer la résistance de 500 Ohm par une résistance de 47 kOhm.**\\ **!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!**\\ __ Schéma fonctionnel __ {{ :techniques:esp8266:remote-pir:schema-pir-esp01.jpg?500 }} __ Carte PCB : circuit imprimé __ Le circuit imprimé a été effectué avec une application en ligne nommée EASY-EDA (https://easyeda.com/account/user/projects/all) {{ :techniques:esp8266:pcb-sr501-esp01-2d.jpg }} {{ :techniques:esp8266:pcb-sr501-esp01-3d.jpg }} __ Fichier zip gerber __ {{ :techniques:esp8266:gerber_pir-motion-notifier-with-esp01.zip }} ===== Les capteurs PIR ===== Les capteurs PIR SR501 et SR505 émettent parfois des false trigger. {{ :techniques:esp8266:pir-sr-501.jpg?500 }} {{ :techniques:esp8266:sr501-with-or-without-trigger.jpg?1200 }} D'après ce que j'ai lu sur les forums, ca peut venir de : - champ radiofréquence (surtout les basses fréquences) - power supply communes avec l'ESP8266 : quand l'esp8266 transmet par RF, il tire (draw) beaucoup de courant, et ca peut avoir un impact sur le fonctionnement du capteur PIR. Pour lutter contre ces phénomènes : * Meilleure réponse : mettre un condensateurs d'une capacité allant de 220nF à 5uF entre pir.groundPin et pir.signalPin * ajouter juste après la sortie signal du capteur une résistance de 10kOhm ou plus, avant qu'elle n'attaque la base d'un transistor ou du pin du RBPI,de l'arduino ou de l'ESP8266 * utiliser le plus gros des 2 capteurs, qui a l'air de générer moins de false triggers. * mettre une autre alim dédiée au capteur * isoler le capteur dans un boitier aluminum (cage de faraday) pour éviter la pertubation des ondes magnétiques. ===== PlatformIO IDE ===== L'IDE PlatformIO est une alternative à l'IDE Arduino. J'ai personnellement du l'utiliser sur Windows 8.1 parce qu'il m'était impossible d'utiliser l'IDE Arduino (NullPointerException lors du chargement des cards). PlatformIO est opensource, il s'agit en fait d'une extension (un plugin) qu'on peut embarquer dans l'IDE Visual Studio Code. __Extensions PlatformIO et Arduino dans Visual Studio Code__ {{:technique:esp8266:platformio:platformio-project-and-extensions.jpg|900}} __Accéder aux fonctionnalités de PlatformIO__ {{:technique:esp8266:platformio:select-platformio-to-access-its-functionnalities.jpg|900}} __Compiler le programme__ {{:technique:esp8266:platformio:platformio-build-program.jpg|900}} __Uploader le programme sur l'ESP01__ {{:technique:esp8266:platformio:platformio-upload-program.jpg|900}} __Lire la sortie serial de l'ESP__ {{:technique:esp8266:platformio:platformio-monitor-esp8266-12.jpg|900}}