Tags

arm64 blacklistd bluetooth cu dns dovecot envsubst esp8266 filter freebsd ipfw lets_encrypt opensmtpd python shell ssl template tls unbound

Powered by

blOg
maRkdown
awK
shEll

16/04/2022

[ esp8266 python ]

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

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:

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:

Commentaires: https://github.com/bsdsx/blog_posts/issues/13


Lien vers ce billet