Πίνακας περιεχομένων:
Βίντεο: Ένας λαμπτήρας διάθεσης LED 1 $ με ATtiny13 και WS2812: 7 βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:31
Ακολουθήστε περισσότερα από τον συγγραφέα:
Πρόκειται για έναν λαμπτήρα διάθεσης χαμηλού κόστους με τέσσερις λειτουργίες.
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 ασφάλειας.
Συνιστάται:
Ρομπότ απομακρυσμένης αναζήτησης και διάθεσης Leap Motion Controlled: 5 βήματα
Ρομπότ απομακρυσμένης αναζήτησης και διάθεσης Leap Motion: Ως μέρος της συμμετοχής μου στο Leap Motion #3D Jam, ήμουν ενθουσιασμένος που έφτιαξα αυτό το ασύρματο ρομπότ Search/Rescue ελεγχόμενης χειρονομίας βασισμένο στο Raspberry Pi. Αυτό το έργο καταδεικνύει και παρέχει ένα μινιμαλιστικό παράδειγμα του τρόπου με τον οποίο οι ασύρματες 3D χειρονομίες
Σύγχρονος λαμπτήρας διάθεσης RGB: 7 βήματα (με εικόνες)
Σύγχρονος λαμπτήρας διάθεσης RGB: Θέλετε να προσθέσετε κάποιο στυλ στο γραφείο σας; Σας καλύψαμε με μια λάμπα διάθεσης DIY φτιαγμένη από μέρη που μπορείτε εύκολα να βρείτε ξαπλωμένα στο γκαράζ ή το υπόστεγο σας. Ο λαμπτήρας διάθεσής μας διαθέτει αισθητικό και μοντέρνο σχεδιασμό, ενώ σας δίνει τον πλήρη έλεγχο του χρώματος
Χάρτης Λαμπτήρας- Ενημερωτικός και Όμορφος!: 7 Βήματα
Χάρτης Λαμπτήρας- Ενημερωτικός και Όμορφος!: Αυτή η λάμπα είναι κατασκευασμένη από μεταχειρισμένο/νέο χάρτη. Χρησιμοποιεί είσοδο 7-12V και μπορεί να προσαρμοστεί σε διαφορετικά χρώματα και φωτεινότητα. Έχει ακόμη και φόρτιση USB! Πολύ απλό στην κατασκευή, αλλά απαιτεί συγκόλληση
Ένας ενεργοποιημένος λαμπτήρας επιφάνειας εργασίας: 4 βήματα (με εικόνες)
Μια ενεργοποιημένη λάμπα επιφάνειας εργασίας: Εδώ θα δείξω πώς να φτιάξετε μια απλή, μικρή ενεργοποιημένη λάμπα επιτραπέζιου υπολογιστή χρησιμοποιώντας arduino και σερβοκινητήρες. Θα σας πω επίσης πώς μπορείτε να αλλάξετε τους κινητήρες έτσι ώστε να μπορείτε να καταγράφετε χειρισμούς και επομένως να πραγματοποιείτε κινήσεις με τη λάμπα που
Λαμπτήρας ανατολής και δύσης με LED: 7 βήματα (με εικόνες)
Ένας λαμπτήρας ανατολής και ηλιοβασιλέματος με LED: Το ξέρετε, το χειμώνα είναι δύσκολο να σηκωθείτε, επειδή έξω είναι σκοτεινό και το σώμα σας δεν θα ξυπνήσει στη μέση της νύχτας. Έτσι μπορείτε να αγοράσετε ένα ξυπνητήρι που σας ξυπνά με φως. Αυτές οι συσκευές δεν είναι τόσο ακριβές όσο λίγες