Neste artigo, vamos explorar o uso do Zephyr RTOS com o devkit PIC32CM MC00 Curiosity Nano da Microchip. Não pretendemos fazer uma introdução ao Zephyr RTOS, para isso você pode assistir aos webinars Zephyr RTOS: Primeiros passos e Webinar: Zephyr RTOS: Construindo uma Aplicação IoT Completa para entender a montagem do ambiente de build, debug e gravação.
Introdução
No evento de junho de 2026 do Embarcados, o Seminário de Sistemas Embarcados e IoT, ganhei uma placa com o microcontrolador PIC32CM1216 diretamente do Rogério Moreira, da Microchip. Um microcontrolador ARM Cortex M0 que conta com apenas 128 KB de Flash e 16 KB de RAM.
No começo da minha carreira, eu já tinha trabalhado na manutenção de código para um produto que contava com um dsPIC33FJ256 (256KB Flash e 30 KB de RAM). Lembro de sofrer bastante para tentar reduzir o consumo de memória. Cada byte, função, arquivo .c/.h ou estrutura mal alinhada contava durante o processo de build.
Porém, os tempos agora mudaram, e fiquei curioso em saber até onde eu poderia chegar usando apenas 16KB de RAM e desenvolver uma aplicação com esse devkit, com o agravante de tentar utilizar Zephyr RTOS também.
Escolhi utilizar o Zephyr RTOS porque ele já tinha suporte à família PIC32CM e aos sensores, protocolo Modbus e display que queria utilizar para esta demo. Este devkit não possui um suporte oficial do Zephyr, então foi preciso criar um custom board out of tree com todos os arquivos dts e overlay para nossa demo.
Demonstração
Para este artigo, criamos uma demo bem simples de monitoramento e controle via Modbus. A ideia foi reunir, em uma única aplicação, os principais periféricos e serviços que normalmente aparecem em um produto embarcado real: sensores, display, expansão de I/O, armazenamento de dados em Flash e comunicação industrial, rodando sobre o Zephyr RTOS.
A placa atua como um dispositivo Modbus RTU (unit id 1, 115200 8N1), exposto através de um adaptador USB‑RS485. Por esse barramento, é possível ler os sensores, acompanhar o estado do sistema e controlar as saídas (LEDs) remotamente. Localmente, um display OLED mostra as informações de operação e quatro teclas permitem interação direta com a aplicação.
Esta demo conta com os seguintes recursos:
- Modbus RTU
- Sensores de distância VL53L0X
- Sensor de temperatura e umidade SHT3x
- Display OLED SSD1306
- Shield com expansor I2C MCP23008
- 4 Leds
- 4 Teclas
- RTC Interno
- Watchdog
- Armazenamento NVS usando os últimos 16 KB da Flash interna
- Salva o status do LED ao ligar a placa.
- Salva a contagem de vezes que à tecla foi pressionada
- Terminal shell
Conexões elétricas:
| Pino | Função | Periférico |
| PA00 | UART TX | Console shell |
| PA01 | UART RX | |
| PA08 | I²C SDA | SHT3x, VL53L0X, SSD1306, MCP23008 |
| PA09 | I²C SCL | |
| PA14 | UART TX | Modbus RS-485 |
| PA15 | UART RX | Modbus RS-485 |
| PA10 | GPIO (saída) | RS-485 DE/RE |
| PA02 | GPIO (saída) | RESET do shield IHM |
| PA03 | GPIO (entrada) | INT do MCP23008 |
| PA22 | GPIO (entrada) | Botão SW0 |
| PA23 | GPIO (saída) | LED0 da placa |



Gravação e Debug
A placa devkit já conta com um gravador on‑board, o que nos permite tanto gravar quanto depurar o firmware diretamente pelo VSCode, utilizando o plugin Cortex‑Debug.
Para agilizar o fluxo de trabalho, automatizamos todo o processo dentro do próprio VSCode:
- Criamos task runners que encapsulam os comandos do west (build, gravação e o servidor GDB), eliminando a necessidade de digitar comandos manualmente no terminal a cada ciclo.
- Configuramos um launch de debug que sobe o servidor GDB (via pyOCD) que conecta o Cortex‑Debug à placa, permitindo depuração passo a passo, inspeção de variáveis e breakpoints direto no editor. Com isso, gravar e depurar a aplicação se resume a um clique, tornando o ciclo de desenvolvimento muito mais rápido e produtivo.

Você pode encontrar o código-fonte em: https://github.com/JorgeGzm/PIC32-ArtigoZephyr
Para rodar esta demo, usamos:
- Ubuntu 24.04
- Zephyr SDK 1.0.1
- Zephyr Project v4.4.0
Software Modbus
Para testar e validar a comunicação Modbus, criamos uma aplicação em Python com interface gráfica para monitoramento e controle do device, como: visualizar leituras dos sensores, informações do device, número de vezes que a tecla da placa foi pressionada, ligar e desligar o LED da placa, o tempo de atividade da aplicação (uptime), o valor atual do RTC e rotina de sincronização automática da data e hora do RTC com o relógio do computador.

Conclusão
Nos últimos anos, passei a trabalhar com microcontroladores mais robustos. No último produto em que atuei, por exemplo, utilizamos um STM32H7 com 2 MB de Flash e 1 MB de RAM internos, além de 32 MB de SDRAM e 16 MB de NOR Flash externas.
Foi surpreendente perceber tudo o que foi possível realizar com um microcontrolador que dispõe de poucos pinos e recursos de memória considerados “limitados” (128 KB de Flash e 16 KB de RAM). A demo foi capaz de executar uma aplicação com Zephyr RTOS, consumindo cerca de 105 KB de Flash (80%) e 13,6 KB de RAM (83%).
Esta demonstração serviu para me lembrar de como os tempos mudaram. A qualidade do código, os níveis de abstração dos drivers e a arquitetura de software para sistemas embarcados evoluíram significativamente.
Como resultado, tornou-se viável considerar microcontroladores mais modestos, como o PIC32CM1216, no desenvolvimento de produtos. Quando combinado ao Zephyr RTOS, ele passa a contar com um ecossistema maduro que oferece suporte a diversos sensores, protocolos de comunicação e funcionalidades prontas para uso, reduzindo o esforço de desenvolvimento e acelerando a criação de soluções embarcadas.








