Arduino και Led Dot Matrix MAX7219

Φτιάχνουμε λοιπόν ένα project με το Arduino και θέλουμε να προσθέσουμε μια οθόνη για να παρουσιάζουμε πληροφορίες. Υπάρχει μια πληθώρα επιλογών από οθόνες TFT, LCD, OLED, e-Paper, Touch, σε διάφορες αναλύσεις και χρώματα. Μπορείτε να διαβάσετε ένα πολύ καλό άρθρο σχετικό με το θέμα αυτό και να παρακολουθήσετε ένα συγκριτικό βίντεο στο Educ8s.tv.

Από την άλλη, αν η πληροφορία που θέλουμε να παρουσιάσουμε είναι κάποιες απλές ενδείξεις (π.χ. αν η τιμή ενός αισθητήρα ξεπέρασε κάποιο όριο), τότε μπορούμε να χρησιμοποιήσουμε και μερικά led λαμπάκια τα οποία είναι πολύ φθηνά και εύκολα στον προγραμματισμό τους.

Μια ενδιάμεση λύση είναι οι οθόνες Dot Matrix, οι οποίες είναι συστοιχίες από led λαμπάκια. Οι πιο συνηθισμένες που κυκλοφορούν στην αγορά έχουν 64 led διατεταγμένα σε 8 σειρές και 8 στήλες. Όπως είναι εύκολα κατανοητό με ανάλυση 8×8 δεν μπορούν να συγκριθούν με τις υπόλοιπες LED και TFT οθόνες, αλλά για αναπαράσταση κειμένου και απλών γραφικών μπορούν να κάνουν ικανοποιητική δουλειά. Επίσης ως εκπαιδευτικός τις βρίσκω ιδιαίτερα ενδιαφέρουσες, καθώς πιστεύω ότι βοηθούν πολύ στο να κατανοήσουν οι μαθητές τον τρόπο λειτουργίας των οθονών, τι είναι τα pixel και τι είναι η ψηφιοποιήση της εικόνας.

Μια οθόνη Led Dot Matrix με 64 led διατεταγμένα σε 8 σειρές και 8 στήλες

Μια πολύ καλή πρόταση, που μας γλιτώνει από αρκετό κόπο όσον αφορά τη συνδεσμολογία, είναι οι Dot Matrix οθόνες με ενσωματωμένο τον οδηγό MAX7219. Σε αντίθεση με τις απλές Dot Matrix, που απαιτούν 16 καλώδια για την σύνδεση με το Arduino, αυτή η υλοποίηση απαιτεί μόνο 5 και μας δίνει την δυνατότητα να συνδέσουμε πολλές οθόνες μεταξύ τους, χωρίς να προσθέσουμε άλλα καλώδια στο Arduino. Η τιμή του συγκεκριμένου module είναι περίπου στα 4 ευρώ από ελληνικά καταστήματα και 1,5 ευρώ από το ebay (τιμές Αυγούστου 2018).

Led Matrix οθόνη με ενσωματωμένο τον οδηγό MAX7219

Σύνδεση με Arduino

Η υλοποίηση της Dot Matrix οθόνης με τον οδηγό MAX7219 έχει 5 pins θα οποία συνδέονται στο Arduino ως εξής:

  • Το pin VCC συνδέεται στα 5V του Arduino.
  • Το pin GND συνδέεται στην γείωση (GND) του Arduino.
  • Το pin DIN (Data in) το συνδέουμε σε ένα από τα ψηφιακά pins του Arduino. Στο συγκεκριμένο παράδειγμα το συνδέω στο pin 12.
  • Το pin CS (Chip select), το οποίο είναι χρήσιμο όταν έχουμε πολλές οθόνες που συνδέονται μεταξύ τους, το συνδέουμε σε ένα από τα ψηφιακά pins του Arduino. Στο συγκεκριμένο παράδειγμα το συνδέω στο pin 11.
  • Το pin CLK (Clock Signal), το οποίο λειτουργεί ως ψηφιακός μετρονόμος, το συνδέουμε σε ένα από τα ψηφιακά pins του Arduino. Στο συγκεκριμένο παράδειγμα το συνδέω στο pin 10.
Σύνδεση μιας οθόνης Dot Matrix MAX7219 με το Arduino

Επιλογή βιβλιοθήκης

Για τον έλεγχο της Dot Matrix οθόνης με τον οδηγό MAX7219 υπάρχουν διαθέσιμες αρκετές βιβλιοθήκες, τις οποίες μπορούμε να προσθέσουμε στο Arduino IDE. Ένα άρθρο που συνοψίζει μερικές από αυτές μπορείτε να διαβάσετε στο Arduino Playground. Η προσωπική μου επιλογή για την διαχείριση απλών pixel και εικόνων είναι η βιβλιοθήκη max7219 από τον Riyas (μικρό και κατανοητό σετ εντολών), την οποία μπορείτε να κατεβάσετε από το GitHub.

Για να κάνετε εγκατάσταση την συγκεκριμένη βιβλιοθήκη στο Arduino IDE σας, μπορείτε να ακολουθήσετε τον παρακάτω αναλυτικό οδηγό:

Βήμα 1ο: Από την σελίδα στο GitHub κάνουμε κλικ στο Clone/Download
Βήμα 2ο: Επιλέγουμε να κατεβάσουμε την βιβλιοθήκη σε μορφή Zip
Βήμα 3ο: Ανοίγουμε το συμπιεσμένο αρχείο με κάποιο πρόγραμμα όπως το 7zip
Βήμα 4ο: Αποσυμπιέζουμε μόνο τον φάκελο MaxMatrix, ο οποίος περιέχει τα αρχεία της βιβλιοθήκης
Βήμα 5ο: Συμπιέζουμε τον φάκελο MaxMatrix σε μορφή zip
Βήμα 6ο: Από το Arduino IDE επιλέγουμε Σχέδιο –> Συμπερίληψη Βιβλιοθήκης –> Προσθήκη βιβλιοθήκης ZIP και αναζητούμε το αρχείο MaxMatrix.zip
Αν όλα έχουν πάει καλά θα πρέπει πλέον στο μενού της συμπερίληψης βιβλιοθήκης να βλέπουμε την επιλογή MaxMatrix

Προγραμματισμός οθόνης με την βιβλιοθήκη MaxMatrix

Οι βασικές μας εργασίες πριν ξεκινήσουμε να ανάβουμε τα διάφορα led στην οθόνη είναι:

  • να συμπεριλάβουμε την βιβλιοθήκη MaxMatrix στο πρόγραμμα μας,
  • να δημιουργήσουμε ένα αντικείμενο της κλάσης MaxMatrix περνώντας ως παραμέτρους τα pin στα οποία έχουμε συνδέσει την οθόνη με το Arduino, καθώς και τον αριθμό των οθονών που έχουμε,
  • να αρχικοποιήσουμε το αντικείμενο στο Setup και
  • να ορίσουμε την φωτεινότητα των led.

Αφού έχουμε κάνει τις παραπάνω δηλώσεις στο πρόγραμμα μας, μπορούμε πλέον να ανάβουμε και να σβήνουμε μεμονωμένα led στην οθόνη, χρησιμοποιώντας την συνάρτηση setDot(x,y,state) η οποία δέχεται 3 παραμέτρους: την θέση x, την θέση y και την κατάσταση του συγκεκριμένου led (true = αναμμένο, false = σβηστό).

Το αποτέλεσμα της συνάρτησης matrix.setDot(1,4,true);

Με τον τρόπο αυτό μπορούμε να “ζωγραφίσουμε” στην οθόνη Dot Matrix μια χαμογελαστή φατσούλα με τον παρακάτω κώδικα

Ζωγραφίζοντας μια χαμογελαστή φατσούλα στην οθόνη.

Φυσικά μπορούμε να εκμεταλλευτούμε τις δυνατότητες που μας παρέχουν οι δομές επανάληψης καθώς και η συνάρτηση loop() έτσι ώστε να δημιουργήσουμε όμορφα animation.

Το Animation που προκύπτει με τον παραπάνω κώδικα 

Εκτός από την συνάρτηση setDot(x,y,state), η οποία μας επιτρέπει να ελέγχουμε την κατάσταση (φωτεινό/σβηστό) για κάθε led της οθόνης, η βιβλιοθήκη MaxMatrix μας δίνει την δυνατότητα να χρησιμοποιούμε πίνακες χαρακτήρων που αποτυπώνουν όλη την κατάσταση της οθόνης με τη συνάρτηση writeSprite(x,y,spriteArray).

Η συνάρτηση writeSprite(x,y,spriteArray) δέχεται 3 παραμέτρους: την θέση x και y από την οποία θα αρχίσει να εμφανίζεται το sprite και έναν πίνακα χαρακτήρων που περιλαμβάνει την κατάσταση των led στην οθόνη. Τα 0 και 1 στους πίνακες χαρακτήρων συμβολίζουν την κατάσταση του κάθε led στην οθόνη (0=σβηστό, 1=φωτεινό).

Με το παραπάνω πρόγραμμα και τη συνάρτηση writeSprite, εναλλάσουμε δυο εικόνες στην οθόνη

Συνδέοντας πολλές οθόνες μαζί

Η μεγάλη ευκολία που μας παρέχει η υλοποίηση της οθόνης Led Dot Matrix με τον οδηγό MAX7219, είναι η δυνατότητα να συνδέουμε με απλό τρόπο πολλές οθόνες μεταξύ τους, χωρίς να προσθέσουμε νέα καλώδια στο Arduino. Η σύνδεση κάθε νέας οθόνης γίνεται απευθείας με την προηγούμενη με τον τρόπο που φαίνεται στην παρακάτω εικόνα.

Συνδέοντας 4 οθόνες Led Dot Matrix στην σειρά για να φτιάξουμε μια οθόνη 32×8 pixels.

Σε προγραμματιστικό επίπεδο, αξιοποιώντας την βιβλιοθήκη MaxMatrix που χρησιμοποιήσαμε και στα παραπάνω παραδείγματα, θα πρέπει να προσέξουμε να δηλώσουμε τον αριθμό των συνδεδεμένων οθονών.

Αλλάζω τον αριθμό των συνδεδεμένων οθονών από 1 σε 4

Αν δεν κάνουμε αυτή την αλλαγή και αφήσουμε τον αριθμό των Led Displays σε 1, τότε όλες τους θα αναπαράγουν το ίδιο ακριβώς animation. Αν όμως θέλουμε να λειτουργήσουν ως μια μεγάλη οθόνη με πλάτος 4×8 = 32 pixel, τότε θα πρέπει να δηλώσουμε τον αριθμό 4 στην μεταβλητή που έχουμε δημιουργήσει.

Από την στιγμή που έχουμε πλέον 32 pixel πλάτος στην οθόνη μας, μπορούμε να τα εκμεταλλευτούμε και να δημιουργήσουμε animation τα οποία θα μετακινούν εικόνες δεξιά – αριστερά. Η βιβλιοθήκη MaxMatrix παρέχει δύο συναρτήσεις που μας διευκολύνουν στην δουλειά αυτή, την shiftRight() και την shiftLeft().

Έτσι μπορούμε να ανάψουμε αρχικά συγκεκριμένα led της οθόνης, ή να χρησιμοποιήσουμε την συνάρτηση writeSprite(x, y, spriteArray) για να αποτυπώσουμε μια εικόνα και μετά με τις συναρτήσεις shiftRight() και shiftLeft() να μετακινούμε τις αποτυπώσεις αυτές δεξιά – αριστερά.

Το αποτέλεσμα του παραπάνω προγράμματος: Το δεξί βέλος εμφανίζεται αριστερά και κινείται δεξιά μέχρι να βγει από όλες τις οθόνες. Το αριστερό βέλος εμφανίζεται δεξιά και κινείται αριστερά μέχρι να βγει από όλες τις οθόνες.