terça-feira, setembro 04, 2018

Display OLED de 0,96" com Conector de 6 Pinos

Já faz algum tempo que falei aqui sobre um display OLED de 0,96" com conexão I2C. Recentemente resolvi comprar mais alguns e acabei comprando um modelo um pouco diferente, com um conector de 6 pinos e possibilidade de uso com I2C, "SPI 4 pinos" e "SPI 3 pinos". As informações que achei nos tubos da internet não foram muito completas (a maioria são tutoriais do tipo "ligue assim e use a biblioteca da Adafruit"), documento aqui as minhas descobertas e conclusões.

Existem variações deste display com outros nomes nos pinos e com um sétimo pino. Não testei estes modelos, mas coloco no final o que descobri sobre eles.

Displays para todos os gostos


Além dos vários posts incompletos na internet, a minha principal fonte foi o datasheet do controlador SSD1306.

A primeira coisa importante são as anotações na traseira do display, que indicam como configurar o modo de comunicação.  O display vem de fábrica configurado para "SPI 4 pinos", para os outros modos você terá que usar um ferro de solda e se arriscar a danificar o display.

Configuração de fábrica
Independente do modo, os pinos GND, VCC e RES correspondem a terra, alimentação (3,3 ou 5V) e reset. O reset do módulo é feito colocando o sinal RES em nível baixo por um pequeno período de tempo. Isto pode ser feito através de uma saída digital ou ligando o sinal a VCC por um resistor de 10K e à terra por um capacitor de 100nF (para gerar um único reset quando o display for alimentado).


Os códigos de exemplo estão no github para não ocuparem espaço demais aqui no post.

Modo "SPI 4 pinos"

Como dito, este é o modo padrão. As conexões a serem feitas são:

SCL: SCK da SPI do microcontrolador
SDA: MOSI da SPI do microcontrolador
D/C: Nível alto indica dados, nível baixo indica comando. Ligar a uma saída digital do microcontrolador.

Pois é, o "SPI 4 pinos" usa apenas três pinos. Como não existe transferência de dados do display para o  microcontrolador, o pino MISO da SPI não é conectado.

 Os 8 bits de dados devem ser shiftados do bit mais significativo ao menos. Os bits são registrados no display na borda de subida do clock. Isto corresponde ao modo 0 do SPI (padrão no Arduino).

Reparar a ausência de um pino de seleção. O display considera que os dados na SPI são sempre para ele. Ou seja, não dá para ligar outros dispositivos na SPI. A versão do display com conector de 7 pinos retira esta limitação acrescentando um sinal CS que precisa estar em nível baixo para o display ser selecionado.

O código que eu escrevi para testar com o Arduino é uma adaptação do que usei para a versão I2C. As conexões estão nos comentários.

Modo "SPI 3 pinos"

Para usar este modo precisamos mover o resistor R4 para R2 (ferro de solda, pinça, lupa e uma mão firme são necessários).

Alem de torto, R2 não é o resistor original, que caiu no .chão e não foi mais encontrado
O sinal D/C deve ser mantido em nível baixo, bastam duas conexões:

SCL: SCK da SPI do microcontrolador
SDA: MOSI da SPI do microcontrolador

Neste modo devem ser shiftados 9 bits, sendo o primeiro o indicador de dado ou comando. Por um lado esta opção reduz a quantidade de conexões, por outro tem o problema de usar a SPI para enviar 9 bits. Em muitos casos isto vai impedir o uso do hardware de SPI do microcontrolador, obrigando a usar "bit banging" (pulsar manualmente os sinais).

Código

Modo I2C

Para usar este modo precisamos mover o resistor R3 para R1 e fazer um curto no lugar de R8 (ferro de solda, pinça, lupa, um pedaço de fio de wire-wrap e uma mão firme são necessários).

Deu tanto trabalho para soldar direito que acabei danificando o display

O sinal D/C passa a ser a seleção do endereço: nível baixo 0x3C, nível alto 0x3D.  Os sinais SCL e SDA devem ser ligados ao sinais correspondentes no microcontrolador.

Feita a alteração, podemos usar o código do meu post original tomando o cuidado com os sinais RES e D/C.



Nenhum comentário: