sexta-feira, 30 de setembro de 2016

Displays OLED 128x32 com controlador SSD1306

No post anterior, havia comentado sobre os displays OLED de 64x32 e os problemas que encontrei. Quando fiz o pedido dos displays de 64x32 também pedi de 128x32, assim, dando continuidade, segue o post sobre os displays OLED.

Display OLED de 128x32 acima e 64x32 abaixo. Tem  a mesma pinagem e também é extremamente pequeno.

Vista do lado inferior. Neste display também retirei os resistores de pull-up de 4k7 do barramento I²C e o regulador de tensão. Nesta placa há lugar para um resistor de 0R (R5) para contornar o regulador.

Adaptador para displays OLED com interface I²C usados no LaunchPad. Ele já tem montados os resistores (2k) de pull-up do barramento I²C embaixo da resina epoxi cinza.

Launchpad e um MSP430G2230 com um firmware de teste acionando o display OLED de 64x32.

Assim como no display de 64x32, o de 128x32 também tem o mapeamento do OLED diferente: usa somente a segunda metade da memória de display. Outra traquinagem que descobri é que normalmente os displays de 128x64 usam as linhas (Rows) de forma alternada. Na inicialização do controlador SSD1306 há um comando que define estes parâmetros (Comando 'Set COM pins hardware configuration', 0xDA, bit 5 COM Left/Right remap e bit 4 COM pin configuration).


Linhas alternadas como é normalmente feito em displays de 128x64.

Linhas sequenciais usadas no display de 128x32.


Bit 4 (COM pin configuration) erroneamente configurado para linhas alternadas. Note que as linhas ímpares do bitmap dos caracteres não é mostrada reduzindo o seu tamanho pela metade.
Bit 4 configurado para linhas sequenciais. Note que, assim, os caracteres são mostrados corretamente. O firmware usado é exatamente o mesmo usado no display de 64x32, apenas com este bit ajustado para linhas sequenciais.




terça-feira, 27 de setembro de 2016

Displays OLED 64x32 com controlador SSD1306

Finalmente chegaram os displays OLED 64x32 brancos que havia pedido no Aliexpress. São incrivelmente pequenos e, junto a placa com os componentes auxiliares, são um pouco maior que um DIP de 8 pinos.

Display OLED ao lado de dois PIC de 8 pinos. Veja como é pequeno.
Face inferior. Retirei o regulador de tensão contornando com um resistor de 1R e retirei os resistores de pull-up de 4k7 da interface I²C.
Display em ação com uma placa controlada por um PIC16F1503.
Placa com o MSP430F2230. Menor placa de desenvolvimento que você já viu!

Estes displays usam o famoso e bem documentado controlador SSD1306, porém o mapeamento dos pixels é diferente e me custou algumas horas para descobrir como era. Normalmente o SSD1306 é usado com displays com resolução de 128x64 usando toda sua memória gráfica de 1024 bytes, mas quando o OLED tem menos pixels (64x32 neste caso) o fabricante do OLED define como os pixels serão ligados ao controlador.

Mapa do display para a resolução normalmente usada de 128x64.
Mapa para este display. Note que por ter menos pixels, somente as páginas 4 a 7 e colunas 32 a 95 são mostradas. Isso é definido pelo fabricante do OLED, portanto podendo variar.
Há vários métodos para escrever um caractere nestes displays, o que uso consiste definir na inicialização o sentido de escrita de cima para baixo e da esquerda para a direita. Antes de enviar os bytes contendo os pixels do caractere, envio os comandos de início e final das páginas e colunas, formando uma pequena janela do tamanho exato do caractere (neste caso 2 páginas por 8 colunas, ou 16x8 pixels). Em seguida, aponto para o endereço correspondente do caractere na tabela na memória do microcontrolador e envio os bytes correspondentes.
Exemplo mostrando a janela bem como a ordem de escrita.








sexta-feira, 16 de setembro de 2016

Reaproveitando de telas LCD de Note/Net books

  Num post anterior, havia comentado sobre o reaproveitamento de telas LCD de Note/Net books com uma placa com uma placa baseada no IC MT6820-B que ainda não chegou, mas outra que havia pedido uma semana depois veio antes, baseada no IC RTD2271. Esta tem entrada VGA, DVI e áudio analógico.
       Testei com duas telas LCD que tenho, uma de um eeePC1005 da Asus de 1024x600 (modelo HSD100IFW1-F da HannStar) e outra de um notebook desconhecido de 1280x800 (modelo CLAA141WB05A da Chunghwa).
  Assim como a outra placa, esta tem um header de 30 pinos para o barramento LVDS mais a seleção de alimentação da tela, que pode ser de 12V, 5V ou 3,3V (esta última porcamente derivados dos 5V através de dois diodos). A alimentação externa é feita com uma fonte de 12V que pode ser a própria do computador. Internamente, ela tem um regulador chaveado de 5V e um linear exclusivo para o RTD2271 de 3,3V. A pinagem deste header (CN5) é igual ao da placa baseada no MT6820-B, com exceção dos dois primeiros pinos cuja função está invertida.

Foto da placa no anúncio do Aliexpress.

Placa que veio. Mesma funcionalidade, mesmos conectores e pinagem. O controlador é o RTL2271 em vez do RTL2261 e o amplificador de áudio é o NS4268 (Chaveado, classe D) em vez do SA7496  (Linear, classe AB).
Conectores. Os postes de parafusos, coloquei 3 que tinha de sucata para facilitar a montagem.
         A interface de controle usa 6 botões e um LED bicolor, usei uma placa que tinha de um monitor LCD antigo que só tem 4, assim não uso o botão AUTO (cuja função está disponível no menu) e POWER. Troquei o LED bicolor por um redondo e mais brilhante. Usando a porta VGA,  o RTD2271 sempre faz o ajuste automaticamente.

Placa de interface com 4 botões e LED bicolor com cabo devidamente modificado.
Placa de interface montada sobra a placa RTD2271
        O áudio é bem simples (IC NS4268), amplificador chaveado classe D stereo de 3W com apena os controle de volume pelos botões UP e DOWM.
        O menu de controle é bem simples e funcional, tendo seleção de entrada (VGA, HDMI ou automático), controle de volume, calibração de cor, temporizações no modo VGA e seleção de linguagem.
        Se você for comprar esta placa, compre com o teclado e um jogo de cabos LVDS. O teclado que usei funcionou mas ficou sem dois botões e os cabos LVDS usados vieram de computadores desmontados sendo que tive que adaptá-los mudando alguns pinos do conector da tela e na outra extremidade, crimpar os fios do conector do header de 30 pinos (CN5), alimentação e backlight (CN3).



Ligando a tela do eeePC à placa RTD2261:

        A tela do eeePC usa um backlight de LED com o inversor integrado à mesma. Ela usa 3,3V para o controlador e 5V para o backlight. Em vez de ligar os 3,3V no header de 30 pinos (CN5, como é comumente feito), liguei no header de seleção de tensão junto com os 5V. O controle do backligh é feito por um sinal PWM e um de habilitação, liguei os dois juntos no pino 3 de CN3 da placa RTD2271 pois esta tem controle por tensão analógica, assim o brilho sempre fica no máximo.

Pinagem do conector da tela LCD HSD100IFW1-F, note a importância de ter a documentação da tela.
Tela LCD HSD100IFW1-F com o cabo LVDS adaptado e na outra extremidade com os devidos conectores de sinal LVDS, alimentação e backlight.

















Detalhe do conector da tela LCD.
Tela LCD HSD100IFW1-F ligada à placa RTD2271.
Tela LCD HSD100IFW1-F em operação, usando a interface DVI.
Menu principal.
Controle de volume.


Ligando a tela de 1280x800 à placa RTD2261:

        Esta tela usa apenas uma lâmpada de cátodo frio para o backlight, requerendo um inversor apropriado. Usei um retirado de um notebook velho. Fiz um cabo para ligá-lo ao CN3, alimentado pelos 12V. Assim como a tela anterior, ficou sem o controle de brilho por PWM, ficando este também no máximo.
        A alimentação do controlador da tela LCD é de somente 3,3V, que vem do header de 30 pinos (CN5), mais simples que a anterior.

Pinagem do conector da tela LCD CLAA141WB05A. Note que os sinais LVDS são os mesmos.
Inversor da lâmpada de cátodo frio com o cabo devidamente modificado.

Detalhe do conector da tela LCD.

Tela LCD CLAA141WB05A em operação.

        Tabela de resoluções suportadas segundo a documentação:

Resolução                  1 2 3 4
1366x768 único de 6 bits   0 0 0 0
1280x1024 duplo de 8 bits  1 0 0 0
1024x768 único de 8 bits   0 1 0 0
1024x768 único de 6 bits   0 0 1 0
1366x768 único de 8 bits   0 0 0 1
1920x1080 duplo de 8 bits  1 0 0 1
1280x800 único de 6 bits   0 1 1 0
1440x900 duplo de 8 bits   0 1 0 1
1680x1050 duplo de 8 bits  0 0 1 1
1024x600 único de 6 bits   0 1 1 1

        Esta tabela está com algumas discrepâncias pois para 1024x600x6bits de cor fecha-se os jumpers 2, 3 e 4 mas só funcionou com 2 e 3 somente. Mesmo para 1280x800x6bits de cor, era para ser o 2 e 3 mas funcionou com 1, 2 e 3.