Κινητά τηλέφωνα και gadgets

Κινητά τηλέφωνα και gadgets

» Έλεγχος μήτρας 8x8

Έλεγχος μήτρας 8x8


Η Κίνα παρέχει για μια μικρή τιμή μια τεράστια ποσότητα όχι μόνο ηλεκτρονικών συσκευών, αλλά και των εξαρτημάτων τους. Μια μικρή σειρά από διόδους εκπομπής φωτός μπορεί να δείξει τις πληροφορίες που χρειάζεστε, πιθανώς αριθμούς, καθώς η ανάλυση δεν είναι πολύ υψηλή, LED 8 επί 8, κάθε διάμετρος 3 χλστ. Αυτή η μήτρα λάμπει στο κόκκινο, γιατί είναι η πιο ορατή και τραβάει την προσοχή περισσότερο από άλλα χρώματα.


Είναι πιο βολικό να χρησιμοποιήσετε αυτόν τον πίνακα για έλεγχο Arduinoγιατί είναι ψηφιακό. Εάν γράψετε ένα απλό πρόγραμμα, μπορείτε να εμφανίσετε τις απαραίτητες πληροφορίες σε αυτήν την "οθόνη" LED. Υπάρχουν πιο ακριβές τρίχρωμες μήτρες προς πώληση, στις οποίες συνδυάζοντας τα τρία κύρια χρώματα μπορείτε να δημιουργήσετε σχεδόν οποιοδήποτε.


Αυτή η μήτρα έχει 16 ακίδες, παρέχεται ένα διάγραμμα παραπάνω, το οποίο δείχνει ξεκάθαρα πώς συνδέονται τα βασικά στοιχεία της μήτρας - LED, καθοδηγούμενα από αυτό, μπορείτε να συνδέσετε σωστά τη μονάδα για αναπαραγωγή πληροφοριών τόσο από ψηφιακές όσο και από αναλογικές συσκευές. Μην ξεχνάτε τις αντιστάσεις περιορισμού ρεύματος, θα είναι λυπηρό αν καεί κάποιο από τα pixel. Το ονομαστικό συνεχές ρεύμα ενός σημείου είναι ίσο με 20 mA, ρεύμα αιχμής 100 mA, τάση τροφοδοσίας 2,1-2,1V, μήκος κύματος 625-630 nm, η μέγιστη απαγωγή ισχύος είναι 40 mW, η άνοδος είναι κοινή εδώ, δηλαδή ένα συν. Συνολικές διαστάσεις της μήτρας LED 37 στο 37 στο 8 mm. Πρέπει να κολλήσετε προσεκτικά, μην αγγίζετε το συγκολλητικό σίδερο με θερμοκρασία 260 βαθμών για περισσότερο από 5 δευτερόλεπτα, η συνιστώμενη θερμοκρασία λειτουργίας είναι -40 - +70 Κελσίου.

Εάν έχετε πολλές τέτοιες μήτρες σε LED, μπορείτε να τις συνδέσετε για να δημιουργήσετε μεγάλους πίνακες πληροφοριών.

Οθόνη Matrix - μια συσκευή που αποτελείται από μια μήτρα LED 8x8 και μια πλακέτα ελέγχου που βασίζεται στο τσιπ MAX7219 με τις ελάχιστες απαιτούμενες σωληνώσεις. Στη φωτογραφία μπορείτε ήδη να δείτε την τελική συσκευή, αλλά μου ήρθε ταχυδρομικά με αυτήν τη μορφή, οπότε έπρεπε να πάρω ένα συγκολλητικό σίδερο και να κολλήσω τα πάντα με τον σωστό τρόπο.

Η βασική σύνδεση με την πλακέτα Arduino Nano φαίνεται στο διάγραμμα κυκλώματος.

Όπως μπορείτε να δείτε από το διάγραμμα, όλα είναι απλά, απλά πρέπει να συνδέσετε τις επαφές και των δύο πλακών με καλώδια με την ακόλουθη σειρά:

Arduino NanoMatrix 8x8
PIN 12PIN DIN
PIN 11PIN CLK
PIN 10PIN CS
PIN 5VPIN 5V
PIN GNDPIN GND

Λοιπόν, επιτέλους ήρθε η ώρα να δουλέψετε με τον κώδικα και για να εκτελέσετε τη μήτρα LED, πρέπει να κάνετε λήψη και εγκατάσταση της βιβλιοθήκης LedControl. Η βιβλιοθήκη υποστηρίζει μικροκυκλώματα MAXIM 7221 και 7219. Η μήτρα LED χρησιμοποιεί το MAX7219 ως πρόγραμμα οδήγησης, αυτό χρειαζόμαστε. Νομίζω ότι πρέπει να ξεκινήσουμε με ένα μικρό σκίτσο που δείχνει τις βασικές λειτουργίες αυτής της βιβλιοθήκης. Στο σκίτσο, η συνάρτηση setRow() χρησιμοποιείται για την ενεργοποίηση/απενεργοποίηση των LED. Η σύνταξη για την κλήση της συνάρτησης setRow() είναι:

matrix.setRow(0, row, col, set);

Οπου μήτρα- αντικείμενο κλάσης LedControl

0 - διεύθυνση της συσκευής στο δίαυλο SPI, σε αυτήν την περίπτωση υπάρχει μόνο μία συσκευή και η αρίθμηση ξεκινά από τη διεύθυνση μηδέν

σειρά- σειρά (Πιθανές τιμές από 0 έως 7)

διάσελο- στήλη (Οι πιθανές τιμές είναι από 0 έως 7)

σειρά- τιμή ρύθμισης( αληθής- ανάβω, ψευδής- σβήνω)

matrix.setRow(0, 1, 4, true)

Ενεργοποιήστε το LED στη μήτρα, που βρίσκεται στην 1η σειρά και στην 4η στήλη.

Ενα άλλο παράδειγμα:

int x = 1;

int y = 4;

matrix.setRow(0, x, y, true);

matrix.setRow(0, x, y, false);

Το ίδιο συμβαίνει μόνο με τη χρήση μεταβλητών και την επακόλουθη απενεργοποίηση του αναμμένου LED στις δεδομένες συντεταγμένες. Έτσι, στο σκίτσο, πολλά κινούμενα σχέδια παίζονται χρησιμοποιώντας τη συνάρτηση setRow ().

#include "LedControl.h" //Σύνταξη για τη δημιουργία της κλάσης LedControl(dataPin,clockPin,csPin,numDevices) //Όπου το LedControl είναι αντικείμενο της κλάσης //dataPin είναι η καρφίτσα στην πλακέτα Arduino στην οποία θα το pin DIN be connect //clockPin είναι η ακίδα στην πλακέτα Arduino στην οποία θα συνδεθεί η ακίδα CLK //csPin - η ακίδα στην πλακέτα Arduino στην οποία θα συνδεθεί η ακίδα CS //numDevices - ο αριθμός των συσκευών στο δίαυλο / /Δημιουργήστε ένα αντικείμενο της κλάσης matrix στην περίπτωσή μας με μια συνδεδεμένη συσκευή LedControl matrix = LedControl(12, 11 , 10, 1); //Χρόνος καθυστέρησης για την ενεργοποίηση/απενεργοποίηση της λυχνίας LED στη μήτρα const int delayValue = 100; //Πρωτότυπα λειτουργιών //Διαδοχική ενεργοποίηση/απενεργοποίηση void PointSerialSet(); //Snake από δεξιά προς τα αριστερά void PointRigthToLeft(); //Snake από κάτω προς τα πάνω void PointDownToUp(); //Snake από αριστερά προς τα δεξιά void PointLeftToRigth(); //Snake από πάνω προς τα κάτω void PointUpToDown(); //Εφέ - εξασθενίζοντας παλμό void PointFading(); //Εφέ - κενό παλμού PointPulse(); //Εφέ - αυξανόμενο κενό ώθησης PointClimbing(); //Επίδραση της συστροφής της σπείρας μέσα στο void PointToSpiralIn(); //Επίδραση της περιστροφής του σπειροειδούς κενού προς τα έξω PointToSpiralOut(); void setup() ( // Η συσκευή με διεύθυνση 0 wake by default matrix.shutdown(0, false); //Ρυθμίστε τη φωτεινότητα του πίνακα Led στο 8 //Οι πιθανές τιμές είναι από 0 έως 15 matrix.setIntensity( 0, 8). (); PointPulse() ; PointClimbing(); PointToSpiralIn(); PointToSpiralOut(); ) //Σώματα συναρτήσεων void PointSerialSet() ( //Χρησιμοποιήστε τη συνάρτηση setLed(διεύθυνση, γραμμή, στήλη, σύνολο) //Διαδοχική ενεργοποίηση από σειρές για(int i = 0; i< 8; i ++) { for(int j = 0; j < 8; j ++) { //Включить светодиод matrix.setLed(0, i, j, true); delay(delayValue); //Выключить светодиод matrix.setLed(0, i, j, false); } } } void PointRigthToLeft() { //Используем функцию setLed(address, row, col, set) //Змейка справа - налево for(int i = 7; i >= 0; i --) ( for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); ) else ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) ) ) ) void PointDownToUp() ( //Χρησιμοποιήστε τη συνάρτηση setLed(address, row, col, set) //Snake από κάτω προς τα πάνω για (int i = 7; i >= 0; i --) ( for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, i, n, true); delay(delayValue); matrix.setLed(0, i, n, false); ) else ( matrix.setLed(0, i, j, true); delay(delayValue); matrix.setLed(0, i, j, false); ) ) ) ) void PointLeftToRigth() ( //Χρησιμοποιήστε τη συνάρτηση setLed(address, row, col, set) //Snake από αριστερά προς τα δεξιά για (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); ) else ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) ) ) ) void PointUpToDown() ( //Χρησιμοποιήστε τη συνάρτηση setLed(address, row, col, set) //Snake από πάνω προς τα κάτω για (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, i, n, true); delay(delayValue); matrix.setLed(0, i, n, false); ) else ( matrix.setLed(0, i, j, true); delay(delayValue); matrix.setLed(0, i, j, false); ) ) ) ) void PointFading() ( //Χρησιμοποιήστε τη συνάρτηση setLed(address, row, col, set) //Fading effect int upValue = 0 ; int downValue = 7; for(int i = 0; i< 8; i ++) { if(i % 2) { for(int n = downValue; n >= upvalue; n --) ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) downValue --; ) else ( for(int j = upValue; j< downValue + 1; j ++) { matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); } upValue ++; } } } void PointClimbing() { //Используем функцию setLed(address, row, col, set) //Эффект затухания int upValue = 4; int downValue = 4; for(int i = 0; i < 8; i ++) { if(i % 2) { for(int n = downValue; n >= upvalue; n --) ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) downValue ++; ) else ( for(int j = upValue; j< downValue + 1; j ++) { matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); } upValue --; } } } void PointPulse() { //Используем функцию setLed(address, row, col, set) //Эффект пульса for(int i = 0; i < 8; i ++) { if(i == 4) { for(int climb = i; climb >= 0; climb --) ( matrix.setLed(0, climb, i, true); delay(delayValue / 4); matrix.setLed(0, climb, i, false); ) for(int fade = 1; fade< 8; fade ++) { matrix.setLed(0, fade, i, true); delay(delayValue / 4); matrix.setLed(0, fade, i, false); } } else { matrix.setLed(0, 4, i, true); delay(delayValue); matrix.setLed(0, 4, i, false); } } } void PointToSpiralIn() { //Используем функцию setLed(address, row, col, set) //Эффект спирали внутрь int lengthX = 8; // Ширина матрицы int lengthY = 8; // Высота матрицы int pointX = 0; int pointY = 0; int dir = 0; // Направление (0 - вправо, 1 - вниз, 2 - влево, 3 - вверх) int offset = 0; // Смещение // Перебираем всю матрицу for (int i = 0; i < lengthX * lengthY; i++) { matrix.setLed(0, pointY, pointX, true); delay(delayValue); matrix.setLed(0, pointY, pointX, false); if(dir == 0) { pointX ++; if(pointX >= μήκοςX - 1 - μετατόπιση) ( dir = 1; ) συνέχεια; ) if(dir == 1) (pointY ++; if(pointY ><= offset) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset + 1) { dir = 0; offset ++; pointY = offset; } continue; } } } void PointToSpiralOut() { //Используем функцию setLed(address, row, col, set) //Эффект спирали внаружу int lengthX = 8; // Ширина матрицы int lengthY = 8; // Высота матрицы int pointX = 3; //начать с этих координат int pointY = 3; //начать с этих координат int dir = 0; // Направление (0 - вправо, 1 - вниз, 2 - влево, 3 - вверх) int offset = 3; // Смещение // Перебираем всю матрицу for (int i = 0; i < lengthX * lengthY; i++) { matrix.setLed(0, pointY, pointX, true); delay(delayValue); matrix.setLed(0, pointY, pointX, false); if(dir == 0) { pointX ++; if(pointX >= μήκοςX - 1 - μετατόπιση) ( dir = 1; ) συνέχεια; ) if(dir == 1) ( pointY ++; if(pointY >= lengthY - 1 - offset) (dir = 2; ) συνέχεια; ) if(dir == 2) (pointX --; if(pointX<= offset - 1) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset - 1) { dir = 0; offset --; pointY = offset; } continue; } } }

Βίντεο από το σκίτσο:


Ενεργοποιήστε τη Javascript για να λειτουργούν τα σχόλια.

Αυτό το άρθρο δημιουργήθηκε για όσους αγόρασαν μια γυμνή μήτρα 8x8 και καταχωρητές μετατόπισης 74hc595 και δεν ξέρουν πώς να τα συνδέσουν όλα.

Έψαξα στο Διαδίκτυο για πολύ καιρό για οδηγίες σχετικά με το πώς να συνδέσω τα παραπάνω εξαρτήματα, αλλά βρήκα είτε όχι για τα μητρώα μου είτε με μη λειτουργικά σκίτσα, οπότε αποφάσισα ότι πρέπει ακόμα να δουλέψω με τα χέρια και το κεφάλι μου για να ευχαριστήσω τον εαυτό μου με 8 * 8 εικόνες.

Έχοντας βρει φύλλα δεδομένων για τους καταχωρητές matrix και shift στο Διαδίκτυο, σχεδίασα το ακόλουθο διάγραμμα:

Το 12ο σκέλος και των δύο μικροκυκλωμάτων (πείρο κλειδώματος), για αποθήκευση θυρών είναι κοινό, γιατί δεν έχει νόημα να μανδαλώνουμε τους καταχωρητές σε διαφορετικούς χρόνους. Ορισμένοι από τους ακροδέκτες (άνοδοι) της μήτρας συνδέονται μέσω αντιστάσεων περιορισμού ρεύματος με ονομαστική τιμή 220 ohms. Όλα τα άλλα σύμφωνα με το σχήμα είναι εξαιρετικά απλά. Για κάθε ενδεχόμενο, εικόνες με το pinout του matrix.

