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).
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.
No 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.
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
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.
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?
ola acabei de ligar meu display 128* 64 ele apareceu um monte de quadrados e pontos
precisa configurar algo no lcd.
obrigado
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
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?
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!
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
Paulo, outro detalhe.
Meu display é o kxm12864j-4, há alguma restrição deste display para com este código/pinagem?
Segue o DataSheet do display para facilitar: http://www.kxmlcd.com/UploadFiles/201103171346328…
Abraços,
João Paulo Thomazinho
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
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?
Olá Tomaz,
Pergunto: essa biblioteca do display que baixou está compilando normalmente na IDE do Arduino??
Pelo que pesquisei sobre esse erro, sua biblioteca está numa versão antiga, e me avisa se funcionou ok?
Abraços
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
Olá Dey,
olha que material legal que encontrei. Aqui um video interessante.
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.
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!
Deu o mesmo erro que o de cima, estou usando o arduino mega, shetch V.1.0.1. Voce tem alguma solução??
Opa, verifica e me diz se funcionou ok?
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
Oi Rafael,
isso está parecendo que a biblioteca está na versão antiga do Arduino (ex.: 022).
Abra os arquivos .h e .cpp da biblioteca ks0108 e procure por Wprogram.h e substitua por Arduino.h
Aqui mais detalhes disto.
Bons testes!
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????
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
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
Oi Natalia,
preciso do seu código completo para poder lhe ajudar
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
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.
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?
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
Qual conector que vc ta usando para conectar os fios no display? Pelo visto, da pra ver q vc nao os soltou um a um . Grato
Oi Marco, estou usando conectores macho e fêmea normal. Fios comuns que você encontra em qualquer loja que vende Arduino.
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.
Oi Lucas, boa noite!
Nunca precisei trabalhar com Bitmaps, mas procure algo parecido com isto que irá encontrar o que precisa. Se encontrar para este modelo de display em específico, ficaria muito grato se voltasse aqui para compartilhar o link.
Bons estudos!
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.
Olá amigo,
pelo que lembro, um display de mp4 não tem conexão externa fácil de manipular.
Mas que tal usar um display de celular como este?: http://produto.mercadolivre.com.br/MLB-547387965-tela-lcd-nokia-5110-matriz-de-84-x-48-pixels-para-arduino-_JM
Acho que facilita sua vida, tem vários exemplos na net de como usá-lo com Arduino
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.
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
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.