Appunti su Arduino: pilotare un display LCD

In questi giorni sto realizzando con alcuni allievi della mia classe 5′ un misuratore di temperatura che utilizza un display LCD 16×2 (16 colonne e 2 righe) compatibile con i driver dell’Hitachi HD44780. Poiché la quantità di collegamenti è elevata ho deciso di realizzare questo post per non dimenticare ed avere traccia per le future realizzazioni in classe, in modo che possa essere di riferimento per gli allievi.
Per qualsiasi dettaglio fate riferimento al tutorial che trovate sul sito Arduino.cc: LiquidCrystal – “Hello World!”

Per poter pilotare il display avete necessità di utilizzare la libreria LiquidCrystal.h che vi permette di comunicare in modalità 4 bit o 8 bit, questo vuol dire che per la trasmissione dati possono essere utilizzate 4 o 8 linee di controllo a queste si aggiungono le due linee di controllo: Register Select (RS) e Enable (E) e alla linea opzionale Read/Write (RW).

In classe ho utilizzato la modalità a 4 bit, la stessa del tutorial sul sito Arduino, ciò comporta l’utilizzo di 6 uscite digitali sulla scheda Arduino.

Disponiamo di una serie di display economici: Xiamen GDM 1602K (seguite il link per prelevare il datasheet).

Dall’immagine tratta dal datasheet, notate che il display è dotato di 16 pin e la numerazione parte da sinistra.

Nella tabella allegata trovate le funzioni di ogni piedino.

Ricordate che la piedinatura di questi display è comune alla maggior parte degli LCD 16 x 2 standard Hitachi HD44780, ma potreste trovare qualche variazione tipicamente accade per i pin 15 e 16 che potrebbero essere al posto dei pin 1 e 2 (non è il caso di questo display).
In ogni caso come potete vedere dalle fotografie (sopra) il display reca sul lato piste, una legenda con il riferimento piedino -> funzione quindi, non potete sbagliarvi.

Funzione dei piedini

  • Pin 1: Vss – collegato al GND
  • Pin 2: VDD – collegato a +5V
  • Pin 3: V0 – controllo del contrasto dei caratteri. In genere viene collegato ad un potenziometro o trimmer in configurazione partitore di tensione in modo che possiate applicare sul Pin 3 una tensione che varia da 0 a +5V e al variare della tensione varia il contrasto.
  • Pin 4: RS segnale di selezione registro – per selezionare il registro nel quale registrare ciò che appare sul display oppure selezionare il registro di funzionamento in cui viene memorizzata di volta in volta l’istruzione da eseguire per il funzionamento dell’LCD
  • Pin 5: segnale Read/Write – per selezionare la modalità di funzionamento: lettura/scrittura – collegato a GND
  • Pin 6: segnale Enable (E) – per abilitare la scrittura nei registri
  • Pin 7 al Pin 14: linee dati che si inviano o si ricebono dai registri del display. Un valore HIGH (H) indica scrittura (WRITE) del bit nel registro del display, un valore LOW (L) indica un valore letto (READ) da un registro.
  • Pin 15: A (Anodo) – piedino a cui collegare una tensione positiva (nel caso del display descritto +4,2V) che serve per la retroilluminazione del display.
  • Pin 16: K (Catodo) – piedino da collegare a GND per consentire la retroilluminazione.

I collegamenti realizzati sono identici a quelli che trovate sul tutorial: LiquidCrystal – “Hello World!” dove al posto del potenziometro abbiamo utilizzato un trimmer:

Codice:

/* uso del display LCD 16x2 standard Hitachi HD44780

  Circuito:
 * pin RS collegato al pin digitale 12
 * pin E (Enable) collegato al pin digitale 11
 * pin D4 collegato al pin digitale 5
 * pin D5 collegato al pin digitale 4
 * pin D6 collegato al pin digitale 3
 * pin D7 collegato al pin digitale 2
 * pin R/W collegato al GND
 * pin 1 e pin 4 collegati a GND
 * pin 2 collegato a +Vcc
 * centrale del potenziometro/trimmer da 10 KOhm collegato al pin 3 del'LCD
 * pin SX potenziometro/trimmer collegato a +Vcc
 * pin DX potenziometro/trimmer collegato a GND
 * i pin SX e DX del potenziometro/trimmer possono essere interscambiati
*/

// includere la libreria:
#include <LiquidCrystal.h>

/*
   Viene creata l'istanza dell'oggetto LiquidCrystal chiamata lcd in cui
   sono indicati i pin dell'LCD collegati alle uscite digitali di Arduino
*/
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
   //impostiamo il numero di colonne ed il numero di righe di lcd
  lcd.begin(16, 2);
  // Visualizzo il messaggio sul display
  lcd.print("Salve mondo!");
}

void loop() {
  // posiziona il cursore in colonna 0 e linea 1
  // (nota: la linea 1 e la seconda linea, poichè si conta incominciando da 0):
  lcd.setCursor(0, 1);
  // stampa il numero di secondi dall'ultimo reset
  lcd.print(millis()/1000);
}

Nel caso in cui colleghiamo il Pin 15 a +5V e il Pin 16 a GND abbiamo la retroilluminazione:

28 pensieri su “Appunti su Arduino: pilotare un display LCD

  1. Alessio

    Bella spiegazione, e dato che ho Luigino con un termistore per leggere la Temperatura mi piacerebbe sapere cosa si deve cambiare nel codice per la visualizzazione dei dati sul display. Grazie. …

    Rispondi
  2. alessandro

    ciao!
    interessante come applicazione! appena mi arriva il display provo!
    una osservazione, compilando e testando sui simulatori ho dovuto modificare le prime due righe come segue, anche nel wiki sembra si faccia così:

    #include
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

    ti torna o è un mio abbaglio?
    grazie ancora!

    Rispondi
    1. admin Autore articolo

      Ciao Alessandro.
      Ma non è già così?

      L’unica differenza è l’aggiunta del commento:

      ...
      #include   
        
      /* 
         Viene creata l'istanza dell'oggetto LiquidCrystal chiamata lcd in cui 
         sono indicati i pin dell'LCD collegati alle uscite digitali di Arduino 
      */  
      LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
      ...
      

      ho inteso male io?

      Fammi sapere.
      Saluti.

      Rispondi
      1. alessandro

        Ciao!
        un probabile refuso della piattaforma che usi per il blog… infatti ho riportato anche io pari pari lo stesso errore…
        il richiamo alla libreria è il seguente:

        #include (simbolo minore) LiquidCrystal.h (simbolo maggiore)

        // initialize the library with the numbers of the interface pins
        LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

        manca infatti la dicitura LiquidCrystal.h all’interno dei simboli minore e maggiore. anche facendo un copia incolla questo pezzo della riga non viene copiato…
        probabilmente il blog lo interpreta come un qualche tipo di comando riservato o commento non visualizzabile…

        Rispondi
        1. admin Autore articolo

          Si hai ragione tu ho verificato adesso è WordPress si ostina a non scrivermi l’argomento dell’include, perdonate cerco di sistemare.

          Rispondi
  3. admin Autore articolo

    Si ho verificato è il plug-in “Google Syntax Highlighter for WordPress” che mi crea qualche problemino ora dovrebbe vedersi #include <liquidcrystal.h> noto che all’interno delle parentesi angolari non vengono accettate le maiuscole e il testo non compare in questo modo: <LiquidCrystal.h>.
    Il problema è legato all’interpretazione dei codici escape delle parentesi angolari.
    Scusatemi ancora vedo di trovare nel breve una soluzione.

    Grazie per la segnalazione, se trovate altri errori di visualizzazione fatemi sapere che correggo.

    Saluti.

    Rispondi
  4. MAURIZIO

    SALVE MI STO’ DOCUMENTANDO IN RELAZIONE AL PILOTAGGIO DEI DISPLAY
    E MI CHIEDO SE ARDUINO PUO’ PILOTARE UN DISP 4 RIGHE 16 CARATTERI E SE SI, VORREI UN ESEMPIO PER SCRIVERE DEI TESTI DIVERSI NELLE VARIE POSIZIONI UTILIZZANDO COME COMANDO DIVERSI PIN DI INPUT,
    GRAZIE IN ANTICIPO

    Rispondi
    1. admin Autore articolo

      Ciao Paolo.

      Dai uno sguardo ai commenti. Ho notato che in certe occasioni che il plug-in “Google Syntax Highlighter for WordPress” ho qualche problemino.

      La sintassi corretta è: #include (simbolo minore) LiquidCrystal.h (simbolo maggiore).

      Io sto usando Safari e Google Chrome sotto Mac e vedo tutto ok, fammi sapere cosa stai usando tu così cerco di capire.

      Per copiare il codice fai click su: “view plain” e copia.

      Fammi sapere.

      Grazie per la segnalazione.

      Rispondi
  5. Albe

    Quele è la marca/modello del display lcd? Che tipo di lcd è (Transflessivo)?
    Vorrei sapere se quando si spegne la retroilluminazione il display si legge corettamente oppure è necessaria la retroilluminazione?

    Rispondi
  6. messi

    non mi carica il programma mi da errore : LiquidCrystal lcd (12,…….);
    mi dice che lcd non è dichiarato per piacere aiutatemi ok???

    Rispondi
    1. admin Autore articolo

      Ciao.

      L’errore dipende dal fatto che la dichiarazione è stata fatta in questo modo:

      #include < LiquidCrystal.h > 
      
      con gli spazi tra la parentesi angolare < e la L e tra la h e la parentesi angolare >
      Se nel tuo sketch togli gli spazi tutto funziona.
      
      E' un problema che ho con il plug-in di WordPress che viusalizza il codice.
      
      Scusami tanto.
      
      Saluti.
      Rispondi
  7. Gabriele

    Grazie 🙂 mi e’ stato molto utile poiche’ con altri tutotial non capivo perche’ non si vedesse nulla, poi ho letto questo:
    Nel caso in cui colleghiamo il Pin 15 a +5V e il Pin 16 a GND abbiamo la retroilluminazione:

    GRAZIE!

    Rispondi
  8. mario

    salve, volevo sapere da cosa dipende il numero di data bus line utilizzati. nei vari tutorial trovati in giro (compreso questo) ne vengono usati sempre 4. Perché?

    Rispondi
    1. admin Autore articolo

      Ciao Mario.

      Perdona il ritardo con cui ti rispondo.

      Negli esempi che trovi on-line, come giustamente hai notato, non trovi collegati i pin che vanno
      dal 7 al 10.
      Il display può essere collegato usando 4 o 8 pin per il trasferimento dati. Collegando solamente 4 pin lasciamo liberi 4 pin di Arduino per altri scopi. Utilizzando 8 pin le prestazioni migliorano, ma non così tanto da giustificare la perdita di 4 pin in più su Arduino.

      Quindi la scelta dell’uso di soli 4 pin è puramente di risparmio.

      Ricorda che l’intero dato è costituito da 8 bit e se la modalità che hai scelto è trasferimento a 4 bit, saranno utilizzati solo i pin dal DB7 al DB4 e quindi dovrai effettuare due trasferimenti. Se ad esempio devi inviare il dato 10011101, verrà inviato prima 1001 e poi 1101.

      Ciao.

      Rispondi
    1. admin Autore articolo

      Ciao Antonio.

      Va bene un potenziometro da 10KOhm. Se usi un potenziometro con valore superiore (ad es. da 47KOhm) funziona ugualmente, solo che per arrivare alla piena luminosità non arriverai a piena rotazione del potenziometro.

      Saluti.

      Rispondi
  9. Armando Manno

    Ciao michele
    Sono nuovo
    Ma se uno volesse pilotare 2 lcd con lo stesso atmega328 i punti in comune sono le alimentazioni , la retroilluminazione i vari segnali ad eccezione delpin 4 che dovrebbe abilitare la scrittura sul lcd giusto ?
    E poi dichiarare i due lcd
    Lcd1.begin….
    Lcd.begin….
    Potrebbe funzionare?

    E corretto

    Rispondi
  10. Paolo

    Ottima spiegazione.
    Hai esperienza con arduino uno ed il Display Nokia 5110. Io ho uno acquistato un display da SparkFun e non riesco a farlo funzionare in nessun modo.
    Ho provato ad seguire le indicazioni sul sito che riporta anche lo schema elettrico
    e un programma per farlo funzionare,ma senza risultati.
    Molti suggeriscono di usare lo schema sul sito di Adafruit, ma nonostante l’uso delle librerie adafruit , non sono riuscito a concludere niente.
    Aggiungo che riesco ad istallare le librerie, che devono essere rinominate per poter esser richiamate da ide di arduino, ma non serve a niente.
    Non riesco a capire perché il display non funziona .
    Potresti aiutarmi?
    Grazie
    Paolo

    Rispondi
  11. Marco

    Ciao, voglio farti i complimenti per il blog, il tuo lavoro e la tua bravura nello spiegare i vari argomenti, grazie a te sono riuscito a imparare ad utilizare questa stupenda piattaforma, grazie, voglio chiederti un informazione riguardo il controllo dello schermo lcd, nel mio progetto sullo scermo nella prima linea viene scritto in che menu sono cambiandolo tramite un pulsante e qui si è presentato il problema che un nome del menu è più corto di altri e quindi non viene riscritto tutto lo scermo e rimangono gli ultimi caratterei della scritta prima, ho risolto mettendo degli spazi nella scritta più corta in modo che vanno a riscrivere le lettere degli altri menu, però nella seconda riga ci sono dei valori numerici che cambiano da menu a menu e che aumentano e diminuiscono , tipo in un menu ho 4000 e in quello dopo ho 180, ma essendo che uso una cifra in meno l’ultimo 0 non sparisce e visivamente ho 1800 e non 180, come posso fare ad ovviare al problema? il valore a 4000 può scendere anche sotto 999 quindi andando a perdere un numero che non viene riscritto.
    Spero in una tua risposta con una soluzione al mio problema.

    Rispondi
  12. Sebastiano

    Ciao e grazie per gli utili consigli !
    Ho un problema quasi incredibile (almeno per me …)
    Mi funziona tutto ma se tento di visualizzare il carattere “O” (maiuscolo o minuscolo) il display va in tilt (visualizza una serie di caratteri strani o addirittura niente) !
    Se tento di visualizzare la stringa è “ABCDEFGHIJKLMNPQ” funziona, se invece la stringa è “ABCDEFGHIJKLMNOP” non funziona più niente …
    Hai qualche idea in proposito ?

    Grazie

    Sebastiano

    Rispondi
  13. Angelo

    Ciao a tutti,
    io ho eseguito tutti i collegamenti tranne la retroilluminazione. Configurazione a 4 bit.
    Con il potenziometro riesco a regolare il contrasto, però ho un problema.
    Non riesco a stampare sul LCD. Mi rimangono sempre e solo i rettangoli neri, con contrasto variabile.
    Lo stesso codice stampa sia su seriale che su lcd.
    Su seriale funziona ma su lcd no.
    Il codice è quello standard di questo tutorial solo con l’aggiunta della stampa in seriale.
    Cosa sbaglio?

    Rispondi
    1. Angelo

      Ho risolto il mio problema. Il pin R/W(5), che la guida consiglia di collegarlo a massa, l’ho collegato ad un pin digitale e lo faccio gestire all’arduino,

      LiquidCrystal lcd(12, 10, 11, 7, 6, 5, 4);
      //LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)

      Ora però ho un problema, i caratteri sono tutti strani, tipo £$|§+(poi quadrato nero) e si ripete.
      Da cosa potrebbe dipendere?

      Rispondi
  14. Davide

    ciao!
    prima di tutto ti volevo ringraziare molto per i tutorial che fai perchè mi aiutano sempre davvero tanto! vorrei farti una domanda..
    io ho avuto qualche problemino a saldare i contatti sul display e forse l’ho pure rovinato perchè ora visualizza solo quadrati neri.. ma nelle tue foto vedevo che hai collegato il display e la breadboard in modo diverso, inserisci i cavi direttamente nel display! mi spieghi per favore cosa usi?
    Grazie mille

    Rispondi

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.