Prise en main d’un module NodeMCU (ESP8266)

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

Marquage sous le NodeMCU

Le marquage indique un baudrate de 9600 baud. Mais cela ne semble pas marcher.

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�noƒll��
                                                                                                                               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.

Ce contenu a été publié dans embarqué, informatique, programmation, avec comme mot(s)-clé(s) , , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *