Conectando display 128×64 no Arduino Mega

Tirar suas ideias do papel com Arduino é algo fantástico, que as vezes me faz pensar: “era isso que faltava”. Hoje temos um mundo de novas possibilidades quando se pensa em desenvolver algo divertido ou resolver um pequeno problema que nos incomoda muito.

O mundo é feito de interações, seja psicológicas ou com objetos físicos. Um display de 128×64 pontos é uma excelente tela para um aplicativo pequeno e medio, onde moderadas informações precisam ser passadas para o usuário gerando então uma Interface de comunicação com este.

Podemos com ele apresentar desde grandes textos, para pessoas que tenham dificuldade na leitura de telas comuns, e até imagens convertidas de um bmp. Portanto, se seu projeto exige boa interação com o usuário, é indispensável o uso de um display 128×64.

O display

Sem muitos segredos, abaixo algumas imagens do display, para que possamos ter melhor uma ideia de seu tamanho (eu mesmo antes de tê-lo ficava em dúvida qual suas medidas práticas).

Display lcd 128x64 com Arduino Mega
Visão de cima segurando o display lcd 128×64 conectado ao Arduino Mega
display lcd 128x64 Arduino Mega e Potenciômetro
Simplicidade de conexões entre Arduino e Display 128×64
display lcd 128x64 em funcionamento
Display 128×64 exibindo texto

As conexões

Apesar de existirem vários displays no mercado, com controladoras diferentes, não é difícil descobrir qual o padrão de comunicação deste RT12864J-1. Seguindo a tabela encontrada no site oficial do Arduino[1] podemos facilmente ver como funcionam as conexões para os diversos modelos de display e Arduinos. O display aqui usado, com o Arduino Mega usa as seguintes conexões:

Pino do Display LCD 128×64 Pino do Arduino Mega Comentários
1 GND
2 5V
3 Externo Pino do centro do trimpot
4 36 Data Instrunsion
5 35 Read / Write
6 37 Enable Signal
7 22 D0
8 23 D1
9 24 D2
10 25 D3
11 26 D4
12 27 D5
13 28 D6
14 29 D7
15 33 CCEL 1
16 34 CCEL 2
17 Reset Desconectar durante gravação
18 Externo Pino lateral do trimpot
19 5V Backlight
20 GND Backlight

O Trimpot

Basicamente um trimpot é um potenciômetro não usado por usuários. Normalmente pequenos, estão disponíveis no circuito para que possamos fazer pequenos ajustes definitivos. Nos displays LCD em geral os usamos para ajustar o brilho da imagem, e sem esse ajuste simplesmente não é possível vermos algo! Por isso, sempre cuide ao trabalhar com um display LCD, tive sérios problemas até descobrir que o trimpot é sim importante para seu correto funcionamento.

Mas o que faz um trimpot/potenciômetro?
Basicamente ele funciona como um resistor que tem sua resistência alterada de acordo com o giro de ajuste presente no componente. Simples assim.
Trimpot display LCD 128x64No nosso display, precisamos fazer as conexões dos pinos 3 e 17 no meio e lateral do trimpot respectivamente. A imagem ao lado, retirada do datasheet do display[2], ilustra tal conexão. Podemos ver que tanto um potenciômetro de 10 quanto de 20Kohms pode ser usado. Usei um de 10k.
Lembre-se que o outro pino da lateral do trimpot (que ficou livre) deve ser conectado em GND.

Potenciômetro 10k com Arduino
Potenciômetro usado no lugar de um Trimpot para ajuste da imagem do display LCD

Software utilizado

Para começar a usar o display, baixe a biblioteca e alguns exemplos aqui. Caso esse link não fique mais disponível, apenas acesse o site oficial do Arduino encontrando logo no início esse download. Se preferir você pode ainda acessar o projeto oficial no google code.

Para exibir o texto no display (que será usado em um projeto em andamento e que publicarei aqui), de acordo com a imagem do início deste post, usei o seguinte código:

#include   // library header
#include   // font definition for 14 point Arial font.
#include "SystemFont5x7.h"   // system font
unsigned long startMillis;
unsigned int iter = 0;
unsigned int iterStart = 0;

void setup(){
  GLCD.Init(NON_INVERTED);   // initialise the library
  GLCD.ClearScreen();
  GLCD.ClearScreen();
  GLCD.SelectFont(System5x7);       // select fixed width system font

  GLCD.DrawRect(0, 0, 127, 63, BLACK);
  GLCD.CursorTo(2,1);
  GLCD.Puts("IDENTIFICADOR");
  GLCD.CursorTo(3,3);
  GLCD.Puts("E BLOQUEADOR");
  GLCD.CursorTo(4,5);
  GLCD.Puts("DE CHAMADAS");
}
void loop(){}

Dicas

  • Você pode usar um Potenciômetro com outros valores além de 10kOhms. O único problema é que será difícil fazer a regulagem. Resistores em série ou paralelo podem servir para ajudar.
  • A biblioteca GLCD permite que você use imagens de 64×64 bmp e as converta para serem exibidas no display, muito interessante isso!
  • Outros pinos podem ser usados para conectar o Arduino ao display LCD, nunca se restrinja aos exemplos encontrados na internet. No entanto, precisará alterar arquivos de cabeçalho para que funcione, no Mega o arquivo é: ks0108_Mega.h

Conclusão

Antes de começar, parecia quase impossível a tarefa de conectar um display LCD “desse tamanho” no Arduino e fazer tudo funcionar. Em menos de uma hora desde o início consegui fazer o primeiro teste e vi, mais uma vez, o quão simples é trabalhar com Arduino.

Referências

[1] http://www.arduino.cc/playground/Code/GLCDks0108

[2] http://www.satistronics.com/myfiles/file/LCD/RT12864J-1.pdf

http://www.topwaydisplay.com/Pub/Manual/LM12864MBC-Manual-Rev0.1.pdf

36 Comments

  1. ola meu nome é giovan faço mecatronica em curitibanos tenho aulas com o prof. herculano

    ele falou muito bem de vc e me passou seu blog, gosto muito de eletronica entao comprei um arduino e um display quando chegar vo pidir umas dicas para programar.

    abraços.

  2. Olá Giovan,

    que bom que o Herculano indicou meu blog pra ti. Aqui tu podes conferir alguns conteúdos na área de eletrônica e principalmente na área de programação. Como vai estudar Arduino, recomendo dar uma passada no curso de programação em C que disponibilizo gratuitamente aqui: http://www.paulotrentin.com.br/programacao/curso-… . Está em andamento este curso, e o tempo é curto, mas aos poucos vou continuando.

    Assim que chegar seu display me avisa, que posso dar algumas dicas práticas de como fazer a conexão. Qual o tamanho dele?

    1. Olá Giovan,

      o que deve estar acontecendo é algum problema na regulagem do potenciômetro, você o instalou corretamente? Poderia descrever melhor o que seriam esses quadrados e pontos?

      A configuração que precisa ser feita é apenas a do potenciômetro, faz toda a diferença!

      Podes me encaminhar uma foto do display ligado?

      Abraços

  3. Olá, não entendi onde ligar o pino 17 – Reset – Desconectar durante gravação, estou colocando ele em GND.

    estou usando um arduino mega 2560 e quando rodo o programa os quadrados ficam todos acesos e nao os que quero, seria problema com o pino 17?

    1. Oi Rafael,

      desculpe a demora em responder, mas olha só, o pino 17 só atrapalha na gravação do software do computador para o Arduino.
      Seu problema parece ser simplesmente falha na configuração do trimpot (ou potenciômetro). Lembre-se que sem ele não funciona, ou quando configuramos muito brilho acontece justamente o que você citou "os quadrados ficam todos acesos".

      Testa aí e me avisa se funcionou.
      Bons estudos!

  4. Olá Paulo, boa tarde.

    Segui teu exemplo, porém cheguei a uma situação onde eu não consegui solução por enquanto.

    Após toda a montagem conforme tua explicação, o Display permanece com o BackLight aceso e os pixels do LCD todos acesos.

    Sinceramente não entendi onde eu possa ter errado, conferi toda a fiação e a posição dos pinos do display, bem como do Arduino Mega, porém o problema persiste.

    Com o Trimpot eu consigo ajustar a luminosidade dos pixels do display, mas independentemente disso eles permanecem todos acesos.

    Será que há alguma dica p/ que possa me ajudar?

    Desde já, agradeço.

    João Paulo Thomazinho

    1. Olá Joao,

      seguindo o datasheet está tudo correto mesmo, é a mesma pingagem.
      No site oficial do arduino, porém, não encontrei nenhuma referência ao seu modelo específico kxm12864j-4.
      Encontrei um pessoal discutindo sobre esse display aqui: http://open-source-energy.org/forum/showthread.ph… mas não vi nada muito conclusivo.

      Minha recomendação é que você teste essa última versão da biblioteca GLCD: http://code.google.com/p/glcd-arduino/downloads/l
      Talvez funcione.

      Você teve algum problema com o processo de compilação/upload?
      Faça os testes e me avisa se funcionou…

      Abraços

  5. Amigo, instalei a biblioteca ao arduino, peguei seu codigo e mandei compilar. deu erro de compilação In file included from C:\Users\user\Desktop\arduino-1.0.1\libraries\glcd/include/gText.h:30,
    from C:\Users\user\Desktop\arduino-1.0.1\libraries\glcd/glcd.h:40,
    from ks0108example.cpp:12:
    C:\Users\user\Desktop\arduino-1.0.1\libraries\glcd/include/Streaming.h:30: error: expected initializer before ‘&’ token
    C:\Users\user\Desktop\arduino-1.0.1\libraries\glcd/include/Streaming.h:63: error: expected initializer before ‘&’ token
    C:\Users\user\Desktop\arduino-1.0.1\libraries\glcd/include/Streaming.h:67: error: expected initializer before ‘&’ token
    C:\Users\user\Desktop\arduino-1.0.1\libraries\glcd/include/Streaming.h:78: error: expected initializer before ‘&’ token
    In file included from C:\Users\user\Desktop\arduino-1.0.1\libraries\glcd/include/gText.h:31,
    from C:\Users\user\Desktop\arduino-1.0.1\libraries\glcd/glcd.h:40,
    from ks0108example.cpp:12:
    C:\Users\user\Desktop\arduino-1.0.1\libraries\glcd/include/glcd_Device.h:85: error: conflicting return type specified for ‘virtual void glcd_Device::write(uint8_t)’
    C:\Users\user\Desktop\arduino-1.0.1\hardware\arduino\cores\arduino/Print.h:48: error: overriding ‘virtual size_t Print::write(uint8_t)’

    o que pode ser?

  6. Amigo estou tentando conectar um display lcd 16×2 no arduino, mas preciso de umas dicas com a programação. Como começar mesmo, qual o básico para ligar e escrever algo no display.

    Obrigado

  7. Amigo é o seguinte realizei algumas ligações utilizando o arduino uno e o display ks0108 ficou joia… perfeito porem quando fui passar o programa para o arduino mega fica todo falhado, e como se a tela ks0108 tivesse ficado dividida em duas !!
    voce tem ideia do q pode ser ? tenho q incluir o arquivo ks0108_Mega.h ?

    Muito Obrigado.

    1. Oi Lucas,
      desculpa a demora em responder.

      O que pode estar ocorrendo é que os pinos que você está usando para ativar cada parte do display (ele é dividido em duas partes) não estão certos.
      Se você olhar no site oficial da biblioteca, verá que temos umas mudanças na conexão do Arduino Uno/Duemilanove para o Mega:

      14 (alog0) 33 CSEL1 12 15 16 1 Chip 1 select
      15 (alog1) 34 CSEL2 13 16 15 2 Chip 2 select

      O pino 14 vai no 33 (ativa célula 1)
      E o pino 15 vai no 34 (ativa célula 2).

      Bons testes!

  8. Os erros….

    D:\programas\arduino-1.0.1\libraries\ks0108\ks0108.cpp: In member function ‘void ks0108::Init(boolean)’:
    D:\programas\arduino-1.0.1\libraries\ks0108\ks0108.cpp:505: error: ‘OUTPUT’ was not declared in this scope
    D:\programas\arduino-1.0.1\libraries\ks0108\ks0108.cpp:505: error: ‘pinMode’ was not declared in this scope
    D:\programas\arduino-1.0.1\libraries\ks0108\ks0108.cpp:511: error: ‘delay’ was not declared in this scope

  9. O meu é um 12864ZW e fiz a instalação correta como descrito acima . Corrigia a biblioteca e tudo, mas quando mando o codico ele não faz nada. Não da erro no codigo, Apenas não aparece nada ??? Alguma ideia do que possa ser????

    1. Oi Vagner,

      aparentemente seu display usa o controlador ST7920, que não é compatível com a biblioteca que estou usando neste display.
      Mas a boa notícia é que existe esta biblioteca que é compatível com esse seu display.
      Baixe-a e rode o código de exemplo, possivelmente irá funcionar.

      Por favor, passe aqui depois para dizer se conseguiu.

      Abraço

      1. O meu também é um 12864ZW … Vi o comentário do Vagner e baixei a biblioteca citada.. porém o código não compila, da erro:

        HelloWorld.ino: In function ‘void draw()’:
        HelloWorld:119: error: ‘u8g’ was not declared in this scope
        HelloWorld.ino: In function ‘void setup()’:
        HelloWorld:133: error: ‘u8g’ was not declared in this scope
        HelloWorld.ino: In function ‘void loop()’:
        HelloWorld:149: error: ‘u8g’ was not declared in this scope

        é erro na biblioteca?
        Estou usando o Arduino Mega 2560

          1. Olá Paulo, eu consegui utilizando a biblioteca U8GLIB
            tirei o comentário da linha
            //U8GLIB_ST7920_128X64_1X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); //Portas conectadas, substituir do o parenteses ao lado 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16

            coloquei o número da porta que estava do DO ao D7, en, di e rw… funcionou direitinho. Obrigada

  10. Boa tarde, consegui resolver o problema quanto às mensagens de erro, eram por causa da biblioteca. Consegui localizar um modelo semelhante ao que uso, incluindo a biblioteca, em

    http://skyduino.wordpress.com/2012/05/25/arduino-ecran-lcd12864-dealextreme-pas-chere-et-puissant/

    Agora o display acende a luz de fundo, o potenciômetro atua no controle dessa luz, mas os caracteres não aparecem, e as ligações, aparentemente, estão corretas.

  11. sketch_apr26a.cpp: In function ‘void setup()’:
    sketch_apr26a:8: error: ‘GLCD’ was not declared in this scope
    sketch_apr26a:8: error: ‘NON_INVERTED’ was not declared in this scope
    sketch_apr26a:13: error: ‘BLACK’ was not declared in this scope

    Deu esse erro, pode me ajudar?

    1. Oi Erickson,

      Vendo seu erro eu iria indicar que faltava incluir o cabeçalho da biblioteca (visto na linha 1 do código fonte acima)

      Mas pesquisei um pouco e percebi que esta biblioteca está desatualizada, ao menos a v2 que deixei no link.
      Já atualizei o link, e agora a versão correta está disponível que é a versão 3. Aproveitei e adicionei o link do projeto no google code.

      Faça o teste e, por favor, volte para dizer se funcionou. Assim podemos melhorar o conteúdo aqui do blog.

      Abraços

  12. Boa noite!
    Gostaria de saber se vc tem algum material sobre como plotar Bitmaps nesse tipo de display.
    Estou com dificuldades em converter esse tipo de imagem para plotá-lo no LCD.
    Obrigado.

  13. Ola, paulo
    Venho em seu blog ver dicas e duvidas sempre que tenho tempo.
    Eu tenho um projetinho eletronico em mente que envolve

    Display de mp4. Sera que da pra usar display usado de mp4 ou mp3.?
    Grato a atencao.

  14. Ola, bom dia.
    Obrigado pela resposta e a ideia de usar o 5110,
    gostei vou tentar com um desses.

    Eu so coloquei a questao do display mp4 ou mp3,
    Por tentar reaproveitar componentes que
    As vezes estao ali na gaveta, kkkk, meio que esquecidos.
    E tentar utilizalos mesmo que apenas didatico ou fazer
    Projetinhos de hobista.

    Obrigado pela atencao.
    J soares.

  15. Boa noite Paulo, estou começando no mundo Arduino, e como não poderia ser diferente, tenho as minhas dificulades…estou montando um sketch com uma tela lcd grafic (KS0108-128X64 V.02).
    Com : DATA/ HORA. Usando shield DS 1303 ; PLACA MEGA 2560. FUNCIONANDO BEM.
    Estou tentando colocar também sensor de temperatura DS18B20 OU LM35, sem sucesso.
    Como eu poderia te enviar o esboço do meu sketch pra vc dar uma olhada no meu erro?

    grato, Roberto Carlos

    1. Oi Roberto,
      tenta inicialmente fazer um exemplo básico somente com os sensores de temperatura.

      Depois integra tudo. É comum ocorrer estes problemas quando começamos a integrar vários dispositivos, pois muitas vezes, as bibliotecas entram em conflito por usar um mesmo rescurso.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *