LCD: Arduino e o display LCD 1602 (HD44780, SPLC780D)
Conectar um display LCD ao Arduino parecia complicado, mas não foi – e ainda achei um bom substituto para o potenciômetro normalmente indicado para regular o contraste.
Vários dos projetos que tenho em mente para o futuro incluem a necessidade de exibir continuamente informações do Arduino ao usuário, e para isso os mostradores LCD são praticamente imbatíveis na relação entre sua pequena complexidade de programação no Arduino, baixo custo de obtenção e facilidade de interpretação pelo usuário.
Um dos modelos mais populares de display LCD é o módulo LCD 1602, fácil de encontrar no Brasil entre R$ 15 e R$ 20, que mostra uma tela de 2 linhas de 16 caracteres cada, com contraste e iluminação reguláveis.
Após ver tantas vezes outros novos usuários reclamando de dificuldades (caracteres não aparecem, aparece apenas uma fileira de quadrados, backlight não acende) no seu primeiro contato com displays LCD no Arduino, achei que teria problemas similares na minha primeira experiência com o 1602, mas não foi bem assim: a fileira de quadrados apareceu na hora certa, e logo foi substituída pelos caracteres que eu queria mostrar no primeiro exemplo...
A conexão do LCD 1602 ao Arduino
Os displays LCD 1602 populares são baseados no controlador SPLC780D, que é clone do popular controlador LCD Hitachi HD44780, e por isso compartilham todos uma mesma pinagem, com as descrições que você vê na foto:
Os 2 primeiros pinos são de alimentação do conjunto, seguidos de 4 de controle, mais 8 (DB0 a DB7) de transmissão de dados, e os 2 finais são de alimentação do backlight.
Para o nosso exemplo de programação do Arduino com LCD 1602, eles são conectados assim:
Pinos do Arduino
|
Pinos do LCD
|
Notas
|
GND
|
Vss
| |
RW
| ||
LED-
| ||
5V
|
Vcc
| |
LED+
|
Via um resistor de 68Ω ou mais
| |
5
|
V0
|
PWM substitui um potenciômetro para controle do contraste
|
7
|
RS
| |
8
|
E
| |
9
|
DB4
| |
10
|
DB5
| |
11
|
DB6
| |
12
|
DB7
| |
(não conectados)
|
DB0
| |
DB1
| ||
DB2
| ||
DB3
|
Note que há um componente externo necessário: o resistor de 68Ω entre o 5V do Arduino e o LED+ do LCD. Se você não tiver um resistor de 68Ω, use um maior – eu usei de 100Ω. Quanto maior, menos intensa vai ser a iluminação do backlight.
Muitos tutoriais do LCD1602 com Arduino usam um segundo componente externo: um potenciômetro conectado ao V0 do LCD. Com ele, o usuário pode controlar manualmente o contraste, mas eu prefiro usar um pino do Arduino (com PWM) para a mesma função, dispensando o componente externo adicional.
Ainda sobre a ausência do potenciômetro, vale destacar: a datasheet menciona a importância de permitir que o usuário regule o contraste (que pode variar devido a questões como temperatura e ângulo), mas informa que essa regulagem pode ser feita por PWM. Assim, para aproveitar essa dica, eu conectei o pino 3 (V0) do LCD a um pino PWM do Arduino (o 5, no meu caso) que estava sobrando, e incluindo a seguinte linha na função setup()
do meu programa: analogWrite(5,96);
. O número 961 pode variar – eu experimentei vários números até encontrar o 96 como o contraste ideal para o meu caso.
Programando o Arduino para usar o LCD
Na programação, o display LCD é tão fácil de acessar quanto, por exemplo, o envio de dados ao monitor serial: você inclui a biblioteca, inicializa, e depois usa o comando variações do comando write
.
Alguns luxos ficam disponíveis ao programador, entretanto, graças à riqueza do conjunto de instruções interno do controlador HD447802: limpar a tela, posicionar o cursor, rolar a tela, deixar o cursor visível (e/ou piscante), e mais.
Tudo isso fica disponível aos programadores do Arduino por meio da biblioteca LiquidCrystal, que já vem instalada quando você instala o ambiente do Arduino no seu computador. Dê uma olhada na sua lista de comandos e programas de exemplo para entender tudo o que ela é capaz.
O programa a seguir é um exemplo de uso de LCD no Arduino, simples e curto para facilitar o entendimento:
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);
void setup() {
lcd.begin(16, 2);
pinMode(5,OUTPUT);
analogWrite(5,96);
lcd.setCursor(1,0);
lcd.write("BR-ARDUINO.ORG");
}
void loop() {
}
Destaquei em vermelho a inclusão e instanciação da biblioteca. A linha que começa com #include não varia, será assim em todos os programas que usarem a biblioteca. A linha a seguir tem uma variação importante: a lista de números entre parênteses, que corresponde aos pinos do Arduino conectados aos pinos RS, E, DB4, DB5, DB6 e DB7 do LCD, respectivamente. Os números que eu mencionei correspondem aos que eu usei, mas você pode usar outros, se preferir.
Em verde eu marquei a linha que normalmente não pode faltar na sua função setup()
: o comando lcd.begin
que indicará como parâmetro quantas colunas e linhas estão presentes no seu display LCD.
Em seguida, em laranja, está a inicialização do pino com PWM que eu usei para substituir o potenciômetro normalmente usado para definir o contraste do LCD. Veja a explicação acima, quando falei sobre as conexões físicas.
Para completar, ainda na função setup()
(mas normalmente você incluiria na função loop()
), inseri 2 comandos para posicionar o cursor na coluna 1 da linha 0 (a de cima) e escrever o nome do site.
Como não restou nada mais para fazer neste exemplo, a função loop()
ficou vazia. É só compilar, transferir para o Arduino e o nome do site será exibido na tela...
Tem muito mais que você pode querer conhecer sobre os mostradores LCD: como fazer quando o controlador é diferente, para que servem os os pinos do módulo LCD que ficaram desconectados, como imprimir caracteres pseudográficos, como criar seus próprios caracteres, e mais.
Mas, para usá-lo na prática, as informações básicas que eu precisei estão acima, complementadas pela lista de comandos da biblioteca LiquidCrystal.
Pausa para uma crítica
Sou fã do display LCD 1602. Ele é prático, clássico (sua controladora Hitachi HD44780 está entre nós desde o século XX) e útil.
Esses atributos fazem com que hoje ele venha incluído em boa parte dos kits de componentes para iniciantes em eletrônica (ou em Arduino).
Mas ele não deveria vir nesses kits, por várias razões.
- Mistura um componente que exige solda de 16 pinos junto a um mar de componentes meramente encaixáveis. Na forma como é usualmente apresentado, o LCD deveria ser parte dos kits voltados a quem já aprendeu a soldar, ou que tenham como objetivo ensinar a soldar. Não é o caso da maioria dos kits que tenho visto, que vêm com diversos componentes que podem ser plugados diretamente numa breadboard, e o LCD acaba sendo o único componente que exige soldagem. Se for seguida a lista de exercícios que acompanha o kit, a primeira soldagem que o iniciante em questão fará na vida pode acabar sendo direto a de uma barra de 16 pinos. Como alternativa, o módulo LCD poderia vir com a barra previamente soldada3, mas ainda restariam as razões abaixo.
- Gera problemas que o aluno pode não conseguir detectar ou resolver. Se as lições do kit dependem do LCD, e o LCD pode depender de o aluno fazer – sem orientação adicional, muitas vezes – uma solda de 16 pinos, o eventual erro, curto ou mal contato gerado nessa primeira solda pode comprometer o restante das lições. Ou seja: o LCD é o único componente que exige que o aluno tenha um ferro de solda e saiba usá-lo; caso ele erre nessa soldagem, a solução pode depender de ele ter um multímetro e saber usá-lo, ou de fazer outros diagnósticos que não fazem parte do propósito do kit, nem estão previstos no seu conteúdo.
- Usa uma forma de conexão incomum. A maioria dos periféricos externos conectados ao Arduino pelos iniciantes usa algum tipo de conexão serial (I2C, SPI, USART), que compartilham uma série de conceitos entre si. Usar um periférico baseado em alguma delas traz uma série de oportunidades de sinergia no aprendizado, e as complexidades do LCD 1602 são tão específicas que acabam nem sendo explicadas.
- Muitos pinos e jumpers. As conexões seriais mencionadas acima se caracterizam, entre outros fatores, pelo pequeno número de pinos usados. Não é o caso do LCD 1602, cujo modo
sui generis
(nesse contexto) de se comunicar usa 6 a 7 pinos de dados do Arduino, mais 2 de alimentação, e geralmente exige no mínimo 11 jumpers (cabinhos) conectados. A complexidade é baixa para um usuário intermediário mas, de novo, não me parece adequado como lição inicial para quem está começando.
O problema econômico é bem real: um display LCD 1602 sem a barra de pinos pode ser comprado por um consumidor final na China por preços próximos a US$ 1; o preço sobe para algo próximo a US$ 6 se ele vier já soldado e com uma interface serial, resolvendo assim as 3 objeções acima. Somando com os demais custos, isso aumenta bastante o preço para o aluno.
O que me incomoda, entretanto, é o problema didático: nas condições em que é oferecido, o display LCD cumpre mal as suas funções de aprendizado, pode estar fora do grau de dificuldade esperado por parte dos alunos, e em muitos casos poderia ser melhor simplesmente não inclui-lo nos kits introdutórios (nos quais, mesmo a US$ 1, ele muitas vezes está entre os componentes mais caros), deixando o aluno usar melhor os leds e o monitor serial para fazer a interface com o usuário, mas mantendo o interesse e a curva suave de aprendizado até ele estar pronto para ser exposto ao aprendizado da solda, que é essencial mas – quando o tópico são os microcontroladores, e não a eletrônica em geral – não precisa estar na lista de coisas a serem feitas na primeira semana.
Quando eu tive um primeiro contato com um display LCD 1602, passei pelo que muitos iniciantes passam: tentei plugar o LCD a uma breadboard sem solda, simplesmente passando uma barra de 16 terminais pela sequência de furos do módulo e depois inserindo na breadboard os terminais da barra. Aprendi várias coisas na ocasião, inclusive que o display acender pode ser mera pegadinha, já que o contato precisa estar estável em 100% dos pinos, e para ele acender basta estar estável em 2 ou 3 deles.
Eu tinha uma bancada à mão, soldei e a partir daí funcionou de primeira. Mas semana após semana tenho visto os relatos de quem passa pela mesma experiência que eu passei, mas não tem um ferro de solda ainda e buscou o caminho do kit justamente pelo interesse em microcontroladores que poderia ser satisfeito sem precisar soldar nada na primeira semana.
E pode, desde que o plano de exercícios não seja feito desnecessariamente dependente de soldar um componente que nem precisaria fazer parte do kit.
Um dia ainda farei meu próprio kit, e não vou repetir o erro de fazer com que as lições baseadas em componentes encaixáveis dependam de um componente que precise ser soldado pelo próprio aluno iniciante. Por enquanto, o que faço é compartilhar com você essa observação ;-)
Fora isso, é só saber qual dos pinos do 1602 é conectado a cada pino do Arduino. Como o controlador que vem embarcado no módulo é o SPLC780D, que é clone do popular controlador LCD Hitachi HD44780, eu me baseei na descrição de pinagem e demais informações que constam no capítulo 7 ("Monitores de LCD") do livro Arduino em Ação (da Novatec, que patrocina o BR-Arduino), do qual extraí o diagrama abaixo:
Comentar