31 de julho de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Como configurar o ESP-IDF (Windows e Linux)

configurar o esp-idf

O esp-idf pode ser instalado no Windows, Mac e Linux. Se deseja utilizar o esp-idf no Windows, baixe esse instalador e proceda como lhe for orientado. Nesse artigo vou mostrar como configurar o ESP-IDF no Linux e ambos os sistemas estarão hábeis a seguir com o próximo artigo, onde será fundamental ter o ESP-IDF instalado.

O que é ESP-IDF?

Trata-se do SDK para ESP, mas nesse caso eles chamam de “ESPressif IoT Development Framework”. Para quem não sabe o que é SDK, trata-se do Software Development Kit. Ou seja, a mesma coisa com outro nome.

Desenvolver para uma plataforma diferente da nativa (por exemplo, criar um programa para Raspberry a partir do computador x86) se chama cross-compiling – ou, compilação cruzada. Existem diversos tipos de compilação, só que nem encontro mais entre os quase 1.000 artigos. Mas vou dar algumas referências:

Compilar o kernel – Raspberry

Ambiente de compilação para Raspberry com Raspbian

Trocar o logo do kernel

Compilar módulo do kernel para Raspberry

Cross-compile para Omega – compilação cruzada para MIPS.

Programar nativamente remotamente – Usando o X forwarding para programar uma RPi.

Cross-compilng para Raspberry

Configurar o ESP-IDF no Linux

No Linux também é simples configurar, mas alguns passos adicionais são necessários, como por exemplo, a instalação dos seguintes pacotes (considerando qualquer variante do Debian, incluindo Ubuntu). O procedimento descrito é baseado na documentação oficial.

sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0

É bom estar com uma distribuição Linux bem atualizada, ao menos que ofereça a versão >= 3.5 do cmake. Se quiser confirmar a versão antes de proceder com a instalação dos pacotes supracitados, use:

apt list cmake

Estou usando o Linux Mint 20.1 Ulyssa (que é um Ubuntu mal disfarçado), que tem a versão 3.16.3, já bem superior ao 3.5.

configurar o ESP-IDF

A versão de Python deve ser >= 3.6. Verifique com:

python --version

Deve ser um link simbólico para a versão 3 em seu sistema. No Mint 20.1 a versão é a 3.8.5.

configurar o ESP-IDF

Se ainda não o fez, será necessário também garantir o acesso às portas seriais pelo usuário. O tradicional comando a seguir será o suficiente. Refaça o login e, em última instância, reinicie o sistema.

usermod -a -G dialout $USER

Para fazer a comunicação serial sem a IDE do Arduino, podemos usar diversos programas diferentes, como GTKTerm, Cutecom e PuTTY (que serve também para SSH). Para linha de comando podemos usar Telnet, screen, cu etc. Um exemplo com screen:

screen /dev/ttyUSB0 115200

Para sair da tela, Ctrl-A + \. O screen prende a porta serial e a sessão pode ser restabelecida posteriormente. Porém, se sair do screen sem finalizar a comunicação, a porta serial ficará presa e não será possível fazer upload para o dispositivo.

Baixar o ESP-IDF

O sistema estando pronto para receber o ESP-IDF, podemos então iniciar o processo. Clone o repositório para o home do usuário. Já descrevi esse processo em outro artigo, mas sequer o encontro. Façamos novamente:

cd
mkdir esp
cd esp
git clone --recursive https://github.com/espressif/esp-idf.git

Não é um “pacotinho”. Vai levar um tempo, dependendo da velocidade de sua conexão.

Essa clonagem resultará no diretório esp-idf.

Será necessário instalar também o toolchain, que é o conjunto de ferramentas para compilação, debugging etc. Dentro do diretório recém-clonado tem o script shell install.sh, que deverá ser executado tão logo o conteúdo tenha sido clonado.

cd esp-idf
./install.sh

O processo deverá ser tranquilo, o script fará tudo. Um diretório extra será criado “fora” do diretório esp, que é o ~/.espressif – um diretório oculto.

Quando o processo terminar, podemos executar o script export.sh para configurar o ambiente de compilação.

Estando dentro do diretório ~/esp/esp-idf, digite:

. ./export.sh

Repare que tem um espaço entre o primeiro e segundo ponto.

