Développer en Python sur micro-contrôleur ESP8266


Dans le milieu des micro-contrôleurs, de type Arduino ou autre, les langages historiques comme le c ou le c++ ont encore un avenir certain. Ils permettent vraiment d'accéder aux fonctionnalités de plus bas niveau du CPU comme l’accès direct aux registres, mais aussi d'utiliser des API orientées objet de haut niveau d'abstraction.

Pourtant, mis à part dans quelques domaines spécifiques nécessitant une optimisation des ressources mémoire, de la vitesse de calcul ou de la consommation, la majorité des applications sur micro-contrôleur débouche sur des programmes dont l'algorithmique est relativement simple: boucle comprenant la lecture de capteurs, de transmission de données, commande d'actionneurs, mise en sommeil, .etc.

Dans ce second cas, le langage Python peut représenter une alternative intéressante grâce à sa syntaxe plus "douce" et surtout ses capacités de typage automatique. En revanche, la nécessité d'avoir le code de l'interpréteur Python embarqué sur le micro-contrôleur ne permet pas une mise en œuvre sur les petites unités telles que le cartes Arduino Uno ou apparentées. Cette solution est donc réservée pour les applications utilisant des cartes plus puissantes telles que PyBoard, SMT32, Espruino pico ou à processeur Espressif du type Esp8266 ou Esp32.

Pour cet article, j'ai utilisé une carte Geekcreit® basée sur un ESP8266 ESP-12F, que l'on peut se procurer sur internet sur des sites chinois pour environ 5€, mais tout ce qui suit est facilement transposable à un autre micro-contrôleur supportant MicroPython.

Comme toujours, j'utilise un PC sous Linux, xubuntu 18.04 - 64 bits.

Installation du firmware MicroPython

MicroPython est un compilateur Python complet et un environnement d’exécution, runtime, qui s'exécute directement sur le micro-contrôleur, bare-metal. Il offre une console interactive, le REPL, pour exécuter des commandes directement en ligne, ainsi que la possibilité d'importer et d'exécuter des scripts à partir du système de fichiers intégré. Le REPL possède un historique, une complétion de code (tabulation), un retrait automatique et un mode de collage.

MicroPython s'efforce d'être aussi compatible que possible avec le langage Python "normal" (connu sous le nom de CPython) de sorte que si vous connaissez Python, vous connaissez déjà MicroPython.

En plus d'implémenter une sélection de bibliothèques Python de base, MicroPython comprend des modules tels que machine pour accéder au matériel de bas niveau (Ports d'entrée/sortie, convertisseur A/N, I2C, SPI, .etc.)

Il est téléchargeable pour une multitude de micro-contrôleurs sur le site de MicroPython, sur la rubrique de téléchargement

Pour moi, il se composait d'un fichier unique: esp8266-20191220-v1.12.bin

Installation de l'outil esptool

