Nell’Ottava Parte della Guida verrà Illustrato come Interfacciare Display LCD con Arduino e come visualizzare Stringhe e Numeri…
INTRO
L’acronimo LCD significa “Liquid Crystal Display” e sono dei supporti grafici usati come output in molti schemi elettrici. Gli LCD sono migliori dei 7-segmenti in quanto economici, facili da programmare e inoltre permettono di visualizzare ogni numero, lettera o simbolo. La dicitura LCD 16×2 informa che il display è formato da 2 righe da 16 caratteri. Ogni carattere viene visualizzato grazie ad una matrice da 5×7 pixel. Esistono vari tipi di LCD, anche con più di due righe, molto comuni sono i display LCD 16x$ che dispongono di 4 righe.
Il display LCD ha due registri al suo interno, uno per memorizzare i comandi da eseguire (cancellare il display, settare il cursore, inizializzare il display….) e l’altro serve a memorizzare i caratteri che verranno visualizzati sul display LCD.
La piedinatura del display è:
Il primo pin, chiamato “GND” è il terminale di massa del display, “VCC” è l’alimentazione, tra VCC e massa deve esserci una potenziale di 5V. Il pin “VEE” serve a regolare il contrasto del display, si va a collegare quindi una resistenza variabile come in figura:
Il pin “RS” serve a selezionare il tipo di registro da usare, o il registro data o il registro comando. Il pin “R/W” seleziona se scrivere i registri o leggere i dati immagazzinati in essi.
Il pin “E” è il pin Enable, quando si invia un fronte di salita su questo pin viene abilitata la lettura dei pin data: questi pin sono “D0,D1,D2,D3,D4,D5,D6,D7” e sono i pin su cui vengono inviati i dati da memorizzare sui registri.
Gli ultimi due pin, “A” e “K” sono i pin del led di retroilluminazione, uno è l’anodo e l’altro è il catodo. L’anodo è collegato tramite una resistenza da 330Ω all’alimentazione, questa resistenza regola la corrente nel LED di retroilluminazione e di conseguenza la luminosità. Si consiglia di non scendere sotto il valore indicato per non bruciare la retroilluminazione.
L’LCD può essere usato in due modalità di invio dati, la prima ad 8bit è più veloce ma richiede 11 linee di comunicazione e quindi 11 pin del PIC, la seconda modalità richiede solo 7 linee di comunicazione anche se è più lenta. Nel secondo caso il carattere o il comando da inviare al display, composto da un char quindi a 8 bit, viene diviso in 4 LSB e 4MSB e inviati uno per volta, per questo richiede più tempo e meno linee.
Il Pin chiamato VEE nell’immagine (ma che viene anche chiamato Vo) è il pin che riceve una tensione tra 0 e VCC, generata con un resistore variabile e serve per regolare il contrasto del display. Supponiamo una alimentazione a 5V, se questo potenziometro è più verso il pin collegato alla massa genererà una tensione inferiore a 2.5V e man mano che ci si avvicina agli 0V i pixel saranno illuminati. Se è molto vicino agli 0V le scritte possono anche non essere visualizzate perché tutti i pixel sono illuminati al massimo.
LA LIBRERIA
La libreria usata per il controllo del display LCD è già installata su l’IDE di Arduino e si chiama “LiquidCrystal”, attualmente alla versione 1.0.6. Nel caso non sia installata leggete la guida su come installare o aggiornare le librerie presente su questo sito.
Iniziamo a vedere le varie funzioni disponibili in questa libreria. La prima serve per indicare come è connesso un display LCd con Arduino, la seconda serve ad indicare le righe e le colonne e la terza ripulisce il display LCD. Si avrà:
LiquidCrystal(rs, enable, d4, d5, d6, d7); //Connessione 4 bit senza pin rw LiquidCrystal(rs, rw, enable, d4, d5, d6, d7); //Connessione 4 bit con pin rw LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7); //Connessione 8 bit senza pin rw LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7); //Connessione 8 bit con pin rw lcd.begin(colonne, righe) //Indicare il numero di colonne e righe //supponiamo connessione a 4bit senza pin di rw e display 16x2 la modalità più comune LiquidCrystal(0, 1, 2, 3, 4, 5); //rs->0, enable->1, d4->2, d5->3, d6->4, d7->5 void setup(){ lcd.begin(16, 2); //2 righe e 16 colonne lcd.clear(); //Pulisci display LCD }
Il display LCD dispone di un cursore che indica quale posizione si va a scrivere, questo cursore può essere visibile oppure no e può essere una linea o un rettangolo nero sulla posizione:
In questo caso è un rettangolo nero, ma potrebbe essere una linea in basso alla posizione. Nella libreria vi sono varie funzioni per controllare il cursore, si avrà:
void setup(){ lcd.home(); //Posiziona il cursone nella prima riga e prima colonna lcd.setCursor(colonna, riga); //posiziona il cursore nella posizione riga-colonna lcd.setCursor(2, 3); //posiziona il cursore nella posizione riga 2 colonna 3 lcd.noCursor(); //Rendi il cursore invisibile lcd.cursor(); //rendi visibile il cursore lcd.noBlink(); //cursore fisso non lampeggiante lcd.blink(); //cursore lampeggiante }
La prima funzione fa ritornare il cursore nella posizione riga 1 colonna 1, la seconda funzione invece sposta il cursore nella posizione indicata dai due numeri, la terza funzione serve a rendere visibile il cursore oppure no mentre l’ultima stringa dell’esempio serve per selezionare se il cursore deve lampeggiare o no.
Queste funzioni possono essere usate sia nel ciclo di setup sia nel ciclo di loop.
Per scrivere sul display LCD invece si usano le seguenti funzioni:
void loop(){ data = 'a'; //inizializza data con un char 'a' in particolare lcd.write(data); //mostra il char 'a' lcd.write('d'); //mostra il char 'd' data = 'a'; //data inizializzato con il char a data = "Ciao"; //data inizializzato alla stringa Ciao lcd.print(data); //Visualizza la variabile data lcd.print("Ciao"); //Visualizza Ciao numero = 190; numero = B01010101; numero = 349008; lcd.print(numero, BASE); //Visualizza il numero nella base BIN per binario (base 2), //DEC per decimale (base 10) ed HEX per esadecimale (base 16). lcd.print(numero, DEC) //Mostra numero in base 10 lcd.print(0xD2, HEX) //Mostra 0xD2 in esadecimale float x = 3.14; //Inizializza x a 3.14 lcd.print(x, 10); //Mostra il numero floating point }
Si può usare “lcd.write(data)” per scrivere un singolo carattere sul display LCD mentre “lcd.print(data)” serve per visualizzare stringhe o numeri che occupano più di uno spazio sul display LCD. nella seconda funzione può essere indicata la base di come mostrare il numero.
Poi ci sono due stringhe per spegnere il display LCD eliminando tutte le cose scritte con la possibilità di riaccenderlo nelle stesse condizioni di quando è stato spento e vi è una funzione per creare caratteri personalizzati accendendo un singolo pixel. Si avrà:
byte smile[8] = { //Crea uno smile B00000, B10001, B00000, B00000, B10001, B01110, B00000,}; void setup() { lcd.createChar(0, smile); //0 indica da quale riga dei pixel scrivere i pixel di smile lcd.begin(16, 2); //sposta il cursore sulla seconda riga e 16esima colonna lcd.write(byte(0)); //scrivi lo smile } void loop(){ lcd.noDisplay(); //Spegni il display LCD lcd.display(); //Riaccendi il display }
Quindi per creare un carattere speciale bisogna avere una variabile con 8 stringhe da 5 bit che rappresentano i pixel del carattere, poi si va a creare il char, si sposta il cursore, e poi si va a visualizzare io carattere. La funzione “lcd.noDisplay” invece viene usata per spegnere il display che poi si riaccende con la stringa successiva.
Le ultime funzioni servono per spostare le scritte sul display, ovvero per farle scorrere a destra o sinistra. Le funzioni sono:
void loop(){ lcd.scrollDisplayLeft(); //Muovi tutte le scritte sul display di una posizione a sinistra lcd.scrollDisplayRight(); //Muovi tutte le scritte sul display di una posizione a destra lcd.leftToRight(); //Se si scrive 1 carattere per volta verrà scritto da sinistra a destra lcd.rightToLeft(); //Se si scrive 1 carattere per volta verrà scritto da destra a sinistra lcd.autoscroll(); //Attiva lo scorrimento automatico in direzione indicata sopra lcd.noAutoscroll(); //Disattiva lo scorrimento automatico }
Quindi nel primo caso muovo il display a sinistra, con la seconda funzione lo muovo a destra mentre con le funzioni successive si va a scrivere con scorrimento sul display. Questo vuol dire che se si scrive un carattere per volta il carattere precedente viene spostato a destra o sinistra, in base a quale funzione viene eseguita prima “lcd.leftToRight();” oppure “lcd.rightToLeft();”. Se l’auto scroll è disattivato quando si scrive un nuovo carattere bisogna cambiare posizione.
ESEMPIO
Scriviamo uno Sketch di esempio in cui eseguiamo le funzioni viste in precedenza. Prima di iniziare bisogna dire che è necessario richiamare la libreria con la seguente stringa “#include <LiquidCrystal.h> “ mentre la funzione per configurare la connessione va inserita all’inizio, fuori dal setup e dal loop oppure va richiamata ogni volta e in ogni caso da errori. Il codice è il seguente:
#include <LiquidCrystal.h> //Carica la libreria per il display LCD LiquidCrystal lcd(0, 1, 2, 3, 4, 5); //Configura connessione per tutte le funzioni byte smile[8] = { //Crea uno smile B00000, B10001, B00000, B00000, B10001, B01110, B00000}; void setup() { lcd.begin(16, 2); //LCD 16x2 lcd.createChar(0, smile); //Crea lo smile } void loop() { lcd.clear(); //Pulisci il display lcd.write(byte(0)); //Mostra lo smile delay(1000); //Attendi 1 secondo lcd.clear(); //Pulisci il display lcd.noCursor(); //Spegni il cursore lcd.leftToRight(); //Scrivi da sinistra a destra lcd.autoscroll(); //Attiva l'autoscrol lcd.setCursor(9, 0); //Sposta il cursore sulla prima riga 5° colonna lcd.write('C'); //Scrivi Ciao delay(300); //Aspetta 0.3 secondi lcd.write('I'); delay(300); lcd.write('A'); delay(300); lcd.write('O'); lcd.noAutoscroll(); //Disattiva l'autoscrol delay(1000); //Aspetta 1 secondo lcd.setCursor(9, 1); //Sposta sulla seconda riga lcd.print("NE555.IT"); //Mostra la stringa "NE555.IT" delay(1000); //Aspetta 1 secondo for(int i = 0; i<3; i++){ //Esegui tre volte lcd.scrollDisplayRight(); //Sposta a destra tutte le scritte delay(500);} //Aspetta 0.5 secondi for(int i = 0; i<3; i++){ //Esegui tre volte lcd.scrollDisplayLeft(); //Sposta a sinistra delay(500);} //Aspetta 0.5 secondi }
Si va quindi a inizializzare uno smile, poi nel setup si indica che display si usa e si creare lo smile. Nel “loop” si pulisce il display, si scrive lo smile e poi si va a visualizzare sulla prima riga “CIAO” un carattere alla volta con scrittura da sinistra a destra. Sulla seconda riga si scrive per intero “NE555.IT” e poi si va a muovere queste due stringe prima a destra e poi a sinistra di 3 posizioni per ogni direzione grazie ad un for.
Queste funzioni vengono ripetute visto che si trovano nel loop.
Lo schema è il seguente:
L’alimentazione a 5V giunge dal pin di Arduino e alimenta il display LCD. Inoltre giunge ad un capo del resistore variabile in modo tale da creare una tensione che regoli il contrasto dell’LCD. Il display è connesso come descritto nel codice ad Arduino, mentre tutti i pin non connessi sono collegati a massa.
La retroilluminazione è sempre alimentata a 5V con il GND al catodo mentre l’anodo è connesso ad un terminale di un resistore di 470 Ohm mentre l’altro capo è connesso alla tensione di 5V. Variando il resistore variabile si varia il contrasto.
DOWNLOAD
Potete scaricare la simulazione del circuito con PROTEUS e gli Sketch al seguente LINK!!!