Cómo Subir Imágenes o Archivos al ESP32 Utilizando LittleFS

El ESP32 es un microcontrolador versátil que permite almacenar y acceder a archivos en su memoria flash, como imágenes o archivos de datos. Para lograr esto, es necesario utilizar un sistema de archivos compatible, como SPIFFS o LittleFS. A continuación, documentaré el proceso exacto que seguí para configurar correctamente mi ESP32 y evitar problemas en el futuro.

Configuración del ESP32 y la Partición

En el IDE de Arduino
Version: 2.3.4-nightly-20241114 Date: 2024-11-14T03:17:02.899Z CLI Version: 1.0.4 Copyright © 2024 Arduino SA

Las opciones disponibles en Tools > Partition Scheme son las siguientes:

  • Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)
  • Default 4MB with ffat (1.2MB APP/1.5MB FATFS)
  • 8M with spiffs (3MB APP/1.5MB SPIFFS)
  • Minimal (1.3MB APP/700KB SPIFFS)
  • No OTA (2MB APP/2MB SPIFFS)
  • No OTA (1MB APP/3MB SPIFFS)
  • No OTA (2MB APP/2MB FATFS)
  • No OTA (1MB APP/3MB FATFS)
  • Huge APP (3MB No OTA/1MB SPIFFS)
  • Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS)
  • 16M Flash (2MB APP/12.5MB FATFS)
  • RainMaker 4MB
  • RainMaker 4MB No OTA
  • Custom

Hoy, 19 de noviembre de 2024, seleccioné:

Configuración utilizada:

  • Opción de partición: Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS)

Comandos Ejecutados

1.- Crear el archivo del sistema de archivos (LittleFS):

mklittlefs -c data -p 256 -b 4096 -s 1441792 littlefs.bin
  • -c data: Carpeta donde están los archivos (e.g., image.jpg, logo.jpg).
  • -p 256: Tamaño de página.
  • -b 4096: Tamaño de bloque.
  • -s 1441792: Tamaño total del sistema de archivos.

2.- Verificar el chip y la memoria flash del ESP32:

esptool.py --chip esp32 --port /dev/cu.usbserial-0001 flash_id

Este comando me permitió confirmar que la memoria flash estaba correctamente configurada.

3.- Subir el archivo LittleFS al ESP32:

esptool.py --chip esp32 --port /dev/cu.usbserial-0001 write_flash 0x290000 littlefs.bin

Archivo de Partición Utilizado

El archivo que funcionó con estas configuraciones fue default.csv, y este es su contenido:

# Name,   Type, SubType, Offset,  Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x140000,
app1, app, ota_1, 0x150000,0x140000,
spiffs, data, spiffs, 0x290000,0x160000,
coredump, data, coredump,0x3F0000,0x10000,
  • spiffs: Espacio asignado para el sistema de archivos, comienza en la dirección 0x290000 y tiene un tamaño de 1.5MB (0x160000).
  • Esta configuración está predeterminada en la opción Default 4MB with spiffs.

Montaje de LittleFS en el Código

En lugar de usar SPIFFS, opté por LittleFS. Aquí está el fragmento de código utilizado para montar el sistema de archivos y manejar errores:

if (!LittleFS.begin()) {
    Serial.println("Falló el montaje de LittleFS. Formateando...");
    if (LittleFS.format()) {
        Serial.println("LittleFS formateado con éxito.");
    } else {
        Serial.println("Error al formatear LittleFS.");
    }
    if (!LittleFS.begin()) {
        Serial.println("LittleFS no pudo montarse después del formateo.");
    } else {
        Serial.println("LittleFS montado correctamente después del formateo.");
    }
} else {
    Serial.println("LittleFS montado correctamente.");
}

Consideraciones Importantes

  1. Evita el uso de SPIFFS: Aunque SPIFFS sigue siendo soportado, LittleFS es más eficiente y moderno, especialmente si manejas archivos de mayor tamaño o realizas muchas operaciones de escritura y lectura.
  2. Compatibilidad con el esquema de partición: Asegúrate de que el esquema de partición seleccionado sea compatible con tus necesidades de almacenamiento. En este caso, 1.5MB para LittleFS fue suficiente para mis imágenes (logo.jpg, image.jpg).
  3. Pasos para cargar archivos:
    • Siempre recrea el sistema de archivos (e.g., littlefs.bin) después de realizar cambios en los archivos de la carpeta data.
    • Usa los comandos descritos anteriormente para subir el sistema de archivos al ESP32.
  4. Monitor Serial para Depuración: Usa el Monitor Serial para confirmar que LittleFS se monta correctamente y que los archivos están disponibles:plaintextCopy code
LittleFS Mounted Successfully Files in LittleFS: File: /logo.jpg File: /image.jpp

Conclusión

Con esta configuración y los pasos detallados, logré que el ESP32 cargara correctamente imágenes desde LittleFS en mi proyecto. Este blog sirve como referencia para evitar errores comunes en el futuro y como guía para otros desarrolladores que enfrenten problemas similares.