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
  


Cerrar