Παρόλο που θα μπορούσατε να συνδέσετε οκτώ LED το καθένα με μια αντίσταση σε μια ακίδα Arduino (όπως κάναμε για ένα RGB LED στο Μάθημα 2), θα αρχίζατε γρήγορα να ξεμείνετε από ακίδες στο Arduino σας. Εάν δεν έχετε πολλά πράγματα συνδεδεμένα στο «duino» σας, είναι εντάξει να το κάνετε – αλλά συχνά θέλουμε κουμπιά, αισθητήρες, σερβομηχανισμούς κ.λπ. και προτού το καταλάβετε δεν έχετε απομείνει καρφίτσες. Έτσι, αντί να το κάνετε αυτό, θα χρησιμοποιήσετε ένα τσιπ που ονομάζεται 74HC595 Serial to Parallel Converter . Αυτό το τσιπ έχει οκτώ εξόδους (τέλεια) και τρεις εισόδους που χρησιμοποιείτε για να τροφοδοτείτε δεδομένα σε αυτό λίγο τη φορά.
Αυτό το τσιπ καθιστά λίγο πιο αργό την οδήγηση των LED (μπορείτε να αλλάξετε τα LED περίπου 500.000 φορές το δευτερόλεπτο αντί για 8.000.000 το δευτερόλεπτο), αλλά εξακολουθεί να είναι πραγματικά πολύ γρήγορο, πολύ πιο γρήγορο από ό, τι μπορούν να ανιχνεύσουν οι άνθρωποι, οπότε αξίζει τον κόπο!
εξαρτήματα
Για να δημιουργήσετε το έργο που περιγράφεται σε αυτό το μάθημα, θα χρειαστείτε τα ακόλουθα μέρη.
5mm Κόκκινο LED 8
Αντιστάσεις 270 Ω (κόκκινες, μωβ, καφέ ρίγες) 8
74HC595 Shift Register
1
Ψωμί σανίδα μισού μεγέθους 1
Arduino Uno R3 1
Πακέτο σύρματος βραχυκυκλωτήρα 1
Διάταξη Breadboard
Είναι ίσως πιο εύκολο να τοποθετήσετε πρώτα το τσιπ 74HC595, καθώς σχεδόν όλα τα άλλα συνδέονται με αυτό. Τοποθετήστε το έτσι ώστε η μικρή εγκοπή σε σχήμα U να είναι προς το πάνω μέρος του breadboard. Η ακίδα 1 του τσιπ βρίσκεται στα αριστερά αυτής της εγκοπής.
- Το Digital 4 από το arduino πηγαίνει στο pin #14 του καταχωρητή shift
- Το Digital 5 από το arduino πηγαίνει στο pin #12 του καταχωρητή shift
- Το Digital 6 από το arduino πηγαίνει στο pin #11 του καταχωρητή shift
Όλες οι έξοδοι από το ‘595 εκτός από μία βρίσκονται στην αριστερή πλευρά του τσιπ, επομένως, για ευκολία σύνδεσης, εκεί βρίσκονται και τα LED.
Μετά το τσιπ, τοποθετήστε τις αντιστάσεις στη θέση τους. Πρέπει να προσέχετε ότι κανένα από τα καλώδια των αντιστάσεων δεν αγγίζει το ένα το άλλο. Θα πρέπει να το ελέγξετε ξανά, προτού συνδέσετε το ρεύμα στο Arduino. Εάν δυσκολεύεστε να τακτοποιήσετε τις αντιστάσεις χωρίς να ακουμπούν τα καλώδιά τους, τότε βοηθάει να κοντύνετε τα καλώδια έτσι ώστε να βρίσκονται πιο κοντά στην επιφάνεια της πλάκας ψωμιού. Στη συνέχεια, τοποθετήστε τις λυχνίες LED στην πλάκα ψωμιού.
Τα μεγαλύτερα θετικά καλώδια LED πρέπει να είναι όλα προς το τσιπ, σε όποια πλευρά και αν βρίσκονται.
Απομένει μόνο να στερεώσετε τα καλώδια του βραχυκυκλωτήρα όπως φαίνεται παραπάνω. Μην ξεχνάτε αυτό που πηγαίνει από την ακίδα 8 του IC στη στήλη GND του breadboard.
Φορτώστε το σκίτσο που παρατίθεται λίγο αργότερα και δοκιμάστε το. Κάθε LED θα πρέπει να ανάβει με τη σειρά μέχρι να ανάψουν όλες οι λυχνίες LED, και στη συνέχεια σβήνουν όλες και ο κύκλος επαναλαμβάνεται.
Το μητρώο Shift 74HC595
Πριν προχωρήσω στον κώδικα, ας ρίξουμε μια γρήγορη ματιά στο τι κάνει το τσιπ, ώστε να καταλάβουμε τι πρέπει να κάνει ο κώδικας.
Το τσιπ είναι ενός τύπου που ονομάζεται καταχωρητής μετατόπισης.
Ο καταχωρητής μετατόπισης περιέχει αυτό που μπορεί να θεωρηθεί ως οκτώ θέσεις μνήμης, καθεμία από τις οποίες μπορεί να είναι 1 ή 0.
Για να ενεργοποιήσουμε ή να απενεργοποιήσουμε καθεμία από αυτές τις τιμές, τροφοδοτούμε τα δεδομένα χρησιμοποιώντας τις ακίδες «Δεδομένα» και «Ρολόι» του τσιπ.
Ο ακροδέκτης του ρολογιού πρέπει να λαμβάνει οκτώ παλμούς, τη στιγμή κάθε παλμού, εάν ο ακροδέκτης δεδομένων είναι υψηλός, τότε ένα 1 ωθείται στον καταχωρητή μετατόπισης, διαφορετικά ένα 0. Όταν ληφθούν και οι οκτώ παλμοί, ενεργοποιήστε το “Ασφάλιση Το pin αντιγράφει αυτές τις οκτώ τιμές στον καταχωρητή κλειδώματος. Αυτό είναι απαραίτητο, διαφορετικά τα λανθασμένα LED θα αναβοσβήνουν καθώς τα δεδομένα φορτώνονταν στον καταχωρητή μετατόπισης.
Το τσιπ έχει επίσης ένα pin OE (output enable), που χρησιμοποιείται για την ενεργοποίηση ή απενεργοποίηση των εξόδων ταυτόχρονα. Θα μπορούσατε να το συνδέσετε σε μια ακίδα Arduino με δυνατότητα PWM και να χρησιμοποιήσετε το ‘analogWrite’ για να ελέγξετε τη φωτεινότητα των LED. Αυτή η ακίδα είναι ενεργή χαμηλά, οπότε την συνδέουμε στο GND.
Κωδικός Arduino
Το Arduino περιλαμβάνει μια ειδική λειτουργία που ονομάζεται “shiftOut” που έχει σχεδιαστεί ειδικά για την αποστολή δεδομένων σε καταχωρητές μετατόπισης.
Εδώ είναι το πλήρες σκίτσο, η συζήτηση για το πώς λειτουργεί ακολουθεί.
- /*
- Adafruit Arduino – Μάθημα 4. 8 LED και ένα Shift Register
- */
- int latchPin = 5 ;
- int clockPin = 6 ;
- int dataPin = 4 ;
- byte led = 0 ;
- κενού ρύθμιση ()
- {
- pinMode ( latchPin , OUTPUT );
- pinMode ( dataPin , OUTPUT );
- pinMode ( clockPin , OUTPUT );
- }
- κενό βρόχο ()
- {
- led = 0 ;
- updateShiftRegister ();
- καθυστέρηση ( 500 );
- για ( int i = 0 ; i < 8 ; i ++)
- {
- bitSet ( led , i );
- updateShiftRegister ();
- καθυστέρηση ( 500 );
- }
- }
- void updateShiftRegister ()
- {
- digitalWrite ( latchPin , LOW );
- shiftOut ( dataPin , clockPin , LSBFIRST , leds );
- digitalWrite ( latchPin , HIGH );
- }
- int latchPin = 5 ;
- int clockPin = 6 ;
- int dataPin = 4 ;
- byte led = 0 ;
- κενού ρύθμιση ()
- {
- pinMode ( latchPin , OUTPUT );
- pinMode ( dataPin , OUTPUT );
- pinMode ( clockPin , OUTPUT );
- }
Η συνάρτηση ‘loop’ αρχικά σβήνει όλα τα LED, δίνοντας στη μεταβλητή ‘led’ την τιμή 0. Στη συνέχεια καλεί το ‘updateShiftRegister’ που θα στείλει το μοτίβο ‘led’ στον καταχωρητή shift έτσι ώστε όλα τα LED να σβήσουν. Θα ασχοληθούμε με το πώς λειτουργεί το ‘updateShiftRegister’ αργότερα.
Η συνάρτηση βρόχου σταματά για μισό δευτερόλεπτο και μετά αρχίζει να μετράει από το 0 έως το 7 χρησιμοποιώντας τον βρόχο ‘for’ και τη μεταβλητή ‘i’. Κάθε φορά, χρησιμοποιεί τη συνάρτηση Arduino ‘bitSet’ για να ορίσει το bit που ελέγχει αυτό το LED στη μεταβλητή ‘led’. Στη συνέχεια καλεί επίσης το ‘updateShiftRegister’ έτσι ώστε τα led να ενημερώνονται για να αντικατοπτρίζουν αυτό που υπάρχει στη μεταβλητή ‘led’.
Υπάρχει τότε μισό δευτερόλεπτο καθυστέρηση πριν αυξηθεί το ‘i’ και ανάψει το επόμενο LED.
- κενό βρόχο ()
- {
- led = 0 ;
- updateShiftRegister ();
- καθυστέρηση ( 500 );
- για ( int i = 0 ; i < 8 ; i ++)
- {
- bitSet ( led , i );
- updateShiftRegister ();
- καθυστέρηση ( 500 );
- }
- }
Η συνάρτηση ‘updateShiftRegister’, πρώτα από όλα θέτει το latchPin στο χαμηλό και στη συνέχεια καλεί τη συνάρτηση Arduino ‘shiftOut’ πριν βάλει ξανά το ‘latchPin’ σε υψηλή θέση. Αυτό απαιτεί τέσσερις παραμέτρους, οι δύο πρώτες είναι οι ακίδες που πρέπει να χρησιμοποιηθούν για Δεδομένα και Ρολόι αντίστοιχα.
Η τρίτη παράμετρος καθορίζει από ποιο άκρο των δεδομένων θέλετε να ξεκινήσετε. Θα ξεκινήσουμε με το πιο σωστό bit, το οποίο αναφέρεται ως «Λιγότερο Σημαντικό Bit» (LSB).
Η τελευταία παράμετρος είναι τα πραγματικά δεδομένα που πρέπει να μεταφερθούν στον καταχωρητή μετατόπισης, που σε αυτήν την περίπτωση είναι «led».
- void updateShiftRegister ()
- {
- digitalWrite ( latchPin , LOW );
- shiftOut ( dataPin , clockPin , LSBFIRST , leds );
- digitalWrite ( latchPin , HIGH );
- }
Έλεγχος φωτεινότητας
Ένας ακροδέκτης του 74HC595 που δεν έχω αναφέρει είναι ένας ακροδέκτης που ονομάζεται “Ενεργοποίηση εξόδου”. Αυτό είναι το pin 13 και στο breadboard, είναι μόνιμα συνδεδεμένο με το Ground. Αυτός ο ακροδέκτης λειτουργεί ως διακόπτης, ο οποίος μπορεί να ενεργοποιήσει ή να απενεργοποιήσει τις εξόδους – το μόνο πράγμα που πρέπει να προσέξετε είναι ότι είναι «ενεργό χαμηλό» (συνδεθείτε στη γείωση για ενεργοποίηση). Άρα, αν συνδεθεί σε 5V, σβήνουν όλες οι έξοδοι. Ενώ εάν είναι συνδεδεμένο στο Ground, οι έξοδοι που υποτίθεται ότι είναι ενεργοποιημένες είναι ενεργοποιημένες και αυτές που θα έπρεπε να είναι απενεργοποιημένες.
Μπορούμε να χρησιμοποιήσουμε αυτήν την καρφίτσα μαζί με τη συνάρτηση ‘analogWrite’, που χρησιμοποιούσαμε στο Μάθημα 3, για να ελέγξουμε τη φωτεινότητα των LED χρησιμοποιώντας PWM (δείτε επίσης Μάθημα 3).
Για να το κάνετε αυτό, το μόνο που χρειάζεται να κάνετε, είναι να αλλάξετε τη σύνδεση στην ακίδα 13 του 74HC595, ώστε αντί να το συνδέσετε στο Ground, να το συνδέσετε στον ακροδέκτη 3 του Arduino.
Το παρακάτω σκίτσο, μόλις ανάψουν όλες οι λυχνίες LED σταδιακά θα τις σβήσει ξανά.
- /*
- Adafruit Arduino – Μάθημα 4. 8 LED και ένα Shift Register – Brightness
- */
- int latchPin = 5 ;
- int clockPin = 6 ;
- int dataPin = 4 ;
- int outputEnablePin = 3 ;
- byte led = 0 ;
- κενού ρύθμιση ()
- {
- pinMode ( latchPin , OUTPUT );
- pinMode ( dataPin , OUTPUT );
- pinMode ( clockPin , OUTPUT );
- pinMode ( outputEnablePin , OUTPUT );
- }
- κενό βρόχο ()
- {
- setBrightness ( 255 );
- led = 0 ;
- updateShiftRegister ();
- καθυστέρηση ( 500 );
- για ( int i = 0 ; i < 8 ; i ++)
- {
- bitSet ( led , i );
- updateShiftRegister ();
- καθυστέρηση ( 500 );
- }
- για ( byte b = 255 ; b > 0 ; b –)
- {
- setBrightness ( b );
- καθυστέρηση ( 50 );
- }
- }
- void updateShiftRegister ()
- {
- digitalWrite ( latchPin , LOW );
- shiftOut ( dataPin , clockPin , LSBFIRST , leds );
- digitalWrite ( latchPin , HIGH );
- }
- void setBrightness ( byte φωτεινότητα ) // 0 έως 255
- {
- analogWrite ( outputEnablePin , 255 – φωτεινότητα );
- }