Sistema interativo embarcado com matriz de LEDs, controle por joystick e feedback visual e sonoro
Countroller é um sistema embarcado desenvolvido para o Raspberry Pi Pico W que integra hardware de entrada (joystick, botões) com saídas interativas (matriz de LEDs, display OLED, buzzers). O projeto demonstra conceitos fundamentais de sistemas embarcados, programação C modular e integração de componentes eletrônicos.
O projeto foi desenvolvido como trabalho final da Unidade 7 do programa EmbarcaTech, consolidando conhecimentos em programação embarcada, arquitetura de microcontroladores e IoT.
- 🎮 Controle por joystick: navegação de cursor em matriz 5×5 de LEDs RGB
- 🔴 Matriz NeoPixel: 25 LEDs endereçáveis individualmente com cores customizáveis
- 📊 Display OLED: feedback visual em tempo real (posição do joystick, contadores de botões)
- 🔘 Sistema de botões: dois botões com contador de pressionamentos e feedback sonoro
- 🔊 Buzzers PWM: dois buzzers para feedback auditivo controlado por modulação de largura de pulso
- 🎨 Padrões pré-programados: exibição de padrões visuais (IF, PI, Coração) na matriz LED
- 🏗️ Arquitetura modular: código organizado em componentes independentes e reutilizáveis
O sistema opera em um loop principal que realiza continuamente:
- Leitura de entrada: captura posição do joystick (eixo X e Y via ADC) e estado dos botões
- Atualização visual: posiciona LED na matriz de acordo com o joystick
- Processamento de eventos: detecta pressionamentos de botões e incrementa contadores
- Feedback multissensorial:
- Exibe informações no display OLED
- Aciona LEDs RGB de status
- Toca feedback sonoro via buzzer
Ao inicializar, o sistema exibe três padrões animados (IF, PI, Coração) na matriz de LEDs como confirmação de funcionamento.
| Componente | Quantidade | Detalhes |
|---|---|---|
| Microcontrolador | 1 | Raspberry Pi Pico W |
| Matriz de LEDs | 1 | 5×5 NeoPixel (WS2812B) — 25 LEDs RGB endereçáveis |
| Display | 1 | SSD1306 OLED 128×64 (I2C) |
| Buzzers | 2 | Controle PWM |
| Botões | 2 | Push buttons (A e B) |
| Joystick | 1 | Analógico com botão integrado |
| LEDs RGB | 3 | Vermelho, Verde, Azul para status |
| Componente | Pino GPIO | Tipo |
|---|---|---|
| Matriz NeoPixel | GPIO 7 | Digital (PIO) |
| Display OLED (SDA) | GPIO 14 | I2C |
| Display OLED (SCL) | GPIO 15 | I2C |
| Joystick X | GPIO 26 | ADC0 |
| Joystick Y | GPIO 27 | ADC1 |
| Botão A | GPIO 5 | Digital Input |
| Botão B | GPIO 6 | Digital Input |
| Joystick Button | GPIO 22 | Digital Input |
| Buzzer 1 | GPIO 21 | PWM |
| Buzzer 2 | GPIO 10 | PWM |
| LED Azul | GPIO 12 | Digital Output |
| LED Vermelho | GPIO 13 | Digital Output |
| LED Verde | GPIO 11 | Digital Output |
| Categoria | Tecnologia |
|---|---|
| Microcontrolador | Raspberry Pi Pico W |
| Linguagem | C11 |
| Build System | CMake 3.13+ |
| SDK | Raspberry Pi Pico SDK 1.5.1 |
| Padrão | Modular C |
| Periféricos | I2C, ADC, GPIO, PWM, PIO |
Countroller/
├── CMakeLists.txt # Configuração de build
├── pico_sdk_import.cmake # Importação do Pico SDK
├── include/ # Headers
│ ├── buttons.h # Controle de botões e LEDs RGB
│ ├── buzzer.h # Controle de buzzers PWM
│ ├── display.h # Display OLED
│ ├── init.h # Inicialização do sistema
│ ├── joystick.h # Leitura do joystick
│ ├── neopixel.h # Controle da matriz LED
│ └── ssd1306/ # Driver OLED
│ ├── ssd1306.h
│ ├── ssd1306_font.h
│ └── ssd1306_i2c.h
├── lib/
│ └── ssd1306/
│ └── ssd1306_i2c.c # Implementação do driver OLED
├── pio/
│ └── ws2818b.pio # Código PIO para NeoPixel
├── src/ # Implementação
│ ├── main.c # Loop principal
│ ├── init.c # Inicialização
│ ├── buttons.c # Lógica de botões
│ ├── buzzer.c # Geração de som
│ ├── display.c # Saída OLED
│ ├── joystick.c # Leitura analógica
│ └── neopixel.c # Controle de LEDs
└── tools/ # Utilitários
├── drawls.c # Ferramentas de desenho
└── piskel_convert.c # Conversão de padrões
- Raspberry Pi Pico W
- Visual Studio Code com extensão Raspberry Pi Pico
- Raspberry Pi Pico SDK
- CMake 3.13 ou superior
- Compilador ARM GCC
- Hardware conectado conforme o mapeamento de pinos
-
Clone o repositório
git clone <repositório> cd Countroller
-
Configure o CMake
mkdir build cd build cmake .. -
Compile o projeto
make
-
Transfira para o Pico
Coloque o Pico em modo bootloader (segure BOOTSEL ao conectar) e copie o arquivo
.uf2gerado para o dispositivo.
Após o boot:
- O sistema exibe três padrões animados (IF, PI, Coração) na matriz LED
- Use o joystick para mover o LED pela matriz
- Pressione os botões A ou B para incrementar contadores e ouvir feedback sonoro
- O display OLED mostra posição do joystick e contadores dos botões
- Os LEDs RGB indicam status do sistema
Confira o sistema em ação neste vídeo de demonstração:
O projeto inclui ferramentas especializadas para geração de padrões visuais:
Arquivo que contém as definições dos padrões visuais (IF, PI, Coração) exibidos na matriz de LEDs durante a inicialização. Foi gerado utilizando Piskel App, uma ferramenta online para criação de pixel art e animações.
Responsável por converter e processar os padrões gerados no Piskel para o formato apropriado de controle da matriz de LEDs. Realiza a transformação dos dados de desenho em comandos compatíveis com o sistema NeoPixel.
O projeto foi estruturado seguindo as melhores práticas para C embarcado:
- Modularização: Cada componente (botões, display, joystick, etc.) é implementado independentemente em seus próprios arquivos
.ce.h - Separação de responsabilidades: Lógica de hardware separada da lógica de aplicação
- Reutilizabilidade: Bibliotecas como SSD1306 podem ser facilmente portadas para outros projetos
- Eficiência: Uso direto do SDK do Pico sem abstrações desnecessárias
Essa organização foi baseada em Modular Code and How to Structure an Embedded C Project.
O projeto consolida conhecimentos em:
- Sistemas embarcados: inicialização de hardware, configuração de periféricos
- Programação C modular: organização de código para manutenibilidade e reutilização
- Protocolos de comunicação: I2C, ADC, GPIO, PWM
- Interfaces de hardware: leitura de sensores analógicos, controle de atuadores
- Arquitetura de microcontroladores: recursos de GPIO, PIO, timers
Este projeto foi inspirado em exemplos do repositório BitDogLab-C:
- display_oled
- Joystick_led
- neopixel_pio
- button-buzzer
- button_led_rgb
Agradecimentos especiais ao Professor Jivago pelos recursos educacionais disponibilizados em seu canal no YouTube, que foram essenciais para compreender os conceitos e implementações dos diversos componentes.
Também expresso minha gratidão a todos os professores envolvidos no programa EmbarcaTech, cujo dedicado acompanhamento, classes síncronas e orientações foram fundamentais para minha formação.
