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

Αναβοσβήνει, τραγουδάει, Marioman: 5 βήματα
Αναβοσβήνει, τραγουδάει, Marioman: 5 βήματα

Βίντεο: Αναβοσβήνει, τραγουδάει, Marioman: 5 βήματα

Βίντεο: Αναβοσβήνει, τραγουδάει, Marioman: 5 βήματα
Βίντεο: Μ.Κανά-Θ.Παπακωνσταντίνου ''Όταν τραγουδάω''(Ζέφυρος) 2024, Σεπτέμβριος
Anonim
Αναβοσβήνει, τραγουδάει, Marioman
Αναβοσβήνει, τραγουδάει, Marioman

Χρησιμοποιήστε ένα attiny13a, δύο LED και ένα ηχείο ευχετήριας κάρτας για να δημιουργήσετε μια αναβοσβήνει Marioman που παίζει το θεματικό τραγούδι Super Mario Brothers. Αυτό μπορεί να είναι ένα εύκολο έργο χαμηλού κόστους για όποιον ψάχνει έναν διασκεδαστικό τρόπο να εισχωρήσει στον προγραμματισμό AVR! οι νότες των τραγουδιών δημιουργούνται από ένα τετραγωνικό κύμα που εξάγεται σε μία μόνο ακίδα του μικροελεγκτή AVR. Οι λυχνίες LED που εναλλάσσονται σε κάθε νότα συνδέονται με 2 ακίδες το καθένα από το ίδιο τσιπ.

Βήμα 1: Υλικά και κατασκευή

Υλικά και Κατασκευή
Υλικά και Κατασκευή

1 attiny13a

www.mouser.com/Search/ProductDetail.aspx?qs=sGAEpiMZZMvu0Nwh4cA1wRKJzS2Lmyk%252bEP0e%2f7dEeq0%3d Κόστος: $ 1,40

  • 2 LED - όλα τα LED θα κάνουν
  • 1 μπαταρία λιθίου σε σχήμα νομίσματος

www.sparkfun.com/commerce/product_info.php?products_id=338 Κόστος: 2,00 $

1 θήκη κυττάρων νομισμάτων

www.sparkfun.com/commerce/product_info.php?products_id=8822 Κόστος: 1,25 $

1 μικρό ηχείο από μουσική ευχετήρια κάρτα

Συνολικό κόστος υλικών 5 5 $ Τα δύο LED συνδέθηκαν απευθείας σε δύο ακίδες καθένα από το attiny13A. Χρησιμοποιούνται δύο ακίδες για κάθε LED, ο δεύτερος πείρος είναι χαμηλός για χρήση ως σύνδεση γείωσης. Το τρέχον όριο των ακίδων εισόδου/εξόδου στο AVR θα εμποδίσει τα LED να τραβήξουν πολύ, οπότε δεν είναι απαραίτητο να συνδεθεί μια αντίσταση σειρά. Το ηχείο που χρησιμοποιείται είναι τυπικό για εκείνο που βρίσκεται σε μια μουσική ευχετήρια κάρτα, κάθε μικρό ηχείο θα κάνει, δεδομένου ότι αυτό παράγει έναν τετράγωνο κύμα, δεν είναι πολύ σημαντικό να ανησυχείτε για την οδήγηση του ηχείου ή την ποιότητα ήχου.

Βήμα 2: Συγκόλληση του AVR στις λυχνίες LED και το ηχείο

Συγκόλληση του AVR στις λυχνίες LED και ηχείο
Συγκόλληση του AVR στις λυχνίες LED και ηχείο
Συγκόλληση του AVR στις λυχνίες LED και ηχείο
Συγκόλληση του AVR στις λυχνίες LED και ηχείο

Για να φτάσουν οι λυχνίες LED απλώνονται σαν τα χέρια, ένας πείρος λυγίζει πάνω από το AVR σε κάθε πλευρά. Ο προσανατολισμός του AVR με αυτόν τον τρόπο διευκολύνει τη σύνδεση με το ηχείο (δεύτερη εικόνα), καθώς οι συνδέσεις βρίσκονται στις δύο κάτω ακίδες. Για αισθητική, το μπροστινό μέρος του τσιπ είναι στραμμένο προς τα έξω, οπότε βεβαιωθείτε ότι το ηχείο έχει την ίδια όψη όταν επισυνάπτεται.

