De um experimento de fim de semana a um hub multimídia completo: como criei o Ext-Monitor em Rust para transformar um microcomputador de US$ 10 em uma segunda tela de alta performance e central IoT.
Quem programa sabe como uma segunda tela faz falta na rotina diária de desenvolvimento. Mas os monitores portáteis dedicados costumam custar mais de R$ 1.500, ocupam espaço na mochila e a grande maioria dos softwares de espelhamento para Linux sofre com latência no cursor do mouse, engasgos no Wayland e alto consumo de CPU.
Comecei esse projeto despretensiosamente, por puro lazer e curiosidade técnica. Minha meta inicial era simples e pessoal: pegar uma plaquinha modesta que eu tinha na gaveta — um Raspberry Pi Zero W de dez dólares — e tentar fazê-la funcionar como um monitor secundário que fosse ágil e realmente útil para a minha própria bancada de trabalho.
Só que o projeto foi crescendo, os desafios de baixo nível foram aparecendo e o que era para ser apenas uma tela estendida acabou virando um verdadeiro HUB DE SERVIÇOS multimídia, combinando extensão de vídeo, áudio digital HDMI, analisador de espectro em tempo real e central de mídia com função de Chromecast.

🎯 O Desafio de Fazer Caber em um Silício de US$ 10
O chip Broadcom BCM2835 do Raspberry Pi Zero possui restrições severas de hardware:
- 1 único núcleo ARM1176 (ARMv6) operando a 1.0 GHz.
- Apenas 512 MB de memória RAM compartilhada entre o sistema e a GPU VideoCore IV.
- Controlador USB 2.0 integrado (
dwc2) que divide interrupções com o sistema operacional.
Qualquer distribuição Linux comum com X11 ou Wayfire consome mais de 350 MB de RAM só no boot e trava o processador em 100%. Para viabilizar uma taxa estável de 30 a 60 FPS com menos de 0.8% de uso de CPU, descartei bibliotecas pesadas e desenhei uma arquitetura em Rust nativo direto no silício.

🛠️ A Arquitetura em Cinco Pilares
1. Scanout Zero-Copy no DRM/KMS & DMA-BUF
No receptor, não existe servidor gráfico X11 nem Wayland. O decodificador H.264 V4L2 M2M da GPU VideoCore IV (/dev/video10) decodifica os quadros e os importa diretamente como descritores de memória DMA-BUF para o driver DRM/KMS (/dev/dri/card0). A imagem é projetada no plano primário do HDMI sem nenhuma conversão de cores na CPU ARM.
2. Modo USB Bulk Direct com Latência Sub-Milissegundo (< 1 ms)
Através de um driver USB Gadget customizado (FunctionFS classe 0xFF), vídeo e comandos viajam a 480 Mbps brutos através de um único cabo micro-USB comum. O canal contorna completamente a pilha de rede TCP/IP, atingindo latência inferior a 1 milissegundo, imune a interferências de Wi-Fi e bloqueios de firewall.
3. Áudio Digital HDMI Integrado ao PipeWire
O computador host cria um sink virtual no PipeWire (Raspberry_Pi_HDMI_Audio), capturando PCM estéreo a 48 kHz e transmitindo via codec Opus de baixa latência (UDP 5004). O som é decodificado e reproduzido diretamente pelas caixas da TV ou monitor através do conector HDMI.
4. Analisador de Espectro FFT de 512 Pontos em Tempo Real
Quando o streaming de vídeo da área de trabalho é pausado e há música tocando, um motor matemático de FFT Cooley-Tukey com janela de Hann calcula a energia de 24 bandas logarítmicas de frequência. Um multiplexador de hardware chaveia a saída HDMI para exibir um visualizador dinâmico e responsivo a 30 FPS na TV (evitando que a tela fique apagada) e espelha o resultado no painel Web em Canvas.

5. Central de Mídia IoT & 100% de Execução em RAM
O appliance incorpora um receptor UPnP/DLNA (estilo Chromecast), permitindo tocar arquivos de mídia da rede doméstica direto na tela. Todo o sistema operacional roda descompactado na memória RAM em um initramfs minimalista de apenas 32 MB construído com Buildroot e Musl libc. O cartão micro-SD é desvinculado após o boot, eliminando qualquer risco de desgaste ou corrupção ao puxar o cabo da tomada.

📊 Comparativo Técnico de Bancada
| Solução | Taxa de Quadros | Latência | Uso de CPU no Pi Zero | Estabilidade |
|---|---|---|---|---|
| GUD USB Display (Legado) | 5–12 FPS | > 250 ms | 100% (gargalo) | Tearing severo |
| VNC / RDP Mirror | 15–25 FPS | 80–150 ms | 75–90% | Artefatos de bloco |
| Ext-Monitor (Rust + VideoCore IV) | 30–60 FPS | < 1 ms (Bulk) / < 15 ms (UDP) | ~0.8% | Zero Tearing / Fluido |
🎁 Código Aberto e Documentação Técnica (Licença MIT)
Fiz esse projeto para resolver uma necessidade da minha bancada, me diverti demais enfrentando os limites do silício e decidi disponibilizar a solução completa em código aberto com licença MIT para quem quiser montar o seu monitor secundário ou central IoT:
- 🔗 Repositório Oficial no GitHub: github.com/programandosolucoes/ext-monitor
- 📦 Release v2.3.0 Final Congelada: v2.3.0-final
- 📖 O Livro do Ext-Monitor (20 Blueprints): LIVRO-EXT-MONITOR.md
- 📘 Manual de Operação Completo (Inglês): OPERATION-MANUAL.md
Se você tiver um Raspberry Pi Zero na gaveta ou estiver procurando uma segunda tela ágil e gratuita para o seu Linux ou Windows, teste o projeto e compartilhe suas impressões!