Διασύνδεση του I2C LCD με το Arduino

Στις ηλεκτρονικές μας κατασκευές με το Arduino, συχνά θέλουμε να απεικονίσουμε κείμενο και ένας τρόπος που μπορούμε να το κάνουμε είναι με ένα LCD module χαρακτήρων. Στη διασύνδεση ενός LCD module με το Arduino χρησιμοποιούνται αρκετά ψηφιακά Ι/Ο πινς που στην κατάσταση 4-bit mode φτάνει στα 6 πινς.

Μπορούμε να ξεπεράσουμε αυτό το πρόβλημα με τη χρήση ενός I2C LCD module. Αυτό περιλαμβάνει 2 πινς (εκτός τους 2 ακροδέκτες τροφοδοσίας) που συνδέονται στο δίαυλο I2C του Arduino, ελευθερώνοντας όλα τα ψηφιακά πινς I/O.

Επισκόπηση του I2C LCD

Ένα τυπικό I2C LCD module αποτελείται από δυο μέρη. Το LCD module χαρακτήρων που βασίζεται στο τσιπ HD44780 και ένα pcb προσαρμογέα κολλημένο πίσω από το LCD module.

Το LCD module χρησιμοποιείται για την απεικόνιση κειμένου / χαρακτήρων. Κατασκευάζεται σε διάφορα μεγέθη, για παράδειγμα ένα 16Χ2 character LCD μπορεί να απεικονίσει 32 ASCII χαρακτήρες σε δυο γραμμές των 16 χαρακτήρων η κάθε μια.

Εάν παρατηρήσεις από κοντά θα δεις τον κάθε χαρακτήρα μέσα σε ένα παραλληλόγραμμο  με τα pixel να τον σχηματίζουν. Κάθε παραλληλόγραμμο αποτελείται από ένα πλέγμα 5Χ8 pixels

To pcb του προσαρμογέα βασίζεται στον 8-bit  I/O Expander chip – PCF8574. Αυτό το ολοκληρωμένο κύκλωμα μετατρέπει τα σειριακά δεδομένα του πρωτοκόλλου I2C σε παράλληλα δεδομένα για επικοινωνία με το LCD module.

Πάνω στο pcb του προσαρμογέα υπάρχει ένα τρίμερ για τη ρύθμιση της αντίθεσης του ντισπλέι. Επιπρόσθετα υπάρχει και ένας βραχυκυκλωτήρας πάνω στο pcb για την επιλογή του πίσω φωτισμού.

I2C διευθύνσεις του LCD

Υπάρχει η περίπτωση να χρησιμοποιείς πολλαπλές συσκευές πάνω στον ίδιο δίαυλο I2C. Σε αυτή την περίπτωση θα πρέπει να επιλέξεις μια διαφορετική διεύθυνση για το I2C LCD module για να μην έχουμε σύγκρουση δεδομένων.

Πάνω στο pcb του προσαρμογέα υπάρχουν επαφές (βλέπε εικόνα) που μπορείς να τις βραχυκυκλώσεις κατάλληλα με κόλληση για να ορίσεις την I2C διεύθυνση του I2C LED module.

Ευτυχώς ή δυστυχώς υπάρχουν αρκετές εταιρίες που κατασκευάζουν το ίδιο PCF8574 τσιπ όπως η Texas Instruments, η NXP Semiconductors και άλλες. Η I2C διεύθυνση του LCD module ορίζεται διαφορετικά από εταιρεία – σε εταιρία.

Αν το LCD έχει ένα PCF8574 από την Texas Instruments

Σύμφωνα με το εγχειρίδιο της Texas Instruments, τα 3 λιγότερα σημαντικά bit (Α0, Α1, Α2) του 7-bit του καταχωρητή διεύθυνσης είναι bit επιλογής που προσδιορίζουν και από μια διαφορετική διεύθυνση:

Αφού υπάρχουν 3-bit με τα οποία μπορούμε να ορίσουμε και από μια διαφορετική διεύθυνση και κάθε bit έχει δυο δυνατές τιμές 0 και 1, τότε μπορούμε να θέσουμε μια από οχτώ διαφορετικές διευθύνσεις.

Προκαθορισμένα και τα τρία bit επιλογής της διεύθυνσης έχουν τιμή το λογικό 1 με τράβηγμα pull up, ορίζοντας στο PCF8574 την προκαθορισμένη διεύθυνση 0100111 στο δυαδικό ή 0x27 στο δεκαεξαδικό.

Βραχυκυκλώνοντας με κόλληση τις επαφές που ορίζουν την διεύθυνση τότε αυτές τίθενται σε LOW.

Αν το LCD  έχει ένα PCF8574 τσιπ από την NXP Semiconductor

Σύμφωνα με το εγχειρίδιο της NXP Semiconductor υπάρχουν τρία bit επιλογής (Α0, Α1, Α2) πάνω στο 7-bit I2C καταχωρητή διεύθυνσης που στο κάθε ένα μπορούμε να δώσουμε τιμή 0 ή 1 και έτσι ορίζονται οκτώ διαφορετικές διευθύνσεις.

Προκαθορισμένα και τα τρια bit επιλογής της διεύθυνσης έχουν τιμή το λογικό 1 με τράβηγμα pull up, ορίζοντας στο PCF8574 την προκαθορισμένη διεύθυνση 0111111 στο δυαδικό ή 0x3F στο δεκαεξαδικό.

Βραχυκυκλώνοντας με κόλληση τις επαφές που ορίζουν την διεύθυνση τότε αυτές τίθενται σε LOW.

Διάταξη ακροδεκτών του I2C LCD

To I2C LCD module επικοινωνεί με τον έξω κόσμο χρησιμοποιώντας 4 ακροδέκτες:

GND: είναι ο ακροδέκτης της γείωσης και συνδέεται με τον ακροδέκτη 0V του Arduino.
Vcc: είναι η τάση τροφοδοσίας του LCD. Συνδέεται στην έξοδο 5V του Arduino ή σε εξωτερικό τροφοδοτικό 5V
SDA: είναι ο ακροδέκτης σειριακών δεδομένων που χρησιμοποιείται για αποστολή ή λήψη δεδομένων. Συνδέεται στο πιν SDA του Arduino.
SCL: είναι ο ακροδέκτης ρολογιού για συγχρονισμό μετάδοσης δεδομένων. Οι παλμοί ρολογιού παράγονται από την Master συσκευή. Συνδέεται στο πιν SCL του Arduino

Διασύνδεση του Arduino Uno σε ένα I2C LCD module

Επειδή το I2C LCD χρησιμοποιεί 4 πινς για την διασύνδεση του, είναι πιο εύκολο να το χρησιμοποιήσουμε αυτό αντί του κλασικού LCD που χρησιμοποιεί 12 πινς.

Για να χρησιμοποιήσεις το I2C LCD module σύνδεσε το VIN πιν με το πιν 5V του Arduino και το GND με το 0V του Arduino.

Τώρα μένει να συνδέσουμε τα πινς που ορίζουν την I2C επικοινωνία. Ας σημειώσουμε εδώ ότι κάθε Arduino Board έχει διαφορετικά πινς για I2C επικοινωνία τα οποία θα πρέπει να συνδεθούν κατάλληλα. Για το Arduino Uno ο ακροδέκτης SDA (data line) του I2C LCD συνδέεται με το πιν A4(SDA) του Arduino Uno και ο ακροδέκτης SCL (clock line) του I2C LCD συνδέεται με το πιν Α5(SCL) του Arduino Uno.

Εάν χρησιμοποιείς διαφορετικό Arduino Board βασίσου στον πίνακα που ακολουθεί:

Μετά που διασυνδέσεις το I2C LCD module θα πρέπει να ρυθμίσεις την αντίθεση της οθόνης για να έχεις το βέλτιστο αποτέλεσμα. Στο I2C LCD θα βρεις ένα μικρό ποτενσιόμετρο που μπορείς να το ρυθμίσεις με ένα μικρό κατσαβίδι για να ορίσεις την επιθυμητή αντίθεση.

Εγκατάσταση βιβλιοθήκης

Για να μπορέσει το Arduino Board να επικοινωνήσει με το I2C LCD module και να απεικονίσει δεδομένα είναι αναγκαίο να εγκαταστήσουμε και να χρησιμοποιήσουμε κατάλληλη βιβλιοθήκη ειδικά για I2C επικοινωνία. Ακολούθησε τα ακόλουθα βήματα για να την εγκαταστήσεις:

LiquidCrystal_I2C Library
1] Πάτησε εδώ LiquidCrystal_I2C για να κατεβάσεις την βιβλιοθήκη του I2C LCD module. Θα πρέπει να έχεις ένα φάκελο .zip στο φάκελο downloads του  υπολογιστή σου.
2] Κάνε unzip τον .zip folder και θα πρέπει να πάρεις τον φάκελο LiquidCrystal_I2C
3] Μετακίνησε τη βιβλιοθήκη LiquidCrystal_I2C στο φάκελο των βιβλιοθηκών του περιβάλλοντος Arduino IDE
4] Τέλος κάνε επανεκκίνηση την εφαρμογή Arduino IDE.

Ανιχνεύοντας την I2C διεύθυνση

Η διεύθυνση του I2C LCD module εξαρτάται από τον κατασκευαστή του PCF8574 και την βραχυκύκλωση των επαφών όπως εξηγήσαμε νωρίτερα. Η προκαθορισμένη διεύθυνση (χωρίς τη βραχυκύκλωση των επαφών) για το τσιπ που είναι κατασκευασμένο από την Texas Instruments είναι 0x27 ενώ η προκαθορισμένη διεύθυνση του τσιπ κατασκευασμένο από την NXP Semiconductors είναι 0x3F.

Παρατηρούμε ότι υπάρχει σύγχυση για τον προσδιορισμό της διεύθυνσης του PCF8574 τσιπ. Ένας τρόπος για να το λύσουμε αυτό είναι να χρησιμοποιήσουμε ένα sketch που αφού συνδέσουμε το I2C στο Arduino και το τρέξουμε δίνει στο Serial Monitor την επιθυμητή I2C διεύθυνση.

Πάτησε εδώ για να κατεβάσεις το sketch εύρεσης της I2C διεύθυνσης του LCD.

Κώδικας επίδειξης για το Arduino – Hello World

Παρακάτω δίνεται δοκιμαστικός κώδικας για το Arduino που απεικονίζει το μήνυμα «Hello World» στην πρώτη γραμμή και «LCD tutorial» στην δεύτερη γραμμή για ένα I2C module.

Στον κώδικα που ακολουθεί θα πρέπει να κάνεις αλλαγές που εξαρτώνται από την διεύθυνση του I2C και τις διαστάσεις σε στήλες και γραμμές του LCD. Εάν χρησιμοποιείς 16Χ2 χαρακτήρων LCD πέρασε τις παραμέτρους 16, 2 και εάν χρησιμοποιείς 20Χ4 LCD πέρασε τις παραμέτρους 20, 4

//Εισαγωγή της διεύθυνσης I2C και τις διαστάσεις του LCD module
LiquidCrystal_I2C  lcd(0x3F, 16, 2);

Όταν γίνει κατανοητό προχώρησε και φόρτωσε τον ακόλουθο κώδικα:

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);  // Ορισμός της διεύθυνσης για ένα 16 Χ 2 χαρακτήρων I2C LCD

void setup() {
  lcd.init();
  lcd.clear();         
  lcd.backlight();      // Άναψε τον πίσω φωτισμό
  
  // Εμφάνισε ένα μήνυμα και στις δυο γραμμές του LCD.
  lcd.setCursor(2,0);   //Μετακίνησε τον κέρσορα στον χαρακτήρα 2 στη γραμμή 0
  lcd.print("Hello world!");
  
  lcd.setCursor(2,1);   //Μετακίνησε τον κέρσορα στον χαρακτήρα 2 στη γραμμή 1
  lcd.print("LCD Tutorial");
}

void loop() {
}

Όταν όλα πάνε καλά θα έχεις το αποτέλεσμα όπως στην ακόλουθη εικόνα:

Επεξήγηση του κώδικα

Ο κώδικας ξεκινά με την συμπερίληψη της βιβλιοθήκης LiquidCrystal_I2C

# include <LiquidCrystal_I2C.h>

Στη συνέχεια δημιουργείται ένα αντικείμενο της κλάσης LiquidCrystal_I2C. Η συνάρτηση δημιουργίας του αντικειμένου παίρνει τρείς παραμέτρους: address, columns, rows. Εδώ μπορείς να δηλώσεις την διεύθυνση, την προκαθορισμένη ή την διεύθυνση που βρήκες νωρίτερα αν είναι διαφορετική και τις διαστάσεις της οθόνης του I2C LCD.

LiquidCrystal_I2C lcd(0x3F, 16, 2);

Μόλις το αντικείμενο της κλάσης δημιουργηθεί τότε αυτό μπορεί να δράσει σε μεθόδους (συναρτήσεις) που έχουν οριστεί για το I2C.

Στη συνάρτηση ‘setup’ χρησιμοποιείται η συνάρτηση init() για να αρχικοποιήσει το lcd αντικείμενο. Στη συνέχεια καλείται η συνάρτηση clear() η οποία καθαρίζει την οθόνη του LCD και μετακινεί τον κέρσορα στην πάνω αριστερή γωνία. Η συνάρτηση backlight() χρησιμοποιείται για να ανάψει τον πίσω φωτισμό:

lcd.init();
lcd.clear();
lcd.backlight();

Στη συνέχεια με την συνάρτηση lcd.setCursor(2, 0); ο κέρσορας τοποθετείται στη τρίτη στήλη και στη πρώτη γραμμή, που ορίζει τη θέση που θα εισαχθεί νέο κείμενο στο LCD. Σημείωση: η πάνω αριστερή θέση έχει συντεταγμένες στήλη = 0 και γραμμή = 0.

lcd.setCursor(2, 0);

Στη συνέχεια, καλώντας την παρακάτω συνάρτηση print εμφανίζεται στο I2C LCD το μήνυμα «Hello World»

lcd.print(“Hello World”);

Στη συνέχεια ο κέρσορας τοποθετείται στη τρίτη στήλη και στη δεύτερη γραμμή και με την εντολή print εμφανίζεται το μήνυμα «LCD Tutorial» στην οθόνη του LCD:

lcd.setCursor(2, 1);
lcd.print(“LCD Tutorial”);

Άλλες χρήσιμες συναρτήσεις της βιβλιοθήκης:

— home()  μετακινεί τον κέρσορα στην πάνω αριστερή γωνία χωρίς να καθαρίσει την οθόνη.
— cursor() εμφανίζει τον κέρσορα σαν μια γραμμή υπογράμμισης στη θέση που ο επόμενος χαρακτήρας θα εμφανιστεί.
— noCursor()  κρύβει τον κέρσορα.
— blink() αναβοσβήνει ένα παραλληλόγραμμο από 5Χ8 pixels στη θέση που ο επόμενος χαρακτήρας θα εμφανιστεί.
— noBlink() απενεργοποιεί την λειτουργία blink του 5Χ8 pixel κέρσορα.
— display() εμφανίζει τα περιεχόμενα της οθόνης LCD που προηγουμένως υπήρχαν στην LCD.
— noDisplay() θέτει σε κατάσταση off την οθόνη χωρίς να την καθαρίζει έτσι ώστε οι χαρακτήρες / κείμενο μπορούν να ξαναεμφανιστούν καλώντας την συνάρτηση display()
— scrollDisplayLeft()  κυλίει τα περιεχόμενα της οθόνης ένα διάστημα αριστερά. Εάν θέλεις να κυλίεις το κείμενο συνεχόμενα, τότε θα πρέπει να χρησιμοποιήσεις αυτή τη συνάρτηση μέσα σε επαναληπτικό βρόγχο.
— scrollDisplayRight() μετακινεί τα περιεχόμενα της οθόνης ένα διάστημα δεξιά.
— autoscroll() ενεργοποιεί την αυτόματη κύλιση του περιεχομένου της οθόνης του I2C LCD. Εάν η τρέχουσα κατεύθυνση του κειμένου είναι αριστερά προς δεξιά (προεπιλεγμένη) τα περιεχόμενα κυλίωνται προς τα αριστερά και εάν η τρέχουσα κατεύθυνση είναι από δεξιά προς αριστερά τα περιεχόμενα κυλίονται προς δεξιά.
— noAutoscroll() απενεργοποιεί την αυτόματη κύλιση.