La période d’enfermement (ils appellent ça le con, finement) est propice à l’expérimentation. C’est le moment de sortir du tiroir tous ces trucs que vous avez rangés en disant que « ça servira bien un jour ». J’appelle ça le CPTS (ça peut toujours servir). Je vous propose d’installer MicroPython sur une ESP-12E ESP2866 pour voir un peu comment ça se passe.
Je vous avais proposé d’utiliser l’ESP2866 avec l’IDE Arduino sur le Raspberry Pi il y a quelque temps… Cette fois, toujours sur le Raspberry Pi, on va utiliser l’ESP8266 pour faire du MicroPython.
Matériel utilisé
- Raspberry Pi 4
- ESP8266 – NodeMCU LoLin v3
- Version la plus récente de Raspbian Stretch, mise à jour, avec Python 3 activé par défaut.
- Adaptateur USB => Série pour utiliser Rx et Tx de l’ESP8266
- Câble USB => microUSB pour utiliser une connexion via USB-Série
Installer MicroPython sur un ESP8266 avec le Raspberry Pi
Vous connaissez sans doute Python, l’un des langages les plus répandus et les plus étudiés actuellement. MicroPython est un portage (une implémentation) du langage de programmation libre du langage Python,sous licence MIT, vers le monde des microcontrôleurs.
Avec MicroPython, les compétences acquises dans le développement en Python (sur PC Windows, Linux ou sur Raspberry Pi), sont directement utilisables sur quantité de cartes microcontrôleur.
L’ESP8266 en fait partie et il existe une version de MicroPython adaptée à cet environnement. Je vous propose de la découvrir.
Récupérer le firmware MicroPython pour ESP8266
Il faut télécharger le firmware micro python disponible sur la page de téléchargement http://micropython.org/download#esp8266
La version dépendra de la date à laquelle vous ferez la manip. Dans mon cas la version la plus récente (latest) disponible était la esp8266-20191220-v1.12.bin (elf, map) (latest). Cliquez dessus, le fichier de 600Ko environ sera téléchargé et enregistré dans le dossier Downloads.
Pour accéder à l’ESP8266, on va aussi installer un outil appelé esptool. C’est un utilitaire basé sur Python, open source, indépendant de la plate-forme, créé pour communiquer avec le bootloader ROM dans les puces Espressif ESP8266 & ESP32. Il est également disponible sur le github Espressif.
1 |
pi@raspberrypi:/dev $ <span style="font-size: 12pt;"><strong>pip install esptool</strong></span> |
Avec cet outil, on peut maintenant effacer la mémoire flash
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
pi@raspberrypi:/dev $ <span style="font-size: 12pt;"><strong>sudo esptool.py --port /dev/ttyUSB0 erase_flash</strong></span> esptool.py v2.8 Serial port /dev/ttyUSB0 Connecting........ Detecting chip type... ESP8266 Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: 2c:f4:32:11:4a:e2 Uploading stub... Running stub... Stub running... Erasing flash (this may take a while)... Chip erase completed successfully in 2.0s Hard resetting via RTS pin... |
J’ai choisi de communiquer avec l’ESP8266 en utilisant les ports Rx et Tx physiques (les broches qui sont autour de la carte). Pour permettre l’accès à la mémoire Flash, Appuyez sur les switchs Reset et Flash, lachez Reset et l’effacement aura lieu.
[stextbox id=’info’ caption=’SI vous êtes connecté(e) via USB ‘]Si vous êtes connecté(e) par la prise micro USB, esptool va gérer automatiquement l’accès à la mémoire flash, vous n’aurez pas de manipulation physique à effectuer.[/stextbox]
Maintenant qu’on a effacé la mémoire flash, on va pouvoir y mettre le firmware de remplacement : MicroPython.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
pi@raspberrypi:/dev $ <span style="font-size: 12pt;"><strong>sudo esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect -fm dio 0 /home/pi/Downloads/esp8266-20191220-v1.12.bin</strong></span> esptool.py v2.8 Serial port /dev/ttyUSB0 Connecting.... Detecting chip type... ESP8266 Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: 2c:f4:32:11:4a:e2 Uploading stub... Running stub... Stub running... Changing baud rate to 460800 Changed. Configuring flash size... Auto-detected Flash size: 4MB Flash params set to 0x0240 Compressed 619828 bytes to 404070... Wrote 619828 bytes (404070 compressed) at 0x00000000 in 9.4 seconds (effective 529.7 kbit/s)... Hash of data verified. Leaving... Hard resetting via RTS pin... |
Tester MicroPython
Pour tester MicroPython on peut utiliser CuteCom. Il n’est pas installé par défaut sur votre version de Raspbian. Vous trouverez la méthode pour l’installer dans un article précédent sur l’ESP8266. Configurez CuteCom pour qu’il se connecte à votre carte ESP8266 (pour moi /dev/ttyUSB0 à 115200 b/s).
Redémarrez la carte NodeMCU avec le bouton Reset.
1 2 3 |
MicroPython v1.12 on 2019-12-20; ESP module with ESP8266␍␊ Type "help()" for more information.␍␊ >>> |
Vous devriez obtenir le résultat ci-dessus.
Votre carte est maintenant sous MicroPython.
et pour connaître la version de Python embarquée :
1 2 3 |
import sys␍␊ print(sys.version)␍␊ 3.4.0␍ |
C’est donc un Python 3.4 qui est présent dans ce firmware.
WiFi
Après l’installation et le démarrage, la carte configure automatiquement un point d’accès WiFi (AP) auquel vous pouvez vous connecter. L’ESSID est de la forme MicroPython-xxxxxx où les x sont remplacés par une partie de l’adresse MAC de votre appareil (il sera donc identique à chaque fois, et très probablement différent pour toutes les puces ESP8266). Le mot de passe pour le WiFi est micropythoN (notez le N majuscule). Son adresse IP sera 192.168.4.1 une fois que vous vous serez connecté à son réseau.
Il est possible de configurer le WiFi mais ce n’est pas l’objet de ce tutoriel 🙂
Accéder au point d’accès AP (Access Point)
Manip faite ici sur un PC Windows 10 : Dans la liste des AP WiFi, vous trouverez une ligne MicroPython (ici MicroPython 114ae2 – adresse MAC de l’AP). Connectez vous sur cet AP de la carte ESP8266. Le mot de passe est par défaut : micropythoN.
Après connexion, vous pouvez vérifier en ligne de commande que la carte ESP8266 répond :
C:\Users\admin>ping 192.168.4.1
Envoi d’une requête ‘Ping’ 192.168.4.1 avec 32 octets de données :
Réponse de 192.168.4.1 : octets=32 temps=1 ms TTL=255
Réponse de 192.168.4.1 : octets=32 temps=1 ms TTL=255
Lorsque vous êtes connecté(e) à l’AP vous pouvez utiliser l’accès Web pour discuter avec la carte ESP8266.
Utiliser WebREPL avec MicroPython
WebREPL, c’est quoi ?
REPL signifie Read Evaluate Print Loop. C’est est le nom donné à l’invite interactive MicroPython à laquelle vous pouvez accéder sur le ESP8266. L’utilisation du REPL est de loin le moyen le plus simple de tester votre code et d’exécuter des commandes.
Il y a deux façons d’accéder au REPL : soit par une connexion câblée via le port série de l’UART (comme ci-dessus), soit par WiFi.
WebREPL vous permet d’utiliser l’invite Python sur le WiFi, en vous connectant via un navigateur. Les dernières versions de Firefox et de Chrome sont prises en charge. Pour faciliter l’utilisation, le client WebREPL est hébergé sur http://micropython.org/webrepl. Vous pouvez également l’installer localement à partir du dépôt GitHub https://github.com/micropython/webrepl .
Mettre WebREPL en route
Avant de vous connecter à WebREPL, vous devez définir un mot de passe et l’activer via une connexion série normale. Les versions initiales de MicroPython pour ESP8266 étaient livrées avec WebREPL activé automatiquement au démarrage et avec la possibilité de définir un mot de passe via le WiFi lors de la première connexion. Cependant comme WebREPL est très connu, les possibilités d’intrusions sont devenues trop fortes. La configuration initiale ne peut plus se faire qu’en connexion câblée pour une meilleure sécurité. Une fois connecté(e) via l’UART ou l’USB tapez après le prompt >>> :
1 |
import webrepl_setup |
Suivez les instructions et les invites à l’écran. Pour que les modifications soient actives, vous devez redémarrer votre appareil.
1 2 3 4 5 6 7 8 9 10 11 |
WebREPL daemon auto-start status: disabled␍␊ Would you like to (E)nable or (D)isable it running on boot?␍␊ (Empty line to quit)␍␊ > <span style="font-size: 14pt;"><strong>E</strong></span>␍␊ To enable WebREPL, you must set password for it␍␊ New password (4-9 chars): <span style="font-size: 14pt;"><strong>ESP8266</strong></span>␍␊ Confirm password: <strong><span style="font-size: 14pt;">ESP8266</span></strong>␍␊ Changes will be activated after reboot␍␊ Would you like to reboot now? (y/n)<span style="font-size: 14pt;"><strong> y</strong></span>␍␊ >>> ␍␊ ets Jan 8 2013,rst ca |
J’ai autorisé la mise en route de WebREPL, entré comme mot de passe ESP8266 (original, non?) et autorisé le reboot de la carte. Après le redémarrage on obtient :
1 2 3 4 5 |
WebREPL daemon started on ws://192.168.4.1:8266␍␊ Started webrepl in normal mode␍␊ MicroPython v1.12 on 2019-12-20; ESP module with ESP8266␍␊ Type "help()" for more information.␍␊ >>> |
Utiliser WebREPL
[stextbox id=’info’ caption=’Pour info’]J’ai fait cette manip sur PC car Raspbian rechigne à se connecter à l’AP avec le MDP ESP8266 il me dit que le MDP est trop court, si j’allonge le MDP à 9 caractères, je n’ai plus ce message d’erreur mais pas non plus la connexion.[/stextbox]
Pour utiliser WebREPL, connectez votre ordinateur au point d’accès de l’ESP8266 (MicroPython-xxxxxx, voir la section précédente à ce sujet). Une fois que vous êtes sur le même réseau que l’ESP8266, ouvrez la page web http://micropython.org/webrepl/#192.168.4.1:8266/ puis cliquez sur le bouton « Connect« . Si la connexion est réussie, vous devriez voir une invite de mot de passe.
Le bouton « Connect » se transforme en « Disconnect » et vous avez une invitation à entrer le mot de passe. Tapez le MDP (pour rappel j’avais mis ESP8266).
Une fois que vous avez tapé le mot de passe configuré à l’étape de configuration ci-dessus, appuyez sur Entrée une fois de plus et vous devriez obtenir une invite ressemblant à >>>. Vous pouvez maintenant commencer à taper des commandes Python ! Pour les tests j’ai connecté une LED entre D5 (GPIO 14) et masse.
1 2 3 |
pin = machine.Pin(14, machine.Pin.OUT) pin.on() pin.off() |
La LED s’allume et s’éteint, le test est concluant. Mais là on est en ligne de commande, le programme disparaîtra quand on éteindra la carte. Il faut pouvoir enregistrer un programme dans la carte.
Ce qui nous intéresse c’est le cadre à droite qui permet d’envoyer (Send) ou récupérer (Get) un programme présent sur la carte.
Les programmes MicroPython et l’ESP8266
Si vous souhaitez qu’un programme soit exécuté automatiquement au démarrage de la carte, il va falloir créer un programme appelé main.py. Il contiendra les instructions à exécuter au démarrage.
Sur le PC j’ai créé avec Note Pad++ un fichier appelé main.py (évitez le bloc-note Windows qui introduit des caractères parasites) :
1 2 3 4 5 6 |
import machine import time led = machine.Pin(14, machine.Pin.OUT) led.on() time.sleep(1) led.off() |
Ce programme est simplement chargé d’allumer une LED connecté entre D5 (GPIO 14) et masse pendant une seconde, puis de l’éteindre.
Dans le cadre à droite de la fenêtre WebREPL cliquez sur Parcourir, sélectionner le fichier main.py que vous avez créé, puis cliquez sur Send to device pour envoyer le fichier main.py vers la carte ESP8266.
Redémarrez la carte (reset ou alimentation). Au démarrage, la LED s’allume une seconde puis s’éteint. Attention, si votre programme comporte une erreur, il va « planter » sans explication…
Conclusion
Il y a encore beaucoup à dire sur MicroPython et son utilisation avec la carte ESP8266, mais vous trouvez ici la méthode pour démarrer et commencer à découvrir comment ça fonctionne.
Pour en savoir plus, vous trouverez les livres de Dominique Meurisse chez ENI : MicroPython et Pyboard, et Python, Raspberry Pi et Flask.
Sources
- https://docs.micropython.org/en/latest/esp8266/tutorial/intro.html
- http://micropython.org/webrepl/#192.168.4.1:8266/
- https://nodemcu.readthedocs.io/en/master/flash/
- https://github.com/espressif/esptool
- https://docs.micropython.org/en/latest/esp8266/tutorial/repl.html
- http://www.srccodes.com/p/article/58/setup-web-repl-esp8266-12e-connect-micro-python-prompt-repl-wifi-access-point-ap-hello-world
Bonjour François,
Ma question : est-il possible en MicroPython d’affecter d’autres Pin que la 4 et 5 à un usage I2C. Je souhaite sans circuit mettre un BMP280 et un écran SSD1306 sur un ESP-12E.
Merci de la réponse si c’est possible.
Bravo pour notre rencontre lors du salon de Vitré ou j’ai été fort impressionné par votre gentillesse ainsi que celle de Sarah Lacaze.
Bonne continuation
Cordialement,
Jean Luc
Bonjour Jean Luc
je n’ai pas testé ça mais une recherche me renvoie sur https://docs.micropython.org/en/latest/esp8266/quickref.html#i2c-bus
pour l’ESP8266. Il faudrait voir si on peut déclarer d’autres pins dans la ligne i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000)
Après si les 2 sont sur le bus I2C vous les reliez tous les deux à SDA et SCL et ça fonctionne, c’est le principe du bus…
http://electro8051.free.fr/I2C/busi2c.htm
Pas trop le temps pour tester ça entre les impressions de visières 3D et l’écriture d’articles pour la revue Programmez!
Merci pour votre retour sur Vitré c’est gentil mais avec Sarah c’est vraiment un plaisir pour nous de rencontrer les makers sur toute la France :)prenez soin de vous et de vos proches
cordialement
François
Hello François,
Suite au message j’ai donc essayé de refaire en mettant les Pin(0) pour scl et Pin(2) pour sda en Pin.IN tous les 2 et cela fonctionne très bien. J’ai chargé la librairie ssd1306 et instancié une variable OLED (je ne savait que mettre) et miracle c’est bon.
Merci de votre aide et de m’avoir répondu. Longue vie au RPI avec des ESP8266 encore mieux.
Bon weekend.
Jean Luc
eh bien c’est super, alors
merci de m’avoir tenu informé, et ça servira sans doute à d’autres lecteurs
prenez soin de vous
cdt
françois
En plus évidemment des C++ (et C si on veut qq chose de moins glouton), et donc python, il y a pleins d’autre langage sur l’ESP : Basic entre autre, mais aussi Lua malheureusement un peu abandonné.
bonjour François
juste un truc je vais moi aussi tester le truc mais je suis sous linux ,il y a un problème??
bonjour Bruno
bin sous Raspbian c’est du Linux aussi 🙂 c’est à tester
Bonjour,
J’ai un module ESP8266 Huzzah 4 MB avec LUA. Je me suis branché et il fonctionne bien. Je veux transférer à Micropython car je veux recevoir des courriels d’un système que j’ai conçu. Est-ce la même procédure que pour cette version plus haut (Lolin)? J’ai déjà un Pi4 sous Raspian.
Je suis très nouveau dans ce domaine.
Merci
Bonjour
bin… ne connaissant pas votre module c est difficile de répondre.
le mieux c’est d essayer mais je ne peux pas vous garantir le résultat 🙂
cdt
francois
Bonjour François,
Est ce que cette configuration reste d actualité malgré les mises à jour des OS raspberry qui ne contiennent plus le driver usb-série. J aimerai retrouver le moyen d avoir une configuration me permettant de communiquer et de programmer mes esp8266. Pourriez vous m en dire plus sur la configuration utilisée à l époque pour votre article ? Version de raspbian ? Est ce que l adaptateur usb série utilisé à été utilisé pour contourner ce genre de problématique plutôt que d utiliser directement le port usb de la carte esp8266.
Merci d avances pour vos éventuelles précision sur le sujet.
Bonne journée.
Bonjour Steeven
j’avoue que c’est très loin. Pour ce genre de manip j’utilise une carte fraichement créée avec l’OS en vigueur à la date de l’article… C’est indiqué dans l’article d’ailleurs : Raspbian Stretch
mais je pense que la connexion via USB doit fonctionner
En relisant l’article, je pense que c’était aussi pour mettre en oeuvre l’adaptateur USB<=>Serial à l’époque
Je ne sais plus ou est cette carte, j’utilise des ESP32 actuellement
je viens de connecter un ESP32 Wroover sur une carte ESPCAM Freenove et pas de souci
N’hésitez pas si vous voulez des compléments d’info
cdt
francois
Merci pour votre retour, je vais poursuivre mes tests et peut être basculer sur esp32 prochainement pour essayer.
Cdt.