Qualche giorno fa Matteo Canetto mi ha scritto un’email raccontandomi il suo progetto e di alcuni test eseguiti con il PCF8574P interfaccia I2C per display LCD paralleli.
Ho chiesto a Matteo di raccontare e condividere la sua esperienza ed ho ricevuto via email la sua guida all’uso del PCF8574P, dei display LCD e tutte le foto che trovi in questo articolo.
Matteo sta lavorando ad un progetto ben più complesso del semplice controllo di un display LCD parallelo mediante connessione i2c, lo ha chiamato DomoticOne e spero presto possa ultimarlo e inviare foto, video e sketch del suo progetto.
Il progetto di Matteo con il PCF8574P
La guida scritta da Matteo è così ben fatta che la riporto senza interventi, buona lettura.
Oggi andremo a conosce l’integrato Pcf8574:
molto spesso sul nostro microcontrollore siamo a corto di pin.
Per risolvere questo problema ci sono vari modi,una buona soluzione è ricorrere a quei circuiti integrati chiamati IO Expander la cui funzione è quella di aumentare il numero di I/O a disposizione.
Il PCF8574 è un 8 bit e utilizza il protocollo I2C, che comunica utilizzando un’interfaccia a 2 fili seriale, in cui un filo è un clock seriale (SCL) e l’altro per i dati seriali (SDA).
Con questo IC, è possibile utilizzare solo 2 pin di Arduino per controllare fino a 8 ingressi o uscite digitali.
In questo tutorial vedremo come far comunicare il nostro display lcd ( io uso un 20×4 compatibile come i classici 16×2 hd44780 )
Per fare tutto ciò abbiamo bisogno delle librerie appropriare chiamate LiquidCrystal_I2C, dove all’interno troveremo tutto il necessario per collegare il display lcd dal datasheet dei componenti allo schema di montaggio, ad alcuni esempi per lo sketch.
Componenti:
- di certo non deve mancare la nostra scheda arduino
- l’integrato della famiglia PCF85743
- un transistor BC557 con opportune resistenze ( la prima collegata al piedino b da 1KW e la seconda dipende dallo schema del lcd)
- Il classico potenziometro usato per regolare il contrasto del display
Riassumendo lo schema vediamo che l’integrato ai pin 1-2-3-8 è collegato a GND, mentre 4-5-6-7 sono collegati al display ai pin 11-12-13-14, di seguito abbiamo pin 9-10-11 sempre collegati al display con i pin 6-5-4.
Colleghiamo il pin 12 alla resistenza da un 1KW, a sua volta collegata col transistor tramite il pin b con il pin c a +5V e il pin e col pin 15 del display. Per la comunicazione usiamo i pin 14 e 15 collegati ad arduino su gli ingressi analogici A5 e A4, il potenziometro collegato al pin 3 del display,e concludiamo con il pin 16 del PCF a +5v e pin 16 del display collegato a GND.
Con questa configurazione otterremo (con un classico PCF8574A) l’address 0x20, mentre con un PCF8574AP (come quello di questa guida) avremmo 0x38.
L’address ci serve per individuare il nostro integrato, perché volendo possiamo collegare 8 PCF tutti assieme ognuno con 8 ingressi o uscite, per un complessivo di ben 64 pin digitali I/O in più sul nostro arduino!!
Che ne dite?
Come integrato è molto utile.
Un piccolo consiglio per l’acquisto, troverete diverse sigle sui PCF a 16 pin come appunto A-AP-N-P ecc, praticamente sono tutti uguali, solo piccole variazioni tra costruttori riportati sui datasheet.
Un immagine che può tornare utile è quella qua sotto se si vuole conoscere i vari address, come noterete la nostra configurazione è L-L-L per ottenere 0x20 oppure 0x38 a seconda dell’integrato.
Faccio notare che L sta per GND mentre H sta per +5V.
Passiamo allo sketch, come detto prima abbiamo vari esempi all’interno della libreria, noi prenderemo quello chiamato “Hello World” e se necessario vi apporteremo varie modifiche come appunto l’address o il tipo del display, come noterete è assai semplice:
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x20,16,2); // 16x2 e il tipo del lcd - address 0x20 void setup() { lcd.init(); // inizializza lcd // Stampa il messaggio su LCD. lcd.backlight(); lcd.print("Hello, world!"); } void loop() { }
Bene, siamo al termine di questo tutorial, come vedete il PCF8574 è un integrato molto versatile utile e compatto.
Ho realizzato una piccola shield per un mio progetto (il DomoticONE, progetto ancora da finire), l’intero circuito è racchiuso in appena 5x4cm ma volendo si fa può rimpicciolire:
Spero di essere stato utile a tutti voi, mi resta solo che augurarvi di fare ancora una ottima esperienza col nostro arduino e con i PCF8574.
44 commenti
1 ping
Vai al modulo dei commenti
Ciao mauro, ero da tempo che cercavo una guida del genere, ora che matteo ha fatto questa guida sono riuscito a risolvere un problema che da giorni avevo con pochissimi soldi e una grande facilità.
Saluti Alberto
Autore
Grazie Alberto per il tuo commento.
Sono certo che Matteo sarà contento di leggere i tuoi complimenti
e stimolato a scrivere degli altri articoli interessanti.
Mauro
Ciao Mauro,
Grazie per questo e per tante altre utili guide che ho trovato su mauroalfieri.it
Ho iniziato un progetto di domotica e gestione con arduino (ma sono principiante assoluto) e grazie a te ho trovato la soluzione a diversi problemi. Grazie!
Matteo
Autore
ciao Matteo,
Il blog é quí anche per questo.
Mauro
Ciao 🙂 vorrei sapere se usando display di diversa grandezza, ad esempio il 20 x 4, che tipo di indirizzo di selezione I2C bisogna inserire. So che il 16×2 è il 0x20 e gli altri tipi di lcd ? esite una tabella ?
Grazie 🙂
Autore
Ciao Andrea,
se leggi bene l’articolo vedrai che l’indirizzo da inserire non dipende dal tipo di display ma dalla configurazione dei pin A0,A1 e A2 presenti sul PCF8574
Mauro
ahhh ok ora ho capito… 🙂 ma per il 16×2 è obbligatorio inserire il 0x20? Grazie 🙂
Niente mi rispondo da solo …. ho visto il tuo articolo 🙂 volevo chiederti invece se hai mai usato la shield Easy VR Grazie 🙂
Autore
Ciao Andrea,
personalmente no, c’è un ottimo tutorial nel mio blog dedicato alla Easy Vr, scritto da due ragazzi appassionati arduino.
Mauro
ok Grazie ancora 🙂
Ciao, stavo proprio cercando un circuito per pilotare un display 20×4 tramite I2C con Arduino e ho trovato il tuo articolo molto interessante. Visto però che tratti principalmente il display 16×2 (anche se dici che tu utilizzi un 20×4) mi sorge una domanda: per pilotare un display 20×4 il circuito elettrico è lo stesso o occorrono delle modifiche?
Grazie
nicola
Autore
Ciao Nicola,
se possiedi un circuito 24×4 con integrata già la parte I2C puoi utilizzare le librerie per qual tipo di display.
Se vuoi realizzare tu il circuito con il PCF8574P assicurati che il display sia controllabile in modalità 4bit come i 16×2 e che il chip di gestione del display sia compatibile con il PCF8574
Mauro
grazie per le tue indicazioni
nicola
Ciao e complimenti per il tuo blog…
Quando un progetto amplifica le porte I/O del nostro Arduino è sempre un qualcosa di MOLTO positivo.
Per quando abbia guardato su internet non riesco a reperire il transistor BC557, posso usarne qualcuno di equivalente?
Grazie!
Autore
Ciao Andrea,
nella configurazione attuale anche il più semplice BC547 può andar bene.
Mauro
Proprio ora mi sono accorto che grazie all’acquisto del kit beginner Arduino originale sono in possesso di ben 5 bc547b, è equivalente?
Autore
Ciao Andrea,
in questa configurazione, come ti ho scritto, si.
Mauro
Ciao, nel disegno dello schema elettrico l’emettitore del transistor è messo in posizione errata in quanto deve essere sul + 5 volts … sempre che si tratti di un BC557 …
… se invece si tratta di un BC547, la posizione della freccia dell’emettitore è corretta ma invertita perché deve essere uscente …. tutto questo poiché il BC 547 ed il BC557 non sono equivalenti in quanto il primo è un NPN ed il secondo è PNP …
sono utilizzabili entrambi apportando però le opportune modifiche al circuito ed al codice poiché NPN va in saturazione con uno stato logico High sulla base, mentre PNP va in saturazione con uno stato logico Low …
Il post è datato, tuttavia ti segnalo questo poiché qualcuno potrebbe comunque usufruire delle tue preziose indicazioni …
Ciao.
Autore
Ciao Claudio,
grazie mille delle precisazioni sono sempre utilissime e di grande aiuto.
Non mi ero accorto dell’errore, non avendo disegnato io il progetto non ne possiedo il disegno originale per correggerlo.
Lascio all’autore dell’articolo la possibilità di mandarmi la correzione, eventualmente la disegnerò personalmente per non lasciare errori a chi desidera seguire questa guida.
Grazie.
Ciao e scusate la domanda sciocca, ma con questa configurazione il backlight ha la funzionalità on off o si può anche fare una sorta di regolazione?
Grazie
Autore
Ciao Valerio,
con questa configurazione non penso sia possibile a causa della mancanza del controllo di tipo PWM sul pin a cui è collegata la retro illuminazione. Se colleghi la retro illuminazione ad un pin PWM di arduino potresti controllarla se il tuo display la supporta.
Mauro
Grazie mille della risposta. Ok allora attacchero il controllo D11 e farò un comando apparte.
Grazie di nuovo.
Autore
Ottimo Valerio.
Scusa di nuovo, ma se io volessi mettere una resistenza variabile in serie a R1 (R1 -> resistenza variabile pin 1 e pin2 -> pin15 e il pin 3 scollegato).
Ho provato con una resistenza variabile da 470 ma non varia abbastanza ho provato con una da 4K7 ma non a variazione.
Sbaglio o devo provare con valori tipo 1K o ?
Autore
Ciao Valerio,
per resistenza variabile intendi un potenziometro?
Io utilizzo il classico 10k ma penso che anche il tuo 4,7k possa andar bene per regolare il contrasto.
Mauro
Grazie mille ma non per il contrasto; R1 e la retroilluminazione.
Avendo un R1=470 e in serie un potenziometro da 4K7 collegato solo tra il pin 1 e il 2 (tenendo il 3 pin scollegato) va bene o ho fatto errore e rischio di rompere tutto per le correnti che girano? Sono un aggeggione, ma non tanto pratico, scusa di nuovo.
Autore
Ciao Valerio,
ad occhio penso che danni non dovresti farne, tuttavia è solo una via teorica non avendo io in mano ne i tuoi componenti ne la possibilità di fare dei test con degli strumenti specifici prima di collegare il tutto.
Mauro
Grazie mille, ho provato e per ora funziona.
Grazie di tutto.
Autore
Ottimo Valerio.
Mauro
Ciao Mauro,
finalmente sono riuscito a reperire tutti i componenti anche io ho usato un PCF8574AP, un transistor BC547B e un LCD 16×2, questi ultimi componenti reperiti dal kit beginner di Arduino.
Ho montato il progetto ed inserito la resistenza da 1k tra il pin 13 del PCF e il centrale del transistor, inoltre ho inserito la resistenza da 220 tra il pin 15 dell’lcd e il pin e del transistor come specificato.
Essendo un AP ho usato l’address 0x38.
Funziona tutto alla grande solo una cosa è anomala:
l’istruzione lcd.backlight() spegne la retroilluminazione invece di accenderla!!!
Quale errore ho commesso?
logicamente l’istruzione lcd.noBacklight() fa accendere la retroilluminazione.
Non è un problema, basta tenerne condo nel proprio progetto, volevo solo correggere un mio eventuale errore!
Grazie
Autore
Si Andrea, comprendo l’interesse.
Autore
Ciao Andrea,
non ho provato a utilizzare il metodo lcd.blacklight() probabilmente porta il pin LOW invece di portarlo HIGH.
Oppure potresti aver collegato il transistor in modo che agisca sul pin negativo della retroilluminazione.
Ciao Mauro,
Innanzitutto ti faccio i complimenti per la tua guida.
Io ho un problema con un display 16×2 comandato con i2c.
Utilizzando un qualsiasi sketch, anche il più semplice, il display mi mostra solamente la prima lettera della parola.
Per intenderci se gli dico di scrivere “Ciao”, lui scrive solo la “C”. Questo vale anche per i numeri. Mentre invece tutte le altre funzioni tipo clear, cursor o backlight funzionano correttamente.
Il mio display è pilotato da un PCF8574AT.
Secondo te a cosa può essere dovuto?
Potrebbe essere un problema di librerie?
Ti ringrazio anticipatamente.
Ciao.
Autore
Ciao Matteo,
non sei il primo che segnala questo comportamento, se leggi nei commenti devo aver già dato più di un suggerimento da seguire.
ciao, hai risolto il tuo problema, dalla descrizione ne ho uno uguale.
ho provato a leggere i commenti passati come dice Mauro, ma io non ho trovato spiegazioni per la risoluzione del problema.
Grazie per l’aiuto che mi puoi dare
Autore
Ciao Masismo,
lascio il commento per Matteo.
Ciao, io ho risolto il problema.
con l’ide 1.6.9 sono andato dulla gestione delle librerie ed ho installato la libreria liquidcrista_i2c di frank brabander. cliccando sul tasto more info ti apre questa pagina web.
https://github.com/marcoschwartz/LiquidCrystal_I2C
spero di essere stato d’aiuto
Autore
Ciao Masismo,
si la libreria di Marco S. è quella ufficiale inclusa nell’IDE arduino.
Io consiglio di scaricarla direttamente dall’IDE.
Ciao come posso fare a capire se il mio lcd può supportare il modulo i2C?
L’ho acquistato da poco ma non riesco a farlo funzionare.
Autore
Ciao Seby,
perdonami ma non ho capito la domanda 🙂
Hai un display di che tipo, con che driver di controllo? l’I2C è a parte o integrato?
Ciao Mauro, mi chiamo Fabiano e sono un appassionato di elettronica. Sto realizzando una scheda con arduino nano che mi gestisce un diplay LCD con interfaccia I2C, gestita tramite la libreria LiquidCrystal_I2C e che funziona perfettamente con il PCF8574AT. Ora vorrei inserire nello stesso bus, IC PCF8574T per gestire 4 uscite e leggere 4 ingressi digitali, ma non riesco a configurare il secondo IC sia per leggere che per scrivere le uscite.
Il Display è configurato con ADRESS ( 0x38 ) A0=Vdd-A1=gnd-A2=gnd, mentre il secondo IC ADRESS ( 0x20 ) A0=gnd-A1=gnd-A2=gnd.
Nel Setup di Arduino ho inizializzato il dispalay
( LiquidCrystal_I2C lcd(0x39,16,2); // set the LCD address to 0x39 for a 16 chars and 2 line
Wire.begin
e nel Loop() visualizzo dati sul display.
Vorrei anche leggere lo stato degli ingressi e di conseguenza attivare le uscite con delle logiche.
Parte di codice che ho scritto : queste due funzioni vengono richiamata dal main loop().
Mi potresti dare consigli in merito ? Grazie anticipatamente.
[[ codice rimosso in automatico ]]
Autore
Ciao Fabiano,
in primo luogo ti invito alla lettura e rispetto delle regole del blog scritte in fondo ad ogni articolo.
In merito alla tua richiesta non ho capito alcune cose:
1. “Il Display è configurato con ADRESS ( 0x38 )” e poi mi scrivi “LiquidCrystal_I2C lcd(0x39,16,2)” dov’è l’errore?
2. “Parte di codice che ho scritto : queste due funzioni vengono richiamata dal main loop().” e non funzionano? che errori ti danno? il monitor seriale ti da qualche info su cosa accade?
Ciao Mauro, ti ringrazio per la risposta al mio post.
Ho finalmente sistemato il mio problema e ti spiego : Il display è configurato con ADDRESS ( 0x38 ) nel codice avevo provato a cambiare indirizzo del display pensando che andassero in conflitto con il secondo IC.
L’errore del non funzionamento stava nel PCB che ho realizzato in quanto il comune dei Jumper che impostano l’indirizzo al PCF8574T/3 era solo collegati tra di loro e non verso massa, quindi l’intergato con aveva ADDRESS !.
Sistemato questo collegamento ha subito iniziato a funzionare la parte del I/O Expander.
GRazie
Autore
Grazie Fabiano per la condivisione, sarà di certo utile ad altri.
[…] in passato ho pubblicato un articolo scritto da Matteo, un appassionato arduino, in cui un display lcd 1602 collegato ad un pcf8574p potevi controllarlo […]