Βήμα 3: Προγραμματισμός του Attiny13a

Προγραμματισμός του Attiny13a
Προγραμματισμός του Attiny13a

Υπάρχουν πολλές διαφορετικές επιλογές για τον προγραμματισμό AVR. Για αυτό το έργο χρησιμοποιήθηκε το USBtiny, το οποίο είναι διαθέσιμο ως κιτ από τον ιστότοπο της ladyada είτε συνδέστε καλώδια στη θηλυκή πρίζα και συνδέστε τα σε ένα breadboard ή καλύτερα να πάρετε έναν φτηνό προσαρμογέα προγραμματισμού AVR όπως αυτόν Το

Βήμα 4: Δημιουργία υλικολογισμικού για Marioman

Δημιουργία υλικολογισμικού για Marioman
Δημιουργία υλικολογισμικού για Marioman

Το attiny13A διαθέτει 1K προγραμματιζόμενου φλας και 64bytes SRAM. Το συνημμένο αρχείο tar έχει το αρχείο προέλευσης καθώς και μεταγλωττισμένο υλικολογισμικό για λήψη. Τρεις συστοιχίες στον κώδικα c χρησιμοποιήθηκαν για τη δημιουργία της μουσικής

  • freq - συχνότητες κάθε νότας
  • μήκος - μήκος κάθε νότας
  • καθυστέρηση - παύση μεταξύ κάθε νότας

Ο πίνακας συχνοτήτων δεν έχει τις πραγματικές συχνότητες, αλλά την τιμή που πρέπει να εισαγάγετε στον καταχωρητή TTCROB για να δημιουργήσετε το τετραγωνικό κύμα από τον ακροδέκτη PB0. Ακολουθεί μια σύντομη περίληψη των υπολογισμών και της διαμόρφωσης ακίδων για παραγωγή τετραγωνικών κυμάτων:

  • Το attiny13A διαθέτει εσωτερικό ταλαντωτή ρυθμισμένο στα 9,6MHz
  • Το εσωτερικό ρολόι για το IO είναι ο ταλαντωτής διαιρεμένος με 8 ή 1,2 MHz
  • Ένας εσωτερικός χρονοδιακόπτης ρυθμίζεται σε έναν καταχωρητή 8bit για να μετράει κάθε κύκλο ρολογιού με προεπιλογή 8.
  • Αυτό έχει ως αποτέλεσμα ένα τσιμπούρι ίσο με 1 / (1.2MHz / 8) =.006667ms
  • Το attiny13A έχει ρυθμιστεί ώστε να συγκρίνει αυτό που υπάρχει στον καταχωρητή 8bit TCCR0B με το χρονόμετρο και να αλλάζει μια καρφίτσα όταν ταιριάζουν.
  • Για παράδειγμα, για να δημιουργηθεί ένα τετραγωνικό κύμα στα 524Hz (μία οκτάβα πάνω από το μέσο C) το οποίο έχει περίοδο 1,908ms.

1.908ms = 286 κρότωνες ρολογιού (1.908/.0067) Διαιρέστε το 286 με 2 για να αλλάξετε τον πείρο στο t/2 (286/2 = 143) Βάλτε το 143 στον καταχωρητή TTCR0B για να δημιουργήσετε αυτήν τη σημείωση. Αυτός είναι όλος ο κωδικός που είναι απαραίτητος για να ρυθμίσετε το χρονόμετρο, κάντε τη σύγκριση και εξάγετε ένα τετράγωνο κύμα:

TCCR0A | = (1 << WGM01]; // διαμόρφωση χρονοδιακόπτη 1 για λειτουργία CTC TCCR0A | = (1 << COM0A0]; // εναλλαγή OC0A σε σύγκριση αντιστοίχισης TCCR0B | = (1 << CS01); // clk/8 prescale TTCR0B = 143; // Δημιουργία τετραγωνικού κύματος στα 524HzΓια την καθυστέρηση των ήχων και των παύσεων μεταξύ τους χρησιμοποιήθηκε μια απλή συνάρτηση καθυστέρησης

άκυρος ύπνος (int ms) {int cnt; για (cnt = 0; cnt <(ms); cnt ++) {int i = 150; ενώ (i--) {_asm ("NOP"); }}}Αυτό μετρά αντίστροφα από 150 όπου κάθε κύκλος NOP είναι περίπου.006667ms. Το τελευταίο πράγμα που κάνει ο κώδικας είναι να βολέψει τις συστοιχίες, να δημιουργήσει τη μουσική και να αναβοσβήνει τα δύο LED. Αυτό γίνεται σε συνεχή βρόχο με τον ακόλουθο κώδικα

const uint8_t freq PROGMEM = {… data}; const uint8_t length PROGMEM = {… data}; const uint8_t delay PROGMEM = {… data};… while (1) {for (cnt = 0; cnt < 156; cnt ++) {OCR0A = pgm_read_byte (& freq [cnt]); output_toggle (PORTB, PB3); output_toggle (PORTB, PB4); ύπνος (pgm_read_byte (& μήκος [cnt])); output_toggle (PORTB, PB3); output_toggle (PORTB, PB4); // χρονόμετρο διακοπής TCCR0B = 0; ύπνος (pgm_read_word (& καθυστέρηση [cnt])); // χρονόμετρο έναρξης TCCR0B | = (1 << CS01); // clk/8 prescale}}Υπάρχουν 156 στοιχεία στους πίνακες συχνοτήτων/μήκους/καθυστέρησης, αυτός ο βρόχος τα διασχίζει. Τα ακροδέκτες PB3 και PB4 εναλλάσσονται το καθένα έτσι ώστε να εναλλάσσονται με κάθε νότα. Ο πρώτος ύπνος είναι το μήκος της νότας που παίζουμε αφού ορίσουμε τον καταχωρητή OCR0A στην κατάλληλη τιμή. Ο δεύτερος ύπνος είναι η παύση ανάμεσα στις νότες που παίζουμε. Στον παραπάνω κώδικα μπορεί να έχετε παρατηρήσει τις δύο συναρτήσεις pgm_read_byte () και pgm_read_word () καθώς και τη λέξη -κλειδί PROGMEM. Με ένα ενσωματωμένο τσιπ όπως το attiny, η ποσότητα SRAM είναι πολύ περιορισμένη, σε αυτή την περίπτωση μόνο 64bytes. Οι πίνακες που χρησιμοποιούμε για όλα τα δεδομένα συχνότητας/καθυστέρησης/μήκους είναι πολύ μεγαλύτεροι από 64bytes και επομένως δεν μπορούν να φορτωθούν στη μνήμη. Χρησιμοποιώντας την ειδική οδηγία PROGMEM avr-gcc, αυτές οι μεγάλες συστοιχίες δεδομένων αποτρέπονται από τη φόρτωση στη μνήμη, αντίθετα διαβάζονται από το φλας.

Βήμα 5: Αφήνοντας το Marioman Loose

Το παραπάνω βίντεο δείχνει τη Μαριόμαν εν δράσει. Η μέση κατανάλωση ενέργειας είναι περίπου 25mA, ώστε να μπορεί να αναβοσβήνει και να κάνει θορύβους για περίπου 10 ώρες πριν αδειάσει το κελί νομίσματος λιθίου. Ο μόνος τρόπος για να τον ενεργοποιήσετε και να τον απενεργοποιήσετε είναι να αφαιρέσετε την μπαταρία των κυψελών νομισμάτων, η ανθεκτική που αναφέρεται στα υλικά είναι κατάλληλο για αυτό. Μπορεί να προστεθεί ένας διακόπτης, αλλά υπάρχει κάτι που πρέπει να ειπωθεί για να είναι απλό.

Συνιστάται: