Continuando a falar sobre o uso do registrador de deslocamento 74hc164. A minha idéia em usar esse carinha é para ligar um display LCD HD4478 ao Arduino sem precisar de muitos pinos.

Um display LCD HD4478, por padrão precisaria de 11 pinos do microcontrolador para funcionar em modo 8-bits com todas as suas funcionalidades, mas com o uso do 74hc164 deu para fazer a ligação usando 4 pinos. Acho que é possível ligar com apenas 3 pinos, estava tentando fazer isso usando o display em modo 4-bits, mas não obtive bons resultados.

Usei o circuito feito pelo Frank Henriquez junto com algumas modificações no código publicado pelo calli no fórum do Arduino. Segue nos links abaixo o esquema e o código.

Esquema de montagem | Código para o Arduino

Esse código não chega nem perto de fazer tudo o que é possível com o LCD, mas aos poucos quero montar uma biblioteca para o Arduino e coloco as funcionalidades mais utilizadas.

O próximo passo agora é usar um botão direcional que comprei na Seeedstudio para controlar as informações que aparecem no display, fazer mudança de menus, selecionar itens, etc.

, , ,

Muitas vezes necessitamos de mais portas para nosso projeto do que o microcontrolador pode fornecer, casos de exemplo são matrizes de LEDs, matrizes de botões e displays LCD. Podemos usar um registrador de deslocamento com entrada serial e saída paralela para reduzir a quantidade de pinos usados, liberando os outros pinos para outras atividades. O CI 74hc164 é um registrador de deslocamento que converte a entrada no formato serial para a saída no formato paralelo, muito simples de usar.

74hc164

Como exemplo, para controlar 8 LEDs ligados no 74hc164 com o Arduino faça as seguintes ligações nos pinos:

  • A -> Arduino dataPin
  • B -> 5V
  • Qa .. Qh -> LEDs
  • GND -> GND (duh)
  • CLK -> Arduino clockPin
  • CLR -> Arduino resetPin
  • VCC -> 5V

Os pinos dataPin, clockPin e resetPin são configurados no programa escrito para o Arduino, como mostrado abaixo, e é através deles que vamos controlar o 74hc164. Nesse programa que escrevi, a função initShift inicializa os pinos de controle do 74hc164, o clock e deixa o ci no modo reset. A função sendShift envia um byte que indica quais leds estão ligados e desligados:

int resetPin = 6;
int clockPin = 7;
int dataPin = 5;
 
void setup() {
      initShift(resetPin, clockPin, dataPin);
      sendShift(B10101010);
}
void loop() {
}
 
void initShift(int resetPin, int clockPin, int dataPin) {
      pinMode(resetPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(dataPin, OUTPUT);
      digitalWrite(resetPin, LOW);
      digitalWrite(clockPin, LOW);
}
 
void sendShift(byte message) {
      int i;
      byte testByte =  B00000001;
      digitalWrite(resetPin, HIGH);
 
      for(i=0; i <= 7; i++) {
            digitalWrite(clockPin, LOW);
            digitalWrite(dataPin, (message >> i) & testByte);
            digitalWrite(clockPin, HIGH);
      }
}
, ,

Esse tutorial na página do Arduino ensina como ligar o display LCD ao Arduino com apenas 3 fios usando o CI HEF4094. Vou tentar encontrar esse CI e fazer essa brincadeira. Para montar um shield usando apenas 3 portas do Arduino é uma maravilha.

Tutorial: http://www.arduino.cc/playground/Code/LCD3wires

,

Para enviar mensagens através da comunicação serial estabelecida entre o Arduino e o computador e mostrar essas mensagens no display LCD escrevi o código abaixo baseado no artigo escrito por Benjamin Eckel:

#include &lt;LiquidCrystal.h&gt;
 
LiquidCrystal lcd(11, 13, 12, 7, 8, 9, 10);
char message[16];
 
void setup() {
     Serial.begin(9600);
     lcd.clear();
}
 
void loop () {
     write_lcd();
}
 
int write_lcd () {
     int i = 0;
     char incoming_char = 0;
 
     while (incoming_char != '~') {
          incoming_char = get_incoming_char();
          message[i] = incoming_char;
          i += 1;
     }
     for (int j=i-1; j &lt; 16; j++) {
          message[j] = ' ';
     }
     lcd.clear();
     lcd.print(message);
     Serial.println(message);
     delay(500);
}
 
char get_incoming_char() {
     char incoming_char;
 
     while (1) {
          if (Serial.available() &gt; 0) {
               incoming_char = Serial.read();
               return incoming_char;
          }
     }
}

Para enviar as mensagens pode-se utilizar a própria IDE do Arduino ou escrever programas em outras linguagens para esse fim.

Usando Python fica fácil:

import serial
 
/*ttyUSB0 é a porta onde o Arduino está conectado e
9600 a velocidade de comunicação */
ser = serial.Serial('/dev/ttyUSB0', 9600) 
 
ser.write("string")
, ,

Hoje decidi testar com o Arduino alguns Displays LCDs que tenho na gaveta. A ligação é bem simples e com o uso da biblioteca LiquidCrystal fica fácil criar projetos com o uso dos Displays.

lcm-s01602dtra1Em primeiro lugar, é importante verificar qual o controlador e o modelo do Display e procurar pelo seu datasheet para verificar a pinagem. Apesar de existir um padrão para a pinagem, ela costuma mudar em alguns modelos. Meus Displays são LM016L com controlador HD44780A00 (bastante utilizado). Procure no All DataSheet pelo datasheet do seu Display.

A pinagem para o LM016L é a seguinte:

pinos

Os pinos DB[número] são os pinos de dados. Para ligar o LCD no Arduino vamos utilizar os pinos Gnd, Vcc, Contraste, RS, R/W, Enable, DB4, DB5, DB6 e DB7. A minha ligação entre o Display e  Arduino ficou assim:

ligacao2

Imagem em melhor qualidade

O pino 3 ( Contraste ) do Display deve ser ligado a um potenciômetro ( coloquei um de 100K ) para o controle do contraste. Os outros dois pinos do potenciômetro devem ser ligados no 5V e no Gnd.

Ao ligar o Arduino, o Display LCD vai apresentar as linhas pintadas, ou apenas uma:

dsc035981

Eu utilizei a biblioteca padrão do Arduino para displays LCDs, LiquidCrystal, mas existem outras não oficiais. Para colocar o Display para exibir as mensagens precisamos instanciar um objeto do tipo LiquidCrystal que represente o Display e passar os atributos que representam os pinos de conexão para o construtor. Os atributos que devem ser passados são:

LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)

Lembrando que o número dos pinos que devem ser passados para o construtor são dos pinos do Arduino e não do Display (sim, eu passei os pinos do Display). Por fim, para testar se tudo está funcionando corretamente carregue esse programa de exemplo no Arduino:

#include
 
LiquidCrystal lcd(11, 13, 12, 7, 8, 9, 10);
int i;
 
void setup() {}
 
void loop() {
     lcd.clear();
     lcd.print("Olá mundo! ");
     delay(1000);
     for(i = 0; i &lt; 10; i++) {
          lcd.clear();
          lcd.print(i);
          delay(1000);
     }
}

dsc03591

Referências:

http://www.ladyada.net/learn/arduino/lcd.html

http://arduino.cc/en/Reference/LiquidCrystal

,