Explorando o módulo OV7670-FIFO: Video Frame Buffer

Este post faz parte da série Explorando o módulo OV7670-FIFO. Leia também os outros posts da série:

Olá, caro leitor. Este artigo apresenta o desenvolvimento dos módulos para configuração do OV7670. Para tal, são utilizados os módulos apresentados no primeiro artigo que tem função de comunicação via interface SCCB. O projeto pode ser acessado neste link.

 

 

Estrutura do módulo OV7670 e conexão com o buffer AL422

 

No primeiro artigo foi apresentado o método de acesso do módulo OV7670, utilizando a interface SCCB. Como destacado, a interface SCCB posibilita transferir informações e será utilizada para configurar o módulo OV7670. O diagrama de blocos do sensor é mostrado na Figura 1.

 

Estrutura do sensor OV7670 [1].
Figura 1: Estrutura do sensor OV7670 [1].

 

A partir desse diagrama é possível verificar a conexão entre a interface SCCB e o banco de registradores do módulo. Além disso, verifica-se que os registradores estão conectados com outros dois módulos: Video Timing Generator e Exposure/Gain Control.

 

O bloco Video Timing Generator tem como saída alguns sinais de controle que estão conectados diretamente no buffer AL422. Esse CI é uma memória DRAM de 3 Mbits (393.216 palavras de 8 bits) que tem função de fila (FIFO - First In First Out). Os terminais de acesso são ilustrados na Figura 2.

 

Video Frame Buffer - Pinos do buffer AL422 [2].
Figura 2: Pinos do buffer AL422 [2].

 

Segundo informações do datsheet "ching ling", a conexão entre o módulo OV7670 e o buffer é a ilustrada na Figura 3. De modo geral, a sincronização entre os sinais gerados pela câmera e a captura pelo buffer são realizados diretamente. Isto é, a saída da câmera está ligada diretamente nas entradas do buffer.

 

Video Frame Buffer - Conexão entre o módulo OV7670 e o buffer AL422 [3].
Figura 3: Conexão entre o módulo OV7670 e o buffer AL422 [3].

 

No entanto, por se tratar de uma memória FIFO, são disponibilizados sinais de controle para determinar o momento em que as informações serão gravadas e também para controlar a posição de acesso. Cabe ressaltar que ao inserir um dado no buffer um ponteiro de escrita é incrementado. O mesmo vale para leitura e para o ponteiro de leitura.

 

A seguir são destacados os sinais de controle:

  • WE (Write Enable): Habilita operação de escrita na FIFO. Observe que este sinal passa por uma porta NAND (CI 7400) para que o sinal WE do buffer seja ativado em zero somente quando WE e HREF estão em nível lógico 1;
  • WRST (Write Reset): Posiciona o ponteiro de escrita no endereço zero. Esse sinal é ativado em zero;
  • RRST (Read Reset): Posiciona o ponteiro de leitura no endereço zero. Esse sinal é ativado em zero;
  • OE (Output Enable): Habilita saída do buffer;
  • RCLK (Read clock): Sincronização para leitura de dados.

 

 

Video Frame Buffer

 

Embora tenha vários modos de operação, neste artigo será descrito apenas a configuração para que o sensor apresente como saída uma imagem no formato RGB565. A resolução da imagem será configurada como QVGA (320 x 240).

 

O início de um frame é sempre indicado pelo sinal VSYNC. Durante o período que o sinal VSYNC está ativado ocorre o processo de varredura horizontal, sendo indicado pelo sinal HREF. Como dito anteriormente, o HREF é um dos sinais de controle para gravar um dado na FIFO. Quando o sinal HREF está ativado, os bytes são transferidos na frequência no sinal PCLK. Isso é ilustrado na Figura 4.

 

Temporização de linha [4].
Figura 4: Temporização de linha [4].

 

O frame completo é ilustrado na Figura 5. Cabe ressaltar que será utilizado o padrão QVGA.

 

Temporização do frame VGA [4].
Figura 5: Temporização do frame VGA [4].

 

Por fim, cada byte transferido corresponde ao formato RBG565. Portanto, cada pixel é representado por dois bytes. As componentes R, G e B são ilustradas na Figura 6.

 

Formato de saída RGB565 [4].
Figura 6: Formato de saída RGB565 [4].

 

 

Capturando um Frame

 

Para controlar as operações na FIFO foi criado um módulo chamado Fifo.h. Esse módulo contém apenas três funções: Inicialização, Captura de frame e leitura da fifo.

 

 

A função de inicialização configura o estado inicial dos pinos de controle do buffer. Lembre-se que os sinais são ativados em zero, exceto o WE e RCLK.

 

 

Para capturar um frame é necessário monitorar o sinal VSYNC. Isso pode ser feito via interrupção ou polling. Nesse caso, utilizou-se da segunda opção.

 

