Table of Contents
- 1. Introdução: por que usar Zephyr no Arduino DUE
- 2. Visão geral do suporte do Zephyr ao Arduino DUE
- 3. Pré-requisitos do ambiente de desenvolvimento
- 4. Estrutura recomendada de workspace
- 5. Criando o projeto do zero para o Arduino DUE
- 6. Arquivo CMakeLists.txt: integração com o Zephyr
- 7. Arquivo prj.conf: configuração do kernel (Kconfig)
- 8. Arquivo main.c: primeira aplicação
- 9. Compilando o projeto para o Arduino DUE
- 10. Gravando o firmware no Arduino DUE
- 11. Próximos passos
1. Introdução: por que usar Zephyr no Arduino DUE
O Zephyr Project é um sistema operacional de tempo real (RTOS – Real-Time Operating System) moderno, modular e altamente configurável, projetado para sistemas embarcados que exigem previsibilidade temporal, portabilidade e escalabilidade. Diferente do ecossistema Arduino tradicional — baseado em superloop e bibliotecas monolíticas — o Zephyr oferece um modelo arquitetural profissional, alinhado a práticas industriais, como device tree, Kconfig, CMake e um kernel preemptivo completo.
O Arduino DUE ocupa um espaço interessante nesse contexto. Baseado no microcontrolador Atmel/Microchip SAM3X8E, um ARM Cortex-M3 de 32 bits operando a 84 MHz, ele oferece recursos raros no “mundo Arduino”: barramento externo, controlador DMA (Direct Memory Access), múltiplas UARTs, SPI, TWI (I²C – Inter-Integrated Circuit), além de USB nativo (USB OTG). Esses recursos fazem do DUE uma excelente plataforma didática para aprender Zephyr em um hardware amplamente conhecido.
Neste artigo, você aprenderá passo a passo, de forma minuciosa, como criar um projeto Zephyr totalmente funcional para o Arduino DUE, utilizando todos os recursos documentados oficialmente pela fundação Zephyr para essa placa. O foco não será apenas “compilar e rodar”, mas entender a arquitetura do projeto, as decisões de configuração e o papel de cada arquivo envolvido.
2. Visão geral do suporte do Zephyr ao Arduino DUE
Antes de escrever qualquer linha de código, é fundamental entender como o Zephyr enxerga o Arduino DUE. No Zephyr, placas não são tratadas como “kits genéricos”, mas como descrições formais de hardware, compostas por:
- Board Definition: define CPU, clock, memória e periféricos básicos
- Device Tree (DTS): descreve os dispositivos de hardware de forma declarativa
- Kconfig da placa: habilita ou restringe funcionalidades do kernel
- Arquivos de build: integram a placa ao sistema CMake do Zephyr
No caso do Arduino DUE, o Zephyr fornece oficialmente:
- Arquivo de board baseado no SAM3X8E
- Mapeamento correto de pinos compatível com o layout do DUE
- Suporte a:
- GPIO (General Purpose Input/Output)
- UART (console serial)
- SPI
- I²C (TWI no SAM)
- Temporizadores e SysTick
- Programação via porta USB de programação (a mesma usada com o bossac)
Isso significa que não é necessário criar uma placa customizada para começar: o Arduino DUE já está plenamente integrado ao ecossistema Zephyr.
3. Pré-requisitos do ambiente de desenvolvimento
Antes de criar o projeto, o ambiente Zephyr precisa estar corretamente instalado. Assumiremos aqui que você já leu os artigos anteriores da série e possui:
- Linux (Ubuntu 22.04 ou superior recomendado)
- Python 3.10+
west(ferramenta de meta-build do Zephyr)- Zephyr SDK instalada
- Toolchain ARM embarcada funcional
Para validar rapidamente se o ambiente está correto, execute:
west --version
E depois:
west boards | grep due
Se o ambiente estiver correto, você verá a placa arduino_due listada entre as placas suportadas. Esse comando é extremamente importante: ele confirma que o Zephyr reconhece oficialmente o Arduino DUE no seu workspace.
4. Estrutura recomendada de workspace
Um erro comum entre iniciantes é misturar código de aplicação com o repositório do Zephyr. A abordagem correta é usar um workspace limpo, com a seguinte estrutura conceitual:
zephyr-workspace/
├── zephyr/ # Código-fonte do Zephyr RTOS
├── modules/ # Módulos externos (opcional)
├── bootloader/ # Bootloaders (opcional)
└── arduino_due_app/ # SUA aplicação
Dentro da pasta arduino_due_app, ficará apenas o código da aplicação, sem dependências diretas do kernel. Essa separação é crucial para manter o projeto sustentável e escalável.
5. Criando o projeto do zero para o Arduino DUE
Agora vamos criar efetivamente o projeto.
5.1 Criando o diretório da aplicação
mkdir arduino_due_app
cd arduino_due_app
5.2 Estrutura mínima de um projeto Zephyr
Crie a seguinte estrutura inicial:
arduino_due_app/
├── CMakeLists.txt
├── prj.conf
└── src/
└── main.c
Essa é a estrutura mínima obrigatória para qualquer aplicação Zephyr.
6. Arquivo CMakeLists.txt: integração com o Zephyr
Crie o arquivo CMakeLists.txt com o conteúdo:
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(arduino_due_app)
target_sources(app PRIVATE src/main.c)
O que esse arquivo faz, exatamente?
cmake_minimum_required: garante compatibilidade mínima do CMakefind_package(Zephyr ...): importa todo o sistema de build do Zephyrproject(...): define o nome lógico do projetotarget_sources(...): registra os arquivos C da aplicação
Aqui ocorre algo importante: você não define compilador, flags ou linker script. Tudo isso é herdado automaticamente da definição da placa (arduino_due) e do kernel.
7. Arquivo prj.conf: configuração do kernel (Kconfig)
O prj.conf controla quais partes do kernel Zephyr serão compiladas.
Comece com o mínimo funcional:
CONFIG_PRINTK=y
CONFIG_SERIAL=y
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y
Essas opções habilitam:
printk()– saída básica de debug- Driver de porta serial
- Console padrão via UART
No Arduino DUE, isso será mapeado automaticamente para a UART correta definida no device tree da placa.
8. Arquivo main.c: primeira aplicação
Crie src/main.c:
#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
int main(void)
{
printk("Zephyr rodando no Arduino DUE!\n");
while (1) {
printk("Tick\n");
k_sleep(K_SECONDS(1));
}
return 0;
}
Conceitos importantes aqui
#include <zephyr/kernel.h>: acesso ao kernel, threads e temporizaçãoprintk(): saída síncrona simples (não éprintf)k_sleep(): API de temporização do kernelmain()existe, mas não é o ponto de entrada real — o kernel já está inicializado antes dela ser chamada
9. Compilando o projeto para o Arduino DUE
Agora vem a parte crítica: build correto para a placa certa.
Dentro da pasta arduino_due_app:
west build -b arduino_due
O Zephyr irá:
- Ler a definição da placa Arduino DUE
- Selecionar o SoC SAM3X8E
- Configurar clocks, memória e periféricos
- Gerar o firmware final
Se tudo estiver correto, o build terminará sem erros.
10. Gravando o firmware no Arduino DUE
O Arduino DUE utiliza o bootloader SAM-BA, compatível com a ferramenta bossac.
Com a placa conectada via porta USB de programação, execute:
west flash
O Zephyr cuidará automaticamente do processo de gravação usando o método correto definido para a placa.
Após o reset, abra um terminal serial:
minicom -D /dev/ttyACM0 -b 115200
Você deverá ver:
Zephyr rodando no Arduino DUE!
Tick
Tick
Tick
11. Próximos passos
A partir daqui, você já tem:
- Um projeto Zephyr funcional
- Build e flash corretamente configurados
- Console serial ativo
- Base sólida para evoluir
Nos próximos artigos, podemos avançar para:
- Device Tree do Arduino DUE em detalhes
- GPIO e LEDs
- UARTs adicionais
- SPI e I²C
- Timers e interrupções
- Multithreading real no Cortex-M3