Podemos também criar um alias para facilitar a execução do comando em um próximo boot. Por exemplo, adicionando a linha sugerida na documentação em um arquivo qualquer que inicie com o perfil do usuário. Costumo colocar em ~/.bashrc. A linha do alias ficou assim:

alias get_idf='. $HOME/esp/esp-idf/export.sh'

Agora reabra o terminal ou faça:

source ~/.bashrc

E o alias estará disponível, digitando get_idf para fazer o export automaticamente. Nesse ponto terminamos de configurar o ESP-IDF.

Iniciando um projeto

Agora podemos pegar um exemplo do ESP-IDF para usar como skeletron para nossos projetos. Inicie fazendo um mero teste com o hello_world:

cd
cd esp
get_idf
cp -r $IDF_PATH/examples/get-started/hello_world  .

Isso é para o caso de querer iniciar um projeto praticamente vazio, mas outros projetos dos exemplos podem ser usados como base para novos projetos.

Conecte o dispositivo ao computador e certifique-se de que a porta serial está disponível. Agora entre no diretório recém copiado e configure o projeto com menuconfig.

cd ~/esp/hello_world
idf.py menuconfig

Claro que tem outras formas de chegar ao diretório, fazer a cópia etc.

menuconfig | configurar o ESP-IDF

Abrindo o menuconfig podemos definir velocidade do processador, credenciais WiFi etc. Em Serial Flasher Config definimos (por exemplo) a velocidade da comunicação serial para o monitor, quando executarmos idf.py monitor para monitorar a execução. Em Component Config temos opções relacionadas à calibração do ADC, servidor HTTP, OTA, ethernet e muito mais. Como normalmente uso a API do Arduino para programar o ESP32, nunca abordei o uso do ESP-IDF a fundo, mas já mostrei como configurar o ESP-IDF em algum outro artigo. Em breve haveremos de utilizar alguns recursos específicos, por isso resolvi escrever primeiramente essa referência.

menuconfig | configurar o ESP-IDF

Para compilar o hello_world, simplesmente apertamos Esc para sair e confirmamos o salvamento da configuração padrão. Agora podemos compilar o firmware simplesmente digitando:

idf.py build

Tendo compilado, podemos fazer o upload de duas maneiras:

flash | configurar o ESP-IDF

Das duas opções, me parece particularmente óbvio que rodar idf.py -p PORTA flash é o mais simples.

Em uma saída normal do upload devemos ter ao final da mensagem as linhas:

Leaving...
Hard resetting via RTS pin...
Done

Monitorar o ESP32 pelo ESP-IDF

O monitor do próprio ESP-IDF nos fornece uma conexão serial, bastando usar:

idf.py -p /dev/ttyUSBO monitor

No meu caso, /dev/ttyUSB0 é a porta serial no Linux (que poderia ser /dev/ttyACM0 e em ambos os casos, invés de 0 poderia ser outro número, conforme as circunstâncias). Para sair do monitor, usa-se Ctrl+]. Podemos também combinar flashing e monitoramento passando ambos na mesma linha (flash monitor).

Características e esqueleto de projeto

Podemos usar qualquer projeto dos exemplos como base, até para ajudar a cortar caminho. Usando o ESP-IDF não desfrutamos da simplicidade de incluir bibliotecas disponíveis através da IDE do Arduino. O projeto é em C e o arquivo principal está no diretório main, dentro do exemplo que for utilizado como base. No caso do hello_world, o arquivo principal é main/hello_world.c. No menu ESP32 do blog você encontra todas as referências relacionadas aos recursos nativos do ESP-IDF, caso deseje desenvolver sem usar a API do Arduino. De qualquer modo, será fundamental ter o ESP-IDF configurado, para o próximo artigo relacionado.

Por enquanto não se preocupe com o nome de projeto, posteriormente veremos como renomear um esqueleto e compatibilizar a estrutura para um novo projeto. O importante nesse artigo era configurar o ESP-IDF adequadamente.

Por enquanto ficamos nesse ponto. No próximo artigo vamos à parte divertida, usando a placa T-Internet-PoE. Já para o próximo artigo teremos vídeo e mostrarei superficialmente o menuconfig, se me lembrar de colocar no roteiro.

Aproveite para se inscrever em nosso canal Dobitaobyte no Youtube e clique no sininho para receber notificações.