DSP Lab 02 – Implementação de uma biblioteca e teste do display OLED 96×16
Neste Lab iremos descrever o processo de implementação de uma biblioteca de caracteres para comunicação com o display OLED de 96×16 pixels, que utiliza o controlador SSD1306, montado na placa de desenvolvimento eZDSP C5515.
Display OLED
Displays OLED (Organic Led Emitter Diode) são feitos de um tipo de material orgânico (contêm carbono) que emite luz quando excitado por uma corrente elétrica. A imagem abaixo, retirada do site allaboutcircuits.com, ilustra as camadas de construção de um display OLED.
Estes displays não necessitam de uma retro iluminação e filtros para luz assim como é necessário nos displays de LCD comuns, o que os torna mais eficientes, simples de produzir e mais leves, além da possibilidade de serem construídos de forma flexível ou dobrável. A figura abaixo ilustra este modelo de display na forma flexível.
Os displays de OLED apresentam as seguintes vantagens em relação aos de LCD:
- Maior qualidade de imagem – Melhor contraste, alto brilho, ótimo ângulo de visão, grande variedade de cores e uma maior taxa de atualização.
- Baixo consumo de energia.
- Fácil construção que permite telas mais finas, flexíveis e transparentes.
- Melhor durabilidade – São mais duráveis e podem opera em uma maior faixa de temperatura por não apresentar o cristal líquido em sua construção.
O Display montado na eZDSP
A ferramenta para desenvolvimento com DSP’s eZDSP C5515 da Spectrum Digital possui um display OLED de 96×16 pixels, comunicação via protocolo I2C, montado na placa principal para testes de comunicação serial e como uma forma de visualização de variáveis e interface com o usuário.
Nos códigos originais disponibilizados pela Spectrum Digital para manipulação do display, não era possível escrever uma cadeia de strings e envia-los para o controlador SSD1306 de uma forma intuitiva. Ao invés disso, uma combinação de 4 bytes deveria ser escrita e enviada ao display para a montagem dos caracteres, bit a bit, individualmente na tela. A imagem abaixo ilustra uma parte do algoritmo original para a combinação dos bytes na escrita de um caractere.
Outro fator que dificultou a interação com o display foi que a sequência de bytes, como na imagem acima, originalmente era escrita na ordem invertida da montagem do caractere.
Enviando um caractere para o Display OLED
O display apresenta uma configuração de 96×16 pixels (96 colunas x 16 linhas) onde podemos indicar 2 linhas de textos de 96×8 pixels cada uma que são chamados de PAGE 0 e PAGE 1 pelo datasheet do controlador SSD1306. A imagem abaixo ilustra o tipo de endereçamento do ponteiro de memória do display no modo horizontal para uma tela de 128×68 pixels.
Para mostrar um caractere por inteiro e com boa nitidez, o display necessita de 5 bytes de dados dispostos em 8 linhas que formam uma PAGE na memória do display. A imagem abaixo ilustra a formatação básica de uma PAGE de memória do controlador SSD1306.
Na elaboração desta biblioteca foi necessária uma ferramenta que gerasse a combinação padrão dos caracteres no mesmo momento em que eles eram montados. Para isso, algumas formulas e arranjos de formatação condicional de células foram elaborados no Excel como forma de facilitar a construção da biblioteca. O Gif abaixo ilustra o funcionamento desta planilha que pode ser baixada neste link.
Diante da imagem acima, observamos então que para o caractere 2 ser mostrado no display nós precisamos enviar a sequência {0x42, 0x61, 0x51, 0x49, 0x46} ao controlador. Assim, os pixels de cada banco serão ligados individualmente como na imagem.
Utilizando o mesmo método e considerando os outros caracteres mais utilizados, um vetor com a sequência de cada caractere foi elaborado com a ajuda da planilha descrita acima. Na imagem abaixo podemos observar uma parte deste vetor.
Para imprimir um caractere no display, apenas chamamos a função text() e passamos como parâmetro o que queremos visualizar na tela, assim como é visualizado na imagem abaixo.
No corpo da função text(), os caracteres que são passados como parâmetro tem o seu tamanho dimensionado. Dentro do laço for() cada caractere é passado como parâmetro para a função display_char() na ordem invertida (do último para o primeiro caractere). Esta função pode ser observada na imagem abaixo.
Na função display_char() cada caractere recebido é convertido para inteiro, subtraído em 32 unidades que é o número decimal de começo dos caracteres na tabela ASCII e o resultado é multiplicado por 5 devido a cada caractere em nossa tabela ser composto por 5 bytes de dados, como já descrito acima. A composição desta função pode ser verificada na imagem abaixo.
A operação descrita acima gera um número que é o index de busca no vetor de caracteres. Por exemplo.
– Número decimal para a letra A na tabela ASCII -> 65
– Valor da variável index -> index = (65 – 32) *5 = 165
Se contarmos 165 bytes de dados no vetor font[] estaremos apontando para o primeiro byte que formará a letra A. Estes 5 bytes são passados dentro do laço for() para a função OSD9616_send() que envia os dados no barramento I2C do DSP.
Algoritmo e testes
O algoritmo base para este teste foi retirado do arquivo original de testes da plataforma de desenvolvimento eZDSP da Spectrum Digital. As funções inseridas e o vetor de caracteres construído já foram descritos acima. O algoritmo se encontra descrito abaixo. Créditos e comentários traduzidos foram inseridos para melhor compreensão.
[crayon-667051b77f395442330574/]
Conclusão
Neste Lab implementamos uma biblioteca básica para fácil interação com o display OLED de 96×16 pixels utilizando o Code Composer Studio. Além disso, entendemos melhor como é o procedimento de inicialização e os principais comandos a serem enviados para este controlador para que o sistema funcione adequadamente. No futuro, outros protótipos mais avançados serão feitos utilizando este DSP, o display e a biblioteca aqui descrita.