Οι εικόνες θα πρέπει να εμφανίζονται γραμμή προς γραμμή (αλλιώς με παρόμοιες μήτρες δεν υπάρχει τρόπος), με μικρή καθυστέρηση (το ανθρώπινο μάτι πρακτικά δεν διακρίνει καθυστέρηση 1ms).

Προσπάθησα να εξηγήσω τα πάντα στο σκίτσο. Κατά τη μεταφόρτωση στον πίνακα, στην οθόνη θα εμφανίζονται οι αριθμοί που θα στείλουμε στην οθόνη της θύρας arduino. (Δείτε βίντεο)

Φωτογραφία της τελικής συσκευής (ζιγκ-ζαγκ στην οθόνη, στο σκίτσο η εικόνα της αποθηκεύεται στη συστοιχία εικόνων)

Στο μέλλον θα προσπαθήσω να κάνω κάτι ενδιαφέρον σε αυτήν την οθόνη.

Τέλος, οι ενότητες matrix έφτασαν από την Κίνα. Κάθε μονάδα αποτελείται από ένα τσιπ MAX7219 (), μια μήτρα LED, έναν πυκνωτή και μια αντίσταση βρίσκονται στην πλεξούδα.


Ελέγχεται από το MAX7219 μέσω διασύνδεσης SPI.


Τα μικροκυκλώματα σε ένα σύμπλεγμα συνδέονται σε σειρά. Διάβασα στο Διαδίκτυο ότι η μέγιστη δυνατή σειριακή σύνδεση επιτρέπει μόνο 8 κομμάτια MAX7219. Μην πιστεύεις. Συνδέθηκαν 16 μονάδες και όλα λειτουργούν καλά.

Οι ενότητες που παρουσιάζονται στο Ali διατίθενται σε διάφορες εκδόσεις. Οι πιο δημοφιλείς είναι 2 τύποι: με μικροκύκλωμα σε DIP και σε πακέτα SOIC. Η μονάδα τσιπ DIP είναι μεγαλύτερη και δεν είναι τόσο βολική όταν συνδέεται σε ένα σύμπλεγμα. Θα πρέπει να συνδέσετε ένα σωρό καλώδια.


Οι μονάδες με τσιπ σε συσκευασία SOIC έχουν το μέγεθος μιας μήτρας LED και συνδέονται με συγκόλληση ή βραχυκυκλωτήρες. Αποδεικνύεται ωραίο και τακτοποιημένο.


Οι πιο γνωστές βιβλιοθήκες για εργασία με πίνακες και συμπλέγματα είναι Πάνελ MAX72xx από τον Mark Riceκαι Parola by MajicDesigns:Η πρώτη βιβλιοθήκη είναι πιο εύκολη στη χρήση, η δεύτερη πιο σύνθετη με περισσότερες δυνατότητες. Θα το γράψω πιο αναλυτικά.

Πάνελ MAX72xx

Απαιτείται εγκατάσταση βιβλιοθήκης όταν χρησιμοποιείτε τον πίνακα MAX72xx Adafruit GFX.

Για να ρωσικοποιήσετε το κείμενο, θα χρειαστεί να κάνετε λήψη ΑΥΤΟ ΤΟ ΑΡΧΕΙΟκαι αντικαταστήστε το προεπιλεγμένο αρχείο glcdfont.c στον κατάλογο Arduino/Libraries/Adafruit-GFX-Library-master. Επίσης σε αυτό το αρχείο, εκτός από τα απαραίτητα γράμματα και αριθμούς, περιγράφεται μια δέσμη από κάθε λογής χαρακτήρες. Μπορεί να μην είναι όλα χρήσιμα. Η παρακάτω εικόνα εξηγεί πώς σχηματίζονται τα σύμβολα.

Εάν είναι απαραίτητο, μπορείτε να δημιουργήσετε τα δικά σας σύμβολα και να τα αντικαταστήσετε με τυχόν αχρησιμοποίητα στο αρχείο. Σχεδόν όλες οι γραμματοσειρές bitmap που χρησιμοποιούνται σε διάφορες βιβλιοθήκες σχηματίζονται με αυτόν τον τρόπο.

Έτσι, εγκαθίστανται οι βιβλιοθήκες MAX72xx Panel και Adafruit GFX, το αρχείο glcdfont.c αντικαθίσταται. Εκκινήστε το Arduino IDE, ανοίξτε ΑΡΧΕΙΟ. Υπάρχει μια συνάρτηση utf8rus στο σκίτσο. Παρέχει επανακωδικοποίηση του πίνακα χαρακτήρων για τη ρωσική γλώσσα. Χρειάζεται μόνο για κανονική έξοδο από το πρόγραμμα, δηλαδή, στο πρόγραμμα, το επιθυμητό κείμενο είναι γραμμένο στα ρωσικά. Εάν το κείμενο εισάγεται μέσω της θύρας COM, τότε οι κωδικοί χαρακτήρων διορθώνονται στη συνάρτηση Serial_Read. Στο IDE και στην κονσόλα, οι προγραμματιστές χρησιμοποιούσαν διαφορετικές κωδικοποιήσεις.

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