A função aguarda o sinal VSYNC tornar-se zero (devido à configuração). Em seguida, reinicia o ponteiro de escrita e habilita a operação de escrita no buffer. Essa condição deve ser mantida até que o frame seja gravado inteiramente no buffer. Após essa condição, a escrita no buffer é desativada.

 

Por fim, o ponteiro de leitura é posicionado em zero e um pulso de clock é dado para efetuar tal condição.

 

 

Até esse ponto o frame está armazenado no buffer e o ponteiro de leitura está posicionado no início. Assim sendo, cada pixel pode ser obtido gerando pulsos no sinal RCLK e lendo o valor da saída. Para tal, criou-se uma função que faz a leitura de dois bytes. Para ler o frame completo basta realizar esse procedimento 76800 vezes (320x240).

 

 

 

Configuração do módulo OV7670

 

Para que o módulo opere do modo indicado neste artigo, é necessário realizar a configuração de uma série de registradores. Para facilitar as operações foi criada uma biblioteca ov7670.h. Algumas funções dessa biblioteca foram mostradas no artigo anterior: leitura e escrita de registradores.

 

 

A função de inicialização verifica se o ID e a versão do módulo ov7670. Se o retorno corresponde às informações descritas no datasheet, a configuração para o modo QVGA/RGB565 é realizada.

 

 

Para configurar o módulo na condição desejada é utilizada a seguinte função:

 

 

Vale também exibir novamente as funções de leitura e escrita dos registradores.

 

 

 

Teste da Aplicação

 

Para testar o módulo foi criada uma aplicação em C#. O software envia um comando pela porta serial para receber uma imagem. O dispositivo recebe esse comando e inicia o procedimento para capturar a imagem e retornar para o cliente. No final do processo a imagem é mostrada no software (Figura 7).

 

Tela da aplicação.
Figura 7: Tela da aplicação.

 

A seguir é mostrado o código da aplicação do microcontrolador. Algumas funções não foram apresentadas, pois tem relação direta com os recursos do microcontrolador. No entanto, você pode consultar esses arquivos neste link, e também adaptar a parte de acesso ao hardware para atender o seu microcontrolador.

 

 

No primeiro teste foi utilizado um modo de operação que exibe uma imagem de barras de cores. Tal configuração é realizada alterando os registradores COM7 e REG_SCALING_YSC. De modo geral, os bits ativados em cada registrador determinam o modo de teste e o tipo de saída.

 

 

O resultado dessa configuração é mostrado na Figura 8.

 

Test Pattern.
Figura 8: Test Pattern.

 

Agora, removendo as configurações anteriores, a imagem real pode ser capturada.

 

 

O resultado dessa configuração é mostrado na Figura 9.

 

Imagem real.
Figura 9: Imagem real.

 

 

Resultados e Discussões

 

Cabe ressaltar alguns pontos importantes. Primeiro, o datasheet não contém todas as informações necessárias. Não encontrei outra versão e a documentação tem alguns erros, como a descrição do registrador REG_SCALING_XSC. No entanto, consultando o fonte do linux e outros documentos foi possível configurar o módulo. Segundo, além das configurações realizadas a partir dos registradores, é necessário também ajustar o foco da câmera. Vale consultar este Application Note.

 

Para aqueles que já utilizaram esse módulo e desvendaram alguns mistérios, compartilhem suas experiências!

 

 

Saiba mais

 

Aplicação com câmera usando Qt5

Calibração de câmeras - Parte 1

Utilizando Câmeras em Sistemas Linux Embarcado

 

 

Referências

 

[1] Implementation Guide.

[2] AVERLOGIC FIFO BUFFER.

[3] Module schematic.

[4] Advanced Information Preliminary Datasheet.

Imagem destacada: https://en.wikipedia.org/wiki/Mode_13h#/media/File:VGA_palette_with_black_borders.svg

Outros artigos da série

<< Explorando o módulo OV7670-FIFO: Interface SCCB
Este post faz da série Explorando o módulo OV7670-FIFO. Leia também os outros posts da série:
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Fernando Deluno Garcia
Fascinado por computação, especialmente na interface entre hardware e software, me engajei na área de sistemas embarcados. Atuo com desenvolvimento de sistemas embarcados e sou docente da Faculdade de Engenharia de Sorocaba.Para mais informações: https://about.me/fdelunogarcia

2
Deixe um comentário

avatar
 
2 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
RPaulinoJr.c Costa Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
R
Visitante
R

Olá, está muito bem explanado, parabéns! Este FIFO também pode ser utilizado com outros dispositivos interessantes, como um ADC de alta velocidade, acredito que daria para ampliar limtada capacidade de ADC de um Arduino Mega, talvez com um TLC5510 (20MSPS, 8 bits) por exemplo. O fabricante do FIFO tem outros modelos de maior capacidade, vale apena ir lá conhecer: http://www.averlogic.com/product.htm

PaulinoJr.c Costa
Visitante
Paulino Costa

Parabéns, ótimo artigo.