sábado, 7 de janeiro de 2012

LCD para seu robô com Arduino

Gostaria que seu robô tivesse uma tela para mostrar informações sobre os sensores, configurações etc.? Bem... se você usa o NXT (da Lego), você já tem isso. Se não, você pode conectar seu robô a um tablet ou a um computador, construir uma interface gráfica e aproveitar a tela de seu dispositivo (como o Ivan fez - veja no blog TechLego).

Mas, se quer uma coisa mais simples (e barata), seus problemas acabaram! :-)

Se você está usando o Arduino (ou qualquer microcontrolador) para controlar seu robô, usar um display de cristal líquido não é uma tarefa complicada.

Os displays de cristal líquido mais comuns (chamados simplesmente de LCDs - Liquid Crystal Displays) são construídos em módulos que possuem esquemas de ligação e de comunicação padronizados (pelo menos até certo ponto). Por isso, seu uso se torna mais simples, principalmente se o compilador do seu microcontrolador possui uma biblioteca para uso dos LCDs (como é o caso do Arduino). Esses displays possuem seus próprios processadores que cuidam do acionamento dos pixels da tela de cristal líquido. O que você precisa fazer é informar ao processador do display o que você quer exibir, e em que lugar.

Existem basicamente dois tipos comuns de LCDs: os de caractere e os gráficos. Os de caractere são os mais simples de se usar. Esses LCDs possuem pequenos retângulos com um número fixo de pixels, sendo que cada retângulo pode exibir apenas um caractere. O número de retângulos determina a quantidade de caracteres que o display pode exibir. O da imagem abaixo é o tipo mais comum de LCD de caractere: possui 16 colunas e 2 linhas ou, simplesmente, 16x2. Outros tipos são 20x2, 16x4, 16x1, entre outros.

LCD 16x2 tipo caractere.

Os LCDs de caractere possuem memória com o mapa dos caracteres que podem ser exibidos. O seu microcontrolador deve informar ao display qual caractere quer exibir, e em que posição da tela. Isso é feito através de comandos padronizados. Não é o objetivo deste post dar detalhes sobre o funcionamento dos LCDs. Se você quiser saber mais, pode acessar este tutorial que mostra a função de cada pino, o mapa de caracteres etc.

Para usar os LCDs de caractere com o Arduino, você pode utilizar a biblioteca LiquidCrystal, disponível no ambiente de compilação. Nesse caso, escrever no display se resume a usar o comando lcd.print()! É muito fácil! A conexão elétrica entre o LCD e o Arduino é mostrada na figura abaixo. Um exemplo completo de utilização da biblioteca está disponível no site oficial do Arduino. Veja aqui!



Se você usa microcontrolador PIC, veja esta apostila disponível no blog Mecatrônica de Garagem.

O uso de LCDs gráficos não é tão simples, pois deve-se controlar cada pixel individualmente. A padronização desses LCDs também permitiu o surgimento de bibliotecas que facilitam bastante a utilização desses displays. No entanto, existem diversas variações entre fabricantes e modelos, o que exige mais cuidado e atenção ao se utilizar displays gráficos.

O LCD gráfico mais comum é baseado no chip KS0108. Os LCDs de 128x64 pixels que eu conheço são todos baseados nesse chip. É tão comum que existe uma biblioteca para uso desses LCDs com o Arduino (veja detalhes na página que descreve o uso da biblioteca GLCD - Graphic LCD).

Como mencionei, a padronização desses displays não é tão forte como a dos LCDs de caractere. Por isso, tente identificar seu LCD antes de fazer a ligação de seus pinos à placa. Alguns LCDs trazem os pinos de alimentação (Vcc e GND) invertidos!! A página da biblioteca GLCD do Arduino traz informações sobre a ligação de quatro subtipos comuns desse LCD.

Uma observação importante é que alguns LCDs gráficos exigem que a alimentação do potenciômetro de ajuste de contraste seja feita com tensão negativa! Se isso não for feito, mesmo que todos os pinos de seu LCD estejam ligados corretamente, nada aparecerá na tela. Felizmente os módulos atuais trazem um pino especial para alimentar o potenciômetro de contraste, sendo que a tensão negativa é gerada pelo próprio circuito do LCD (assim, você só precisa fazer a ligação correta e alimentar o display com +5V). 

Fiz um teste com o display que tenho ligado a um Arduino Nano. O modelo do meu LCD é  KSM12864J-4. Ele não está na lista da página do Arduino, por isso tive de fazer alguns testes até conseguir fazê-lo funcionar corretamente. A ligação entre o LCD e o Arduino ficou assim:


Arduino Nano Função Pino LCD Comentários
5V +5 volts 2
GND GND 1
-- Vo (Contraste) 3 Ligar ao pino central do potenciômetro
8 D0 7
9 D1 8
10 D2 9
11 D3 10
4 D4 11
5 D5 12
6 D6 13
7 D7 14
14 (alog0) CSEL1 15
15 (alog1) CSEL2 16
-- Reset 17 Ligar a um resistor de 470R a +5V
16 (alog2) R_W 5
17 (alog3) D_I 4
18 (alog4) EN 6
-- Vee (saída contraste) 18 Ligar a um dos pinos do potenciômetro
-- Backlight +5 19 Ligar a um resistor de 100 a 330R a +5V
GND Backlight Gnd 20 Ligar o outro pino do potenciômetro também ao GND


Fiz a ligação do LCD utilizando como alimentação a própria tensão de 5V da placa do Arduino.

Note que o pino de RESET deste LCD NÃO deve ser ligado ao pino de reset do Arduino! Se você fizer isso, a comunicação entre o computador e a placa do Arduino falha. Como o RESET deste LCD é ativo em nível baixo, eu liguei um resistor de 470 ohms entre o pino 17 do LCD e +5V do Arduino, para manter o LCD sempre em funcionamento.

O ajuste de contraste deve ser feito por um potenciômetro de 10k a 20kohms (usei um de 10k, e funcionou bem). O pino central desse potenciômetro deve ser ligado ao pino 3 do LCD. Um dos outros dois pinos (qualquer um) deve ser ligado ao pino 18 do LCD e o outro, ao GND do Arduino.

A alimentação do backlight do LCD é feita através de um resistor de 330 ohms ligado ao pino 19 do display.

Testei esse LCD com a biblioteca GLCD do Arduino. O código a seguir gera a tela mostrada na figura abaixo. Note que os comandos de desenho e de escrita na tela são bem simples! Veja o código:


#include <ks0108.h>
#include "Arial14.h"         
#include "SystemFont5x7.h"   


void setup(){
  delay(500);                // tempo para reset do LCD
  GLCD.Init(NON_INVERTED);   // inicializa display
  GLCD.ClearScreen();  
}


void loop(){   
  GLCD.DrawRect(0, 0, 127, 63, BLACK); // desenha retangulo
  GLCD.DrawRoundRect(2, 2, 123, 59, 5, BLACK);  // retangulo com quinas arredondadas
  GLCD.SelectFont(Arial_14);  // define fonte
  GLCD.CursorTo(1,1);  // posicao inicial do cursor
  GLCD.Puts("Visite:");  // imprime mensagem na posicao selecionada
  GLCD.SelectFont(System5x7); // define fonte - padrao do display
  GLCD.CursorTo(2,5);
  GLCD.Puts("www.nossosrobos.");
  GLCD.CursorTo(4,6);
  GLCD.Puts("blogspot.com");
}



Exemplo de utilização do display gráfico 128x64 pixels com Arduino.

Última dica: você pode fazer o display escrever com fundo invertido (fundo branco e caracteres negros). Basta substituir a linha de inicialização do LCD para:

  GLCD.Init(INVERTED);   // inicializa display

Espero que possa aproveitar essas dicas para deixar seu robô mais interativo!
Até a próxima!

Referências:
http://www.arduino.cc/playground/Code/GLCDks0108
http://www.arduino.cc/en/Tutorial/LiquidCrystal
http://afonsomiguel.com/sites/default/files/lcd16x2_1.pdf
http://mecatronicadegaragem.blogspot.com/2011/01/apostila-usando-lcd-16x2-nos.html