Primeiros Passos com o ESP32 e o 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 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:

  1. https://www.embarcados.com.br/o-que-e-o-rtos-nuttx/  
  2. 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. Crie um diretório para agrupar todos os repositórios do NuttX e o acesse:
  1. 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:

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:

Caso contrário, clone o repositório e instale o kconfig-frontends manualmente através do repositório tools:

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. 

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:

Mova o compilador cruzado para este novo diretório:

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:

4. Instale o módulo Python esptool para realizar o download de todos os binários para o ESP32 através da serial.

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):

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: 

Cole o seguinte trecho no fim do arquivo (Substitua <user> pelo seu nome de usuário):

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:

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. 

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.

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:

8. Finalmente, faça o build e o download dos binários para o ESP32 através do seguinte comando:

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:

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:

E finalmente acesse o nsh (NuttX Shell):

ESP32 e o NuttX
Figura 1 – Shell do NuttX

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_distcleanLimpa 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.

ESP32 e o NuttX
Figura 2 – Erro de espaço insuficiente

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

Outros artigos da série

Blink LED no ESP32 com o RTOS NuttX >>
Veja + conteúdo

Técnica em Automação Industrial e Engenheira de computação.
Atualmente trabalhando como Engenheira de Software Embarcado na Espressif.
Interesse em Sistemas Embarcados, testes automatizados e tecnologias IoT.
Apaixonada por tecnologias que conectam o "inimaginável" e fazem isso com qualidade.

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
8 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Maike Reis
Maike
02/04/2021 11:47

Muito bom

Last edited 3 meses atrás by Maike Reis
rudi ;-)
rudi 😉
16/11/2020 05:12

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 😉

Sara Monteiro
Sara Monteiro
Reply to  rudi 😉
16/11/2020 12:15

¡Muchas gracias Ruby!
Un Abrazo,
Atentamente,
Sara Monteiro

Jonathan Gonzaga
JON9507
07/11/2020 19:06

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 »

Jonathan Gonzaga
JON9507
Reply to  Sara Monteiro
07/11/2020 20:09

Oi Sara
Infelizmente não tenho os outputs do terminal.
Eu tô usando o NuttX 9.1.0, talvez seja por conta disso mesmo.

Last edited 8 meses atrás by JON9507
Talvez você goste:

Séries



Outros da Série

Menu