16/04/2022
202204160800 esp8266 python
esp8266 et MicroPython
Il y a déjà plusieurs mois, au détour d'une commande de composants électronique, j'avais ajouté dans mon panier un choupi bouzin àpacher qui non seulement faisait wifi mais intégrait en plus un écran oled. Vite oublié pendant ma découverte de l'Arduino, revoila t'y pas que je tombe dessus en faisant un peu de tri dans mon bazar.
Le bouzin
C'est un heltec wifi kit 8. Il existe une autre version plus péchue du bouzin, le wifi kit 32 pour qui il faudra faire en gros
s/8266/32/gc
Installer de quoi causer avec le bouzin:
$ doas pkg install py38-esptool
Tester qu'on peut causer avec le bouzin:
$ esptool.py --port /dev/cuaU0 --chip ESP8266 read_mac esptool.py v3.3 Serial port /dev/cuaU0 Connecting......... Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: dc:4f:22:19:18:88 Uploading stub... Running stub... Stub running... MAC: dc:4f:22:19:18:88 Hard resetting via RTS pin
$ esptool.py --port /dev/cuaU0 --chip ESP8266 flash_id esptool.py v3.3 Serial port /dev/cuaU0 Connecting......... Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: dc:4f:22:19:18:88 Uploading stub... Running stub... Stub running... Manufacturer: ef Device: 4016 Detected flash size: 4MB Hard resetting via RTS pin...
On a bien un bouzin avec 4 Mo de RAM (Detected flash size: 4MB), on va pouvoir jouer avec MicroPython
- https://www.micropython.fr/
- http://docs.micropython.org/en/latest/esp8266/quickref.html
- https://randomnerdtutorials.com/projects-esp32-esp8266-micropython/
MicroPython
L'installation de MicroPython est largement décrite dans les liens précédents, mais histoire d'avoir une version FreeBSD:
On nettoie le bouzin:
Tout en pressant le bouton 'PRG' (on peut le relacher quand apparait 'Erasing flash (this may take a while)...')
$ esptool.py --port /dev/cuaU0 --chip ESP8266 erase_flash esptool.py v3.3 Serial port /dev/cuaU0 Connecting...... Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: dc:4f:22:19:18:88 Uploading stub... Running stub... Stub running... Erasing flash (this may take a while)... Chip erase completed successfully in 7.4s Hard resetting via RTS pin...
Et on installe micropython fraîchement téléchargé depuis https://micropython.org/download/esp8266/ :
Tout en pressant le bouton 'PRG' (on peut le relacher quand apparait le pourcentage de progression)
$ esptool.py --port /dev/cuaU0 --chip ESP8266 write_flash --flash_mode dio --flash_size detect 0x0 /tmp/esp8266-20220117-v1.18.bin esptool.py v3.3 Serial port /dev/cuaU0 Connecting...... Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: dc:4f:22:19:18:88 Uploading stub... Running stub... Stub running... Configuring flash size... Auto-detected Flash size: 4MB Flash will be erased from 0x00000000 to 0x0009bfff... Flash params set to 0x0240 Compressed 635992 bytes to 418428... Wrote 635992 bytes (418428 compressed) at 0x00000000 in 37.2 seconds (effective 136.9 kbit/s)... Hash of data verified. Leaving... Hard resetting via RTS pin...
Et maintenant magie du bouzin:
Taper Enter pour afficher l'invite de l'interpréteur python (>>>), tilde + point pour quitter cu
$ cu -l /dev/cuaU0 -s 115200 can't open log file /var/log/aculog. Connected >>> import esp >>> esp.check_fw() size: 635976 md5: 40b5ad861d83667d6c8ea59fd38c7ff9 True
Il ne me serait jamais venu à l'esprit d'utiliser un language de si haut niveau avec un microcontrôleur (le C c'est bon, mangez-en) mais je dois avouer que la simplicité du truc m'a laissé sur le cul.
L'interpréteur python c'est bien pratique pour tester en direct mais pour survivre à un reset il faut télécharger le code sur le bouzin:
$ doas pkg install py38-adafruit-ampy $ ampy --port /dev/cuaU0 ls /boot.py
Reste à lire https://pythonforundergradengineers.com/upload-py-files-to-esp8266-running-micropython.html, envoyer son premier main.py et reset le bouzin.
Le traditionnel clignotement de led se verra remplacé ici par l'affichage d'un "Hello world" (il n'y a pas de led pilotable sur la carte). J'ai suivi les liens suivants:
- https://robotzero.one/heltec-wifi-kit-8/
- https://micropython.fr/modules_center/seriel_i2c/oled_128x64_0_96_ssd_1306/
- https://resource.heltec.cn/download/WiFi_Kit_8/WIFI_Kit_8_Pinout_Diagram.pdf
- https://resource.heltec.cn/download/WiFi_Kit_8/WIFI_Kit_8_Schematic_diagram.PDF
Je commence par scanner le bus i2c:
>>> from machine import Pin, I2C >>> i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) >>> devices = i2c.scan() >>> print('i2c devices found:', len(devices)) i2c devices found: 1 >>> for device in devices: ... print("Decimal address: ", device, " | Hexa address: ", hex(device)) ... [ appui sur backspace puis enter ] Decimal address: 60 | Hexa address: 0x3c
Je récupère le module kivabien:
$ cd /tmp && fetch https://raw.githubusercontent.com/micropython/micropython/master/drivers/display/ssd1306.py && ampy --port /dev/cuaU0 put ssd1306.py && ampy --port /dev/cuaU0 ls /boot.py /ssd1306.py
Et c'est parti:
>>> from machine import Pin, I2C >>> import ssd1306 >>> i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) >>> oled = ssd1306.SSD1306_I2C(128, 32, i2c, 0x3c) >>> oled.fill(0) >>> oled.text("Hello World", 0, 0) >>> oled.show()
Je ne dirais pas que le python est ma tasse de thé ou mon bol de chocolat ou mon mug de café mais il faut bien reconnaitre que:
- l'installation de micropython est neuneuproof
- la documentation est abondante
- la liste des modules disponibles est plus que conséquente (https://micropython.fr/modules_center/)
- l'accès à un interpréteur est redoutable d'efficacité lors des tests
Commentaires: https://github.com/bsdsx/blog_posts/issues/13