Como actualizar el firmware del ESP8266
En esta entrada vamos a ver como se puede actualizar el firmware del módulo ESP8266 ESP-01, aunque sirve el procedimiento sirve para cualquier otro que tenga el pin GPIO0 accesible (el ESP05 hay que hackearlo para actualizarlo, por ejemplo). Para ello necesitamos el software para hacer el upload del firmware y el firmware que queramos instalarle al módulo. Para Linux tenemos la herramienta esptool, que podemos descargar desde el siguiente repositorio git:
mkdir /opt/ESP8266 cd /opt/ESP8266 git clone https://github.com/themadinventor/esptool
Tenemos también varios firmwares que le podemos instalar al módulo en función de lo que queremos hacer: el de nodeMCU, el de comandos AT, programas propios que podemos desarrollar con el SDK, etc.
El último firmware disponible de nodeMCU se puede descargar desde aquí, y en el momento de escribir estas lineas son este (con soporte punto flotante) y este (sin soporte punto flotante).
El firmware AT es algo más complicado de encontrar en un solo archivo bin. En el SDK del módulo se pueden encontrar varios archivos bin que hay que grabar en varias zonas de la flash, en lugar de un solo archivo como ocurre con el firmware nodeMCU. No es complicado hacerlo (cuando ya te has peleado bastante con él, pero para eso estoy yo aquí 🙂 ). El último SDK disponible lo podéis bajar desde la web de Espressif, aquí (en el epígrafe Announcements/Latest Release). Dentro del enlace podéis ver que se puede descargar un paquete con los binarios del firmware AT solo, o todo el SDK:

Conexiones del módulo para actualizar el firmware
El esquema del conexiones del módulo ESP-01 es el siguiente:

- VCC: fuente de alimentación externa de 3.3v
- GND: 0V de la fuente de alimentación externa, unida con GND del modulo USB serie.
- CH_PD: Conectado a VCC para activar el módulo.
- RST: Sin conectar (al aire)
- GPIO0: Sin conectar o al aire para arranque en modo normal, a GND para grabar firmware.
- GPIO2: Sin conectar (al aire)
- UTXD: al pin RX del módulo USB-Serie
- URXD: al pin TX del módulo USB-Serie, a través de un divisor de tensión para que al módulo ESP no le entren mas de 3.3v por este pin. El divisor de tensión que uso es el siguiente:
Divisor de tensión
Para entrar en modo upload de firmware, tenemos que desconectar el módulo de la alimentación, conectar el pin GPIO0 a GND, y volver a conectar la corriente. En ese momento ejecutamos el comando esptool.py y se actualiza el firmware. Después desconectamos el modulo de la alimentación, desconectamos el pin GPIO0 (lo dejamos al aire) y volvemos a conectar la alimentación para que arranque el firmware recién grabado.
Grabando el firmware nodeMCU
Para grabar el firmware en la flash del módulo, usamos el siguiente comando:
esptool.py --port /dev/ttyUSB0 write_flash 0x00000 nodemcu_float_0.9.6-dev_20150704.bin
Donde:
- –port /dev/ttyUSB0 indica el dispositivo USB en el que tenemos conectado el conversor USB-serie y el modulo ESP8266-01
- write_flash es el comando para indicar que vamos a grabar un firmware en la memoria del dispositivo
- 0x00000 nodemcu_float_0.9.6-dev_20150704.bin es la dirección base en la que vamos a grabar el fichero bin indicado. Puede haber una lista de parejas <direccion_base> <fichero_bin>, como ocurre para el firmware AT.
Grabando el firmware AT
En el caso del firmware AT, al descomprimir el fichero zip nos encontramos con la siguiente estructura de archivos:
En el archivo readme.txt, nos indica las direcciones base, y los archivos bin que tenemos que grabar para instalar el firmware dependiendo del tamaño de la memoria flash que tenga el módulo, en mi caso, para el módulo ESP01 con flash de 4Mbit nos indica lo siguiente:
Por lo que nos quedaría el siguiente comando:
[22:17] jose@titanio:~/$ esptool.py --port /dev/ttyUSB0 write_flash 0x00000 noboot/eagle.flash.bin 0x40000 noboot/eagle.irom0text.bin 0x3e000 blank.bin 0x7e000 blank.bin 0x7c000 esp_init_data_default.bin Connecting... Erasing flash... Writing at 0x00006c00... (100 %) Erasing flash... Writing at 0x0007b000... (100 %) Erasing flash... Writing at 0x0003ec00... (100 %) Erasing flash... Writing at 0x0007ec00... (100 %) Erasing flash... Writing at 0x0007c000... (100 %) Leaving...
Para probar este firmware podemos usar picocom, conectando a 115200 baudios:
[22:18] jose@titanio:~/$ picocom --omap crcrlf --emap crcrlf /dev/ttyUSB0 -b 115200 picocom v1.7 port is : /dev/ttyUSB0 flowcontrol : none baudrate is : 115200 parity is : none databits are : 8 escape is : C-a local echo is : no noinit is : no noreset is : no nolock is : no send_cmd is : sz -vv receive_cmd is : rz -vv imap is : omap is : crcrlf, emap is : crcrlf, Terminal ready AT+RST OK ets Jan 8 2013,rst cause:2, boot mode:(3,0) load 0x40100000, len 23200, room 16 tail 0 chksum 0x72 load 0x3ffe8000, len 948, room 8 tail 12 chksum 0x50 ho 0 tail 12 room 4 load 0x3ffe83b8, len 3888, room 12 tail 4 chksum 0x1d csum 0x1d don't use rtc mem data r�9 ready AT OK AT+GMR AT version:0.50.0.0(Sep 18 2015 20:55:38) SDK version:1.4.0 compile time:Sep 18 2015 21:32:07 OK
Y con esto ¡ya tenemos nuestro módulo actualizado con el último firmware disponible!
Me he cargado tres ESP8266 01. Los dos primeros al intentar actualizar el firmware Después de cargar el archivo bin e intentar probar los comandos AT, lo único que salía en el monitor serial eran símbolos. La carga del archivo parece hacerla bien ya que parpadea el led azul y con cualquier programa que lo haga, al final dice que la carga ha sido correcta. He probado a cargar todas las versiones que he encontrado para este modulo y probado a todas las velocidades posibles pero no sale otra cosa en el monitor que monigotes, y como mucho este mensaje:
ets Jan 8 2013,rst cause:2, boot mode:(3,0)
load 0x40100000, len 1396, room 16
tail 4
chksum 0xef
load 0x00000000, len 0, room 4
tail 0
chksum 0xef
ho 12 tail 0 room 4
load 0x00000000, len 0, room 12
tail 0
chksum 0xef
csum 0xef
csum err
ets_main.c
El tercero al cargar el sketch arduino para hacer parpadear un led. Después de cargarlo, el led no parpadea, se queda siempre encendido. La carga del sketch se hace correctamente. Después e intentado cargar de nuevo el firmware para volver a los comandos AT y sucede lo mismo que con los otros dos.
Tengo otro que guardare en un cajón hasta que tenga algo claro. Esto es un poco desesperante. Y dan ganas de tirar la toalla
Supongo que habras tenido en cuenta (no lo especificas en tu mensaje) que los pines GPIOo y GPIO2, deberian estar los dos al aire cuando arrancas el modulo en modo normal, NO en modo actualización de firmware (o al menos no teniendo el GPIO0 a GND)… Es lo unico que se me ocurre que pueda ir mal. Yo apago el modulo despues de programarlo, desconecto esos dos pines, y le conecto la alimentacion para que arranque en modo normal.