LVGL no ESP32 com o RTOS Apache NuttX

primeiros passos ESP32 NuttX destaque
Este post faz parte da série Primeiros Passos com o ESP32 e NuttX. Leia também os outros posts da série:

Este artigo compõe a série Primeiros Passos com o ESP32 e o Apache NuttX. Uma série cujo objetivo é apresentar um overview do Sistema Operacional de Tempo Real Apache NuttX e prover instruções para utilizar o Apache NuttX no ESP32.


Caso você esteja iniciando no universo Apache NuttX, recomendo a leitura da primeira parte da série aqui, na qual a Sara Monteiro explica como preparar o ambiente de desenvolvimento e descreve os passos necessários para compilar o Apache NuttX e fazer o upload do firmware para a memória Flash do ESP32.

O que é LVGL?

LVGL, ou Light and Versatile Graphics Library, é uma biblioteca de código aberto que auxilia o desenvolvimento de interfaces gráficas de usuário, com o diferencial de apresentar baixo consumo de memória, o que a torna bastante atraente para uso em sistemas embarcados.

A LVGL oferece suporte a diversos microcontroladores, inclusive ao ESP32. Aqui mesmo no Embarcados o Muriel Costa criou alguns tutoriais de como utilizar o LVGL no ESP32 através do framework ESP-IDF.

Porém, neste tutorial vamos abordar o uso do LVGL no ESP32 de outra maneira. O Apache NuttX oferece suporte a LVGL através de seu repositório de aplicações (/apps), facilitando a criação de um novo projeto com interface gráfica de usuário ou até mesmo rapidamente estendendo um projeto preexistente.

Integração ESP32 + ILI9341 via SPI

Este tutorial usará como plataforma-alvo o kit de desenvolvimento ESP-WROVER-KIT V4.1, o qual é composto pelo módulo ESP32-WROVER-B e por um display de LCD de 3.2 polegadas e resolução 320×240.

image 22
Figura 1: Kit de desenvolvimento ESP-WROVER-KIT – Fonte: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/hw-reference/esp32/get-started-wrover-kit.html

O controle do display é realizado pelo chip ILI9341, que por sua vez se comunica via SPI com o ESP32.

Configurando o sistema

Assumiremos aqui que o ambiente de desenvolvimento com Apache NuttX já esteja configurado conforme o passo a passo descrito no primeiro artigo da série. Além disso, assegure-se de que os repositórios incubator-nuttx e incubator-nuttx-apps estejam atualizados.

Inicialmente, vamos limpar a configuração atual e partir de uma configuração básica do ESP-WROVER-KIT V4.1 que consiste em um sistema mínimo capaz de executar o NuttShell, que é o terminal de comandos do Apache NuttX.

Um dos pontos fortes do Apache NuttX é a sua arquitetura modular e, caso isso não tenha chamado a sua atenção ainda, acredito que os próximos passos deixarão essa característica bastante evidente. Comecemos invocando o menu de configuração do Apache NuttX:

Vamos configurar o periférico SPI do ESP32 e o driver do controlador ILI9341.

Configurar o driver de SPI do ESP32

Habilite o periférico SPI2 do ESP32.

> System Type > ESP32 Peripheral Selection > SPI 2

image 23
Figura 2: Seleção do periférico SPI2 do ESP32

Mapeie os pinos do ESP32 conforme o manual de referência do ESP-WROVER-KIT V4.1. E desabilite as seguintes configurações: SPI software CS e SPI2 use DMA.

> System Type > SPI configuration

image 24
Figura 3: Mapeamento de pinos da SPI2 do ESP32

  • [22] SPI2 CS Pin
  • [19] SPI2 CLK Pin
  • [23] SPI2 MOSI Pin
  • [25] SPI2 MISO Pin

O controlador ILI9341 requer um pino dedicado para a sinalização de comando ou dado, portanto é necessário habilitar esse suporte:

> Device Drivers > SPI Driver Support > SPI CMD/DATA

image 25
Figura 4: Seleção da função CMD/DATA do SPI

Habilitar o driver do controlador de LCD ILI9341

Vamos agora selecionar o driver do controlador de LCD ILI9341:

> Device Drivers > LCD Driver Support > Graphic LCD Driver Support

image 26
Figura 5: Ativação do suporte de drivers para LCDs gráficos

> Device Drivers > LCD Driver Support > Graphic LCD Driver Support > LCD driver selection > ILI9341 LCD Single Chip Driver

image 27
Figura 6: Seleção do driver do controlador ILI9341

O driver ILI9341 do Apache NuttX oferece suporte ao interfaceamento com múltiplos displays de LCD controlados por chips ILI9341. Como neste exemplo teremos apenas 1 display à disposição, vamos configurar para o driver para utilizar o display (1) selecionando a opção:

> Device Drivers > LCD Driver Support > Graphic LCD Driver Support > LCD driver selection > (1) LCD Display

image 28
Figura 7: Configuração da interface 0 do ILI9341

Selecionar método de acesso ao LCD pela aplicação

Uma aplicação no Apache NuttX pode acessar o driver de LCD através de uma das duas opções:

  • Framebuffer graphics driver;
  • LCD character device driver.

1) Framebuffer character driver (/dev/fb0)

