GUIDE / ESPFLASH
Una guía práctica para habilitar actualizaciones de firmware Over-The-Air en ESP32 y enviar nuevas versiones desde tu teléfono Android con ESPFlash.
Cómo configurar actualizaciones OTA en ESP32 con ESPFlash
Cuando un proyecto basado en ESP32 deja de ser un prototipo de laboratorio y pasa a instalarse de forma permanente en un armario eléctrico, dentro de una carcasa hermética o en lo alto de un mástil meteorológico, depender de un cable USB para cada modificación de firmware se convierte en un gran obstáculo. Para solucionar esto, las actualizaciones inalámbricas por red Wi-Fi, conocidas como OTA (Over-The-Air), permiten reprogramar el microcontrolador a distancia sin necesidad de acceso físico a sus conectores.
Hasta ahora, llevar a cabo un despliegue OTA en campo exigía transportar un ordenador portátil o disponer de compleja infraestructura de servidores en la nube. Con ESPFlash para Android, la gestión de firmware en movilidad alcanza un nuevo nivel. Además del grabado tradicional mediante cable USB OTG, la aplicación incorpora una próxima función de actualización OTA nativa, diseñada para enviar binarios compilados directamente desde tu smartphone a través de la red local Wi-Fi.
En esta guía aprenderás a estructurar la tabla de particiones del ESP32, a integrar el servicio OTA en tu código y a utilizar el flujo de trabajo móvil con las herramientas de SerialFlow IO.
Arquitectura de memoria OTA en ESP32 y mecanismo de seguridad
Para que un ESP32 pueda recibir y aplicar una actualización OTA de forma segura sin riesgo de quedar inutilizado (bricked), la memoria flash debe dividirse en al menos dos particiones de aplicación independientes:
- Partición de datos OTA (
otadata): Un bloque pequeño de memoria (habitualmente de 8 KB) que registra cuál de las particiones de aplicación debe ejecutar el gestor de arranque en el próximo reinicio. - Partición
ota_0(Ranura A): Aloja la versión del firmware que se encuentra en ejecución activa. - Partición
ota_1(Ranura B): Permanece como receptáculo pasivo esperando los nuevos datos binarios de la actualización.
Cuando el dispositivo recibe una nueva versión, el sistema escribe los datos en la ranura inactiva (ota_1) y calcula una suma de verificación criptográfica (SHA-256). Solo si la imagen es íntegra y válida, el puntero de otadata se actualiza hacia ota_1 y se efectúa el reinicio. Si ocurre una interrupción de energía o se pierde la señal Wi-Fi durante la transferencia, el ESP32 simplemente reinicia en ota_0 sin consecuencias negativas.
Paso 1: Configurar la tabla de particiones para OTA
La configuración de fábrica de muchas placas de desarrollo asigna todo el espacio de memoria a una única aplicación sin soporte OTA. Para habilitar particiones duales, se recomienda contar con un módulo ESP32 de al menos 4 MB de memoria flash.
En el IDE de Arduino:
Dirígete al menú Herramientas > Partition Scheme y selecciona "Minimal SPIFFS (1.9MB OTA with spiffs)" o "Default 4MB with ffat/ota".
En ESP-IDF o PlatformIO:
Crea un archivo llamado partitions.csv en la raíz de tu proyecto con la siguiente estructura:
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x4000,
otadata, data, ota, 0xd000, 0x2000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 0x100000,
ota_0, app, ota_0, 0x110000,0x170000,
ota_1, app, ota_1, 0x280000,0x170000,
Con este esquema dispondrás de dos particiones de firmware de aproximadamente 1,4 MB cada una, dejando espacio para almacenamiento no volátil (NVS) y configuraciones de radio.
Paso 2: Integrar el servicio OTA en tu firmware
Para que el dispositivo escuche peticiones de actualización a través de la red local, añadiremos el gestor ArduinoOTA al código fuente del proyecto:
#include <WiFi.h>
#include <ArduinoOTA.h>
const char* red_wifi = "MiRedWiFi";
const char* clave_wifi = "ClaveSegura123";
void setup() {
Serial.begin(115200);
WiFi.begin(red_wifi, clave_wifi);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConexión Wi-Fi establecida.");
Serial.print("Dirección IP local: ");
Serial.println(WiFi.localIP());
// Nombre de red mDNS y contraseña de autenticación
ArduinoOTA.setHostname("nodo-esp32-sensor");
ArduinoOTA.setPassword("clave-ota-segura");
ArduinoOTA.onStart([]() {
Serial.println("Iniciando actualización OTA...");
});
ArduinoOTA.onEnd([]() {
Serial.println("\nActualización completada con éxito. Reiniciando...");
});
ArduinoOTA.onProgress([](unsigned int progreso, unsigned int total) {
Serial.printf("Progreso: %u%%\r", (progreso / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error durante la actualización [%u]\n", error);
});
ArduinoOTA.begin();
}
void loop() {
ArduinoOTA.handle(); // Debe ejecutarse con frecuencia en el bucle principal
// Tu lógica de sensores y actuación aquí...
}
Paso 3: Grabado inicial del firmware mediante ESPFlash por USB OTG
Antes de que un nodo pueda recibir datos por red, necesita que su memoria contenga la tabla de particiones inicial y el bootloader habilitado para OTA. Este proceso inicial no requiere un PC:
- Conecta tu teléfono Android al puerto USB del ESP32 mediante un cable OTG.
- Abre la aplicación ESPFlash. La herramienta detectará el circuito integrado automáticamente.
- Elige el archivo binario compilado (
.bin) almacenado en tu teléfono o en un servicio de almacenamiento en la nube (como Google Drive). - Configura la dirección de inicio (habitualmente
0x0para imágenes combinadas o0x10000para la partición de aplicación) e inicia la escritura.
Una vez finalizado el proceso, utiliza SerialFlow Terminal para abrir la consola serie y comprobar que el módulo se asocia a la red Wi-Fi y muestra su dirección IP en pantalla.
Paso 4: Despliegue inalámbrico con la próxima función OTA de ESPFlash
Una vez que el nodo ha sido colocado en su ubicación definitiva, las siguientes actualizaciones se realizan de manera 100 % inalámbrica gracias a la próxima funcionalidad OTA de ESPFlash:
- Exportar el nuevo binario: Compila la versión actualizada de tu software y guarda el archivo
.binresultante en el almacenamiento de tu teléfono Android. - Localización del nodo: Conecta tu móvil a la misma red Wi-Fi en la que opera el ESP32. ESPFlash localizará automáticamente el dispositivo mediante mDNS, o bien podrás ingresar su dirección IP manualmente.
- Envío seguro: Selecciona el archivo binario, introduce la contraseña definida en el código y presiona actualizar.
- Verificación en directo: La app mostrará una barra de avance del envío y confirmará la respuesta del microcontrolador al completar la verificación y ejecutar el reinicio en la nueva partición.
Solución de problemas comunes en actualizaciones OTA
- Error "Not Enough Space" (Espacio insuficiente):
Ocurre si el archivo compilado supera los bytes asignados a las particiones
ota_0uota_1. Para solucionarlo, deshabilita librerías prescindibles o ajusta los offsets en tu archivopartitions.csv. - Desconexión repentina a mitad del proceso: El ESP32 consume picos de corriente elevados (de hasta 500 mA) al transmitir datos por radio y escribir en la memoria flash simultáneamente. Si la fuente de alimentación es inestable, se producirá un reinicio por caída de tensión (brownout). Asegura una fuente de 3.3V o 5V con suficiente amperaje.
- Bucle de reinicios tras actualizar:
Si el nuevo firmware contiene un fallo que provoca un reinicio instantáneo, el mecanismo de reversión (rollback) de ESP-IDF reestablece la partición previa siempre que hayas configurado la validación correspondiente con
esp_ota_mark_app_valid_cancel_rollback(). - Recuperación en caso de fallo crítico: Si una tabla de particiones incorrecta impide que la placa arranque por completo, siempre podrás recurrir a una conexión física mediante USB OTG y ESPFlash para restaurar el firmware original de forma directa y segura.
Conclusión
Habilitar actualizaciones OTA en tus proyectos con ESP32 elimina las barreras físicas del mantenimiento de hardware. Con el ecosistema de herramientas para Android de SerialFlow IO —utilizando ESPFlash para la programación inicial por cable y futuras actualizaciones OTA inalámbricas, junto con SerialFlow Terminal para la monitorización serie— tienes a tu disposición una plataforma completa de grado profesional al alcance de tu mano.