Sisällysluettelo:

Vilkkuu, laulaa, Marioman: 5 vaihetta
Vilkkuu, laulaa, Marioman: 5 vaihetta

Video: Vilkkuu, laulaa, Marioman: 5 vaihetta

Video: Vilkkuu, laulaa, Marioman: 5 vaihetta
Video: Полный курс React Query за час | TanStack Query v4 для начинающих 2024, Marraskuu
Anonim
Vilkkuu, laulaa, Marioman
Vilkkuu, laulaa, Marioman

Käytä attiny13a: ta, kahta LED-valoa ja onnittelukorttikaiutinta luodaksesi vilkkuva Marioman, joka soittaa Super Mario Brothers -teemapalkin, tämä voi olla helppo edullinen projekti kaikille, jotka etsivät hauskaa tapaa päästä AVR-ohjelmointiin! kappaleiden nuotit syntyvät neliöaallolla, joka lähetetään AVR -mikrokontrollerin yhdelle nastalle. LEDit, jotka vuorottelevat jokaisessa nuotissa, on kytketty 2 nastaan, joista jokainen on samassa sirussa.

Vaihe 1: Materiaalit ja rakentaminen

Materiaalit ja rakentaminen
Materiaalit ja rakentaminen

1 attiny13a

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

  • 2 LEDiä - kaikki LEDit sopivat
  • 1 litium -nappiparisto

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

1 nappisolun pidike

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

1 pieni kaiutin musiikkikortista

Materiaalien kokonaiskustannukset ~ 5 $ Jokaisessa LEDissä käytetään kahta nastaa, toinen nasta on asetettu matalaksi käytettäväksi maadoitusliittimenä. AVR: n I/O -nastojen virtaraja estää LED -valoja vetämästä liikaa, joten vastusta ei tarvitse kytkeä Käytetty kaiutin on tyypillinen musiikkikortista löydetylle, mikä tahansa pieni kaiutin tekee, koska tämä antaa neliöaaltoäänen, joten ei ole liian tärkeää huolehtia kaiuttimen ajamisesta tai äänenlaadusta.

Vaihe 2: AVR: n juottaminen LEDeihin ja kaiuttimeen

AVR: n juottaminen LEDeihin ja kaiuttimeen
AVR: n juottaminen LEDeihin ja kaiuttimeen
AVR: n juottaminen LEDeihin ja kaiuttimeen
AVR: n juottaminen LEDeihin ja kaiuttimeen

Jotta LED -valot ulottuisivat käsivarsina, yksi tappi on taivutettu AVR: n yli kummallakin puolella. AVR: n suuntaaminen tällä tavalla helpottaa yhdistämistä kaiuttimeen (toinen kuva), koska liitännät ovat molemmissa pohjatapeissa. se on liitetty.

Vaihe 3: Attiny13a: n ohjelmointi

Attiny13a: n ohjelmointi
Attiny13a: n ohjelmointi

AVR: ien ohjelmointiin on paljon erilaisia vaihtoehtoja. Tähän projektiin käytettiin USBtiny -laitetta, joka on saatavana sarjana ladyadan sivustolta. joko liitä johdot naaraspistorasiaan ja kytke ne leipälevyyn tai hanki vielä halpa AVR -ohjelmointisovitin, kuten tämä.

Vaihe 4: Laiteohjelmiston luominen Mariomanille

Laiteohjelmiston luominen Mariomanille
Laiteohjelmiston luominen Mariomanille

Attiny13A: ssa on 1K ohjelmoitavaa salamaa ja 64tavua SRAM -muistia. Liitteenä oleva tar -tiedosto sisältää lähdetiedoston sekä ladattavan laiteohjelmiston. Kolme c -kooditaulukkoa käytettiin musiikin luomiseen

  • freq - kunkin nuotin taajuudet
  • pituus - kunkin nuotin pituus
  • delay - tauko jokaisen nuotin välillä

Taajuusryhmällä ei ole todellisia taajuuksia, vaan arvo, joka lisätään TTCROB -rekisteriin neliöaallon muodostamiseksi PB0 -nastasta.

  • Attiny13A: n sisäinen oskillaattori on asetettu 9,6 MHz: iin
  • IO: n sisäinen kello on oskillaattori jaettuna 8 tai 1,2 MHz: llä
  • Sisäinen ajastin on asetettu 8 -bittiseen rekisteriin laskemaan jokaisen kellojakson esiasteikko 8.
  • Tämän tuloksena yksi rasti vastaa 1 / (1,2 MHz / 8) = 0,006667 ms
  • Attiny13A on määritetty vertaamaan 8 -bittisen TCCR0B -rekisterin sisältöä ajastimeen ja vaihtamaan nasta, kun ne vastaavat toisiaan.
  • Esimerkiksi neliöaallon luomiseksi taajuudella 524 Hz (yksi oktaavi keskellä C), jonka jakso on 1,908 ms.

1.908ms = 286 kellon tikit (1.908/.0067) Jaa 286 2: lla vaihtaaksesi nastan t/2: ssa (286/2 = 143) Laita 143 TTCR0B -rekisteriin tämän muistiinpanon luomiseksi. Tämä on kaikki tarvittava koodi aseta ajastin vertaamalla ja antamalla neliöaalto:

TCCR0A | = (1 << WGM01); // määritä ajastin 1 CTC -tilaan TCCR0A | = (1 << COM0A0); // vaihtaa OC0A vertailuhaussa TCCR0B | = (1 << CS01); // clk/8 esiasteikko TTCR0B = 143; // tuottaa neliöaallon taajuudella 524 HzÄänien ja niiden välisten taukojen viivästyttämiseen käytettiin yksinkertaista viivetoimintoa

tyhjä uni (int ms) {int cnt; for (cnt = 0; cnt <(ms); cnt ++) {int i = 150; while (i--) {_asm ("NOP"); }}}Tämä laskee alaspäin 150: stä, jolloin jokainen NOP -sykli on noin.006667 ms.

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 (& taajuus [cnt]); output_toggle (PORTB, PB3); output_toggle (PORTB, PB4); uni (pgm_read_byte (& pituus [cnt]))); output_toggle (PORTB, PB3); output_toggle (PORTB, PB4); // pysäytysajastin TCCR0B = 0; uni (pgm_read_word (& delay [cnt]))); // käynnistysajastin TCCR0B | = (1 << CS01); // clk/8 esiasteikko}}Taajuuksissa/pituuksissa/viivejärjestelmissä on 156 elementtiä, tämä silmukka kulkee niiden läpi. Nastat PB3 ja PB4 on kytketty toisiinsa, joten ne vaihtelevat jokaisen nuotin kanssa. Ensimmäinen lepotila on sen nuotin pituus, jonka soitamme sen jälkeen, kun OCR0A -rekisteri on asetettu oikeaan arvoon. Toinen uni on tauko soittamiesi nuottien välillä. Yllä olevassa koodissa saatat huomata kaksi toimintoa pgm_read_byte () ja pgm_read_word () sekä avainsanan PROGMEM. Upotetun sirun kanssa, kuten attiny, SRAM -määrä on hyvin rajallinen, tässä tapauksessa vain 64 tavua. Kaikille taajuus-/viive-/pituustiedoille käyttämämme taulukot ovat paljon suurempia kuin 64 tavua, joten niitä ei voi ladata muistiin. Käyttämällä erityistä PROGMEM avr-gcc -direktiiviä, nämä suuret tietoryhmät estetään lataamasta muistiin, vaan ne luetaan flashista.

Vaihe 5: Anna Mariomanin löystyä

Yllä oleva video näyttää Mariomanin toiminnassa. Keskimääräinen virrankulutus on noin 25 mA, joten hän voi vilkkua ja tehdä ääniä noin 10 tuntia ennen litium -nappikennon tyhjentämistä. sopii tähän hyvin. Kytkimen voi lisätä, mutta on jotain sanottavaa sen pitämiseksi yksinkertaisena.

Suositeltava: