latest

ESP32 en detalle. Primeros pasos

Hardware

El hardware del ESP32 de Espressif ya fue introducido en la sesión previa del curso introductorio de MicroPython. No obstante, vamos a repasar algunas de sus características y a detallar más.

El ESP32 es un SoC con conectividad WiFi 802.11 b/g/n y Bluetooth, ésta última en sus dos variantes (Bluetooth clásico y Bluetooth Low-Energy). La versión que vamos a programar en este curso incorpora un procesador de doble núcleo (también podemos adquirir una versión más sencilla single-core). Al tratarse de un "SoC desnudo" vamos a encontrar una gran variedad de placas de desarrollo y sistemas embebidos que lo usan con diferencias substanciales entre ellos, si bien, el chip OEM del ESP32 está siempre presente, conformando el núcleo de todas ellas (ver Tabla con especificaciones de los chips OEM).  

Identificador #Núcleos FLASH interna (MiB) Tamaño encapsulado Descripción
ESP31B 2 0 6×6 mm Pre-release SoC used for beta testing; no longer available.
ESP32-D0WDQ6 2 0 6×6 mm Initial production release chip of the ESP32 series.
ESP32-D0WD 2 0 5×5 mm Smaller physical package variation similar to ESP32-D0WDQ6.
ESP32‑D2WD 2 2 5×5 mm 2 MiB (16 Mibit) embedded flash memory variation.
ESP32‑S0WD 1 0 5×5 mm Single-core processor variation.

A pesar de que el port de MicroPython para el ESP32 es muy similar al del ESP8266, no cuenta todavía con la madurez de este último. No obstante, según avanzan las versiones del firmware para el ESP32, las diferencias en este sentido se reducen. En este curso, nos hemos decantado por el ESP32 (concretamente el ESP32-WROOM-32 / ESP32-WROOM-32D) por las consecuentes mejoras de prestaciones a nivel de hardware que aporta este SoC frente al ESP8266 (e.j.: 160-240MHz frente a los 80MHz del ESP8266; 520KiB de RAM frente a los 64KiB para instrucciones + 96KiB para datos del ESP8266; 448KiB de ROM frente a los OKiB del ESP8266; y en el caso particular del ESP32-WROOM-32 y el ESP32-WROOM-32D, 4MiB de memoria FLASH externa (QSPI) que se reducen a 1MiB si se usa la característica de programación Over-the-Air (OTA)).


Pinout

Otra diferencia sustancial es el número de pines de entrada / salida que ofrece el ESP32 frente a su antecesor el ESP8266. El ESP32 cuenta con 34 GPIOs (entradas / salidas de propósito general) en lugar de las 16 del ESP8266, de las cuales sólo 13 están disponibles para conectar periféricos externos. Como veremos a continuación en el pinout de la placa de entrenamiento que vamos a utilizar en el curso (la ESP32 DevKit equipada con un ESP32-WROOM-32 / ESP32-WROOM-32D), todos los GPIOs pueden utilizarse como pines de entrada / salida digitales; 18 de ellos pueden usarse como pines de entrada analógica, empleando para ello los dos conversores ADC de 12 bits que incorpora el ESP32. Concretamente, el soporte de tantos pines analógicos suponen una gran mejora respecto del ESP8266 que sólo contaba con una única entrada analógica. Además, 10 de los 34 pines pueden configurarse como sensores capacitativos que inducen variaciones de la capacidad al tocar o aproximarse a dichos pines.

A continuación se muestra el pinout (especificación de las entradas y salidas) de la placa de desarrollo ESP32 DevKit. Esta placa tiene incorporado el convertidor USB a serial y el conector microUSB. Además, incluye un par de LEDs y dos pushbuttons, uno de ellos reservado para resetear el ESP-WROOM-32.

ESP32 (DevKit) pinout (Esquema obtenido de Random Nerd Tutorials)

Por otra parte, debajo podéis ver el pinout del ESP-WROOM-32.

ESP32 WROOM-32 pinout (Esquema obtenido de Random Nerd Tutorials)

Obteniendo el firmware para el ESP-WROOM-32

En las primeras lecciones prácticas y aplicaciones vamos a usar la placa de desarrollo ESP32 DevKit (que integra el ESP32-WROOM-32D). Como puede verse en el esquema de pinout anterior, estas placas incluyen la interfaz USB-serial y un conector microUSB para conectarlas al PC, lo que nos va a facilitar la carga del firmware de MicroPython.  Desde la página de descargas de MicroPython, podremos obtener el firmware estándar o el firmware con soporte para SPIRAM. Éste último, nos permite ampliar la RAM de los ESP32 compatibles (que cuentan con 520KiB de RAM interna) sumándole hasta 8MiB provenientes de una memoria FLASH externa (módulo SPIRAM con interfaz SPI). No es el caso de los ESP32-WROOM-32 / ESP32-WROOM-32D que no equipan ningún módulo FLASH de memoria SPIRAM (PSRAM), tan sólo 4MiB de memoria FLASH externa para almacenamiento.

Por tanto, nosotros escogeremos la opción de firmware estándar para el ESP32. En este punto, tenemos varias opciones, la versión más reciente (con las últimas características pero menos testeada); o un par de versiones, a priori más estables, pero más antiguas. En el momento de escribir estás líneas optamos por la versión esp32-20190125-v1.10.bin (la más reciente de las dos versiones estándar disponibles en la página).


Cargando el firmware de MicroPython en el ESP-WROOM-32

Para cargar el firmware vamos a utilizar la herramienta esptool.py, una aplicación open source implementada en Python, por tanto, independiente de la plataforma de ejecución y que nos permitirá flashear el firmware de MicroPython empleando la imagen (.bin) que hemos descargado anteriormente. Esta utilidad es válida tanto para flashear el ESP32, como para el ESP8266, siempre que utilicemos el archivo de imagen adecuado.

La instalación de esptool.py es muy sencilla.  Partiendo de que tenéis configurado bien Python 2.7, su versión Python 3.4 o cualquier otra versión más reciente en vuestro PC, podemos instalarlo desde el repositorio de paquetes de Python (PyPI) con la herramienta pip:

pip install esptool

Para ver un resumen de funcionalidades y parámetros que admite la herramienta podéis ejecutar desde la terminal:

esptool.py -h

Si estamos realizando el proceso de carga del firmware desde Windows, es posible que necesitéis el driver para el conversor serial a USB (CP210x), podéis descargarlo desde aquí.

Si estáis cargando MicroPython por primera vez en el ESP-WROOM-32, tendremos primero que borrar su memoria FLASH externa por completo, para ello, usaremos el comando siguiente:

esptool.py --chip esp32 --port COM3 erase_flash

El puerto virtual serial establecido puede que no sea el mismo en vuestro caso. En Windows (COM1,COM2, etc) y en sistemas Linux (/dev/ttyUSB0). En Windows, podéis visitar el Administrador de Dispositivos > Puertos(COM y LPT) y buscar la entrada que corresponde al conversor USB a UART CP210x. También podéis ejecutar el comando anterior sin especificar el puerto y forzar a esptool.py a buscarlo:

esptool.py --chip esp32 erase_flash

Con el chip de memoria FLASH completamente borrado (todos los datos reemplazados por bytes 0xFF) escribimos nuestra imagen (.bin) del firmware en dicha memoria comenzando por la dirección 0x1000 (cambiando el puerto de ser necesario):

esptool.py --chip esp32 --port COM3 --baud 460800 write_flash -z 0x1000 esp32-20190125-v1.10.bin

En caso de que se produzca un error es conveniente tratar de reducir la tasa de baudios de 460800 a 115200.

Si todo fue bien, MicroPython estará instalado en la placa ESP32 DevKit (ESP32-WROOM-32 / ESP32-WROOM-32D). La mejor manera de comprobarlo es tratando de conectar con la consola interactiva REPL (Read-Eval-Print-Loop) de nuestro ESP32 con firmware MicroPython. En Windows podemos usar el software Putty para establecer la comunicación serial con la consola REPL, indicando el puerto serial virtual (COM3 en este ejemplo) y fijando la tasa de baudios a 115200.

GUI de Putty con configuración para comunicación serial

En Linux, podemos usar, por ejemplo, el emulador de terminal picocom para tener acceso a la consola REPL de nuestro sistema embebido. El comando a ejecutar en la terminal tendría el siguiente aspecto en este caso particular:

picocom --baud=115200 /dev/ttyUSB0

A partir de este momento, manteniendo el dispositivo conectado por USB (o interfaz UART), tendremos a nuestra disposición una consola interactiva REPL como la disponible en Python 2.x / 3.x, con capacidades de autocompletar mediante el tabulador e historial.


Consola interactiva REPL, sistema de archivos en MicroPython y herramienta WebREPL

El ESP32 DevKit (ESP32-WROOM-32 / ESP32-WROOM-32D) no aparece como un dispositivo de almacenamiento USB al conectarlo al PC. Sin embargo, MicroPython incorpora un pequeño sistema de archivos que nos permite cargar scripts en su memoria. De hecho, si cargamos un script con el nombre main.py, éste se ejecutará cada vez que el dispositivo se reinicie. Más específicamente, la secuencia de ejecución de scripts al inicio es la siguiente:

1. boot.py: Se ejecuta al iniciar el dispositivo. Puede usarse para establecer determinadas opciones de configuración de nuestro programa.
2. main.py: El código que contiene el script main.py se ejecuta inmediatamente después de boot.py.

Volviendo al sistema de archivos de MicroPython, ¿Cómo accedemos a él? la respuesta es gracias a la aplicación WebWebREPL que, 1) nos permitirá manipular la consola interactiva REPL de MicroPython desde nuestro navegador de Internet y así poder programar nuestra placa conectada a la misma red local inalámbrica que el PC que corre el navegador; 2) nos permitirá cargar, descargar y borrar archivos del ESP32 desde el navegador.

Author image
Iván González is postdoctoral researcher at the Castilla-La Mancha University.
Ciudad Real (Spain)