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.

Bancada de Trabalho com o Ext-Monitor Operando em Dual Monitor
Bancada real de testes: Raspberry Pi Zero W estendendo o desktop Wayland em monitor secundário via cabo único USB

🎯 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.

Placa Raspberry Pi Zero com conexões USB e HDMI
Conexão física anti-erro: alimentação e dados no conector Micro-USB OTG central e saída digital mini-HDMI

🛠️ 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.

Painel Web com Visualizador de Áudio Realtime Canvas
Web Dashboard v2.3.0: controle de bitrate, telemetria em tempo real e visualizador de espectro FFT em Canvas 30 FPS

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.

Splash Screen Quadrilíngue do Ext-Monitor na TV
Tela de boas-vindas quadrilíngue com QR Code dinâmico, telemetria de rede e leitura VESA EDID do monitor

📊 Comparativo Técnico de Bancada

SoluçãoTaxa de QuadrosLatênciaUso de CPU no Pi ZeroEstabilidade
GUD USB Display (Legado)5–12 FPS> 250 ms100% (gargalo)Tearing severo
VNC / RDP Mirror15–25 FPS80–150 ms75–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:

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!