terça-feira, abril 06, 2021

Raspberry Pi Pico: Gerando Vídeo Composto

Uma (das muitas) diferenças óbvias entre o Raspberry Pi Pico e os outros modelos de Raspberry é a ausência de uma saída de vídeo (lembrando, o PiPico é uma placa de microcontrolador e os demais são "computadores em uma única placa").

Mas, com o acréscimo de alguns resistores e um pouco de engenhosidade de software, é possível gerar vídeo com o PiPico. Neste post e no próximo vamos ver duas formas de fazer isso.


O sinal de vídeo composto é algo bem antigo (foi criado na metade dos anos 50), mas que sobrevive até hoje. Foi criado pensando (originalmente) na transmissão de vídeo monocromático para apresentação em um CRT (tubo de raios catódicos). Em um CRT temos um feixe de eletrons varrendo a tela, na maior parte do tempo da esquerda para a direita e de cima para baixo. Ao final de cada linha horizontal temos o retraço horizontal, onde o feixe volta rapidamente da direita para a esquerda. Ao final da tela temos o retraço vertical, onde o feixe volta para o topo.

O sinal básico transmite a luminosidade/luminância (brilho) do vídeo e indica onde devem ocorrer os retraços horizontais e verticais. Para suportar cores este sinal é composto com a informação de crominância, que é modulada em um frequência. A forma como é codificada a crominância e como é feita a composição varia conforme o sistema de cores, aqui vamos tratar apenas da geração de vídeo monocromático.

O aspecto do sinal de vídeo é o seguinte:

A geração de um sinal de vídeo composto requer:

  • Seguir os valores de tensão indicados, o que é conseguido usado divisores resistivos
  • Gerar as várias intensidades para a luminosidade (se for desejado suportar tons de cinza), o que pode ser feito usando um DAC integrado ou (como faremos) usando um DAC feito de resistores
  • Observar as temporizações de sincronismo, o que é possível mesmo com microcontroladores com clock de poucos megahertzs
  • A geração dos pontos em uma velocidade que permita um número satisfatório de pontos por linha.

A geração "na unha" de sinais de vídeo por microcontroladores é bem antiga, existem vários exemplos com o ATmega e outros. O meu velho amigo ZX81 gerava por software os sinais de sincronismo. A parte crítica é a geração dos pontos, pois isso exige uma maior velocidade. É aqui que o PIO e o DMA do PiPico vão dar uma mão.

O projeto que eu vou usar como base é de Dean Belfield, ele pode ser encontrado neste artigo e no github. O resultado é uma área útil de vídeo com 192 linhas, cada uma com 256 pontos, com 16 tons de cinza. O único problema é que o código dele gera vídeo no formato PAL e, aqui no Brasil, o vídeo monocromático segue o padrão NTSC (para o vídeo colorido foi criada uma mistura entre os dois, resultando no PAL_M).

A diferença ente NTSC e PAL (no vídeo monocromático) está no número de linhas e nas temporizações, o que resulta em frequências verticais diferentes:


Portanto teremos menos linhas, cada uma ligeiramente mais curtas. Isto é obtido fazendo algumas alterações no código:

  • Uma linha passa a ser composta por 379 "pontos" ao invés dos 382 originais
  • A margem antes da imagem foi reduzida de 18 para 15 "pontos"
  • Na contagem das linhas para compor um quadro as bordas foram reduzidas: a borda superior de 63 para 42 linhas e a borda inferior de 50 para 21, totalizando as 50 linhas de diferença entre PAL e NTSC.
O código final pode ser visto no meu github. A montagem está no artigo do Dean Belfield.

No próximo post vamos ver como gerar vídeo VGA.

Nenhum comentário: