2022/02/17

Primer contacto con ESP32

Paso a relatar los pasos que he seguido para instanciar los hello world en distintos ESP32 en el marco de colaborar en los criterios de elección de hardware para la carrera de especialización de IoT, siendo mi foco de interés sus características de seguridad, pero antes hay hacerlos andar.

Para comenzar, me ha costado comprender la taxonomía de los ESP32, en algún momento medio que lo había logrado pero por falta de refrescarlo lo perdí. En esta oportunidad no sé si he tenido mejor suerte o ha mejorado la información de espressif. Como sea, a partir de una comparativa pude hacerme el siguiente resumen.

Si ves en github podés ver con blame que existe desde hace 15 meses, yo había tenido mi primer contacto con ESP8266 hace 20 meses e intenté entender poco despues así que quizás me la perdí.

Desde ahí te bajás la datasheet de cada familia o serie y te queda algo como esto:
 

  • ESP32
    • ESP32-D0WD-V3
    • ESP32-D0WDQ6-V3
    • ESP32-D0WD
    • ESP32-D0WDQ6
    • ESP32-D2WD
    • ESP32-S0WD
    • ESP32-U4WDH
    • ESP-WROOM-32
  • ESP32-S2
    • ESP32-S2
      • WROVER-1
      • MINI-1
    • ESP32-S2FH2
    • ESP32-S2FH4
  • ESP32-S3
    • ESP32-S3
    • ESP32-S3FN8
    • ESP32-S3R2
    • ESP32-S3R8
    • ESP32-S3R8V
  • ESP32-C3
    • ESP32-C3
      • ESP32-C3-WROOM-02
    • ESP32-C3FN4
    • ESP32-C3FH4

En negrita marqué los que tengo, en el primer caso lo dejé colgando, eso es lo que me confunde un poco. Lo que me importa es dada una plaquita, poder identificar que tiene, a ver si me sirve en particular para el dictado de la materia Ciberseguridad de IoT para mostrar secure boot. Ese safer than ESP32 significa que ESP32 es vulnerable a algunos ataques, no importa, es un tanto irrelevante al mostrar como funciona.

 

Compartiva familias ESP32
Compartiva familias ESP32

Bien, ¿qué hay que hacer? Pues bajar la SDK, evitando sufrir todo lo sufrido con ESP8266.

Curioseás un rato por Libraries and Frameworks, Resources, ponés freertos en el buscador, nada. Recordás que existe https://github.com/espressif/ESP8266_RTOS_SDK y suponés que existe algo tipo ESP32_RTOS_SDK, pero no, no existe. Buscás en los repos y aparece uno que dice:


ESP31B SDK based on FreeRTOS.
For ESP32 please see http://github.com/espressif/esp-idf

 

Ok, pese a que acá relaciona FreeRTOS con el SDK luego... no importa, no fue tan difícil.

Lo primero que te dice es que si querés soporte para todas las familias, elijas la versión apropiada. Luego dice que hay documentación para cada release combinando para cada serie, vamos por la V4.4. que cubre todo, la que me falta, ESP32-S3, ya vendrá.

 

Pasos


Abrimos en tres ventanas esp32, esp32s2 y esp32c3 y los operamos en simultáneo a ver las diferencias.

Voy a usar un VirtualBox con Linux Mint 20.3 xfce, 8GB RAM, 2 cores, guest additions para poder copiar y pegar.

 

Step 1: Install prerequisites, linux only

Sin misterios, es lo mismo para cualquier serie.

sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0


Step 2: Get ESP-IDF

Sin misterios, son 1.2 GB, el v4.4 corresponde al release que habíamos elegido antes.

git clone -b v4.4 --recursive https://github.com/espressif/esp-idf.git


Step 3: Set up the tools, linux only

./install.sh esp32,esp32s2,esp32c3

Dice que

Selected targets are: esp32c3, esp32s2, esp32
Installing tools: xtensa-esp32-elf, xtensa-esp32s2-elf, riscv32-esp-elf, esp32ulp-elf, esp32s2ulp-elf, openocd-esp32

 

Ese riscv32-esp-elf debe ser para el esp32c3.

 

Step 4: Set up the environment variables


. ./export.sh

Te dice con buen criterio que no lo incluyas en el .bashrc para que no se active en cada terminal, es razonable pues no vas a tener 20 terminales en la que estés compilando.

 

Step 5: Start a project

Te dice que te ubiques afuera de ~/esp/esp-idf, copies el hello world, nada misterioso.


Step 7: Configure


idf.py set-target [esp32|esp32s2|eps32c3]
idf.py menuconfig

Con set-target le decís a cada proyecto en que familia será desplegado.

En este punto te recomiendo un:

sudo apt install kdiff3 dirdiff

Luego  te hacés algo como esto mediante copias sucesivas:

hello_world
hello_world_esp32
hello_world_esp32c3
hello_world_esp32s2

Entrás en cada  *_esp32* y ejecutás el set-target correspondiente.

Te genera una carpeta build y el archivo sdkconfig. En éste, podés ver las opciones de configuración para menuconfig y con kdiff3 podrás apreciar las diferencias, muy divertido e ilustrativo:

kdiff3 hello_world_esp32s2/sdkconfig \
    hello_world_esp32c3/sdkconfig

 

Comparación sdkconfig
Comparación sdkconfig

 

Para comparar los archivos de build la tentación es usar esto:

dirdiff hello_world_esp32s2/build/ \
   hello_world_esp32c3/build/

Usalo, pero tené en cuenta que en la carpeta esp-idf hay varias carpetas con nombres correspondientes a la familia, lo cual mete ruido. Igual no me fijé si amerita mirar mucho por este lado.

Cuando llegues al menuconfig, esta bueno tomar nota del baud rate:

Serial Flasher Config ->
'idf.py monitor' baud rate (115200 bps)

Pese a que dice: "set up project specific variables, e.g. Wi-Fi network name and password, the processor speed,..." y habiendo aprendido que con "/" te muestra todas las variables, no lo puedo encontrar. Luego, tras explorar un ratito y quizás recordar de la experiencia anterior, hay variables que son locales a cada proyecto, eso lo ves en main/Kconfig.projbuild. Lo de la clave de Wi-Fi está en el ejemplo ./esp-idf/examples/wifi/getting_started/station.

 

Step 6: Connect device


Esta bueno decirle a virtualbox que siempre conecte la placa a la virtual, asi no tenés que estar recordando hacerlo cada vez que reconectás o se resetea:


Conexión USB con filtro
Conexión USB con filtro

No domino esta funcionalidad, me parece que hay que hacerlo con cada dispositivo, no alcanza cada tipo, tampoco es tan importante.

 

Step 8: Build the project


idf.py build

Paciencia...


Mientras podés saltarte unos pasos y ejecutar 

idf.py -p /dev/ttyUSB0 monitor

para ver que trae la placa ya flasheado.

 

Step 9: Flash onto the device


idf.py -p /dev/ttyUSB0 flash


Step 10: Monitor 

 

Ya te lo había dicho:

idf.py -p /dev/ttyUSB0 monitor

Te agrego que se sale con control ]

 

Resultados

 

El ESP-WROOM-32 dijo que:

Failed to connect to ESP32: Wrong boot mode detected (0x13)!

Se corrije apretando el botón que dice "100" o parecido mientras 

Serial port /dev/ttyUSB0
Connecting.........

Los otros, de una.

 

Remapeo

 

Mirando la traza al fashear cada plaquita, puedo identificar mejor qué es qué, verde significa que le había acertado, amarillo que estaba cerca:

 

  • ESP32
    • ESP32-D0WD-V3
    • ESP32-D0WDQ6-V3
    • ESP32-D0WD
    • ESP32-D0WDQ6
      • ESP-WROOM-32
    • ESP32-D2WD
    • ESP32-S0WD
    • ESP32-U4WDH
  • ESP32-S2
    • ESP32-S2
      • WROVER-1
    • ESP32-S2FH2
    • ESP32-S2FH4
      • MINI-1
  • ESP32-S3
    • ESP32-S3
    • ESP32-S3FN8
    • ESP32-S3R2
    • ESP32-S3R8
    • ESP32-S3R8V
  • ESP32-C3
    • ESP32-C3
        • ESP32-C3-WROOM-02 
    • ESP32-C3FN4
    • ESP32-C3FH4

 

No te prometo que en breve publique la parte de seguridad, mientras, le pego un sensor de temperatura y lo mando por Internet.

No hay comentarios:

Publicar un comentario