int numberOfHorizontalDisplays = 1;

int numberOfVerticalDisplays = 16;

Έχω modules με τσιπ σε πακέτο SOIC. Έχουν ένα μικρό χαρακτηριστικό. Η μήτρα των μονάδων εγκαθίσταται περιστρεφόμενη κατά 90 μοίρες. Είναι μια αμοιβή ευκολίας. Εάν εκτελέσετε τα σκίτσα που συνοδεύουν τις βιβλιοθήκες, θα εξάγουν κείμενο από κάτω προς τα πάνω σε κάθε ενότητα. Το κείμενο θα εμφανίζεται σε ζιγκ-ζαγκ. Για να αντιμετωπιστεί αυτή η πάθηση, πρέπει να «πει» στη βιβλιοθήκη ότι υπάρχουν 16 κάθετες οθόνες (βρίσκονται φυσικά οριζόντια). Και στη συνέχεια στο void Setup καθορίστε τη γραμμή για τη βιβλιοθήκη

matrix.setRotation(matrix.getRotation() + 1);

Θα αναποδογυρίσει μέσω προγραμματισμού κάθε μήτρα. Και όλα θα εμφανίζονται κανονικά.

Οι μονάδες με πακέτο τσιπ DIP δεν το έχουν αυτό. Όλα είναι όμορφα, εκτός από ένα σωρό καλώδια.

Η βιβλιοθήκη του πίνακα MAX72xx είναι μάλλον μέτρια. Δεν υπάρχουν οπτικά εφέ εξόδου. Το σύμπλεγμα γίνεται αντιληπτό ως ένα σύνολο. Τα πράγματα είναι πολύ καλύτερα με τον MD Parola.

Parola της MajicDesigns.

Οι κάτοχοι μονάδων με τσιπ σε πακέτο SOIC θα αντιμετωπίσουν επίσης το πρόβλημα του προσανατολισμού των μονάδων σε ένα σύμπλεγμα. Μόνο που φαίνεται λίγο διαφορετικό από το MAX72xx. Εδώ, οι ενότητες θα εμφανιστούν, όπως ήταν, εκτός σειράς.


Σκίτσο του HelloWorld από δείγματα που περιλαμβάνονται στη βιβλιοθήκη.

Προγραμματικά στο σκίτσο, δεν μπόρεσα να θεραπεύσω αυτήν την πάθηση. Του αντιμετώπισα διαφορετικά. Στο αρχείο Adruino/libraries/MD_MAX72xx_lib.h στο τέλος πρέπει να βρείτε τις γραμμές όπως στην εικόνα.


Και διορθώστε την επιλεγμένη γραμμή 1 έως 0. Αποθηκεύστε το αρχείο. Το Arduino IDE δεν χρειάζεται επανεκκίνηση. Ρίχνουμε, κοιτάμε.


Τώρα μπορείτε να χρησιμοποιήσετε 24 εφέ κινούμενων σχεδίων. Το κινούμενο σχέδιο ξεκινά με την εντολή P.displayText ("Κείμενο προς εμφάνιση", "Στοίχιση κειμένου", ταχύτητα, καθυστέρηση εμφάνισης, εφέ εξασθένισης, εφέ εξασθένισης). Όπως μπορείτε να δείτε, υπάρχουν πολλές ρυθμίσεις.

Και το πιο ευχάριστο είναι η διαίρεση του συμπλέγματος σε εικονικές ζώνες. Η εργασία με ζώνες δεν είναι πολύ δύσκολη. Δεν δημοσιεύω το σκίτσο, είναι στα δείγματα που συνοδεύουν τη βιβλιοθήκη. Τώρα μπορείτε να εμφανίσετε το ρολόι στην αρχή του συμπλέγματος και το ticker ειδήσεων στις υπόλοιπες μονάδες χωρίς προβλήματα, σχεδόν.

Όπως μπορείτε ήδη να μαντέψετε, το πρόβλημα είναι με τα κυριλλικά γράμματα. Είναι επίσης επιλύσιμη. Δίπλα στο προηγούμενο αρχείο στον ίδιο κατάλογο βρίσκεται το αρχείο MD_MAX72xx_font.cpp. Αυτό είναι ένα αρχείο γραμματοσειράς. Οι χαρακτήρες σε αυτό σχηματίζονται παρόμοια με το αρχείο γραμματοσειράς GFX της βιβλιοθήκης. Υπάρχει μια μικρή διαφορά. Εδώ το μέγεθος του χαρακτήρα μπορεί να είναι μικρότερο από 5 πόντους. Στη βιβλιοθήκη Adafruit GFX, το θαυμαστικό, για παράδειγμα, καταλαμβάνει τις ίδιες 5 κουκκίδες τόσο πλάτος όσο οποιοδήποτε άλλο σύμβολο, χρησιμοποιείται μόνο μία σειρά κουκκίδων. Τα υπόλοιπα δεν λάμπουν, αλλά χρησιμοποιούνται ως σύμβολο. Στο Parola, το ίδιο θαυμαστικό καταλαμβάνει επίσης μια σειρά κουκκίδων, μόνο που δεν υπάρχουν κενές κουκκίδες κοντά, αλλά μπορούν να υπάρχουν διπλανοί χαρακτήρες. Θα είναι πιο ξεκάθαρο να κατανοήσουμε την εικόνα.


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

Αποτέλεσμα. Η βιβλιοθήκη του πίνακα MAX72xx του Mark Rice είναι εύκολη στη χρήση και κατανοητή, αλλά με κακή λειτουργικότητα.

Η βιβλιοθήκη Parola της MajicDesigns είναι πιο περίπλοκη και έχει αρκετές δυνατότητες για σχεδόν κάθε εφαρμογή.

Στα προηγούμενα μαθήματα, μάθαμε με τη βοήθεια ενός καταχωρητή βάρδιας. Αυτό αποδείχθηκε λίγο πιο δύσκολο από ό,τι απευθείας από καρφίτσες γενικής χρήσης. Το πρόβλημα που έπρεπε στη συνέχεια να λύσουμε ήταν ο περιορισμένος αριθμός ελεγχόμενων εξόδων στον ελεγκτή Arduino. Το απόγειο της έρευνάς μας ήταν η χρήση δυναμικής ένδειξης για. Τώρα είναι καιρός να περιπλέκουμε λίγο περισσότερο την εργασία: μαθαίνουμε να εργαζόμαστε με τη μήτρα LED.

1. Δείκτης μήτρας

Όπως ήδη γνωρίζουμε, οι δείκτες τμημάτων, είτε είναι κλίμακες είτε αριθμοί, αποτελούνται από μεμονωμένες λυχνίες LED που συνδέονται μεταξύ τους. Για παράδειγμα, μια ομάδα LED μπορεί να έχει όλες τις καθόδους συνδεδεμένες. Ένας τέτοιος δείκτης έχει ένα υστερόγραφο "με κοινή κάθοδο", διαφορετικά - "με κοινή άνοδο". Και τι θα συμβεί αν τοποθετήσουμε τα LED όχι με τη μορφή αριθμού ή κλίμακας, αλλά με τη μορφή πλέγματος; Θα αποδειχθεί αρκετά γραφικός δείκτης. Δηλαδή, ένα στο οποίο μπορείτε να εμφανίσετε όχι μόνο έναν αριθμό, αλλά και κάποιο είδος εικόνας. Ένα τέτοιο πλέγμα ονομάζεται δείκτης μήτρας και στην περίπτωση των LED, μήτρα LED. Η ανάλυση ενός δείκτη μήτρας είναι ο αριθμός των οριζόντιων και κάθετων κουκκίδων. Για παράδειγμα, οι πιο συνηθισμένες ενδείξεις έχουν ανάλυση 8×8 pixel. Εάν απαιτείται μήτρα LED υψηλότερης ανάλυσης, τότε απλώς αποτελείται από πολλούς δείκτες 8x8. Πώς να το κάνουμε αυτό, θα το δούμε αργότερα. Εν τω μεταξύ, ας καταλάβουμε πώς συνδέονται και τα 64 LED μέσα στη μήτρα. Φυσικά, θα ήταν δυνατό, όπως στην περίπτωση ενός δείκτη επτά τμημάτων, να συνδεθούν όλα τα LED με μια κοινή κάθοδο ή άνοδο. Σε αυτήν την περίπτωση, θα χρειαστούμε είτε 64 καρφίτσες ελεγκτή είτε 8 καταχωρητές μετατόπισης. Και οι δύο επιλογές είναι πολύ σπάταλες. Μια πιο σωστή επιλογή είναι να συνδυάσετε τα LED σε ομάδες των 8 τεμαχίων με μια κοινή κάθοδο. Ας είναι αυτές οι στήλες του πίνακα. Στη συνέχεια, τα παράλληλα LED σε αυτές τις στήλες συνδυάζονται ξανά σε ομάδες των 8 τεμαχίων ήδη με μια κοινή άνοδο. Παίρνετε το ακόλουθο σχήμα:
Ας υποθέσουμε ότι η εργασία είναι να ανάψει το LED R6C3. Για να γίνει αυτό, πρέπει να εφαρμόσουμε υψηλό επίπεδο σήματος στον ακροδέκτη R6 και να συνδέσουμε τον ακροδέκτη C3 στη γείωση. Χωρίς να απενεργοποιήσετε αυτό το σημείο, ας προσπαθήσουμε να ανάψουμε ένα άλλο - R3C7. Συνδέστε τον ακροδέκτη θετικής ισχύος στο R3 και γείωση στο C7. Αλλά σε αυτή την περίπτωση, οι σειρές R6 και R3 θα τέμνονται με τις στήλες C3 και C7 όχι σε δύο, αλλά σε τέσσερις θέσεις! Κατά συνέπεια, δεν θα ανάψουν δύο, αλλά τέσσερις πόντοι. Πρόβλημα! Προφανώς, το ίδιο μπορεί να βοηθήσει. Εάν ενεργοποιήσουμε τα σημεία R6C3 και R3C7 με τη σειρά τους πολύ γρήγορα, μπορούμε να χρησιμοποιήσουμε την επιμονή της όρασης - την ικανότητα να ερμηνεύουμε τις ταχέως μεταβαλλόμενες εικόνες στο σύνολό τους.

2. Καταγραφείς μήτρας LED και μετατόπισης

Στο μάθημά μας, θα συνδέσουμε την απλούστερη μήτρα LED 8 × 8 με το Arduino Uno. Η αρίθμηση των καρφιτσών ξεκινά από την κάτω αριστερή γωνία. Ταυτόχρονα, η αρίθμηση των σκελών 1-16 δεν συνδέεται με καμία λογική με την αρίθμηση των στηλών και των γραμμών C και R.
Εστιάζοντας στο μάθημα σχετικά με τη δυναμική ένδειξη, ας προσπαθήσουμε να χρησιμοποιήσουμε καταχωρητές μετατόπισης 8-bit στο σχήμα ελέγχου του δείκτη μήτρας. Συνδέουμε έναν καταχωρητή στις εξόδους του δείκτη που είναι υπεύθυνοι για τις στήλες και τον δεύτερο στις εξόδους σειρών. διάγραμμα κυκλώματος
Σημαντική σημείωση #1.Είναι απαραίτητο οι αντιστάσεις σε αυτό το κύκλωμα να βρίσκονται στις γραμμές που προέρχονται από τον καταχωρητή πρώτης μετατόπισης. Αυτός ο καταχωρητής μετατόπισης είναι υπεύθυνος για τις στήλες. Με αυτή τη σύνδεση, κάθε αντίσταση θα ρυθμίσει το ρεύμα μόνο για ένα LED σε κάθε βήμα του δυναμικού αλγορίθμου. Επομένως, όλα τα LED θα ανάβουν ομοιόμορφα. Σημαντική σημείωση #2.Το παραπάνω διάγραμμα είναι μόνο για ενημερωτικούς σκοπούς. Θα ήταν πιο σωστό να συμπεριληφθεί ένα πρόσθετο μικροκύκλωμα ισχύος στο κενό μεταξύ του δεύτερου καταχωρητή και της μήτρας, για παράδειγμα, το συγκρότημα τρανζίστορ ULN2003.

3. Πρόγραμμα

