Cuprins:

Clipind, cântând, Marioman: 5 pași
Clipind, cântând, Marioman: 5 pași

Video: Clipind, cântând, Marioman: 5 pași

Video: Clipind, cântând, Marioman: 5 pași
Video: MEGA Ghost Dragon 👻🐲 ТОП ТРЕЙДЫ в Adopt Me Roblox Что Дают За Дракона Адопт Ми 2024, Noiembrie
Anonim
Clipind, cântând, Marioman
Clipind, cântând, Marioman

Folosiți un atiny13a, două LED-uri și un difuzor pentru felicitări pentru a crea un Marioman care clipeste care cântă melodia tematică Super Mario Brothers. Acesta poate fi un proiect ușor și ieftin pentru oricine caută un mod distractiv de a intra în programarea AVR! notele melodiilor sunt generate de un val pătrat emis pe un singur pin al microcontrolerului AVR. LED-urile care alternează pe fiecare notă sunt conectate la 2 pini fiecare din același cip.

Pasul 1: Materiale și construcție

Materiale și construcție
Materiale și construcție

1 attiny13a

www.mouser.com/Search/ProductDetail.aspx?qs=sGAEpiMZZMvu0Nwh4cA1wRKJzS2Lmyk%252bEP0e%2f7dEeq0%3dCost: 1,40 USD

  • 2 LED-uri - orice LED-uri vor funcționa
  • 1 baterie cu celule cu litiu

www.sparkfun.com/commerce/product_info.php?products_id=338 Cost: 2,00 USD

1 suport pentru celule de monede

www.sparkfun.com/commerce/product_info.php?products_id=8822 Cost: 1,25 USD

1 difuzor mic de pe o felicitare muzicală

Costul total al materialelor ~ 5 USD Cele două LED-uri au fost atașate direct la doi pini, fiecare dintre elementele 13A. Se utilizează doi pini pentru fiecare LED, al doilea pin este setat pentru a fi utilizat ca o conexiune la masă. Limita de curent a pinilor I / O de pe AVR va împiedica LED-urile să tragă prea mult, astfel încât un rezistor nu este necesar pentru conectarea Difuzorul folosit este tipic pentru unul care se găsește într-o felicitare muzicală, orice difuzor mic va face, dat fiind că acesta emite un ton de undă pătrat, nu este prea important să vă faceți griji cu privire la conducerea difuzorului sau la calitatea sunetului.

Pasul 2: lipirea AVR-ului la LED-uri și difuzor

Lipirea AVR-ului la LED-uri și difuzor
Lipirea AVR-ului la LED-uri și difuzor
Lipirea AVR-ului la LED-uri și difuzor
Lipirea AVR-ului la LED-uri și difuzor

Pentru ca LED-urile să se întindă ca brațele, un pin este îndoit peste AVR de fiecare parte. Orientarea AVR în acest fel face mai ușoară conectarea la difuzor (a doua imagine), deoarece conexiunile sunt pe cei doi pini inferiori. Pentru aspectul estetic, doriți ca partea frontală a cipului să fie orientată spre exterior, deci asigurați-vă că difuzorul este orientat în același mod atunci când este atasat.

Pasul 3: Programarea Attiny13a

Programarea Attiny13a
Programarea Attiny13a

Există o mulțime de opțiuni diferite pentru programarea AVR-urilor. Pentru acest proiect a fost utilizat USBtiny, care este disponibil ca kit de pe site-ul ladyadahttps://www.ladyada.net/make/usbtinyisp/index.html Pentru a conecta AVR-ul la programator puteți fie atașați fire la priza de sex feminin și conectați-le la o placă de măsurare sau, mai bine, obțineți un adaptor de programare AVR ieftin ca acesta.

Pasul 4: Crearea firmware-ului pentru Marioman

Crearea firmware-ului pentru Marioman
Crearea firmware-ului pentru Marioman

Attiny13A are 1K de bliț programabil și 64 de octeți de SRAM. Fișierul tar atașat are fișierul sursă, precum și firmware compilat pentru descărcare. Trei matrice din codul c au fost utilizate pentru a genera muzica

  • freq - frecvențe ale fiecărei note
  • lungime - lungimea fiecărei note
  • întârziere - pauză între fiecare notă

