Raspberry Pi

Gravando código em C++ no Raspberry Pi Pico

Eletrogate 4 de março de 2022

A programação do Raspberry Pi Pico

No post anterior referente ao Raspberry Pi Pico, vimos como programa-lo em Python. Para tanto, carregamos um interpretador minimizado em sua flash e, a partir dele, reproduzíamos códigos salvos em sua memória ainda em Python. Por ser uma linguagem interpretada, no entanto, esta tem limitações quanto a performance e segurança. Neste contexto, surge a demanda por meios de programar a placa em linguagens compiladas, como C++.


Preparando o ambiente de programação

Primeiramente, faça os downloads dos links:

  • https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-win32.exe
  • https://github.com/Kitware/CMake/releases/download/v3.22.2/cmake-3.22.2-windows-x86_64.msi
  • https://aka.ms/vs/17/release/vs_BuildTools.exe
  • https://www.python.org/downloads/release/python-3102/
  • https://github.com/git-for-windows/git/releases/download/v2.35.1.windows.2/Git-2.35.1.2-64-bit.exe
  • https://code.visualstudio.com/Download

Durante a instalação do GCC ARM, habilite, no mínimo, “Add Path to environment variable”.

Faça o mesmo durante a instalação do CMake.

Ao instalar os pacotes a partir do VS Build Tools, é necessário que estejam selecionados:

  • C++ Build Tools core features;
  • C++ 2019 Redistributable Update;
  • C++ core desktop features;
  • MSVC v142 (ou superior) build tools;
  • Windows 10 SDK;
  • C++ CMake tools for windows;
  • Testing tools core features;
  • C++ AddressSanitizer.

Durante a instalação do Python, garanta que o launcher esteja habilitado para todos os usuários e que o caminho PATH seja adicionado às variáveis de sistema.

Na instalação dos demais itens, permita, sempre que solicitado, a escrita do caminho na variável PATH.


Baixando e compilando os exemplos

A partir da pasta de sua preferência aberta no prompt de comandos, digite:

> git clone -b master https://github.com/raspberrypi/pico-sdk.git
> cd pico-sdk
\pico-sdk> git submodule update --init
\pico-sdk> cd ..
> git clone -b master https://github.com/raspberrypi/pico-examples.git

Então, abra um “Developer Command prompt for VS” como administrador e, nele, digite: setx PICO_SDK_PATH "CAMINHO_PARA_SUA_PAST_PICO_SDK" onde “CAMINHO_PARA_SUA_PAST_PICO_SDK” será algo do tipo: C:\Users\User\pico\pico-sdk. Por fim, acesse as variáveis de sistema e adicione à variável path o caminho para a pasta Hostx64\x64 de seu Visual Studio. Ele será algo do tipo: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14…\bin\Hostx64\x64.

Ao fim, feche o terminal e o abra novamente para digitar:

> cd pico-examples
\pico-examples> mkdir build
\pico-examples> cd build
\pico-examples\build> cmake -G "NMake Makefiles" ..
\pico-examples\build> nmake

Quando o processo terminar, se não houverem erros, todos os exemplos estarão compilados na pasta build. Para carrega-los no Pico, conecte-o ao PC enquanto pressiona o botão BOOTSEL e, quando este for reconhecido como dispositivo de armazenamento, copie o arquivo .uf2 referente ao código que quiser para o microcontrolador. Ele irá reiniciar e executar o programa.

Para compilar pelo VS code, siga o tutorial visto a partir da página 42 do manual.


Compilando um código próprio

Aqui, utilizaremos uma refatoração do código que controla um LCD com módulo I2C encontrado na pasta pico-examples e uma pasta modelo de projeto individual. Para começar, faça o download deste arquivo. Descompacte-o fora do diretório de exemplos e altere o nome da pasta conforme preferir.

Pasta descompactada e com nome alterado

Os arquivos nesta pasta estão prontos para a compilação, que deve ser feita da mesma forma que os arquivos da pasta de exemplos. Fique à vontade para explora-la e modifica-la como quiser. Seguindo com nosso projeto, apague os três arquivos fonte: extrafunc.c, extrafunc.h (na imagem, sem o .h) e main.c. Agora, copie o código fonte do exemplo, encontrado em \pico-examples\i2c\lcd_1602_i2c, como mostra a figura abaixo, e cole na pasta de nosso projeto.

Pasta que contém o exemplo utillizado

Perceba, ao abrir o código, que este não segue as boas práticas de programação, principalmente porque temos toda a definição e implementação de funções genéricas no arquivo principal. Corrigiremos isto implementando a modularização. Para tanto, abra o Developer Command Prompt for VS e, por meio dele, abra a pasta no VS code (utilizando >code CAMINHO_NO_SISTEMA_PARA_A_PASTA). Então, crie um arquivo main.c e um lcd_120_i2c.h. Neste ponto, sua janela do editor deverá estar semelhante à vista na imagem abaixo.

Editor com os novos arquivos criados

Agora, separaremos o código entre as pastas de acordo com a função de cada trecho. Neste programa, o arquivo main.c deve conter somente a função main, a inclusão do módulo e das bibliotecas utilizadas. Deverá ficar assim:

Arquivo main.c adequado

Já o lcd_1602_i2c.h deverá conter as declarações das funções e as definições de pré-processamento. Sua versão adequada pode ser vista abaixo.

Arquivo .h adequado

Por fim, o arquivo header deverá ser incluído no source do módulo. Este deverá ficar como se vê na imagem que segue:

Arquivo .c adequado do módulo

Feitas as edições nos arquivos fonte, devemos, agora, adaptar o makelist a eles. Antes das alterações, ela estará assim:

Makelist antes das alterações

Primeiro, deve-se substituir “project1” pelo nome dado a sua pasta. Em add_executable, “extrafunc.c” deve ser substituído por “lcd_1602_i2c” (em projetos com mais códigos fonte, os demais devem ser listados nesta função, também). Já target_link_libraries deve receber todas as bibliotecas embutidas que forem utilizadas. A maioria dos programas utilizará a pic_stdlib, incluindo este. Além dela, devemos listar, também, a hardware_i2c, incluída no código fonte. Ao salvar o arquivo com estas edições, ele deverá estar assim:

Makelist após as alterações

O programa está, agora, pronto para ser compilado. Caso tenha configurado o VS Code para compilar os códigos para a placa Pico, basta clicar em “Build”, na barra azul inferior da tela. Caso não, compile pela linha de comando, como mostrado anteriormente. Após a compilação, o arquivo .uf2 estará na pasta build, como mostra a imagem abaixo.

Para carrega-lo no Pico, basta copiar este arquivo e colar no armazenamento da placa.


Por fim

Neste post, vimos como é trabalhoso o processo de preparação e de programação do Raspberry Pi Pico em C e C++. Surge, perante tal dificuldade, o questionamento: vale a pena programar este chip em C++? O vídeo Raspberry Pi Pico C++ vs Python Performance – YouTube mostra a diferença de performance entre programas semelhantes escritos nas diferentes linguagens. Portanto, depende de sua demanda em relação a velocidade de processamento e de armazenamento consumido, visto que, além das diferenças mostradas no vídeo, para programar o Pico em Python é necessária a instalação de um interpretador e dos códigos em sua Flash, enquanto somente os códigos, já em linguagem de máquina, são necessários para a programação em C++.

Referências:

Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!


Sobre o autor


Eduardo Henrique

Formado técnico em mecatrônica no CEFET-MG, atualmente estuda Engenharia de Controle e Automação na UFMG.


Eletrogate

4 de março de 2022

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!