Introdução
O Raspberry Pi Pico pode ser programado de forma direta e eficiente utilizando linguagens voltadas a sistemas embarcados.
As duas abordagens principais são:
- MicroPython → produtividade e rapidez
- C/C++ → controle total e performance máxima
Este artigo foca em fundamentos sólidos de programação embarcada, com aplicação prática e estrutura profissional.
Modelo de Execução (Firmware)
Diferente de sistemas com OS, o Pico executa um único fluxo principal:
while True:
read_inputs()
process_logic()
update_outputs()
Interpretação modular:
- read_inputs() → sensores / entradas
- process_logic() → regras
- update_outputs() → atuadores
✔ Separação clara: entrada ≠ lógica ≠ saída
MicroPython: Camada de Abstração Produtiva
O MicroPython permite programar o Pico com sintaxe simples e rápida.
Vantagens:
- Curva de aprendizado baixa
- Código limpo e legível
- Testes rápidos
Exemplo básico:
from machine import Pin
import utimeled = Pin(16, Pin.OUT)while True:
led.toggle()
utime.sleep(1)
✔ Ideal para prototipação
C/C++: Controle Total do Hardware
Para aplicações críticas, usa-se o SDK oficial em C/C++.
Vantagens:
- Máxima performance
- Controle de memória
- Acesso direto ao hardware
Exemplo (conceitual):
gpio_init(16);
gpio_set_dir(16, GPIO_OUT);while (true) {
gpio_put(16, 1);
sleep_ms(1000);
gpio_put(16, 0);
sleep_ms(1000);
}
✔ Indicado para produção
Estrutura de Código Profissional
Aplicando separação modular:
def read_inputs():
passdef process_logic():
passdef update_outputs():
passwhile True:
read_inputs()
process_logic()
update_outputs()
Benefícios:
- Testável
- Reutilizável
- Escalável
Manipulação de Tempo
Tempo em sistemas embarcados é crítico.
Funções comuns:
sleep()→ bloqueanteticks_ms()→ controle precisotimers→ eventos periódicos
Exemplo não bloqueante:
import utimelast = utime.ticks_ms()while True:
now = utime.ticks_ms()
if utime.ticks_diff(now, last) > 1000:
print("1 segundo")
last = now
✔ Evita travamentos
Controle de Estado
Evitar lógica linear rígida → usar estados:
state = "OFF"while True:
if state == "OFF":
# lógica
state = "ON"
elif state == "ON":
# lógica
state = "OFF"
✔ Base para sistemas complexos
Entrada e Saída (I/O)
Programação embarcada é essencialmente:
- Ler sinais
- Processar
- Acionar hardware
Tipos de I/O:
Tratamento de Erros
Mesmo em sistemas simples:
try:
sensor_value = read_sensor()
except:
sensor_value = 0
✔ Garante robustez
Persistência de Dados
Microcontroladores não têm banco de dados.
Alternativas:
- Arquivos simples (quando disponível)
- EEPROM (em outros MCUs)
- Flash controlada
✔ Persistência deve ser planejada
Boas Práticas
- Código simples e direto
- Evitar loops bloqueantes
- Separar lógica por função
- Testar cada módulo isoladamente
- Minimizar uso de memória
Aplicações Práticas
Cenários reais práticos:
- Piscar LED com lógica condicional
- Controle de relé por botão
- Leitura de sensor e decisão local
- Temporizadores embarcados
Integração com Sistemas Maiores
O Pico pode atuar como:
- Executor local
- Coletor de dados
- Interface física
Arquitetura típica:
Sensor → Pico → Comunicação → Sistema maior (API / IA / servidor)
Encaminhamento
Agora que a base de programação está estabelecida, avançamos para o controle físico direto:
GPIO, LEDs e controle de hardware

