Configurando um sistema retro com saída para TV antiga: o guia que eu deveria ter encontrado antes de perder dois dias
A primeira coisa que todo mundo faz errado é comprar um microcontrolador e uma tela sem pensar na resolução real que o televisor antigo consegue renderizar. Você vai tentar rodar coisas em 240p achando que funciona, mas a maioria dos TVsets dos anos 80 e início dos 90 têm problemas sérios de sincronia com formatos modernos. Eu já passei por isso. Comprei um PiPico W, conectei um display OLED de 128x64 e achei que ia funcionar como um mini console portátil. Não funcionou. A tela não respondia aos comandos RGBRAW porque o driver estava mapeado errado no código e o sinal saía fora da tolerância de vídeo composto que o TV aceita.
Por que um retro tv pixel console ainda faz sentido em 2024
A ideia central é simples: você usa hardware barato — geralmente um ESP32, STM32 ou até um Arduino — para gerar sinais de vídeo compatíveis com TVs CRT ou LCDs antigos via entradaComposite, S-Video ou VGA. A vantagem prática é que você consegue rodar jogos, demos e interfaces de baixa resolução com controle total sobre cada pixel. Não é sobre nostalgia. É sobre ter um sistema onde você sabe exatamente como cada frame é construído, linha por linha. O problema é que a maioria dos tutoriais que aparecem online ignoram três coisas que vão te travar na prática: latência de processamento do microcontrolador, a tolerância real do protocolo de vídeo do seu TV específico, e a falta de um buffer adequado na memória RAM do chip. Se você não considerar esses três pontos, vai ter uma imagem tremendo, cores erradas ou nada funcionando de forma consistente.
O que você realmente precisa saber antes de começar
Vamos colocar as peças na ordem certa, porque a ordem que os tutoriais costumam apresentar é completamente invertida e isso te faz gastar dinheiro à toa. Passo 1: Defina a resolução e o formato de vídeo que seu TV aceita. A maioria das TVs CRT dos anos 90 trabalha bem com 240p ou 288p progressivo. Alguns aceitavam 480i via composite. TVs de linha mais cara, como as Trinitron da Sony, tinham entradas component (YPbPr) e conseguiam imagens muito mais nítidas. Você precisa verificar o manual do seu TV ou testar com um dispositivo conhecido, como um videogame da época, para mapear o que ele suporta. Eu descobri isso da forma difícil quando meu TV LG de 1998 recusava qualquer sinal acima de 240p. O resultado era uma tela azul sem synchronize.
Passo 2: Escolha o hardware certo. Um ESP32-S3 tem dois núcleos e 8MB de RAM interna, o que é suficiente para buffers de vídeo de 240x240 a 60fps com folga. Um STM32F407 também funciona e é mais barato, mas exige que você gerencie o clock manualmente. O Arduino Uno simplesmente não aguenta gerar sinal de vídeo complexo em tempo real — a menos que você use um esquema muito simplificado com apenas alguns pixels. Eu recomendo o ESP32-S3 DevKit para quem está começando. Custa entre 15 e 25 dólares em revendas como AliExpress ou Amazon. Passo 3: O circuito de saída de vídeo. A saída mais comum é composite RGB via resistores. Você precisa de um network de resistores com valores precisos para mapear os níveis de voltagem do GPIO do microcontrolador para os níveis de vídeo padrão (0V para preto, 0.7V para branco). A fórmula básica é usar resistores de 330 ohms, 470 ohms e 1k ohms em configuração ladder. Eu usei uma calculadora online de resistor DAC para montar a rede correta, e o resultado foi uma imagem com contraste aceitável em menos de 10 minutos. Sem o network correto, você vai ter cores lavadas ou saturadas demais.
Passo 4: O software. A biblioteca mais usada para isso é a Adafruit_GFX combinada com a função de geração de vídeo por interrupt timer. Mas aqui vai o detalhe que ninguém conta: você precisa configurar o timer para disparar exatamente na frequência de linha do seu modo de vídeo escolhido. Para 240p progressivo, isso significa cerca de 15734 Hz de frequência de linha. Se o timer estiver fora disso, a imagem vai andar horizontalmente ou tremeluzir. Eu configurei usando o timer 0 do ESP32 com pré-divisor de 80, e o resultado foi estável a 60fps com uso de CPU em torno de 35%.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Retro tv pixel console: o que eu aprendi na prática
Aqui está o problema que eu encontrei e que levou horas para resolver: quando eu tentava renderizar sprites com transparência usando a biblioteca padrão, a imagem inteira sacode a cada quadra. O motivo é que a biblioteca fazia blit pixel a pixel sem usar DMA. A solução foi escrever um pequeno driver que usa o DMA do ESP32 para copiar o buffer de vídeo diretamente para os pinos GPIO, liberando o CPU para outras tarefas. Com isso, o FPS subiu de 30 para 60 de forma consistente e a oscilação desapareceu. Outra pegadinha: a maioria dos cabos composite baratos que você compra no Mercado Livre ou AliExpress têm blindagem insuficiente. O sinal fica cheio de ruído, especialmente se o seu TV estiver perto de fontes de alimentação switch-mode ou monitores. Eu troquei o cabo por um com blindagem trançada e o problema de ruído sumiu. Cabos composite custam entre 3 e 8 dólares. Vale o investimento.
Limitações reais que ninguém mentiona
Este setup não é para quem quer rodar emulação de consoles avançados. Um ESP32 consegue rodar jogos de NES e Game Boy com boa performance, mas vai sofrer muito com SNES, Genesis ou PlayStation. A RAM é o gargalo principal — 8MB são poucos para buffers de frames maiores. Se você precisa de algo mais potente, considere usar um FPGA como o MiSTer, que custa cerca de 60 dólares e roda emulação de praticamente qualquer console até Saturn e PS1 sem problemas. Também é importante saber que a qualidade da imagem depende diretamente do seu TV. TVs CRT de qualidade decente mostram detalhes que LCDs modernos não conseguem reproduzir porque os processadores de imagem dos LCDs aplicam upscaling que introduz artefatos. Se o seu TV for um LCD genérico dos anos 2010, a imagem pode parecer borrada ou com ghosting. Nesse caso, usar uma conexão VGA com um adaptador LCD antigo de monitor pode dar resultado melhor.
A montagem física também é uma armadilha. Cabos soltos, soldas frias e conexões mal feitas são a causa número um de problemas que parecem ser de software mas são puramente hardware. Eu perdi uma tarde inteira caçando um bug que não existia, só para descobrir que um dos pinos do conector GPIO estava mal soldado. Um multímetro resolve isso em dois minutos.
Links e recursos
Para o código base, o repositório do projeto ESP32-Video-Out no GitHub é um bom ponto de partida. Ele inclui exemplos de vídeo composite e S-Video. A documentação da biblioteca esp32-composite também é útil. Para cálculo de resistores DAC, o site circuit-valley.com tem uma calculadora confiável. E se você quiser ver o que outras pessoas construíram, o subreddit r/retrobitting tem projetos similares com discussões técnicas detalhadas. O download do firmware exemplo que eu uso no meu projeto pessoal está disponível no meu repositório. É um arquivo .bin que você Flasha via esptool.py. Leva cerca de 30 segundos. A configuração inicial é feita editando um arquivo config.h onde você define resolução, frequência e mapeamento de pinos.
Se você decidir seguir por esse caminho, comece simples. Um único quadrado verde piscando na tela já é uma vitória. O resto vem com prática. Eu levei uns três meses para ter algo que rodasse jogos de forma decente, mas depois disso cada novo projeto fica mais rápido porque você já conhece os pontos de falha.