Imagen de Docker para flashear Esp8266 con MicroPython
Presentación
En el presente proyecto se desarrolla la construcción y el uso de una imagen de docker para el flasheo de la Esp8266
Materiales
Placa Esp8266 Wifi
Modulo Adaptador Usb Esp-01s Programador Esp8266 Wifi
Si bien por ser mas cómodo y práctico se ha usado el adaptador el mismo puede ser remplazado por una placa FTDI y el cableado pertinente.
Tambien a los efectos practicos trabajo con dos adaptadores uno de los cuales tal como se ve en la imagen siguiente tiene conectado el GPIO0 al GND.
Construccion de la imagen docker
Para la construcción de la imagen debemos escribir el siguiente archivo Dockerfile
# Usa la imagen oficial de Python como base
FROM python:3.12-slim
# Establece el directorio de trabajo en el contenedor
WORKDIR /app
# Actualiza los paquetes base e instala esptool
RUN apt-get update && apt-get install -y \
curl \
&& pip install --no-cache-dir esptool \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Copia los archivos BIN al contenedor
COPY ESP8266_GENERIC-20241129-v1.24.1.bin /app/
COPY ESP8266_GENERIC-FLASH_1M-20241129-v1.24.1.bin /app/
# Establece un comando por defecto para usar esptool
CMD ["esptool.py"]
En el mismo directorio deberá copiarse tambien los archivos *.bin que contienen los Firmware que vamos a utilizar (aca es importante destacar que el nombre de los archivos debe coincidir exactamente con los puestos en la instrucción COPY del Dockerfile). En este caso en el Dockerfile estan los últimos de la página oficial de MicroPython-Esp8266 la versión v1.24.1 (2024-11-29). En caso de querer usarse otra version deberá decargarse y modificarse el Dokerfile, tambien pueden agregarse mas versiones agregando mas lineas COPY.
El resultado debe ser que nos quede el directorio con la siguiente estructura de archivos:
A continuación debemos abrir una terminal en la carpeta donde se encuentran los archivos y construimos la imagen ejecutando el siguiente comando (cabe aclarar que debemos tener el Docker instalado y configurado).
docker build -t img_flashesp8266 .
Sobre la linea de comando anterior caben dos observaciones: el nombre de la imagen img_flashesp8266 puede ser ese o el que ustedes deseen, pero si lo cambian recuerden de modificar las instruciones que usaremos a continuacion. Y en segundo lugar no olvidarse del punto al final de la linea que debe ir siempre y separado con un espacio despues del nombre.
Si todo ha salido bien veremos lo siguiente en la terminal:
Puesta en marcha contenedor docker
A continuacion debemos iniciar el contenedor y abrir el bash para que podamos flashear nuestras placas, lo que haremos ejecutando el siguiente comando:
docker run -it --name cont_flashesp8266 --device=/dev/ttyUSB0 img_flashesp8266 bash
Aca tambien cabe considerar que el nombre colocado después de --name es el del contenedor y pueden modificarlo a su gusto, pero el del final img_flashesp8266 debe ser necesariamente igual al que le hayan dado a la imagen en el paso anterior
Ademas es imprescindible al momento de ejecutarse este comando que este conectada al puerto /dev/ttyUSB0 la placa Esp8266 que debera estar en modo FLASH o sea con el GPIO0 puesto a LOW (para el caso que la Esp8266 se conecte a otro puerto deberá modificarse la linea de comando)
Si todo ha salido bien veremos lo siguiente en la terminal donde queda abierto el bash para ingresar los comandos de esptool.py :
Flasheo de la placa Esp8266 desde el contenedor Docker
Iniciado el contenedor y abierto el bash ya podemos ejecutar los comandos de esptool.py que veremos a continuacion para borrar, leer y escribir la placa Esp8266:
erase_flash
Este comando nos permite borrar la memoria flash de la placa y es útil hacerlo antes de escribir un nuevo Firmware a efectos de aseguranos que no quede informacion que pueda comprometer su correcto funcionamiento; su sintaxis es:
esptool.py --port /dev/ttyUSB0 erase_flash
Para este, y para todos los comandos que veremos a continuacion cabe resaltar que el puerto indicado /dev/ttyUSB0 debe ser al que esta conectado la placa y que siempre despues de la ejecucion es una buena practica desconectar la placa y volver a conectarla para que se reinicie
Si el comando se ejecuta correctamente tendremos la siguiente salida de terminal:
flash_id
Este comando nos permite conocer los datos de la placa que estamos utilizando; su sintaxis es:
esptool.py --port /dev/ttyUSB0 flash_id
Si el comando se ejecuta correctamente tendremos la siguiente salida de terminal:
write_flash
Este comando se utiliza para escribir el nuevo Firmware en la placa; su sintaxis va depender de cual sea la Memoria Flash de la misma.
Para las placas 1MB de memoria flash su sintaxis es:
esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=4MB -fm qio 0 ESP8266_GENERIC-20241129-v1.24.1.bin
Para las placas 4MB de memoria flash su sintaxis es:
esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=1MB -fm qio 0 ESP8266_GENERIC-FLASH_1M-20241129-v1.24.1.bin
Como podemos observar al comparar la sintaxis de los comandos se modifica el tamaño de la memoria flash (flash_size) y el nombre del archivo .bin que contiene el Firmware
Si el comando se ejecuta correctamente tendremos la siguiente salida de terminal:
read_flash
Este comando se utiliza para leer la memoria flash de la placa y grabar su contenido en un archivo; su sintaxis va depender de cual sea la Memoria Flash de la misma.
Para las placas 1MB de memoria flash su sintaxis es:
esptool.py --port /dev/ttyUSB0 --baud 115200 read_flash 0x00000 0x100000 lectura.bin
Para las placas 4MB de memoria flash su sintaxis es:
esptool.py --port /dev/ttyUSB0 --baud 115200 read_flash 0x00000 0x400000 lectura.bin
Como podemos observar al comparar la sintaxis de los comandos se modifica solamente la última posición que va a ser leida.
Si el comando se ejecuta correctamente tendremos la siguiente salida de terminal:
Finalmente podemos salir del bash del conteneddor ingresando el siguiente comando que nos volvera a la terminal del sistema operativo de nuestra computadora:
exit
Detención y puesta en marcha del contenedor Docker
Es una buena práctica detener el contenedor que lo haremos con el siguiente comando teniendo siempre en cuenta que debemos nombrar el contenedor por el nombre que le asignamos al crearlo, en nuestro caso la sintaxis es:
docker stop cont_flashesp8266
Cuando queramos volver a utilizarlo lo arrancaremos con el siguiente comando teniendo siempre en cuenta que debemos nombrar el contenedor por el nombre que le asignamos al crearlo y que la placa debe estar conectada al puerto /dev/ttyUSB0 o al que le hayamos asignado al poner en marcha el contenedor la primera vez, en nuestro caso la sintaxis es:
docker start -ai cont_flashesp8266