Esptool est un utilitaire open source basé sur Python, donc indépendant de la plateforme utilisée (Windows, Linux, .etc.) permettant de communiquer avec la ROM des contrôleurs Espressif ESP8266 et ESP32, via une liaison série asynchrone (souvent, sur l'usb de la carte). Plus de détails sur les fonctions avancées de esptools

Il s'installe sur la machine hôte (PC) par la commande:

pip3 install esptool

Il faut ensuite modifier la variable d'environnement contenant le chemin de recherche des commandes avec la commande suivante:

PATH="$HOME/.local/bin:$PATH"

Flashage du firmware de la carte ESP

Le flashage du firmaware MicroPython sur la carte ESP se fait avec les deux commandes suivantes:

esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect -fm dio 0 esp8266-20191220-v1.12.bin

A ce stade, vous pouvez déjà commencer à programmer en Python au moyen d'un terminal série connecté à la carte ESP. Moi j'utilise le programme gtkterm (sudo apt install gtkterm), qu'il faut paramétrer à 115200 bauds

Ça y est, vous pouvez dés à présent commencer à écrire des instructions Python de base:

>>> x=2
>>> y=x+1
>>> y
3
>>> print(x,' ',y)
2 3
>>> 

En plus des capacités de base de Python, MicroPython propose une série de modules permettant des accès spécifiques au micro-contrôleur tels que:

  • le système de fichier interne
  • les fonctionnalités de base du réseau telles que le point d'accès WIFI local, la connexion à un point d’accès, etc.
  • la couche réseau TCP, sockets
  • l'accès aux ports GPIO en mode logique
  • la gestion des sorties PWM, Pulse Width Modulation
  • la conversion Analogique/digitale
  • la gestion de l'énergie (mise en sommeil, reveil, .etc.)
  • le contrôle des périphériques 1-wire
  • le contrôle des systèmes NeoPixels
  • le contrôle des LEDs APA102
  • le contrôle des capteurs de température et d'humidité (DHT - Digital Humidity & Temperature)

La documentation complète de l'API propre à l'ESP8266 est consultable ici

En important ces modules, vous pouvez même accéder au matériel directement depuis la console Python comme par exemple à la LED de la carte:

MicroPython v1.12 on 2019-12-20; ESP module with ESP8266
Type "help()" for more information.
>>> from machine import Pin
>>> led = Pin(2, Pin.OUT)
>>> led.on()
>>> led.off()

Installation de l’environnement de développement intégré (IDE) Python, Thonny

Thonny est un IDE python minimaliste, développé par l'Université de Tartu en Estonie, avec l'aide de la Raspberry Pi Foundation et de Cybernetica AS. Il embarque Python 3.7, mais vous pouvez choisir d'utiliser une autre version de Python. Il comporte un éditeur, mettant en évidence les erreurs de syntaxe, sensibilise à la portée des variables et un debugger.

Installation de Thonny:

sudo apt install python3-tk

Puis télécharger le script d'installation dans un dossier de votre choix:

wget https://thonny.org/installer-for-linux

chmod +x installer-for-linux

./installer-for-linux

Normalement, l'exécutable thonny est installé par défaut dans ~/apps/thonny/bin. Vous pouvez créer un raccourcis pour y accéder plus simplement à partir du Bureau par exemple.

Interface de Thonny

L'interface est constitué d'une partie éditeur de texte et d'une partie console. Elle permet d'accéder indépendamment au système de fichier de la machine locale (ouvrir ou enregistrer) ou à celui embarqué sur la carte à micro-contrôleur.

Interface

Au démarrage du micro-contrôleur, le firmware exécute en premier un script boot.py puis passe le contrôle à un second script main.py, s'il existe.

En général, boot.py contient toute la partie de l'initialisation et la mise en oeuvre du réseau, et main.py contient le corps du programme de l'application.

boot.py

Votre première application, l'habituelle blink qui fait clignoter une LED

Vous pouvez maintenant créer un fichier main.py sur l'appareil MicroPython, l'ESP8266, contenant les lignes suivantes:

import machine
from machine import Pin
import time

led = Pin(2, Pin.OUT)
led.on()

for i in range(10):
    led.on()
    time.sleep(0.5)
    led.off()
    time.sleep(0.5)

Pour comprendre ce petit programme, consulter la documentation en ligne.

Une application réseau - Point d'accès + serveur WEB

Un premier mode de fonctionnement de l'ESP8266 consiste à le déclarer comme un point d'accès WIFI. On pourra alors s'y connecter à partir de n'importe quelle station WIFI (PC , téléphone, tablette, .etc.)

Point d'accès WIFI

Dans Thonny, vous pouvez insérer le code suivant, directement dans le fichier boot.py ou dans un nouveau fichier main.py, puis l'exécuter.

# Vous trouverez tous les détails et les explications sur ce programme à https://RandomNerdTutorials.com

try:
  import usocket as socket
except:
  import socket

import network
import esp

import gc
gc.collect()

# le SSID de votre point d'accès, PA
ssid = 'MicroPython-AP'
password = '123456789'

# création du PA
ap = network.WLAN(network.AP_IF)
ap.active(True)
ap.config(essid=ssid, password=password)

# attente de l'activation du PA
while ap.active() == False:
  pass

print('Connection successful')
print(ap.ifconfig())

# une page WEB toute simple, que vous pouvez personnaliser
def web_page():
  html = """<html><head><meta name="viewport" content="width=device-width, initial-scale=1"></head>
  <body><h1>Hello, World!</h1></body></html>"""
  return html

# création du serveur WEB
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

# boucle de traitement du serveur WEB, envoie la page WEB au client
while True:
  conn, addr = s.accept()
  print('Got a connection from %s' % str(addr))
  request = conn.recv(1024)
  print('Content = %s' % str(request))
  response = web_page()
  conn.send(response)
  conn.close()

Au démarrage, le script affiche l'adresse IP de votre ESP8266 :

Connection successful
('192.168.4.1', '255.255.255.0', '192.168.4.1', '208.67.222.222')

Il ne vous reste plus qu'à vous connecter avec une station WIFI, votre téléphone par exemple, au point d'accès 'MicroPython-AP' avec le mot de passe '123456789', puis avec votre navigateur d'aller directement à l'adresse ci-dessus, '192.168.4.1', en l'entrant dans la barre d'URL.

navigateur

Voilà, à partir de ce petit tutoriel vous allez pouvoir découvrir les joies de la programmation embarquée en MicroPython.

Vous trouverez sur internet une multitude de ressources et d'exemples qui vous permettront d'élaborer rapidement toutes vos applications en y intégrant un très grand nombre de capteurs tels que l'accéléromètre MPU6050 , la boussole HMC5883, le capteur de gestes PAJ7620, etc.