Integración de LVGL en ESP32: Configuración y Solución de Problemas

Conceptos Fundamentales de LVGL en ESP32

La biblioteca de interfaz gráfica de usuario LVGL (Light and Versatile Graphics Library) es una elección popular para el desarrollo en microcontroladores, incluido el ESP32. Sin embargo, su implementación puede variar significativamente entre versiones, siendo LVGL v7 y v8 las más comunes. Generalmente, la versión 7 es percibida como más estable en ciertos entornos, mientras que la versión 8 introduce nuevas características y cambios en la estructura de los ejemplos.

La adaptación de LVGL al ESP32 a menudo implica la configuración del sistema de construcción, lo que puede presentar algunos desafíos. Uno de los problemas más frecuentes es la falta de archivos de demostración tras seguir las guías iniciales, lo que impide la compilación de ejemplos funcionales.

Detalles Cruciales para la Configuración

Para superar el inconveniente de los archivos de demostración no encontrados, es necesario añadir una serie de archivos de configuración específicos al proyecto. Estos incluyen un archivo CMakeLists.txt para el componente de ejemplos, un Component.mk (para compatibilidad con sistemas de construcción más antiguos o configuraciones específicas), y un lv_ex_conf.h. El archivo Kconfig es opcional, pero muy útil para la selección de demos a través del menú de configuración.

Configuración del Componente de Ejemplos (lv_examples)

Dentro del directorio que contiene los ejemplos de LVGL (lv_examples para v7 o lv_demo para v8), deberás crear o modificar los siguientes archivos:

CMakeLists.txt para el Componente de Ejemplos

Este archivo informa al sistema de compilación de ESP-IDF cómo integrar los ejemplos de LVGL como un componente independiente. Asegúrate de que apunte a la ubicación correcta de tus archivos fuente.

if(ESP_PLATFORM)
    # Define los archivos fuente recursivamente para los ejemplos de LVGL
    file(GLOB_RECURSE LVGL_DEMO_SOURCES "lv_examples/*.c")

    idf_component_register(
        SRCS "${LVGL_DEMO_SOURCES}"
        INCLUDE_DIRS "."
        REQUIRES "lvgl"
    )
endif()
Component.mk (Compatibilidad con Make)

Si tu proyecto aún utiliza o requiere compatibilidad con el sistema de compilación basado en Make, este archivo es esencial para especificar los directorios de los archivos fuente de los ejemplos.

#
# Makefile para el componente de ejemplos de LVGL
#

CFLAGS += -DLV_CONF_INCLUDE_SIMPLE

# Directorios de código fuente que contienen los ejemplos de LVGL
LVGL_DEMO_SRC_DIRS := lv_examples \
                      lv_examples/src/lv_demo_benchmark \
                      lv_examples/src/lv_demo_keypad_encoder \
                      lv_examples/src/demo_stress \
                      lv_examples/src/lv_demo_widgets \
                      lv_examples/src/lv_ex_style \
                      lv_examples/src/lv_ex_widgets \
                      lv_examples/assets

# Añadir los directorios de código fuente a las rutas de inclusión de cabeceras
COMPONENT_ADD_INCLUDEDIRS := $(LVGL_DEMO_SRC_DIRS) .
Kconfig para Selección de Demos

Este archivo permite seleccionar qué demostraciones de LVGL deseas incluir y ejecutar, directamente desde el menú de configuración de ESP-IDF (idf.py menuconfig).

menu "Configuración de Ejemplos LVGL"

    config LVGL_DEMO_ENABLE_PRINTF
        bool "Habilitar la salida de depuración (printf) en demos y ejemplos"

    choice LVGL_ACTIVE_DEMO_CHOICE
        prompt "Seleccione la demostración a ejecutar"
        default LVGL_DEMO_WIDGETS_ENABLED

        config LVGL_DEMO_WIDGETS_ENABLED
            bool "Mostrar demostración de Widgets"

        config LVGL_DEMO_WIDGETS_AUTOPLAY
            bool "Reproducir demostración de Widgets automáticamente"
            depends on LVGL_DEMO_WIDGETS_ENABLED
            default y

        config LVGL_DEMO_KEYPAD_ENCODER
            bool "Demostración de uso de teclado y codificador"

        config LVGL_DEMO_BENCHMARK
            bool "Evaluación de rendimiento del sistema"

        config LVGL_DEMO_STRESS_TEST
            bool "Prueba de estrés para LVGL"
    endchoice
endmenu
lv_ex_conf.h: Archivo de Configuración de Ejemplos

Este es el archivo de configuración principal para los ejemplos. Define macros basadas en las selecciones de Kconfig para habilitar o deshabilitar funcionalidades y demos específicas.

/**
 * @file lv_ex_conf.h
 * Archivo de configuración para los ejemplos de LVGL.
 * Copiar este archivo como lv_ex_conf.h en el directorio de ejemplos.
 */

#ifndef LVGL_EXAMPLES_CONFIG_H
#define LVGL_EXAMPLES_CONFIG_H

