ÍNDICE DE CONTEÚDO
- Primeiros Passos com o ESP32 e o NuttX
- Blink LED no ESP32 com o RTOS NuttX
- LVGL no ESP32 com o RTOS Apache NuttX
- Interpretador LUA com NuttX
- Executando NuttX em um ESP32 emulado com QEMU
- NuttX: Criando (ou Copiando!) uma Aplicação para o NuttX
- NuttX: Usando o Simulador para Testes e Debugging de Aplicações
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.
Embarcados Experience 2024: Evento Presencial
Participe do Embarcados Experience 2024 em São Paulo. Conhecimento técnico, palestras, workshops e oportunidade de networking com profissionais experientes.
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.
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.
1 2 3 4 |
cd ~/nuttxspace/nuttx git pull origin master cd ~/nuttxspace/apps git pull origin master |
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.
1 2 |
make distclean ./tools/configure.sh esp32-wrover-kit:nsh |
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:
1 |
make menuconfig |
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
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
- [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
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
> Device Drivers > LCD Driver Support > Graphic LCD Driver Support > LCD driver selection > ILI9341 LCD Single Chip Driver
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
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
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)
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)
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
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
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
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:
1 |
make |
E finalmente gravá-lo na memória Flash do ESP32 através da interface /dev/ttyUSB1 (no Linux):
1 |
make download ESPTOOL_SERIAL=/dev/ttyUSB1 ESPTOOL_BINDIR=<PATH> |
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:
1 |
picocom /dev/ttyUSB1 -b 115200 |
Podemos conferir que o character driver do display LCD (/dev/lcd0) foi corretamente inicializado pelo Apache NuttX:
1 2 3 4 5 6 |
nsh> ls /dev /dev: console lcd0 null ttyS0 |
Agora, como recompensa a esse longo processo, vamos executar a aplicação de demonstração do LVGL:
1 |
nsh> lvgldemo |
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:
Interessante, ESP cada vez mais uma mão na roda, suporta até interface gráfica. Muito Legal.
Com certeza! Apesar de Wi-Fi e Bluetooth LE serem as funcionalidades mais atraentes, os demais periféricos fazem do ESP32 um chip extremamente versátil.