Charger NodeMCU sur un ESP8266 sous Linux

Merci de partager...Share on Google+Tweet about this on TwitterShare on FacebookEmail this to someoneShare on Reddit

La petite histoire…

C’est grâce à Bloguelinux que j’ai découvert les ESP8266. Par contre, ça n’a jamais été mentionné dans une émission. C’est un autre auditeur ou auditrice dont je ne me rappelle malheureusement plus le pseudonyme qui en a parlé dans la salle de chat (#bloguelinux sur Freenode) lors d’une émission live. Si vous avez l’occasion, venez participer sur IRC lors de la prochaine émission. Vous ne le regretterez pas!

ESP8266/NodeMCU, quecé ça?

Il existe plusieurs modèles d’ESP8266. Pour ma part, j’ai choisi le moins cher, soit la version ESP-01. C’est est un petit module de 25 mm X 15 mm qui comprend un microcontroller, une antenne Wifi et 2 entrée/sortie générales (GPIO). Ce qui est intéressant de ce dernier, c’est qu’il coute environ 3.78$ (ou 2.54€) sur ebay!!! Pour sa part, NodeMCU est un firmware open source (Licence MIT) qui peut être chargé sur un ESP8266 et qui peut le contrôler grâce à des scripts LUA.

Pourquoi ce tutoriel?

La raison est bien exprimée par la diatribe de @Pat_bloguelinux sur les forums dans l’émission #90. En fait, je me suis heurté à plein de ressources contradictoires et/ou périmées sur Internet. La communauté des ESP8266 est déjà limitée et plusieurs outils de programmations de ce module fonctionnent sous Windows seulement. À un certain point dans mon exploration, j’étais vraiment découragé par le manque d’information et l’instabilité du module. Heureusement, j’ai fini par trouver toutes les solutions à mes problèmes et, si vous suivez mes instructions, vous devriez pouvoir charger NodeMCU sur votre ESP8266 sans trop de soucis!

Prérequis

Logiciels

Je ne vais pas passer à travers l’installation de ces logiciels. Pour moi, sous Arch Linux, GNU Screen, Nmap et ARP-scan se trouvaient dans les dépôts de base tandis qu’Esptool et ESPlorer se trouvaient dans l’AUR. Cherchez dans les dépôts de votre distribution. Si vous ne les trouvez pas tous, les instructions pour l’installation de ces logiciels sont sur leurs sites web respectifs. Un point à noter est que Esptool est un script Python 2. Or, Arch Linux utilise Python 3 de base. Il se peut donc que, pour le faire fonctionnez, vous deviez aller changer la première ligne du script /usr/bin/esptool.py pour #!/usr/bin/env python2.

Composants

  • 1 ESP8266 ESP-01
  • 1 FTDI232
  • 1 câble microUSB vers USB
  • 1 condensateur électrolytique 330 μC ou 470 μC
  • 1 condensateur en céramique 100 nF
  • Plusieurs jumper cables (mâle-mâle, mâle-femelle, femelle-femelle)
  • 2 résistances 330 Ω ou 220 Ω
  • 2 DEL

Le FTDI232 sert à programmer l’ESP8266. Vous en avez besoin d’un seul pour programmer autant de ESP8266 que vous le voulez. Vous pouvez même vous en servir pour programmer d’autres modules comme un Trinket Pro. Notez que pour programmer l’ESP8266, votre FTDI doit supporter le 3.3V. Vous pouvez vous procurer un FTDI sur eBay pour environ 2.63$ (1.77€).

Circuit pour le chargement de NodeMCU

Voici un schéma Fritzing qui montre le circuit à réaliser :

ESP8266-FTDI-texte

Télécharger le circuit
Note : La pièce Fritzing de l’ESP8266 vient du compte github de ydonnelly.

Liste des connexions :

FTDI ESP8266
VCC VCC, CHPD
GND GND, GPIO0
TX RX
RX TX

Ce circuit est essentiellement le même que celui décrit sur ces 2 sites :

La différence c’est que j’ai ajouté un breadboard, car c’est la manière la plus pratique de faire les connexions avec des jumper cables. En plus, ça permet d’ajouter facilement les condensateurs de découplage. Ces derniers sont super importants, car l’ESP8266 est très sensible à la stabilité de son alimentation. Plus de détails sur ce point sont disponibles sur ce site :

Vous remarquerez peut-être que votre FTDI est différent de celui du schéma Fritzing. Ne vous fiez donc pas à l’ordre des connexions, mais plutôt à leur nom. Aussi, il se peut qu’il y ait un jumper sur votre FTDI qui permet de sélectionner entre 5V et 3.3V. C’était le cas sur le mien. Choisissez 3.3V, sinon vous risquez de briser l’ESP8266. La photo ci-dessous montre comment faire :

FTDI-connecteur-texte

Autre point super important : Pour pouvoir charger NodeMCU, la pin GPIO0 doit absolument être mise à la terre (GND).

Flash! Oh! Ohhh!

J’ai tenté de compiler et charger NodeMCU à partir du code source… J’ai obtenu un succès, disons… limité. Je vous suggère donc une solution plus simple, soit d’utiliser directement un fichier binaire. Vous pouvez le trouver ici :

La différence entre la version “integer” et “float”, c’est principalement que la version “float” prend un petit peu plus de mémoire. La différence est tellement minime que je vous suggère d’utiliser la version “float”.

Lorsque le fichier binaire est téléchargé, branchez le FTDI dans votre ordinateur avec le câble USB. Entrez ensuite la commande suivante :

dmesg | grep tty | tail -n 1

Notez sur quel “tty” votre FDTI est branché. Dans mon cas, c’est /dev/ttyUSB0.

Ensuite, à partir d’un terminal, naviguez jusqu’au fichier binaire et entrez la commande suivante :

sudo esptool.py --port /dev/ttyUSB0  write_flash 0x00000 Chemin_du_firmware_NodeMCU.bin

Source : Flashing the NodeMCU firmware on the ESP8266 (Linux) – Guide

Attendez que le firmware soit complètement chargé. Et voilà! Vous avez maintenant un ESP8266 avec NodeMCU.

Vérification

Pour vérifier si NodeMCU fonctionne, débranchez le câble USB et retirez la mise à la terre du GPIO0. Cette dernière étape est très importante, car si vous oubliez de débrancher GPIO0, votre ESP8266 va vous sembler gelé. Le schéma Fritzing suivant vous montre le circuit :

ESP8266-verification-texte
Télécharger le circuit

Liste des connexions :

FTDI ESP8266
VCC VCC, CHPD
GND GND, GPIO0
TX RX
RX TX

Rebranché le câble USB et, dans un terminal, entrez cette commande :

sudo screen /dev/ttyUSB0 9600

Source : How to Make an Interactive TCP Server with NodeMCU on the ESP8266

Eh oui! J’en avais aucune idée auparavant, mais GNU Screen peut servir pour établir une communication série (9600 baud dans le cas présent)! Le contenu du terminal devrait se vider et un curseur apparaitra. Si tout va bien, vous devriez être en mesure d’enter la commande suivante :

node.restart()

Si vous n’arrivez pas à entrer cette commande, vérifiez que vous avez bien débranché GPIO0. Sinon, essayez de recharger NodeMCU.

Si votre commande a fonctionné, vous devriez voir le message d’accueil de NodeMCU ci-dessous (le paquet de symboles bizarres est tout à fait normal).

NodeMCU-accueil

Pour sortir de GNU Screen, faites Ctrl+a, attendez une demi-seconde, appuyez sur k et confirmez que vous voulez bien fermer la session en appuyant sur y.

C’est maintenant que le fun commence!

Premier script LUA

Pour débuter votre exploration de l’ESP8266, je vous propose de commencer par le “hello world!” des circuits électroniques, c’est-à-dire de contrôler des DEL. Ceci peut être accompli grâce au circuit suivant :

ESP8266-FTDI-DEL-texte
Télécharger le circuit

Pour programmer et charger le code LUA, vous pouvez utiliser ESPlorer. Pour le démarrer, entrez cette commande :

sudo esplorer

Cette fenêtre apparaitra.

ESPlorer-texte

Suivez maintenant ces instructions :

  1. Dans le menu “View”, sélectionnez “Show Log” (ou faire Ctrl+l)
  2. Vérifiez que “/dev/ttyUSB0” est bien sélectionné
  3. Appuyez sur “Open”
  4. Appuyez sur “Reset” (même chose que node.restart())
  5. Entrez votre script LUA (voir plus bas)
  6. Sauvegardez le script sous le nom “init.lua” (utilisez ce nom, c’est important.)
  7. Le script sera chargé automatiquement sur l’ESP8266. Attendez la fin du chargement.
  8. Appuyez sur “Reload”
  9. Vérifiez que “init.lua” est bien présent
  10. Appuyez sur “Reset”
  11. Appuyez sur “Close”

Le code ci-dessous crée un serveur web qui dessert une page web où se trouvent 4 boutons qui permettent d’allumer ou d’éteindre les DEL. N’oubliez pas de changer le nom du réseau et le mot de passe du réseau pour les vôtres.

wifi.setmode(wifi.STATION)
wifi.sta.config("NOM_DU_RESEAU","MOT_DE_PASSE_DU_RESEAU")
print(wifi.sta.getip())
led1 = 3
led2 = 4
gpio.mode(led1, gpio.OUTPUT)
gpio.mode(led2, gpio.OUTPUT)
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
    conn:on("receive", function(client,request)
        local buf = "";
        local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
        if(method == nil)then
            _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
        end
        local _GET = {}
        if (vars ~= nil)then
            for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
                _GET[k] = v
            end
        end
        buf = buf.."<h1>ESP8266 - Serveur web</h1>";
        buf = buf.."<p>GPIO0 <a href=\"?pin=ON1\"><button>MARCHE</button></a>&nbsp;<a href=\"?pin=OFF1\"><button>ARRET</button></a></p>";
        buf = buf.."<p>GPIO2 <a href=\"?pin=ON2\"><button>MARCHE</button></a>&nbsp;<a href=\"?pin=OFF2\"><button>ARRET</button></a></p>";
        local _on,_off = "",""
        if(_GET.pin == "ON1")then
              gpio.write(led1, gpio.HIGH);
        elseif(_GET.pin == "OFF1")then
              gpio.write(led1, gpio.LOW);
        elseif(_GET.pin == "ON2")then
              gpio.write(led2, gpio.HIGH);
        elseif(_GET.pin == "OFF2")then
              gpio.write(led2, gpio.LOW);
        end
        client:send(buf);
        client:close();
        collectgarbage();
    end)
end)

Télécharger le code
Source : ESP8266 Web Server Tutorial

Pour accéder à cette page, dans un terminal, entrez :

sudo arp-scan --localnet | grep Espressif
ou encore
sudo nmap -sn 192.168.1.0/24 | grep -B 2 Espressif

L’une ou l’autre de ces commandes vous donnera l’adresse IP et l’adresse MAC de votre ESP8266. Entrez l’adresse IP dans le navigateur de votre choix et vous aurez accès à la page suivante :

Serveur-web

Super n’est-ce pas? Vous pouvez vous amuser à allumer et à éteindre les DEL à partir de cette page web comme bon vous semble. Si vous voulez éviter de chercher l’adresse IP de votre ESP8266 à chaque fois que vous le débranchez, utilisez l’adresse MAC pour donner un IP statique à votre ESP8266 sur votre router.

Laissez aller votre créativité!!

Ce petit tutoriel devrait vous donner une base suffisante pour que vous puissiez créer plein de dispositifs contrôlables à partir votre ordinateur ou votre téléphone cellulaire! Pensez à toutes les possibilités si vous alimentez votre ESP8266 avec des piles et si vous changez les DEL par des moteurs ou des relais… Par ailleurs, plutôt que d’utiliser les GPIOs en sortie, vous pouvez les utiliser en entrée et vous faire un petit système d’alarme…

Bon geekage!

Bonus

Pour ne pas oublier quand sera la prochaine émission live de Bloguelinux, entrez la commande suivante dans un terminal :

fun () { curl -s www.bloguelinux.ca | grep "localize_time_orig" | awk -F '[<>]' '{ print "Prochaine émission live : " $3 "\nProchain Aprèscast : " $15 }'; }; PROMPT_COMMAND="fun"

Maintenant, tant que vous ne fermez pas le terminal, à chaque fois que vous entrerez une commande (ex. : ls), la date et l’heure de la prochaine émission et du prochain Aprèscast s’afficheront.

 

Merci de partager...Share on Google+Tweet about this on TwitterShare on FacebookEmail this to someoneShare on Reddit