terça-feira, março 01, 2022

Raspberry Pi Pico: O Incrível PicoVGA

Continuando a minha busca por um caminho para implementar um terminal alfanumérico com o Raspberry Pi Pico, encontrei o extraordinário projeto PicoVGA. Trata-se de uma biblioteca bastante completa de geração de vídeo para monitores compatíveis com VGA, acompanhada de exemplos simplesmente incríveis.

Demonstração do PicoVGA


A primeira coisa a comentar é o hardware. A solução de geração de vídeo no SDK oficial trabalha com 16 bits por ponto, correspondendo a 32 níveis (5 bits) para vermelho, verde e azul (um bit não é usado atualmente) e gera sinais de sincronismo horizontal e vertical separados. O PicoVGA trabalha com apenas 8 bits por ponto (8 níveis de vermelho, 8 níveis para verde e 4 níveis para azul) e gera um sinal de sincronismo horizontal e vertical combinado (CSYNC). Com isso temos um hadware bem mais simples, exigindo menos pinos do RP2040 (ao custo de menos opções de cores):

Hardware para o PicoVGA (imagem adaptada do site oficial)

Isto me permitiu usar na montagem o RP2040 Zero (e ainda sobraram vários pinos após ligar ainda a serial e um buzzer). A montagem funcionou de primeira com o exemplo dos balões (se bem que eu tinha invertido vermelho com azul).

Minha montagem

O código suporta diversas resoluções (inclusive acima de 640x480) e um monte de formatos para a memória de vídeo (incluindo gráficos com 1/2/4/8 bits por ponto e alfanumérico colorido e monocromático). Estes formatos podem até ser combinados em uma única tela. É possível também usar até 4 planos com transparência e sprites (figuras que se sobrepõe ao fundo). O código de vídeo gera no core 1 do RP2040, deixando o core 0 livre para a aplicação. Overclock é realizado automaticamente se necessário para a resolução de vídeo.

A biblioteca é ainda capaz de gerar sinal para TV (que tenha entrada SCART) e som PWM. Estas duas coisas não me interessam no momento.

As capacidades parecem ser bem acima do que preciso para desenvolver o terminal. O exemplo "Matrix Rain" gera vídeo alfanumérico colorido com 60 linhas (!) de 80 colunas.

Ainda estou no começo de entender como a biblioteca funciona. Um detalhe é que a geração dos bytes a enviar para a PIO a partir do conteúdo da memória de vídeo está codificada em assembly.

Um possível problema é que a biblioteca e exemplos não é compilada conforme o esquema usado pelo SDK oficial. O projeto inclui um subconjunto do SDK e usa makefiles (ao invés de CMake) para especificar o que deve ser compilado. Preciso decidir qual dos dois esquemas vou usar no meu projeto.

Nenhum comentário: