Dans l’objectif final de faire le relevé de mon compteur d’eau, j’ai investi dans un module NodeMCU. Ce module permet de faire du microcontrôleur connecté sur son réseau wifi. Ce qui est parfait pour faire de l’IoT, surtout quand on voit le prix de l’engin (inférieur à 10€).
Découverte du kit
L’interface USB du module est juste un convertisseur USB-UART, qui est vu comme un ttyUSB0 sur ma debian:
$ sudo dmesg [50235.509550] usb 1-1: new full-speed USB device number 5 using xhci_hcd [50235.680785] usb 1-1: New USB device found, idVendor=10c4, idProduct=ea60 [50235.680788] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [50235.680790] usb 1-1: Product: CP2102 USB to UART Bridge Controller [50235.680792] usb 1-1: Manufacturer: Silicon Labs [50235.680793] usb 1-1: SerialNumber: 0001 [50235.688967] cp210x 1-1:1.0: cp210x converter detected [50235.690454] usb 1-1: cp210x converter now attached to ttyUSB0
Si l’on tente de se connecter avec le baudrate indiqué sur le module (9600 bauds) on n’obtient (presque) que des caractères spéciaux.
Message obtenu après s’être connecté au module et appuyé sur le bouton reset:
r$$��|�l�|� $�p�|�p�s�c�p �p�o�loo��� cp�l`{$p�N��d"N��N�"��nn�l� l`�22oo l`Nr����{r$p�N�r���� b n�|쎟� ��oo� d �no l`or�{$p�N�r������� c o�|�� c��NN�$ �nn l`o{�{�$ r��n �l`{d��o���NN����brnnn�l�cl �2������� lllsd ���d$N�� �l���ld ��$��N�n�lbc���ld��B ��d$p"�"r��nc{cr���d cd $����n�|��ol��|�$ l`sl����N��r��N|�$$l��r�d�d�d ��r�d�d� l`�N�l � ll`sl{l��cc ��"�"B{�B��o��2oo�l�� l ��l� ll����$�N���BB l l c ��cc l�"rlr$ ready
Le dernier mot s’affiche en texte clair.
Le point d’accès wifi est lui visible avec le nom FaryLink_3818DF.
Le premier objectif de la prise en main du kit est de faire en sorte que le module se connect à ma box wifi. Il faut donc trouver un moyen de lui communiquer le SSID ainsi que le mot de passe.
Programmation avec l’ide arduino
Il n’est pas facile de trouver des tutoriels autre que vidéos pour prendre en main ce kit. Apparemment la méthode utilisée pour développer sur nodeMCU passe par l’IDE de Arduino : stretch. Il faut donc commencer par l’installer, puis le configurer avec les paramètres du node.
L’installation de l’ide arduino est hyper simple sous debian :
sudo apt install arduino
Et voila… Par contre il faut ensuite le configurer pour NodeMCU !
Déjà on ajoute le port série à l’ide en modifiant son fichier de préférence ~/.arduino/preference.txt:
serial.port=/dev/ttyUSB0
Pour l’instant je n’ai pas réussi à le configurer pour NodeMCU. On va donc directement passer au flashage d’un firmware plus récent.
Flashage d’un firmware récent.
Les guides pour flasher un firmware récent sont déjà plus facile à trouver.
J’ai pris la version la plus récente du firmware sur le github:
wget https://github.com/nodemcu/nodemcu-firmware/releases/download/0.9.6-dev_20150704/nodemcu_integer_0.9.6-dev_20150704.bin
Elle date un peu mais visiblement si on veut un truc plus récent il faut le compiler, et donc installer la toolchain, ce qui ne semble pas si évident.
L’outils de flashage est en python :
git clone https://github.com/themadinventor/esptool.git
Celui dispo dans debian n’a pas l’air de fonctionner pareil.
Une fois le kit branché il suffit de lancer la commande suivante :
$ sudo python esptool.py --port /dev/ttyUSB0 write_flash 0x00000 /opt/nodemcu/nodemcu_integer_0.9.6-dev_20150704.bin esptool.py v2.2-dev Connecting.... Detecting chip type... ESP8266 Chip is ESP8266EX Uploading stub... Running stub... Stub running... Configuring flash size... Auto-detected Flash size: 4MB Flash params set to 0x0040 Compressed 450072 bytes to 290528... Wrote 450072 bytes (290528 compressed) at 0x00000000 in 25.7 seconds (effective 139.9 kbit/s)... Hash of data verified. Leaving... Hard resetting...
Visiblement tous semble s’être bien passé, pourtant quand on appuie sur reset on obtient le message suivant sur la console :
rld��|�$�| � l�b|��r�c�p��oo�lno��� cp�sdrlp�n� �l c N�|�$���on�$� $ �Nl`nr�n �� p�N� r����� bo��n� �c��on� l`�o l nr�n{{$ p�N� r�������# n�| #��no� $ �oo $ N{�� �$`s��n �l �ՁMEM CHECK FAIL!!! �r$
Visiblement ça marche pas, pourtant le point d’accès wifi est toujours visible. Du coup on va tout de même installer la toolchain.
Installation de la toolchain.
C’est pas si compliqué en fait, il suffit de télécharger le github :
git clone https://github.com/pfalcon/esp-open-sdk.git cd esp-open-sdk
Puis de lancer make. Dans mon cas il me manquait le paquet help2man pour que ça se configure correctement :
sudo apt install help2man
Il faut ensuite patienter environ 30 minute pour compiler le tout en faisant make:
make
Et attendre qu’il nous dise que c’est bon :
[...] net_chksum.o lwip/core/ipv4/ip_addr.o lwip/core/ipv4/ip.o lwip/core/ipv4/ip_frag.o lwip/netif/etharp.o lwip/app/dhcpserver.o espconn_dummy.o cp liblwip_open.a /opt/nodemcu/esp-open-sdk/xtensa-lx106-elf/xtensa-lx106-elf/sysroot/usr/lib/ make[1]: Leaving directory '/opt/nodemcu/esp-open-sdk/esp-open-lwip' cp -a esp-open-lwip/include/arch esp-open-lwip/include/lwip esp-open-lwip/include/netif \ esp-open-lwip/include/lwipopts.h \ /opt/nodemcu/esp-open-sdk/xtensa-lx106-elf/xtensa-lx106-elf/sysroot/usr/include/ Xtensa toolchain is built, to use it: export PATH=/opt/nodemcu/esp-open-sdk/xtensa-lx106-elf/bin:$PATH Espressif ESP8266 SDK is installed, its libraries and headers are merged with the toolchain
Compilation du firmware
On récupère la dernière release du firmware sur le github correspondant:
wget https://github.com/nodemcu/nodemcu-firmware/archive/2.1.0-master_20170824.tar.gz tar -zxvf 2.1.0-master_20170824.tar.gz cd 2.1.0-master_20170824
On exporte la toochain précédemment compilée puis on lance make :
export PATH=/opt/nodemcu/esp-open-sdk/xtensa-lx106-elf/bin:$PATH make
Et on attend 5 minutes d’avoir une compilation sans message d’erreur.
Flashage du firmware 2.1
On peut désormais flasher le nouveau firmware aux adresses indiquées:
sudo python esptool.py --port /dev/ttyUSB0 write_flash 0x00000 ../nodemcu/nodemcu-firmware-2.1.0-master_20170824/bin/0x00000.bin sudo python esptool.py --port /dev/ttyUSB0 write_flash 0x10000 ../nodemcu/nodemcu-firmware-2.1.0-master_20170824/bin/0x10000.bin
Une fois flashé on obtient bien une réaction du nodemcu après reset :
rd$ܞ�c�n �$� B|��p��|"� c��oo�loN���bp�l rlp�o� � l cn�|��� #��oN�l�`�N $or�o B$�lp�n� r����� b o�|�$ "�|�n� l �N l or�o {�$`p�N� {����� n�|l쌏b��Nn� l �2Nn d Nr�N �l� {ےN �l� ���N천p��o|�l d$l`b�2��2r�l�N� �o� l ��{�p���� $ �n�l�d�l`��s�p�� ld rd�o����B��cp| cp��l#��o��no�$l��l �l� d� �ll �o���#"ll�2B ����B$ �#rl{ Formatting file system. Please wait... NodeMCU 2.1.0 build unspecified powered by Lua 5.1.4 on SDK 2.1.0(116b762) lua: cannot open init.lua > > > > ls >> ls stdin:2: '=' expected near 'ls' > echo "pouet" stdin:1: attempt to call global 'echo' (a nil value) stack traceback: stdin:1: in main chunk > reset >> reset stdin:2: '=' expected near 'reset' > > print("Coucou") Coucou >
On a bien la main sur la console, je ne comprend toujours pas à quoi correspondent les caractères spéciaux du début par contre.
Connexion au point d’accès wifi
Une fois qu’on a la main sur la console lua la configuration du point d’accès à sa box wifi est relativement simple:
> print(wifi.sta.getip()) nil > wifi.sta.config {ssid="MON_POINT_DACCES", pwd="fbisecurity"} > print(wifi.sta.getip()) 192.168.0.11 255.255.255.0 192.168.0.1
On peut également enregistrer un script lua d’initialisation :
> file.open("init.lua","w+") > file.writeline([[print("Bienvenue chez Martoni")]]) > file.close() > node.restart() > ets Jan 8 2013,rst cause:2, boot mode:(3,6) load 0x40100000, len 26820, room 16 tail 4 chksum 0x2e load 0x3ffe8000, len 2180, room 4 tail 0 chksum 0xc6 load 0x3ffe8884, len 136, room 8 tail 0 chksum 0x4a csum 0x4a ���n��{��o|� dl$l #�����s�l�N��n�l ��r�d�l� $`��{�$�$� l`��r�l� $l rd�o��bc�|$�cbp��$b��n�noll�� l�$��� �lr$�o����cBld� B ���cBl�crl{ NodeMCU 2.1.0 build unspecified powered by Lua 5.1.4 on SDK 2.1.0(116b762) Bienvenue chez Martoni >
Conclusion provisoire:
C’est mal vendu ! Parce que la prise en main n’a rien d’évident, et il faut se battre un peu pour enfin pouvoir prendre la main sur le kit. Je ne sais pas si le firmware par défaut est buggé ou si j’ai utilisé la bonne procédure mais ce fut une connexion compliqué.
Par contre le wifi à l’air de très bien tourner.