Où sommes nous ?

Retour

Programmation d'un ESP-8266 par l'intermédiaire du BananaPI

Pour programmer un ESP (hormis le NodeMCU), il faut avec un ordinateur qui dispose d'un port série capable de délivrer du 3,3 volts. Ça tombe bien, le BananaPI en a plusieurs parfaitement compatibles (le plusieurs est important et nous évitera pleins d'actions préparatoires, les utilisateurs de Raspberry comprendront).

A titre d'exemple, nous utiliserons ici un ESP8266-01.

Préparons le BananaPI

Le port série

Les différents UARTs ont été décrits dans la page consacrée à la TéléInfo : nous allons utiliser ici le port UART3 (UART4 pour un BananaPro) qui sera exposé en /dev/ttyS2 et un éclateur de bus. Installation temporaire donc.

Si ça ne marche pas, vérifier que l'UART3 est bien activé dans le fichier .fex

[uart_para3]
uart_used = 1
uart_port = 3
uart_type = 2
uart_tx = port:PH00<4><1><default><default>
uart_rx = port:PH01<4><1><default><default>

Logiciel

Comme je ne souhaite pas installer Java sur mon BananaPI, réservant la compilation par l'IDE Arduino à mes PCs, il nous faut donc installer sur le PI que le programme de transfère, esptool.
Sous Gentoo, ça se fait par un simple

# emerge -va esptool

Pour communiquer avec l'ESP, il faut aussi un émulateur de terminal configuré avec les CR+LF comme contrôle de fin de ligne. Malheureusement, je n'ai pas réussi à le faire avec minicom que j'utilise habituellement, sans doute un bug. Mais, en installant esptool, les librairies python ont ajouté miniterm qui lui fonctionne très bien

$ miniterm.py --eol CRLF /dev/ttyS2 115200

Si vous tapez des commandes, quelles s'affichent en retour, mais que l'ESP ne réagit pas, vérifiez que ce sont bien des CRLF qui sont envoyés.

L'ESP8266-01

C'est le plus petit de la famille et il ne possède que 8 pins dont voici le brochage.

Sur mon éclateur

Les broches sur mon éclateur perso (sans intéret pour vous autres).

  1. 3,3v
  2. Rxd
  3. RST
  4. GP0
  5. CH_PD
  6. GP2
  7. TxD
  8. GnD

Un bien jolie schéma, mais qui n'est pas de moi :
il provient de du wiki de l'esp8266.

La connexion avec le BananaPI est triviale :

Première connection

Sur le BananaPI, on lance miniterm et on allume l'ESP :

~ $ miniterm.py --eol CRLF /dev/ttyS2 115200
--- Miniterm on /dev/ttyS2 115200,8,N,1 ---
load 0x40100000, len 1396, room 16
tail 4
chksum 0x89
load 0x3ffe8000, len 776, room 4
tail 4
chksum 0xe8
load 0x3ffe8308, len 540, room 4
tail 8
chksum 0xc0
csum 0xc0

2nd boot version : 1.4(b1)
SPI Speed : 40MHz
SPI Mode : DIO
SPI Flash Size & Map: 8Mbit(512KB+512KB)
jump to run user1 @ 1000

␐�␆␀n't use rtc mem data
r␐␃�␒�sl���
Ai-Thinker Technology Co.,Ltd.

ready

Il y a de forte chance que le module ait été livré avec le firmware par défaut, qui le fait réagir comme s'il était un modem Hayes. L'intérêt est plutôt limité ... à moins de ne vouloir uniquement qu'ajouter le WiFi à notre BananaPI.
On peut cependant vérifier que la liaison fonction en lançant un

AT+GMR
AT version:0.40.0.0(Aug 8 2015 14:45:58)
SDK version:1.3.0
Ai-Thinker Technology Co.,Ltd.
Build:1.3.0.2 Sep 11 2015 11:48:04
OK

Programmons

Le "hello world" de l'informatique est la fameuse LED qui clignote. Faisons preuve d'un peu d'originalité et téléversons un programme qui sert à quelque chose, à savoir : afficher la configuration d'un ESP. Et je ne me suis pas trop foulé, Ouilogique (dont le blog contient pas mal d'idées intéressantes) à déjà créer le "croquis" qui va bien.

Comme je l'indiquais plus haut, l'IDE Arduino n'est installée que sur mes PCs (mes BananaPIs ont d'autres choses à faire que de gaspiller leurs ressources avec du Java).

L'exercice sera donc de compiler le projet sur le dit PC, de transférer l'exécutable sur la banane pour enfin le téléverser sur l'ESP.

La compilation

Dans l'IDE Arduino, sélectionnez "Generic ESP8266 Module" (il faut évidemment l'avoir configuré correctement pour qu'elle puisse connaitre les ESP). L'astuce est ensuite de passer par le menu "Croquis / Exporter les binaires compilées"

A compilation a créé un nouveau fichier .bin

~/Arduino $ ls -l get-esp8266-info/
total 232
-rw-r--r-- 1 laurent laurent 2927 27 oct. 00:14 get-esp8266-info.ino
-rw-r--r-- 1 laurent laurent 231248 27 oct. 00:22 get-esp8266-info.ino.generic.bin

C'est lui qu'il faudra copié sur le PI.

Flashage sur l'ESP

La dernière étape est de flasher le binaire généré dans l'ESP ...

Mettre l'ESP en mode programmation

N'oublions pas d'initialiser le port sinon, ca ne marchera pas

stty 115200 cs8 -parenb -cstopb -hupcl -F /dev/ttyS2

Pour que l'ESP accepte le flashage, il faut forcer son port GPIO0 à zéro lors du boot ... Par sécurité, nous le faisons en passant par une résistance de 330Ω.

~/Projets/bidon $ esptool.py --port /dev/ttyS2 write_flash 0x00000 get-esp8266-info.ino.generic.bin 
esptool.py v2.1
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 1MB
Flash params set to 0x0020
Compressed 231248 bytes to 167653...
Wrote 231248 bytes (167653 compressed) at 0x00000000 in 15.4 seconds (effective 120.4 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting...

On déconnecte le GP0, on redémarre et ...

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v09f0c112
~ld



ESP8266 INFORMATION
===================
ESP.getFreeHeap() : 47328
ESP.getChipId() : 0x1574B6
ESP.getSdkVersion() : 1073644416
ESP.getBootVersion() : 4
ESP.getBootMode() : 1
ESP.getCpuFreqMHz() : 80
ESP.getFlashChipId() : 0x1440E0
ESP.getFlashChipRealSize() : 1048576
ESP.getFlashChipSize() : 1048576
ESP.getFlashChipSpeed() : 40000000
ESP.getFlashChipMode() : 0
ESP.getFlashChipSizeByChipId() : 0x100000
ESP.getSketchSize() : 231240
ESP.getFreeSketchSpace() : 204800
ESP.getCycleCount() : 64013444
ESP.getResetInfoPtr()
2
0
1076019840
0
0
0
0

Il y a pleins d'autres options dans esptool comme on peut le voir

$ esptool.py -h
usage: esptool [-h] [--chip {auto,esp8266,esp32}] [--port PORT] [--baud BAUD]
[--before {default_reset,no_reset}]
[--after {hard_reset,soft_reset,no_reset}] [--no-stub]
{load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,version}
...

esptool.py v2.1 - ESP8266 ROM Bootloader Utility

positional arguments:
{load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,version}
Run esptool {command} -h for additional help
load_ram Download an image to RAM and execute
dump_mem Dump arbitrary memory to disk
read_mem Read arbitrary memory location
write_mem Read-modify-write to arbitrary memory location
write_flash Write a binary blob to flash
run Run application code in flash
image_info Dump headers from an application image
make_image Create an application image from binary files
elf2image Create an application image from ELF file
read_mac Read MAC address from OTP ROM
chip_id Read Chip ID from OTP ROM
flash_id Read SPI flash manufacturer and device ID
read_flash_status Read SPI flash status register
write_flash_status Write SPI flash status register
read_flash Read SPI flash content
verify_flash Verify a binary blob against flash
erase_flash Perform Chip Erase on SPI flash
erase_region Erase a region of the flash
version Print esptool version

optional arguments:
-h, --help show this help message and exit
--chip {auto,esp8266,esp32}, -c {auto,esp8266,esp32}
Target chip type
--port PORT, -p PORT Serial port device
--baud BAUD, -b BAUD Serial port baud rate used when flashing/reading
--before {default_reset,no_reset}
What to do before connecting to the chip
--after {hard_reset,soft_reset,no_reset}, -a {hard_reset,soft_reset,no_reset}
What to do after esptool.py is finished
--no-stub Disable launching the flasher stub, only talk to ROM
bootloader. Some features will not be available.

Je vous laisse voir la doc correspondante. Cependant, les plus utiles sont write_flash (évidemment), read_mac pour avoir l'adresse MAC de l'ESP et verify_flash.

erase_flash peut être utile pour s'assurer qu'il ne reste pas de séquelles d'un ancien flashage, ce qui, d'après mes lectures sur le web, peut être utile lorsqu'un programme ne fonctionne pas pour une raison indéterminée (même si fort est à parier que le problème vient plus d'un bug du programme lui-même). Certains le font même systématiquement. De mon coté, je pense que ça va faire des écritures inutiles sur la flash.

Conclusion

Cette méthode fonctionne très bien ... mais force est de constater qu'elle fait aussi un peu "bidouille" et trifouiller directement avec les GPIOs du PI avec des fils volants risque un jour ou l'autre de conduire à une erreur qui pourrait être fatale. Donc à réserver pour un test très épisodique ou pendant l'attente d'un vrai programmateur venant de Chine.


Visitez :
La liste de nos voyages
Nos sorties Ski et rando
Copyright Laurent Faillie 2001-2024
N'oubliez pas d'entrer le mot de passe pour voir aussi les photos perso.
Contactez moi si vous souhaitez réutiliser ces photos et pour les obtenir avec une plus grande résolution.
Visites durant les 7 derniers jours Nombre de visites au total.

Vous pouvez laissez un commentaire sur cette page.