Criando uma aplicação Zephyr out-of-tree com WIFI do ESP32 habilitado

Nesse texto vamos criar uma aplicação com o uso do WIFI do ESP32 e fora da árvore do Zephyr.

Olá caro leitor, como vai? Sim o momento chegou, o suporte ao WIFI do ESP32 chegou ao Zephyr RTOS, transformando esse projeto em mais uma alternativa de uso ao ESP-IDF para o desenvolvimento de aplicações para esse pequeno chip notável da Espressif. Com esse suporte no lugar, resolvi então quebrar um pouco do meu hiato de artigos e aproveitar para trazer um outro assunto junto com esse que muitos me perguntam: “Como ter uma aplicação com o Zephyr RTOS fora do diretório do projeto”.


Existem vantagens notáveis para a criação da sua aplicação com o Zephyr fora do diretório de exemplos, dentre elas podemos citar uma muito impactante, a independência entre os projetos, de forma que é possível que ambos corram com suas manutenções e repositórios separados, sem que o código de aplicação toque no código do kernel e vice-versa.

Nesse texto vamos criar uma aplicação com o uso do WIFI do ESP32 e out-of-tree do Zephyr.


Entendendo o suporte do ESP32 no Zephyr RTOS

O suporte do ESP32 no Zephyr evoluiu bastante ao longo das últimas atualizações do projeto, revelando-se um grande esforço da comunidade que mantém o projeto, reforçado pela própria Espressif que atualmente contribui para o suporte. Com isso branch main do Zephyr para o  ESP32 suporta:

  • Drivers para UART;
  • Drivers para I2C;
  • Drivers para SPI;
  • Drivers para GPIO;
  • Drivers para memoria Flash;
  • Driver para PWM utilizando o LEDC;
  • Suporte para WiFI;
  • Suporte para Bluetooth.

É esperado que, em termos de release, essas funcionalidades cheguem na próxima versão do kernel, que é a 2.6. Enquanto isso não ocorre, usuários podem utilizar o ESP32 através do já citado branch main.

Quero minha aplicação fora da árvore do Zephyr!

Mas você, usuário do ESP32 que quer testar o Zephyr, provavelmente gostaria de ter aquela sensação de limpeza, da sua aplicação está apenas consumindo os recursos do Zephyr certo? Então vamos deixar as coisas mais interessantes para você. Então no lugar de usar os samples dentro do kernel, vamos por outro caminho mais legal e mais profissional.

O primeiro passo, se você ainda não tem o Zephyr instalado em sua máquina, sugiro que comece com o melhor post introdutório sobre o assunto, esse aqui: https://www.embarcados.com.br/zephyr-rtos-no-esp32-primeiros-passos/. Após conferir que está tudo bem com sua instalação vamos ao próximo passo. Utilizarei o VSCode para ilustrar, mas o leitor é livre para utilizar o editor e gerenciador que lhe convir.

O primeiro passo, é criar um diretório para seu projeto, no meu caso, o esp32_sta_wifi_out_of_tree, dentro dele crie uma pasta para seus arquivos C, eu escolhi o nome src, e por último adicione dentro do diretório da sua aplicação o arquivo CMakeLists.txt, dentro da pasta src, você pode colocar seu arquivo main.c, não esqueça o prj.conf, esse arquivo contém configuração padrão do seu projeto que apresentaremos em seguida.

A seguinte estrutura deve estar no seu projeto (aqui demonstrada com o comando tree no terminal):

Agora vamos começar a rechear os arquivos, atenção aos comentários onde houver:

CMakeLists.txt:

prj.conf:

src/main.c:

Agora temos todo o projeto pronto para ser compilado, e pronto para uso, lembrando que a partir desse ponto outros arquivos C poderiam ser adicionados bastando alterar o CMakelists.txt.

Antes de tudo, como o driver WIFI do ESP32 interage com o Zephyr:

Antes de partirmos para programar o nosso ESP32, vamos verificar rapidamente como a stack WIFI do chip da Espressif interage com o restante do RTOS. Como já dito antes o Zephyr é organizado em grupos dentre eles podemos citar os notáveis: kernel, drivers e subsistemas, a stack TCP/IP do zephyr é considerado um subsistema, pois embora pertença ao RTOS ela possui um propósito específico. 

image 143
Figura 1: Estrutura da stack de rede do Zephyr RTOS.

A stack de rede do Zephyr possui pontos que são comuns, e conectados aos drivers através de uma interface de abstração. Essa interface por sua vez é dividida por tecnologias, possuindo implementações comuns entre uma dada tecnologia de rede (ex.: CAN, Bluetooth, WIFI), no nível mas baixo existem as implementações dependente de plataforma como exemplificados pelo layer Network Device Drivers. Esse layer contém as devidas implementações onde dentre elas encontra-se um driver de WIFI baseada na stack distribuida pela Espressif para os chips ESP32.

O adaptador de rede acaba sendo desenvolvido em duas partes, sendo uma localizada na árvore do Zephyr, e outra no módulo hal do ESP32, onde são colocadas as adaptações entre o código feito para o ESP-IDF e a forma como o Zephyr implementa um dado driver.

O resultado final disso é a identificação do ESP32 como sendo uma interface de rede nativa do Zephyr, que está ciente da existência do RTOS, como verificaremos na sessão a seguir.


Tudo pronto, hora de compilar mandar o app para dentro do ESP32

Com o ambiente preparado, agora vamos ver o resultado do funcionamento do WIFI do ESP32 pelo Zephyr, o primeiro ponto relevante a se lembrar é que o comando de build do Zephyr deve ser executado dentro do diretório do seu projeto.

Em seguida prepare o ambiente o ambiente, navegue até o diretório onde sua cópia do Zephyr está em seguida:

Agora vá para o diretório do seu projeto e exporte as variáveis de ambiente do Zephyr:

Com isso, conecte sua placa ESP32 na porta usb do seu computador, e execute o seguinte comando para compilar a aplicação:

Se a compilação terminar com sucesso você deve ver algo parecido no terminal:

Um lembrete importante, caso queira distribuir os binários da sua aplicação para outras pessoas, os arquivos para gravar o ESP32 estão localizados no diretório build/zephyr possuindo as extensões .bin e .elf para uso em debug.

Agora grave o microcontrolador e acesse os logs com a ferramenta de terminal serial de sua preferência, no meu caso eu prefiro a picocom por ser super simples de usar:

E finalmente o comando de flash:

Você deve ver algo do tipo se o comando der certo:

E por fim temos o WIFI mostrando funcionamento pelo terminal serial:

Se quiser, tente dar um ping no seu ESP32 por qualquer outro computador conectado à mesma rede por exemplo:

Conclusão


O ESP32 tem ganhado suporte a diferentes projetos de código aberto, além do próprio ESP-IDF, e com o Zephyr  RTOS não foi diferente, o que beneficia o usuário do chip de poder ter a flexibilidade para selecionar os componentes de software que mais se adequam a realidade da aplicação a ser desenvolvida. No Zephyr, o suporte dos chips da Espressif tem crescido com boa consistência trazendo suporte às funcionalidades básicas em conjunto com os periféricos mais interessantes como WIFI e Bluetooth.

Espero que esse artigo encoraje você, leitor, a partir desse exemplo, iniciar com aplicações mais próximas do uso real desses chips como conectá-lo ao broker MQTT de sua preferência. Como sempre dúvidas e questionamentos são sempre bem vindos, e fiquem ligados, o suporte de chips da Espressif no projeto Zephyr só tende a crescer.


Referências


[1] Projeto Zephyr:
https://www.zephyrproject.org/ 

[2] ESP32 – Zephyr: https://docs.zephyrproject.org/latest/boards/xtensa/esp32/doc/index.html

[3] Zephyr network stack architecture: https://docs.zephyrproject.org/latest/guides/networking/net-stack-architecture.html

[4] Projeto exemplo desse artigo no github:https://github.com/uLipe/esp32_sta_wifi_out_of_tree

Notificações
Notificar
guest
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
Rafael Dias
Rafael Dias
10/06/2021 00:27

olá Felipe.
Não consegui captar onde está o out-of-tree do projeto. Parece um projeto comum feito no zephyr.

WEBINAR

Visão Computacional para a redução de erros em processos manuais

DATA: 23/09 ÀS 17:00 H