Πίνακας περιεχομένων:

Ένας λαμπτήρας διάθεσης LED 1 $ με ATtiny13 και WS2812: 7 βήματα
Ένας λαμπτήρας διάθεσης LED 1 $ με ATtiny13 και WS2812: 7 βήματα

Βίντεο: Ένας λαμπτήρας διάθεσης LED 1 $ με ATtiny13 και WS2812: 7 βήματα

Βίντεο: Ένας λαμπτήρας διάθεσης LED 1 $ με ATtiny13 και WS2812: 7 βήματα
Βίντεο: Λάμπες LED - Γιατί είναι καλύτερες οι λάμπες LED; 2024, Νοέμβριος
Anonim
Λάμπα LED διάθεσης 1 $ με ATtiny13 και WS2812
Λάμπα LED διάθεσης 1 $ με ATtiny13 και WS2812

Ακολουθήστε περισσότερα από τον συγγραφέα:

Προσωπικός διακομιστής CalDAV σε υπολογιστή με έναν πίνακα
Προσωπικός διακομιστής CalDAV σε υπολογιστή με έναν πίνακα
Προσωπικός διακομιστής CalDAV σε υπολογιστή με έναν πίνακα
Προσωπικός διακομιστής CalDAV σε υπολογιστή με έναν πίνακα
LCD Invaders: a Space Invaders Like Game σε οθόνη 16x2 χαρακτήρων LCD
LCD Invaders: a Space Invaders Like Game σε οθόνη 16x2 χαρακτήρων LCD
LCD Invaders: a Space Invaders Like Game σε οθόνη 16x2 χαρακτήρων LCD
LCD Invaders: a Space Invaders Like Game σε οθόνη 16x2 χαρακτήρων LCD
Octarine: Ένα παιχνίδι αντιστοίχισης χρωμάτων με LED WS2812 RGB
Octarine: Ένα παιχνίδι αντιστοίχισης χρωμάτων με LED WS2812 RGB
Octarine: ένα παιχνίδι αντιστοίχισης χρωμάτων με LEDs WS2812 RGB
Octarine: ένα παιχνίδι αντιστοίχισης χρωμάτων με LEDs WS2812 RGB

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

1. Σπινθήρα ουράνιου τόξου. Μια σπίθα φωτός κινείται προς τα πάνω κάθε φορά και αλλάζει σταδιακά το χρώμα.

2. Λάμψη ουράνιου τόξου. Μια σταθερή λάμψη που αλλάζει σταδιακά το χρώμα.

3. Προσομοίωση φωτιάς κεριών.

4. Απενεργοποιημένο.

Μπορείτε να αλλάξετε τρόπους πατώντας ένα κουμπί αφής στο επάνω μέρος. Η τρέχουσα λειτουργία αποθηκεύεται στη μνήμη EEPROM μετά την απενεργοποίηση.

Πόσο μικροσκοπικό είναι το ATtiny13;

Η ιδέα ήταν να αποκτήσουμε τα μέγιστα χαρακτηριστικά από ελάχιστο υλικό, κάτι πιο περίπλοκο από αυτόματο διακόπτη ή θερμόμετρο, ένα έργο κοντά στην άκρη αυτού του μικροσκοπικού μικροελεγκτή. Άλλωστε, οι περιορισμοί σε κάνουν να σκέφτεσαι δημιουργικά, σωστά; Λοιπόν, έμοιαζε στην αρχή.

