Examinando a placa do adaptador, observamos que:
- Tem um trimpot para regular o contraste do display
- Tem um jumper para habilitar/inibir o backlight
- A conversão I2C paralelo é feita por um PCF8574
- Tem três ilhas de configuração marcadas com A0, A1 e A2
- O conector para ligação ao microcontrolador tem, como esperado, quatro sinais: GND, VCC, SDA e SCL.
O PCF8574 é um integrado bastante popular para expandir a capacidade de E/S e saída digital de microcontroladores. O seu endereço I2C é 0 1 0 0 A2 A1 A0. Ou seja, varia entre 0x20 e 0x27, dependendo dos pinos A2, A1 e A0. No caso da minha placa, as ilhas de configuração estão desconectadas e o endereço de fábrica é 0x27. A velocidade máxima no I2C é 100KHz.
O funcionamento do PCF8574 é muito simples: o valor escrito via I2C vai para os pinos P0 a P7; uma leitura via I2C retorna o valor nestes mesmos pinos.
Portanto, a única questão é saber a qual sinal do LCD corresponde cada um dos pinos P0 a P7 do PCF8574. Para isto eu liguei o display ao Arduino: GND em GND, VCC em 5V, SDA em A4 e SCL em A5 (Arduino UNO ou Nano, se for outra versão veja aqui) , carreguei no Arduino o programa abaixo e abri o Serial Monitor:
// Programa para acionar uma a uma as saÃda do // conversor I2C / Paralelo PCF8574 // DQ, Set/2015 #include <Wire.h> void setup() { Serial.begin (9600); Wire.begin(); } void loop() { byte x = 1; delay (10000); for (int i = 0; i < 8; i++) { Serial.println (i); Wire.beginTransmission(0x27); Wire.write(x); Wire.endTransmission(); delay (3000); x = x << 1; } Serial.println(); }Usando um multímetro para ler tensão, liguei uma ponta ao terra e a outra ao sinal RS do display. Olhando o Serial Monitor e o multímetro, descobri que o sinal RS correspondia ao pino P0. Fazendo o mesmo com os demais pinos do LCD, obtive:
- RS = P0
- RW = P1
- E = P2
- A = P3 (backlight)
- D4 = P4
- D5 = P5
- D6 = P6
- D7 = P7
Existem algumas bibliotecas já prontas para displays com interface I2, mas nem todas tem a flexibilidade de configuração da conexão do PCF8574 ao display. Acabei usando a biblioteca NewLiquidCrystal de F Malpartida. É uma biblioteca que suporta vários tipos de conexão de display, o que pode ser confuso no início.
Após baixar o ZIP expanda a pasta NewliquidCrystal dentro da pasta libraries do diretório onde ficam os seus sketches e renomeie-a para LiquidCrystal_I2c (para não confundir a IDE).O programa abaixo mostra a biblioteca funcionando:
// Exemplo simples de uso da biblioteca // NewliquidCrystal // (https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads) // com um display com conexão I2C // (http://www.dx.com/p/i2c-iic-lcd-1602-display-module-with-white-backlight-4-pin-cable-for-arduino-raspberry-pi-374741) #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd( 0x27, // Endereço do PCF8574 2, // bit que controla o sinal E(nable) do LCD 1, // bit que controla o sinal RW do LCD 0, // bit que controla o sinal RS do LCD 4, // bit que controla o sinal D4 do LCD 5, // bit que controla o sinal D5 do LCD 6, // bit que controla o sinal D6 do LCD 7, // bit que controla o sinal D7 do LCD 3, // bit que controla o Backlight do LCD POSITIVE // Backlight acende quando o sinal está em nível Alto ); byte seg, minuto, hora; void setup() { lcd.begin(16,2); // Inicia o LCD DisplayWrite (0, 0, "DQSoft"); DisplayWrite (1, 0, "00:00:00"); } void loop() { if (++seg == 60) { seg = 0; if (++minuto == 60) { minuto = 0; if (++hora == 99) hora = 0; DisplayWriteDec (1, 0, hora); } DisplayWriteDec (1, 3, minuto); } DisplayWriteDec (1, 6, seg); delay (1000); // aguarda um segundo } // Mostra número decimal de 00 a 99 void DisplayWriteDec (byte l, byte c, byte num) { char aux[3]; aux[0] = 0x30 + num / 10; aux[1] = 0x30 + num % 10; aux[2] = 0; DisplayWrite (l, c, aux); } // Posiciona o cursor e mostra mensagem void DisplayWrite (int l, int c, char *msg) { lcd.setCursor(c,l); lcd.print(msg); }
Nenhum comentário:
Postar um comentário