Matricea de frecvență nu are frecvențele reale, ci mai degrabă valoarea de pus în registrul TTCROB pentru a genera unda pătrată de pe pinul PB0. Iată un scurt rezumat al calculelor și configurației pinului pentru generarea undei pătrate:

  • Attiny13A are un oscilator intern setat la 9,6 MHz
  • Ceasul intern pentru IO este oscilatorul împărțit la 8 sau 1,2 MHz
  • Un cronometru intern este configurat într-un registru de 8 biți pentru a număra în fiecare ciclu de ceas cu prescala de 8.
  • Rezultă o bifă egală cu 1 / (1,2 MHz / 8) =.006667ms
  • Attiny13A este configurat pentru a compara ceea ce se află în registrul TCCR0B pe 8 biți cu temporizatorul și pentru a comuta un pin când se potrivesc.
  • De exemplu, pentru a genera o undă pătrată la 524Hz (o octavă deasupra mijlocului C) care are o perioadă de 1,908ms.

1.908ms = 286 căpușe de ceas (1.908 /.0067) Împărțiți 286 la 2 pentru a comuta pinul la t / 2 (286/2 = 143) Puneți 143 în registrul TTCR0B pentru a genera această notă. Acesta este tot codul necesar pentru a configura cronometrul, efectuați compararea și transmiteți o undă pătrată:

TCCR0A | = (1 << WGM01); // configurați temporizatorul 1 pentru modul CTC TCCR0A | = (1 << COM0A0); // comutați OC0A pe meciul de comparare TCCR0B | = (1 << CS01); // clk / 8 prescale TTCR0B = 143; // generează o undă pătrată la 524HzPentru a întârzia tonurile și pauzele dintre ele, a fost utilizată o funcție simplă de întârziere

void sleep (int ms) {int cnt; pentru (cnt = 0; cnt <(ms); cnt ++) {int i = 150; while (i--) {_asm ("NOP"); }}}Acest lucru se numără înapoi de la 150, unde fiecare ciclu NOP este de aproximativ.006667ms. Ultimul lucru pe care îl face codul este să parcurgeți matricele, să generați muzică și să clipiți cele două LED-uri. Acest lucru se face într-o buclă continuă pentru următorul cod

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); sleep (pgm_read_byte (& length [cnt])); output_toggle (PORTB, PB3); output_toggle (PORTB, PB4); // oprire temporizator TCCR0B = 0; sleep (pgm_read_word (& delay [cnt])); // pornire cronometru TCCR0B | = (1 << CS01); // clk / 8 prescale}}Există 156 de elemente în matricele de frecvențe / lungimi / întârziere, această buclă le traversează. Pinul PB3 și PB4 sunt fiecare comutate, astfel încât acestea vor alterna cu fiecare notă. Al doilea somn este pauza dintre notele pe care le jucăm. În codul de mai sus s-ar putea să observați cele două funcții pgm_read_byte () și pgm_read_word (), precum și cuvântul cheie PROGMEM. Cu un cip încorporat precum attiny, cantitatea de SRAM este foarte limitată, în acest caz doar 64 de octeți. Tablourile pe care le folosim pentru toate datele de frecvență / întârziere / lungime sunt mult mai mari de 64 de biți și, prin urmare, nu pot fi încărcate în memorie. Prin utilizarea directivei speciale PROGMEM avr-gcc, aceste matrice de date mari sunt împiedicate să se încarce în memorie, în schimb sunt citite de pe bliț.

Pasul 5: Lăsați-l pe Marioman să se elibereze

Videoclipul de mai sus îl arată pe Marioman în acțiune. Consumul mediu de energie este de aproximativ 25mA, astfel încât să poată clipi și să facă zgomote timp de aproximativ 10 ore înainte de a scurge celula monedei de litiu. bine potrivit pentru asta. Se poate adăuga un comutator, dar există ceva de spus pentru simplificarea acestuia.

Recomandat: