Plantilla para microcontroladores Espressif

junio 30, 2023 circuiteando 0 Comments

 

ESP32-C3 WROOM

Debido a la escasez de microcontroladores que seguimos teniendo y a la subida considerable del precio de los mismos, he optado por cambiar de las marcas occidentales a las del mercado asiático. En concreto a Espressif Systems.

Sus productos los venden los principales proveedores de componentes electrónicos, y en cantidades superiores al resto de marcas. Pasan las certificaciones europeas de compatibilidad electromagnética (ya que incluyen wifi y bluetooth) y sus precios son menores.

Con 2 euros aproximadamente, Atmel nos ofrece un chip de 8 bits a 20 Mhz con 48 KB de memoria Flash y 6 KB de RAM. Interfaces I2C, SPI y UART, junto con un ADC y 5 timers (temporizadores), por poner un ejemplo. Con ese mismo importe podemos conseguir el ESP32-C3 como el de la imagen superior (el módulo soldado, el resto es la placa de desarrollo). Éste nos ofrece:

  • MCU
    • Embedded, 32-bit RISC-V single-core processor, up to 160MHz
    • 384KB ROM
    • 400KB SRAM
    • 8KB SRAM in RTC
  • Wi-Fi
    • IEEE 11 b/g/n-compliant
    • 1T1R mode with data rate up to 150Mbps
    • A-MPDU and A-MSDU aggregation
    • 4µs guard interval
  • Bluetooth
    • Bluetooth LE: Bluetooth 5, Bluetooth mesh
    • Speed: 125Kbps, 500Kbps, 1Mbps, 2Mbps
    • Advertising extensions
    • Multiple advertisement sets
    • Channel selection algorithm
  • Hardware
    • Interfaces: GPIO, SPI, UART, I2C, I2S, remote control peripheral, LED PWM controller, general DMA controller, TWAI™ controller , temperature sensor, SAR ADC
    • 40MHz crystal oscillator
    • 4MB SPI Flash
    • 3.0V to 3.6V operating voltage

Nos ofrecen un microcontrolador RISC-V (carece de licencias) a 32 bits y 160 Mhz, con 400 KB de RAM y 4MB de Flash. Aparte de wifi, bluetooth y más interfaces.

Hay que tener en cuenta que hablo desde la perspectiva del "hobby". Hay libertad absoluta a la hora de la elección, y el tamaño quizás sea la mayor restricción. 

Los módulos vienen ya soldados con todos los componentes necesarios (cristales, memoria flash externa, condensadores de desacoplo, antena, etc...). Aunque se pueden comprar solamente los microcontroladores, la primera opción es muy cómoda, ya que funciona todo y solo hay que soldar el módulo a la placa de circuito impreso. Incluso podemos quitar todo el código relacionado con el wifi y bluetooth y usarlo para aplicaciones más genéricas. Lo principal es que hay stock y su precio/prestaciones son muy buenos.

Estos "chips" se llevan usando varios años en la industria y su entorno de desarrollo Esp-Idf es maduro y de código abierto. Aunque un poco tedioso de configurar al principio de cada proyecto. De ahí la idea de este post, que es compartir una plantilla que he realizado mientras comienzo mi aprendizaje y hacer que sea más fácil iniciar un proyecto nuevo.

 

Plantilla para VSCode

La plantilla está hecha para el IDE VSCode, y utiliza Docker para tener todo lo necesario en un contenedor y no tener que instalar y configurar todas las herramientas y plugins en el ordenador de desarrollo. Arreglando de paso algunos problemas que surgen al seguir los tutoriales oficiales.

En linux utilizo Docker Compose, puesto que permite conectar dispositivos serie/USB a la máquina virtual. En la versión desktop no se permite y hay que utilizar programas externos para hacer un túnel TCP/IP.  

Las características de la plantilla son las siguientes:
 
  • Utiliza una imagen oficial de Espressif (basada en Ubuntu) con idf v. 5.0.2
  • Añade la consola zsh al entorno linux.
  • Añade el editor nano para edición de ficheros.
  • Añade la aplicación telnet para conectarnos a OpenOCD.
  • Se descarga y sustituye OpenOCD v.0.11 por la v.0.12 (necesario para el C3).
  • Selecciona el lenguaje UTF-8 para prevenir un error en la imagen oficial.
  • Añade al usuario al grupo plugdev para poder acceder a los dispositivos por USB.
  • Instala los plugins: C++, Espressif IDF, MemoryView, RTOS Views, C Unity Test Explorer, Cpp Check Lint, Doxygen Documentation Generation, psioniq File Header, TODO Tree, Dash, Doxigen y Log File Highlighter.
  • Da privilegios para conectar el contenedor a un debugger JTAG por el puerto serie/USB.
  • Tiene configurados los plugins instalados.
  • Añade un perfil debug para GDB al de Esp-Ifd ya existente.
  • Añade algunas tareas, como lanzar SystemView, examinar el tamaño del binario generado, mostrar los tamaños por componentes o comparar las diferencias de tamaño entre dos binarios o "builds".
    Depurando con RTOS View

En la imagen superior se puede ver como con la configuración GDB y con el plugin instalado, podemos obtener el nombre de las tareas, su estado, tamaño de pila, etc. Así como los registros del microcontrolador en la esquina inferior izquierda.

    Tarea para visualizar el tamaño de los componentes.
    Tarea para comparar dos "builds"

Se puede ver como se compara una versión en modo debug con la actual optimizada para tamaño. Ésta última ocupa unos 20 KB menos de espacio.

    Mensajes por consola mandados por el firmware.

El programa es muy sencillo, cuenta con varios hilos que van contando y encendiendo y apagando los leds, así como se puede poner en modo de reposo profundo o ligero. Al principio de cada línea indica cual es el hilo que manda el mensaje.

    SystemView (Logs)

Si se configura el entorno para usar SystemView, se puede redirigir todos los logs de la librería por defecto de Esp-Idf a SystemView. Se aprecia en la esquina superior derecha como se insertan algunos caracteres no deseados al no ser el formato completamente compatible. Y en la parte inferior vemos como todos los mensajes aparecen como genéricos, no distingue avisos (warnings) ni errores.

    Logs personalizados.

Se crea un archivo para configurar los logs de forma que cuando detecta que se está utilizando SystemView, se crean unas macros para usar nombres más cortos en las funciones nativas de SystemView, y las nuevas macros para funciones de logs se encargan de redirigir a esas funciones nativas. Y si no detecta el uso de SystemView, se desactivan todas las llamadas a sus funciones nativas y los logs se redirigen a la libreria estándar de Esp-Idf.

    Logs usando funciones de SystemView

Se puede apreciar como los mensajes se muestran correctamente y se diferencian entre mensajes estándar, de aviso y de error. También podemos ver en contexto cual es el hilo que manda cada mensaje.

    Vista de tiempo de ejecución.

Podemos ver los tiempos de ejecución de las diferentes tareas e interrupciones de forma visual. Para más información sobre SystemView se puede ver este otro artículo sobre una placa para una carga electrónica. Cabe mencionar que SystemView ya no está limitado a un millón de eventos en su versión gratuita para uso no comercial.

 

Mediciones de consumo

Durante esta primera toma de contacto con la placa de desarrollo se ha conectado a un medidor que permite ver el consumo de energía de las diferentes partes del programa, así como estimar la capacidad de una batería para un proyecto.

    Placa conectada al raíl de 3.3V del medidor de consumo.

La placa está conectada a 3.3V para evitar alimentar la circuitería de 5V y que no influya a la hora ver el consumo del módulo solamente. Aunque el led RGB inteligente, consume aun no estando encendido.

    Microcontrolador en modo de sueño profundo (deep sleep).
    Consumo de unos 28.5 mA de media durante la ejecución.
    Consumo de 503 uA durante deep sleep.

En la hoja de especificaciones nos indica el fabricante un consumo de 5 uA. Podemos ver que está muy alejado de esa cifra. Pero he podido confirmar que el módulo solo, sin conectar a nada de la placa, si que está rondando esa cifra. Algunos componentes conectados a la línea de 3.3V, así como el led RGB, son los responsables de esta diferencia de consumo. El led es inteligente y permite configurar sus colores mediante un único pin, por lo que en su interior lleva un chip a la espera de recibir órdenes.

    Consumo durante el despertar del chip. Tarda unos 800 ms.
    Consumo de 775 uA durante el sueño ligero (light sleep).
    Detalle durante light sleep.

Vemos como es homogéneo durante el sueño ligero, según las configuraciones podremos ver picos esporádicos si realiza comprobaciones para despertar.

 

Kaluga Kit

Aparte de la placa de desarrollo con el chip C3 mostrada anteriormente, también recomiendo el kit Kaluga. Con él utilizaremos el chip S2, que tiene más capacidad de procesamiento, más interfaces y entradas/salidas.

Con él podemos practicar con un teclado táctil, sonidos, una pantalla LCD y una cámara de vídeo, entre otras cosas. Con un precio entre 2 y 3 veces menor a kits de otros fabricantes.

    Placas para la introducción a Espressif

En la imagen superior se pueden ver las placas que he adquirido para iniciarme, la ESP32-C3 WROOM, el programador oficial de Espressif con JTAG, otro programador que permite insertar los módulos WROOM directamente sin soldar y expone sus conexiones a pines externos, así como el citado kit Kaluga.

    Kit Kaluga

Como he comentado anteriormente, los precios son bastante más económicos que el resto de marcas occidentales, y ofrecen una relación calidad/precio muy buena. Y en eso tengo un poco de experiencia.

Algunas de las placas y programadores que tengo a la mano:
    Placas de desarrollo. N.1
    Más placas y programadores. N.2

He pasado por arduinos, FPGAs Spartan3 y ICE40 UP5K (del que puedes ver una plantilla para usar herramientas libres y nMigen en este artículo), programadores y chips Microchip y Atmel, placas de desarrollo de chips de bajo, medio y alto rendimiento de NXP junto con su programador (como se ve en la imagen N.1), chips de espressif más antiguos (pero en entorno Arduino o Micropython), chips de ST en arquitectura ARM, programadores de Lattice y varios analizadores lógicos entre otros (como los de la imagen N.2).

En resumen, si estás empezando con Espressif y pretendes usar un entorno de desarrollo bajo VSCode, te comparto esta plantilla que corrige varios problemas que surgen al seguir los tutoriales oficiales y ayuda a empezar de forma rápida y sin instalar ni configurar tanto software en el ordenador, ya que queda casi todo en la máquina virtual.

Tan solo necesitas el plugins o extensión Dev Containers para VSCode y Docker Compose instado. Una vez copiada esta plantilla, se cambia el target (chip) a usar y se modifica si fuese necesario el archivo settings.json. También se puede cambiar la imagen de Esp-Idf a usar y la versión de OpenOCD en el archivo Dockerfile. No olvides comprobar el nombre del dispositivo (/dev/ttyACM0 por defecto) en el archivo devcontainer.json para permitir el uso del programador o JTAG.

Puedes descargar la plantilla desde el repositorio. Encontrarás un pequeño resumen de lo que hace el programa y de como capturar datos para SystemView en el archivo Readme. Espero que te sirva de ayuda.

0 comentarios: