Í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
Este artigo compõe a série “Primeiros Passos com o ESP32 e o NuttX”. Uma série cujo objetivo é apresentar um overview do Sistema Operacional NuttX e prover instruções para utilizar o NuttX no ESP32.
A primeira parte da série instrui a preparação do ambiente, a compilação e o building do Sistema Operacional (NuttX) até o upload do firmware para o SoC (ESP32).
A segunda parte da série demonstra como executar o famoso “Hello World” do mundo de Sistemas Embarcados, isto é, uma aplicação que pisca um LED.
Nesta série foi utilizada a placa de desenvolvimento DevKit v1 e a distribuição Ubuntu do Linux. Caso você não tenha uma placa de desenvolvimento, mas quer executar o NuttX no seu próprio computador para testar as funcionalidades básicas do sistemas, experimente usar o simulador, cuja instalação pode ser encontrada em: http://nuttx.apache.org/docs/latest/guides/simulator.html
O que é o NuttX?
O NuttX é um Sistema Operacional de Tempo Real projetado especialmente para ser usado em Sistemas Embarcados com microcontroladores ou processadores de 8 a 64 bits e possui um small-footprint, isto é, ocupa pouco recurso de memória. O NuttX também é um Sistema Operacional customizável, isso significa que o desenvolvedor pode incluir na imagem que será gerada apenas o que for realmente útil para o projeto. Um dos principais compromissos do NuttX é estar em conformidade com os padrões POSIX e ANSI. Ambos padrões que definem uma interface genérica para Sistemas Operacionais, o que colabora na portabilidade, reutilização de código e suporte a aplicações que utilizam esta interface.
Com estas características o NuttX tem se tornado atraente para ser usado em microcontroladores e SoCs. E a Espressif, fabricante do ESP32, está atualmente investindo no suporte ao ESP32 para o NuttX.
A documentação oficial do NuttX pode ser encontrada no site da Apache Foundation onde o projeto é incubado: http://nuttx.apache.org/docs/latest/index.html. E deixo como sugestão de leitura esses 2 artigos do Embarcados:
- https://www.embarcados.com.br/o-que-e-o-rtos-nuttx/
- https://www.embarcados.com.br/webinars/conheca-o-rtos-nuttx/
Processo de Build e Flash do NuttX
Antes de iniciar a compilação e o build do NuttX, atualize seus repositórios e instale as dependências:
1 2 3 |
sudo apt update sudo apt upgrade sudo apt-get install automake bison build-essential flex gperf git libncurses5-dev libtool libusb-dev libusb-1.0.0-dev pkg-config |
- Crie um diretório para agrupar todos os repositórios do NuttX e o acesse:
1 |
mkdir ~/nuttxspace && cd ~/nuttxspace |
- Clone os repositórios apps, que inclui os exemplos e outras aplicações e o NuttX que contém os códigos fontes do SO:
1 2 |
git clone https://github.com/apache/incubator-nuttx.git nuttx git clone https://github.com/apache/incubator-nuttx-apps.git apps |
Nota: O NuttX utiliza um sistema de build semelhante ao do Kernel do Linux (https://www.kernel.org/doc/html/latest/kbuild/index.html). Ele utiliza o kconfig-frontends como seu sistema de configuração. O repositório tools é utilizado para instalar este pacote. Mas caso você esteja usando o Ubuntu 19.10 ou mais recente, estas distribuições já contém o pacote “kconfig-frontends” e portanto você não precisa clonar o repositório tools, bastando apenas instalar o pacote:
1 |
sudo apt-get install kconfig-frontends |
Caso contrário, clone o repositório e instale o kconfig-frontends manualmente através do repositório tools:
1 2 3 4 5 6 |
git clone https://bitbucket.org/nuttx/tools.git cd ~/nuttxspace/tools/kconfig-frontends ./configure --enable-mconf make sudo make install sudo ldconfig |
3. Faça o download e extraia o “compilador cruzado” já compilado para o ESP32 para o ambiente Linux. O compilador cruzado será usado para converter o código fonte em código executável, próprio para ser executado no seu ESP32.
1 |
curl https://dl.espressif.com/dl/xtensa-esp32-elf-gcc8_2_0-esp-2020r2-linux-amd64.tar.gz | tar -xz |
Como o diretório /opt/ é um espaço comumente usado para armazenar softwares de terceiros, crie um diretório em /opt/ para armazenar o compilador cruzado para a arquitetura xtensa:
1 |
sudo mkdir /opt/xtensa |
Mova o compilador cruzado para este novo diretório:
1 |
sudo mv xtensa-esp32-elf/ /opt/xtensa/ |
Agora, o compilador para o ESP32 está neste path. Para invocar os binários da toolchain como comandos, adicione o caminho absoluto do diretório dos binários para PATH. PATH é uma variável de ambiente do Linux que informa ao shell onde ele deve procurar por executáveis ou programas que são invocados a partir de comandos. Para adicionar o caminho do diretório a esta variável e ter efeito imediato no terminal, execute o seguinte comando:
1 |
export PATH=$PATH:/opt/xtensa/xtensa-esp32-elf/bin |
4. Instale o módulo Python esptool para realizar o download de todos os binários para o ESP32 através da serial.
1 |
pip3 install esptool |
Você pode ter a seguinte mensagem de aviso ao fim da instalação:
“WARNING: The scripts pyserial-miniterm and pyserial-ports are installed in ‘/home/<user>/.local/bin’ which is not on PATH.”
Esta mensagem nos alerta que o esptool, bem como outros programas usados pelo esptool, foram instalados em um caminho que não está especificado em PATH. Portanto, estes programas não são visíveis no shell atual. Para resolver esta questão, adicione o caminho onde estes programas estão ao PATH e os carregue usando o seguinte comando (Atenção, substitua <user> pelo seu nome de usuário):
1 |
export PATH=$PATH:/home/<user>/.local/bin |
NOTA: Uma vez que você sair da sua sessão do terminal, a variável PATH perderá estes caminhos porque foram adicionados temporariamente. Portanto, será necessário executar os comandos “export” novamente em uma nova sessão. Como isso pode ser um pouco exaustivo, caso queira adicionar estes caminhos permanentemente, abra seu arquivo bash e adicione estes caminhos a variável PATH através dos seguintes comandos:
1 |
sudo nano ~/.bashrc |
Cole o seguinte trecho no fim do arquivo (Substitua <user> pelo seu nome de usuário):
1 2 3 |
# Add esptool.py and its dependencies directory PATH=$PATH:/home/<user>/.local/bin# Add the cross compiler path for ESP32 PATH=$PATH:/opt/xtensa/xtensa-esp32-elf/bin |
5. Além do Sistema Operacional com a aplicação, o ESP32 também requer um bootloader e uma tabela de partição. Ambos podem ser customizados e compilados para atender as expectativas de clientes e requisitos de projeto. Entretanto, para facilitar o processo, a Espressif preparou um repositório (https://github.com/espressif/esp-nuttx-bootloader) com estes binários pré-compilados a partir da versão mais atual do branch master do ESP_IDF. Portanto, crie um diretório ao lado do diretório /nuttx, ou em outro lugar de sua preferência, e faça o download destes binários através dos seguintes comandos:
1 2 3 4 5 |
mkdir ../esp-bins cd ../esp-bins curl -L "https://github.com/espressif/esp-nuttx-bootloader/releases/download/latest/bootloader-esp32.bin" -o ../esp-bins/bootloader-esp32.bin curl -L "https://github.com/espressif/esp-nuttx-bootloader/releases/download/latest/partition-table-esp32.bin" -o ../esp-bins/partition-table-esp32.bin cd ../nuttx |
6.Mantenha-se no diretório do NuttX e execute o script de configuração para criar um arquivo de configuração para o ESP32.
1 2 |
cd ~/nuttxspace/nuttx ./tools/configure.sh esp32-devkitc:nsh |
7. Como no próximo passo você usará a serial para baixar os binários, execute o seguinte comando para adicionar seu usários ao dialout group, que possui permissão para acessar o driver serial.
1 |
sudo adduser <user name> dialout |
Esta adição irá persistir apenas após um log out e log in no sistema. Portanto, como uma solução alternativa e temporária, mova o usuário atual para o grupo dialout:
1 |
newgrp dialout |
8. Finalmente, faça o build e o download dos binários para o ESP32 através do seguinte comando:
1 |
make download ESPTOOL_PORT=/dev/ttyUSB0 ESPTOOL_BAUD=115200 ESPTOOL_BINDIR=../esp-bins |
OBS: Ajuste a porta USB conforme a sua configuração. Os dois últimos argumentos são opcionais. Caso não sejam especificados, o comando fará o download apenas da aplicação e usará um baud rate default de 921600. Uma vez baixados os binários do bootloader e da tabela de partição, não é necessário baixá-los novamente.
Caso o comando acima seja interrompido indicando que o módulo Pyserial não foi instalado, o instale executando o seguinte comando:
1 |
pip3 install pyserial |
Faça o upload novamente.
Acesso ao shell NuttX
Para acessar o shell do NuttX, é necessário apenas um terminal serial. Caso não tenha um terminal serial, deixo como sugestão o picocom. Para instalar o picocom execute os seguintes comandos:
1 |
sudo apt-get install -y picocom |
E finalmente acesse o nsh (NuttX Shell):
1 |
sudo picocom /dev/ttyUSB0 -b 115200 |
Próximos passos com ESP32 e o NuttX
Se você chegou até aqui e acessou o NuttX shell, e tudo está devidamente instalado e configurado, siga em diante para o próximo artigo da série e execute o exemplo do Blink Led!
Dicas com NuttX
Esta seção é um bônus com o objetivo de sumarizar os principais comandos que são mais utilizados e mostrar alguns problemas simples e típicos que podem acontecer na sua trajetória e como contorná-los.
Tabela 1 – Comandos úteis no processo de building e sua descrição
make distclean | Remove a configuração da placa anterior e deixa disponível para o usuário selecionar outra placa, ou outra configuração da mesma placa. |
./tools/configure.sh nomeplaca:nomeconfig | Seleciona a placa (neste exemplo foi a esp32-devkitc) e a configuração a ser usada (neste exemplo foi a nsh, que inclui o shell do nuttx). Existem outras configurações que incluem suporte a determinados periféricos e exemplos. |
make menuconfig | Abre a tela de configuração para o usuário customizar o que deseja adicionar/retirar na placa. Por exemplo, permite adicionar os drivers de um determinado periférico, adicionar mensagens de debug, etc. |
make clean | Remove os arquivos binários gerados a partir do build anterior. |
make apps_distclean | Limpa apenas os binários das aplicações, os binários do kernel e dos drivers são mantidos |
make download ESPTOOL_PORT=<port> [ ESPTOOL_BAUD=<baud> ] [ ESPTOOL_BINDIR=<dir> ] | Faz o processo de build da aplicação e flash para o dispositivo. Os dois últimos argumentos são opcionais. Caso não sejam especificados, o comando fará o download apenas da aplicação e usará um baud rate default de 921600. Uma vez baixados os binários do bootloader e da tabela de partição, não é necessário baixá-los novamente. |
Resolvendo alguns problemas comuns
Se após executar o comando make menuconfig obtiver a mensagem na imagem a seguir, isso significa que seu terminal está muito pequeno. Expanda a tela e execute novamente.
Referências
Documentação NuttX: http://nuttx.apache.org/docs/latest/index.html
ESP32: https://docs.espressif.com/projects/esp-idf/en/stable/get-started/index.html
Build System do Linux: https://www.kernel.org/doc/html/latest/kbuild/index.html
Simulador: http://nuttx.apache.org/docs/latest/guides/simulator.html
Olá Sara, Estou tendo um problema. Tentei rodar os comandos mas na hora de fazer o download para a ESP32 ele fala que não existe o arquivos bootloader-esp32.bin partition-table-esp32.bin. O estranho é que eu rodei um comando ls -a e os arquivos estão lá na pasta esp-bins Agradeço de antemão qualquer ajuda. blukrr@DESKTOP-PB1O250:~/esp-bins$ cd ~/nuttxspace/nuttx blukrr@DESKTOP-PB1O250:~/nuttxspace/nuttx$ make download ESPTOOL_PORT=/dev/ttyUSB0 ESPTOOL_BAUD=115200 ESPTOOL_BINDIR=../esp-bins Create .version Create version.h make[1]: Entering directory '/home/blukrr/nuttxspace/nuttx/libs/libxx' make[1]: Nothing to be done for 'dirlinks'. make[1]: Leaving directory '/home/blukrr/nuttxspace/nuttx/libs/libxx' make[1]: Entering directory '/home/blukrr/nuttxspace/nuttx/boards' make[1]: Nothing to be done for 'dirlinks'. make[1]: Leaving directory '/home/blukrr/nuttxspace/nuttx/boards' make[1]: Entering directory '/home/blukrr/nuttxspace/nuttx/openamp' make[1]:… Leia mais »
Olá Gilberto, o seu diretório /esp-bins está a dois diretórios atrás do nuttx.
Ele deveria estar no mesmo nível do nuttx, dentro de /nuttxspace.
Você tem 2 opções:
Muito bom
Obrigada Maike!
Saludos volando para ti Sara Buen trabajo !!! Estás genial, estás deseando probar NuttX y empezar. Gracias por el “Hola mundo” 🙂 Sigan así 🙂 Atentamente rudi 😉
¡Muchas gracias Ruby!
Un Abrazo,
Atentamente,
Sara Monteiro
Muito bom Sara, parabéns! Consegui reproduzir o tutorial sem grande problemas, eu já tinha o NuttX, instalado, então só precisei instalar o IDF. Só fiquei com uma dúvida em relação ao passo 4: Após o comando : make -C tools/esp32/ ${HOME}/esp/esp-idf 1 make -C tools/esp32/ ${HOME}/esp/esp-idf Era para o IDF ser instalado completamente na máquina? Pq eu precisei rodar o script install.sh manualmente, ao tentar exportar o ambiente ele não encontrava as ferramentas do GCC para Xtensa. E para usuários que estiverem sem acesso ao device ttyUSB0 podem rodar sudo usermod -a -G dialout $USER 1 sudo usermod -a -G… Leia mais »
Oi Jonathan!
Obrigada!
Sim. Este comando instalaria todo o framework ESP-IDF para você. Bastando apenas ativar o ambiente virtual para carregar as variáveis de ambiente.
Como você já possuía o NuttX instalado, pode ser que o makefile para a instalação do IDF esteja desatualizado. Qual versão do NuttX você está usando?
Você ainda tem ou se lembra do resultado que obteve depois de executar o makefile? O feedback pode nos ajudar a identificar o problema.
A propósito, obrigada pela dica da porta, tenho certeza que será muito útil para outras pessoas!
Abraço!
Oi Sara
Infelizmente não tenho os outputs do terminal.
Eu tô usando o NuttX 9.1.0, talvez seja por conta disso mesmo.
Jonathan,
A versão 9.1.0 possui a instalação mais recente do IDF. Portanto, este certamente não foi o problema. Como você não tem os outputs, e visto que o makefile clonou o repositório, mas não executou o script, apostaria em algum problema relacionado à permissão para executar o script.