/*******************
 * CONFIGURACIÓN GENERAL
 *******************/

/* Habilitar la salida de depuración (printf) en demos y ejemplos */
#ifdef CONFIG_LVGL_DEMO_ENABLE_PRINTF
#define LVGL_DEMO_PRINT_OUTPUT      1
#else
#define LVGL_DEMO_PRINT_OUTPUT      0
#endif

#define LVGL_DEMO_KEYBOARD_SUPPORT   0  /* Añadir soporte de teclado PC (requiere `lv_drivers`) */
#define LVGL_DEMO_MOUSEWHEEL_SUPPORT 0  /* Añadir soporte de "encoder" (rueda de ratón) (requiere `lv_drivers`) */

/*********************
 * USO DE DEMOS
 *********************/

/* Mostrar demostración de widgets */
#ifdef CONFIG_LVGL_DEMO_WIDGETS_ENABLED
#define LV_USE_WIDGETS_DEMO         1
#else
#define LV_USE_WIDGETS_DEMO         0
#endif

#if LV_USE_WIDGETS_DEMO
#ifdef CONFIG_LVGL_DEMO_WIDGETS_AUTOPLAY
#define LV_WIDGETS_DEMO_AUTOSLIDE   1
#else
#define LV_WIDGETS_DEMO_AUTOSLIDE   0
#endif
#endif

/* Demostración de impresora (optimizado para 800x480) */
#define LV_USE_PRINTER_DEMO         0

/* Demostrar el uso de codificador y teclado */
#ifdef CONFIG_LVGL_DEMO_KEYPAD_ENCODER
#define LV_USE_KEYPAD_ENCODER_DEMO  1
#else
#define LV_USE_KEYPAD_ENCODER_DEMO  0
#endif

/* Evaluación de rendimiento del sistema */
#ifdef CONFIG_LVGL_DEMO_BENCHMARK
#define LV_USE_BENCHMARK_DEMO       1
#else
#define LV_USE_BENCHMARK_DEMO       0
#endif

/* Prueba de estrés para LVGL */
#ifdef CONFIG_LVGL_DEMO_STRESS_TEST
#define LV_USE_STRESS_TEST_DEMO     1
#else
#define LV_USE_STRESS_TEST_DEMO     0
#endif

#endif /* LVGL_EXAMPLES_CONFIG_H */
CMakeLists.txt del Componente Principal (main)

Finalmente, el CMakeLists.txt del componente principal de tu aplicación (generalmente el directorio main) debe incluir todos los componentes necesarios, incluyendo lv_examples.

# Definir los archivos fuente para el componente principal de la aplicación
set(APP_SOURCE_FILES "main.c")

idf_component_register(
    SRCS "${APP_SOURCE_FILES}"
    INCLUDE_DIRS "."
    REQUIRES
        "lvgl_esp32_drivers" # Controladores de pantalla y entrada para ESP32
        "lvgl"               # La biblioteca principal de LVGL
        "lv_examples"        # El componente de ejemplos de LVGL
)

# Añadir una definición de compilación privada para el componente principal.
# Esto es necesario si lv_conf.h se incluye de forma simple.
target_compile_definitions(${COMPONENT_LIB} PRIVATE "LV_CONF_INCLUDE_SIMPLE=1")

Nota Importante sobre Versiones y Nombres de Directorios

Es crucial entender la convención de nombres de los directorios de ejemplos de LVGL. Para las versiones 7.x.x, el directorio estándar es lv_examples. Sin embargo, a partir de la versión 8.0.0 y superiores, este directorio se ha renombrado a lv_demo. Si estás descargando la biblioteca de un repositorio y encuentras lv_demo, verifica que tu versión de LVGL sea compatible para evitar problemas de rutas de archivos.

Consideraciones durante la Integración

Solución de Problemas de Visualización (Pantalla Distorsionada/Artefactos)

Si la pantalla muestra artefactos, parpadeos o está completamente distorsionada (a menudo referido como "花屏" en chino), los siguientes puntos son clave:

  • Velocidad del Reloj del Display: Una velocidad de reloj incorrecta (demasiado alta o demasiado baja) para la interfaz de tu pantalla puede causar problemas de sincronización y visualización. Ajusta la frecuencia del reloj según las especificaciones de tu panel LCD.
  • Intercambio de Bytes RGB565: Asegúrate de que la opción "Swap the 2 bytes of RGB565 color" esté seleccionada si tu pantalla utiliza una interfaz de 8 bits (como SPI) y experimentas colores incorrectos o artefactos. Esta opción es vital para corregir el orden de los bytes de color.
  • Configuración Específica de ESP32-S2: Si estás utilizando un ESP32-S2, es común que la interfaz SPI para la pantalla deba configurarse para usar FSPI (Flash SPI), en lugar de VSPI. Verifica la documentación del controlador de pantalla para el ESP32-S2.

Etiquetas: ESP32 LVGL ESP-IDF EmbeddedGUI cmake

Publicado el 6-4 19:58