Για να το κάνουμε πιο διασκεδαστικό, ας προσπαθήσουμε να επισημάνουμε ένα smiley στην ένδειξη. Όπως ήδη αναφέρθηκε, για να εμφανίσουμε την εικόνα στη μήτρα, θα χρησιμοποιήσουμε δυναμική ένδειξη. Δηλαδή, θα τονίσουμε γραμμή προς γραμμή την εικόνα μας. Αρχικά, ανάβουμε τις απαραίτητες στήλες στην επάνω σειρά, μετά στη δεύτερη, στην τρίτη και ούτω καθεξής και για τις 8 σειρές. Ο πρώτος καταχωρητής μετατόπισης θα είναι υπεύθυνος για τις στήλες και ο δεύτερος για τις γραμμές. Επομένως, η έξοδος μιας συμβολοσειράς θα αποτελείται από δύο διαδοχικές εγγραφές στον καταχωρητή: πρώτα περνάμε τον κωδικό της συμβολοσειράς και μετά τον κωδικό των σημείων αυτής της συμβολοσειράς. Σε αυτό το πρόγραμμα, θα χρησιμοποιήσουμε επίσης μια ταχεία έκδοση της συνάρτησης digitalWrite. Αυτό είναι απαραίτητο για να προχωρήσει πολύ γρήγορα η διαδικασία δυναμικής ένδειξης. Διαφορετικά, θα δούμε ένα αξιοσημείωτο τρεμόπαιγμα της μήτρας. Πηγή const byte data_pin = PD2; const byte st_pin = PD3; const byte sh_pin = PD4; ανυπόγραφο long tm, next_flick; const unsigned int to_flick = 500; γραμμή byte = 0; δεδομένα const byte = ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b001); void latchOn()( digitalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(byte d)( for(char i=0; i<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<next_flick)( next_flick = tm + to_flick; line++; if(line == 8) line = 0; // pass line code fill(~(1<<(7-line))); // зажигаем точки в строке № line fill(data); // открываем защелку latchOn(); } } Основная часть этой программы, включая переменные data_pin, sh_pin, st_pin, next_flick, to_flickκαι λειτουργία γέμισμαήδη γνωστά σε εμάς από τα μαθήματα για και για. πίνακας δεδομένααποθηκεύει οκτώ γραμμές της εικόνας μας. Για εξοικονόμηση μνήμης, καταγράψαμε κάθε συνδυασμό σημείων σε δυαδική μορφή. Λειτουργία γαντζώνομαιανοίγει το μάνταλο του μητρώου. Αυτό πρέπει να γίνει μόνο αφού συμπληρωθούν και οι δύο καταχωρητές βάρδιας. Μετά τη φόρτωση του προγράμματος στο Arduino, θα εμφανιστεί ένα smiley στην ένδειξη.

4. Κινούμενα σχέδια στη μήτρα LED

Και τώρα θα ολοκληρώσουμε το πρόγραμμα με τέτοιο τρόπο ώστε η εικόνα στην ένδειξη να αλλάζει κάθε μισό δευτερόλεπτο. Για να το κάνουμε αυτό, ας θυμηθούμε ξανά. const byte data_pin = PD2; const byte st_pin = PD3; const byte sh_pin = PD4; ανυπόγραφο long tm, next_flick, next_switch; const unsigned int to_flick = 500; const unsigned long to_switch = 500000; γραμμή byte = 0; πλαίσιο byte = 0; const byte δεδομένα = ((0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b010010, 0b0011100) void latchOn()( digitalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(byte d)( for(char i=0; i<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<next_flick)( next_flick = tm + to_flick; line++; if(line == 8) line = 0; fill(~(1<<(7-line))); fill(data); latchOn(); } tm = micros(); if(tm >next_switch)( next_switch = tm + to_switch; frame = !frame; ) ) Φορτώνουμε το πρόγραμμα Arduino και παρατηρούμε το αποτέλεσμα.

5. Κλιμάκωση μήτρας LED

Μια μήτρα LED 8×8 είναι κατάλληλη για την εμφάνιση δύο αριθμών ή ενός απλού χαρακτήρα. Εάν θέλετε να εμφανίσετε κάποια περισσότερο ή λιγότερο χρήσιμη εικόνα στην ένδειξη, πρέπει να συνδυάσετε τους πίνακες. Αυτό γίνεται με την προσθήκη νέων καταχωρητών μετατόπισης τόσο κάθετα όσο και οριζόντια. Πρέπει να σημειωθεί ότι η ταχύτητα του ελεγκτή Arduino Uno σε συνδυασμό με τους καταχωρητές αλλαγής ταχυτήτων είναι αρκετή μόνο για οθόνη 16 × 16. Η περαιτέρω αύξηση του μεγέθους της οθόνης LED θα έχει ως αποτέλεσμα αισθητό τρεμόπαιγμα.

Καθήκοντα

  • Υπνωση. Προγραμματίστε τον ελεγκτή με τέτοιο τρόπο ώστε να εμφανίζονται ομόκεντροι κύκλοι με συνεχώς αυξανόμενη ακτίνα στη μήτρα LED με περίοδο 1 δευτερολέπτου.
  • Παιχνίδι με φίδια. Εφαρμόστε ένα τόσο γνωστό παιχνίδι όπως το φίδι σε μια μήτρα LED 8×8. Είναι απαραίτητο να προσθέσετε τέσσερα κουμπιά στο κύκλωμα για να ελέγξετε την κατεύθυνση της κίνησης, καθώς και ένα βομβητή για να σηματοδοτήσει το γεγονός της κατανάλωσης μήλων (ή οτιδήποτε τρώει το φίδι εκεί ...).
  • Ηλεκτρονικό επίπεδο. Προσθέστε ένα επιταχυνσιόμετρο στο κύκλωμα. Γράψτε ένα πρόγραμμα που θα εμφανίζει ένα σημείο στον πίνακα LED, οι συντεταγμένες του οποίου εξαρτώνται από την κλίση ολόκληρης της συσκευής. Για παράδειγμα, όταν η συσκευή είναι στερεωμένη παράλληλα με το έδαφος (κάθετα στο διάνυσμα της βαρύτητας), τότε το σημείο βρίσκεται στο κέντρο. Όταν το ηλεκτρονικό επίπεδο έχει κλίση προς τα αριστερά, το σημείο μετατοπίζεται αναλογικά προς τα δεξιά.

συμπέρασμα

Έχοντας συναρμολογήσει το κύκλωμα ελέγχου μήτρας, πολλοί μπορεί να έχουν μια ερώτηση: "Λοιπόν, δεν έχει βρει κανείς έναν απλούστερο τρόπο να εργαστεί με τη μήτρα σε 30 χρόνια;" Στην πραγματικότητα, το κατάλαβαν. Υπάρχουν εξειδικευμένα μικροκυκλώματα για εργασία με διαφορετικούς τύπους οθονών, συμπεριλαμβανομένης της εργασίας με μήτρα LED. Σε ένα από τα παρακάτω μαθήματα, θα μάθουμε πώς να ελέγχουμε την ένδειξη χρησιμοποιώντας το τσιπ MAX7219. Αυτή η μέθοδος θα μας επιτρέψει να συνδυάσουμε εύκολα πολλές μήτρες με μία μεγάλη οθόνη, χωρίς να χρειάζεται να περιπλέκουμε πολύ το ηλεκτρικό κύκλωμα.