O uso de Framebuffer é mais adequado para displays gráficos de alta resolução acessíveis por meio de uma interface paralela RGB. Para tanto, requer que o processador tenha disponibilidade de RAM proporcional à resolução do display a ser controlado. No caso do ESP-WROVER-KIT V4.1, cujo display possui padrão de cores 16-bit e tem uma resolução de 320×240, seria necessário alocar ao menos 153.600 bytes de RAM (320 x 240 x 2, pois estamos usando 16-bit de cores: RGB565), o que corresponde a uma fatia considerável da RAM interna do ESP32. Portanto, neste tutorial, usaremos o LCD character driver, porém a seguir estão também as configurações necessárias caso o leitor deseje usar a primeira opção e o restante da RAM seja suficiente para as necessidades da aplicação.

> Device Drivers > LCD Driver Support > Graphic LCD Driver Support > LCD framebuffer front end

> Device Drivers > Video Device Support

> Device Drivers > Video Device Support > Framebuffer character driver

2) LCD character driver (/dev/lcd0)

O LCD character driver é o método indicado para displays como o da ESP-WROVER-KIT V4.1, pois possuem um controlador dedicado de LCD cuja interface com o microcontrolador se dá através de um barramento serial (SPI), ao invés de uma interface paralela. A seguir vamos configurar o LCD character device driver:

> Device Drivers > LCD Driver Support > Graphic LCD Driver Support > LCD character device

LVGL
Figura 8: Ativação do character driver de LCDs

Configurar o LVGL

Finalizada a configuração de drivers e do subsistema gráfico do Apache NuttX, agora seguimos com a camada de aplicação. Vamos habilitar a biblioteca LVGL, que é quem fornecerá todo suporte ao desenho gráfico e renderização:

> Application Configuration > Graphics Support > Light and Versatile Graphic Library (LVGL)

LVGL
Figura 9: Seleção da biblioteca LVGL

Adicione o valor de DPI (pontos por polegada) do display nas configurações gráficas do LVGL. No caso do display de 3.2 polegadas e resolução 320×240, o valor de DPI é 125.

> Application Configuration > Graphics Support > Light and Versatile Graphic Library (LVGL) > Graphics settings > (125) DPI (px/inch)

LVGL
Figura 10: Configuração de DPI para a LVGL

Selecione a seguinte opção para que a LVGL inverta os bytes de cores. Isso é importante pois estamos enviando 16-bit de cores através de uma interface serial e o controlador ILI9341 espera que o processador envie o byte mais significativo (MSB) primeiro. Caso não selecionarmos essa opção, como resultado o display exibirá as cores diferente do esperado.

> Application Configuration > Graphics Support > Light and Versatile Graphic Library (LVGL) > Color settings > Swap the 2 bytes of RGB565 color

LVGL
Figura 11: Configuração para inversão de bytes de cores

Habilitar exemplo de demonstração do LVGL

Por fim, vamos selecionar a aplicação de demonstração do LVGL que, por padrão, inclui a aplicação Widgets do LVGL.

> Application Configuration > Examples > LVGL Demo

LVGL
Figura 12: Seleção da aplicação de demonstração do LVGL

Como não configuramos aqui nenhuma interface de entrada, vamos habilitar o modo slideshow da aplicação, que consiste numa demonstração não-interativa:

> Application Configuration > Examples > LVGL Demo > Enable Slideshow mode for Widgets example

LVGL
Figura 13: Ativação do modo Slideshow do exemplo do LVGL

Como gerar o firmware do Apache NuttX com o LVGL

Pronto, finalmente concluímos a etapa de configuração do Apache NuttX com o LVGL para a placa ESP-WROVER-KIT V4.1. Agora vamos compilar o binário:

E finalmente gravá-lo na memória Flash do ESP32 através da interface /dev/ttyUSB1 (no Linux):

Perceba que atribuímos a interface /dev/ttyUSB1 para ESPTOOL_SERIAL. A ESP-WROVER-KIT apresenta duas interfaces seriais, sendo a primeira (/dev/ttyUSB0) utilizada para depuração via JTAG e a segunda para gravação do binário na memória Flash do ESP32.

O parâmetro ESPTOOL_BINDIR deve receber o caminho para os binários do Bootloader e da Partition Table. Você pode encontrar as instruções para efetuar o processo de gravação no primeiro artigo da série aqui.

Execução da aplicação

Uma vez gravado o binário, basta acessarmos o NuttShell através da porta serial, utilizando seu emulador de terminal predileto. Aqui vamos de picocom:

Podemos conferir que o character driver do display LCD (/dev/lcd0) foi corretamente inicializado pelo Apache NuttX:

Agora, como recompensa a esse longo processo, vamos executar a aplicação de demonstração do LVGL:

LVGL
Figura 13: ESP-WROVER-KIT executando o exemplo Widgets do LVGL

No próximo artigo da série abordaremos como melhor aproveitar as capacidades do ESP32 para aumentar a fluidez das animações com a biblioteca LVGL no Apache NuttX, podendo alcançar uma taxa de até 30 quadros por segundo.

Segue um teaser das cenas do próximo capítulo:

Outros artigos da série

<< Blink LED no ESP32 com o RTOS NuttX
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Comentários:
Notificações
Notificar
guest
2 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Maycon
Maycon
23/04/2021 09:03

Interessante, ESP cada vez mais uma mão na roda, suporta até interface gráfica. Muito Legal.

Talvez você goste:

Séries



Outros da Série

Menu