Το πιο δύσκολο σε αυτό το έργο ήταν να τοποθετήσετε όλο τον κώδικα στο ATtiny13. Ο μικροελεγκτής έχει φλας 1K byte και μόλις 64 bytes RAM. Ναι, όταν λέω "bytes", εννοώ αυτά που αποτελούνται από οκτώ bit. 64 byte για όλες τις τοπικές μεταβλητές και στοίβα κλήσεων. Για να γίνει σαφές, σκεφτείτε ότι πρέπει να ελέγχουμε 8 LED RGB. Κάθε ένα από αυτά ορίζεται από 3 byte (ένα για κόκκινο, πράσινο και μπλε κανάλι αντίστοιχα). Έτσι, μόνο για να αποθηκεύσουμε την κατάσταση των 8 LED, θα χρειαστεί να εφαρμόσουμε έναν πίνακα 8 δομών 3 bytes η κάθε μία και ένας δείκτης στην αρχή αυτού του πίνακα θα χρειαζόταν ένα ακόμη byte. Έτσι, έχουν βγει 25 από τα 64 byte. Μόλις χρησιμοποιήσαμε το 39% της μνήμης RAM και δεν έχουμε ξεκινήσει ακόμα. Επιπλέον, για να αποθηκεύσετε επτά βασικά χρώματα ουράνιου τόξου, θα χρειαστείτε 7 × 3 = 21 byte, οπότε το 72% της μνήμης RAM είναι εκτός λειτουργίας. Λοιπόν, όσον αφορά τα βασικά χρώματα, υπερβάλλω: δεν τα χρειαζόμαστε όλα ταυτόχρονα στη μνήμη RAM και δεν αλλάζουν ποτέ, οπότε μπορεί να εφαρμοστούν ως σταθεροί πίνακες για αποθήκευση σε φλας αντί για μνήμη RAM. Τέλος πάντων, δίνει μια συνολική εντύπωση σχετικά με το χρησιμοποιημένο υλικό.

Θυμάμαι τη δήλωση του Knuth σχετικά με την πρόωρη βελτιστοποίηση, ξεκίνησα να πρωτοτυπώ τρεις λειτουργίες λαμπτήρων ξεχωριστά για να δω τι συμβαίνει. Τα έχω δοκιμάσει ξεχωριστά για να βεβαιωθώ ότι λειτουργούν σωστά και το καθένα ταιριάζει στον μικροελεγκτή μου. Χρειάστηκαν μερικά βράδια για να το πετύχουμε και όλα πήγαν καλά… μέχρι που προσπάθησα να τα βάλω μαζί στο switch statement. Το βοηθητικό πρόγραμμα avr-size ανέφερε μέγεθος ενότητας κειμένου 1,5 Kb (με σημαία -s του avr-gcc). Εκείνη τη στιγμή η αρχική μου πρόθεση ήταν να πάρω λίγο ATtiny25 με φλας 2Kb και αυτό θα μπορούσε να ήταν το αίσιο τέλος αυτής της ιστορίας.

Αλλά κατά κάποιο τρόπο ένιωσα ότι μετά από σημαντική βελτιστοποίηση θα μπορούσα να καταφέρω να συρρικνώσω αυτόν τον χάλια κώδικα σε 1Kb. Ωστόσο, χρειάστηκε μια ακόμη εβδομάδα για να συνειδητοποιήσουμε ότι είναι αδύνατο και μία ακόμη εβδομάδα για να το επιτύχουμε ούτως ή άλλως. Έπρεπε να κόψω ένα ουράνιο τόξο σε πέντε βασικά χρώματα (χωρίς σημαντική οπτική διαφορά). Απαλλάχτηκα από τις δηλώσεις περίπτωσης και χρησιμοποίησα μια αλυσίδα if-then-if για να μειώσω το μέγεθος του δυαδικού κώδικα. Το animation πυρκαγιάς χρειάζεται μια ψευδοτυχαία γεννήτρια αριθμών που είναι αρκετά ογκώδης, οπότε εφάρμοσα μια απλοποιημένη έκδοση του LFSR με σταθερή αρχική τιμή. Δεν με ενδιαφέρει το πλήρες μήκος του κύκλου PRNG και απλώς αναζητώ μια ισορροπία κατάβασης μεταξύ του μεγέθους του κώδικα και του «ρεαλιστικού κινούμενου πυρός». Υλοποίησα επίσης πολλές μικρές βελτιστοποιήσεις που δεν μπορώ να θυμηθώ αυτή τη στιγμή και μάλιστα κατάφερα να αναβοσβήσω όλες τις λειτουργίες εκτός από τη φωτιά στο τσιπ. Όταν μου τέλειωσαν οι ιδέες, ο συνολικός μου κώδικας ήταν περίπου 1200 byte.

Πήρα timeout και διάβαζα πολλά για τη βελτιστοποίηση κώδικα AVR. Iμουν κοντά στο να τα παρατήσω και να τα ξαναγράψω όλα στη γλώσσα συνέλευσης, αλλά του έδωσα την τελευταία ευκαιρία. Κατά την τελική βιασύνη βελτιστοποίησης, έκοψα ένα ουράνιο τόξο σε τρία βασικά χρώματα και έκανα τα υπόλοιπα να υπολογίζονται εν κινήσει, επιθεώρησα τα πάντα και ακολούθησα τις συστάσεις βελτιστοποίησης AVR και τέλος…

avrdude: flash flash (1004 bytes):

Γραφή | ################################################### | 100% 0,90

Δεν χρειάζεται να πω ότι χρησιμοποίησα σχεδόν όλη τη μνήμη RAM και μόνο ένα byte EEPROM για να αποθηκεύσω την τρέχουσα λειτουργία. Δεν υπονοώ ότι πρόκειται για μια ιδανική και απόλυτη εφαρμογή. Απλώς λειτουργεί και ταιριάζει στον μικροελεγκτή. Είμαι σίγουρος, θα μπορούσατε να το κάνετε καλύτερα. Πραγματικά είμαι. Θέλω απλώς να μοιραστώ τη διασκέδαση της επίλυσης ενός φαινομενικά μη πρακτικού προβλήματος που θεωρείτε σχεδόν αδύνατο στην αρχή. «Έτσι, το hacking σημαίνει να διερευνώνται τα όρια του δυνατού…» -Ρίτσαρντ Σταλμάν.

Προμήθειες:

1x ATtiny13 MCU (0,28 $ = 0,24 $ για MCU σε πακέτο SOP-8 και 0,04 $ για προσαρμογέα DIP8)

8x LEDs WS2812 RGB (προτείνω έναν πίνακα ή ένα κομμάτι λωρίδας LED) (0,42 $)

1x κουμπί αφής TTP223 (0,10 $)

1x Προσαρμογέας Micro USB σε DIP (0,14 $)

1x αντίσταση 10kΩ (<0,01 $)

1x κεραμικός πυκνωτής 100nF (<0,01 $)

1x ηλεκτρολυτικός πυκνωτής 10-47μF (<0,01 $)

Σύνολο <0,97 $

Βήμα 1: Ρύθμιση λογισμικού

Ρύθμιση λογισμικού
Ρύθμιση λογισμικού

Θα χρειαστείτε την εργαλειοθήκη avr-gcc για τη σύνταξη του πηγαίου κώδικα και το βοηθητικό πρόγραμμα avrdude για τη μεταφόρτωση της ROM του μικροελεγκτή. Η διαδικασία εγκατάστασης είναι αρκετά απλή και απλή, αλλά εξαρτάται από το λειτουργικό σας σύστημα. Εάν χρησιμοποιείτε κάποιο είδος GNU/Linux, πιθανότατα έχετε ήδη τα κατάλληλα πακέτα στο δέντρο αποθετηρίου σας. Μπορείτε να κατεβάσετε τον πηγαίο κώδικα αυτού του έργου εδώ:

github.com/arduinocelentano/t13_ws2812_lamp

Θα χρειαστείτε επίσης μια βιβλιοθήκη light_ws2812:

github.com/cpldcpu/light_ws2812

Αφού αποκτήσετε avr-gcc εργαλειοθήκη και πηγές έργου, εκτελέστε το τερματικό σας και πληκτρολογήστε τον ακόλουθο κώδικα:

cd path/to/project

φτιαχνω, κανω

Βήμα 2: Προγραμματισμός του μικροελεγκτή

Προγραμματισμός του μικροελεγκτή
Προγραμματισμός του μικροελεγκτή
Προγραμματισμός του μικροελεγκτή
Προγραμματισμός του μικροελεγκτή
Προγραμματισμός του μικροελεγκτή
Προγραμματισμός του μικροελεγκτή

Εάν έχετε κάποιο είδος προγραμματιστή USBASP, απλώς συνδέστε το στο Attiny σύμφωνα με το pinout του. Συνήθως θα μοιάζει με αυτό, αλλά προτείνω ανεπιφύλακτα να ελέγξετε το πραγματικό pinout σας!

Εναλλακτικά, μπορείτε να χρησιμοποιήσετε έναν πίνακα Arduino ως προγραμματιστή. Ανοίξτε το Arduino IDE και βρείτε το παράδειγμα του Arduino ISP στο μενού "Αρχείο amples Παραδείγματα". Αφού ανεβάσετε το σκίτσο, ο πίνακας Arduino λειτουργεί ως προγραμματιστής. Τα σχόλια στον κώδικα σκίτσου θα σας δώσουν μια ιδέα για το pinout.

Τώρα τρέξτε

φλας

να αναβοσβήνει το MCU και

κάνω ασφάλεια

για να ορίσετε bits ασφάλειας.

Συνιστάται: