Inhoudsopgave:

Knipperen, zingen, Marioman: 5 stappen
Knipperen, zingen, Marioman: 5 stappen

Video: Knipperen, zingen, Marioman: 5 stappen

Video: Knipperen, zingen, Marioman: 5 stappen
Video: Snappie - De Kleine Krokodil 2024, September
Anonim
Knipperen, zingen, Marioman
Knipperen, zingen, Marioman

Gebruik een attiny13a, twee LED's en een wenskaartluidspreker om een knipperende Marioman te maken die het themalied van Super Mario Brothers speelt. Dit kan een eenvoudig en goedkoop project zijn voor iedereen die op zoek is naar een leuke manier om in te breken in AVR-programmering! noten van de nummers worden gegenereerd door een blokgolf die wordt uitgevoerd op een enkele pin van de AVR-microcontroller. De LED's die op elke noot afwisselen, zijn verbonden met 2 pinnen van dezelfde chip.

Stap 1: Materialen en constructie

Materialen en constructie
Materialen en constructie

1 attiny13a

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

  • 2 LED's - alle LED's zijn voldoende
  • 1 lithium knoopcelbatterij

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

1 knoopcelhouder

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

1 kleine speaker van een muzikale wenskaart

Totale materiaalkosten ~ $ 5 De twee LED's werden rechtstreeks bevestigd aan twee pinnen van elk van de attiny13A. Er worden twee pinnen gebruikt voor elke LED, de tweede pin is laag ingesteld om als aardverbinding te gebruiken. serie. De gebruikte luidspreker is typerend voor een luidspreker die te vinden is in een muzikale wenskaart, elke kleine luidspreker is geschikt, aangezien dit een blokgolftoon produceert, is het niet zo belangrijk om je zorgen te maken over het aansturen van de luidspreker of de geluidskwaliteit.

Stap 2: Solderen van de AVR aan de LED's en luidspreker

Solderen van de AVR aan de LED's en luidspreker
Solderen van de AVR aan de LED's en luidspreker
Solderen van de AVR aan de LED's en luidspreker
Solderen van de AVR aan de LED's en luidspreker

Om de LED's als armen uit te reiken, wordt aan elke kant een pen over de AVR gebogen. Door de AVR op deze manier te oriënteren, is het gemakkelijk om verbinding te maken met de luidspreker (tweede afbeelding), aangezien de aansluitingen op de twee onderste pinnen zitten. het is bijgevoegd.

Stap 3: Programmeren van de Attiny13a

De Attiny13a programmeren
De Attiny13a programmeren

Er zijn tal van verschillende opties voor het programmeren van AVR's. Voor dit project werd de USBtiny gebruikt die als kit verkrijgbaar is op de site van ladyada https://www.ladyada.net/make/usbtinyisp/index.html. Om de AVR op de programmer aan te sluiten, kunt u ofwel bevestig draden aan de vrouwelijke socket en steek ze in een breadboard of beter nog, koop een goedkope AVR-programmeeradapter zoals dezehttps://www.sparkfun.com/commerce/product_info.php?products_id=8508samen met 3x2 mannelijke headers om de plug aan te sluiten.

Stap 4: De firmware voor Marioman maken

De firmware voor Marioman maken
De firmware voor Marioman maken

De attiny13A heeft 1K programmeerbare flash en 64 bytes SRAM. Het bijgevoegde tar-bestand bevat het bronbestand en gecompileerde firmware om te downloaden. Drie arrays in de c-code werden gebruikt om de muziek te genereren

  • freq - frequenties van elke noot
  • lengte - lengte van elke noot
  • vertraging - pauze tussen elke noot

De frequentiearray heeft niet de werkelijke frequenties, maar eerder de waarde die in het TTCROB-register moet worden ingevoerd om de blokgolf van de PB0-pin te genereren. Hier is een korte samenvatting van de berekeningen en pinconfiguratie voor het genereren van blokgolven:

  • De attiny13A heeft een interne oscillator ingesteld op 9,6MHz
  • De interne klok voor IO is de oscillator gedeeld door 8 of 1,2 MHz
  • Een interne timer is ingesteld in een 8-bits register om elke klokcyclus op te tellen met een voorschaal van 8.
  • Dit resulteert in één vinkje gelijk aan 1 / (1,2 MHz / 8) =.006667 ms
  • De attiny13A is geconfigureerd om te vergelijken wat er in het 8bit TCCR0B-register staat met de timer en een pin te wisselen wanneer ze overeenkomen.
  • Om bijvoorbeeld een blokgolf op 524 Hz (een octaaf boven de middelste C) te genereren met een periode van 1,908 ms.

1.908ms = 286 kloktikken (1.908/.0067)Deel 286 door 2 om de pin op t/2 te wisselen (286/2 = 143)Plaats 143 in het TTCR0B-register om deze notitie te genereren. Dit is alle code die nodig is om de timer in te stellen, doe de vergelijking en voer een blokgolf uit:

TCCR0A |= (1<<WGM01); // configureer timer 1 voor CTC-modus TCCR0A |= (1<<COM0A0); // schakel OC0A in bij vergelijk match TCCR0B |= (1<<CS01); // clk/8 voorschaal TTCR0B = 143; // genereer een blokgolf op 524HzOm de tonen en de pauzes ertussen te vertragen, werd een eenvoudige vertragingsfunctie gebruikt

void sleep (int ms) { int cnt; voor (cnt=0; cnt<(ms); cnt++) { int i = 150; while(i--) { _asm("NOP"); } }}Dit telt af vanaf 150, waarbij elke NOP-cyclus ongeveer.006667 ms is. Het laatste wat de code doet, is door de arrays lopen, de muziek genereren en de twee LED's laten knipperen. Dit wordt gedaan in een continue for-lus met de volgende code

const uint8_t freq PROGMEM = { … data };const uint8_t lengte PROGMEM = { … data };const uint8_t vertraging PROGMEM = { … data };…terwijl (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); // stoptimer TCCR0B = 0; slaap (pgm_read_word(&delay[cnt])); // start timer TCCR0B |= (1<<CS01); // clk/8 voorschaal }}Er zijn 156 elementen in de frequenties/lengtes/vertragingsreeksen, deze lus doorloopt ze. Pin PB3 en PB4 zijn elk omgeschakeld, zodat ze met elke noot zullen worden afgewisseld. De eerste slaap is de lengte van de noot die we spelen nadat het OCR0A-register op de juiste waarde is ingesteld. De tweede slaap is de pauze tussen de noten die we spelen. In de bovenstaande code heb je misschien de twee functies pgm_read_byte() en pgm_read_word() gezien, evenals het trefwoord PROGMEM. Met een ingebouwde chip zoals de attiny is de hoeveelheid SRAM zeer beperkt, in dit geval slechts 64 bytes. De arrays die we gebruiken voor alle frequentie-/vertragings-/lengtegegevens zijn veel groter dan 64 bytes en kunnen daarom niet in het geheugen worden geladen. Door gebruik te maken van de speciale PROGMEM avr-gcc-richtlijn wordt voorkomen dat deze grote data-arrays in het geheugen worden geladen, in plaats daarvan worden ze uit flash gelezen.

Stap 5: De Marioman loslaten

De bovenstaande video toont Marioman in actie. Het gemiddelde stroomverbruik is ongeveer 25 mA, dus hij kan ongeveer 10 uur knipperen en geluiden maken voordat de lithium-knoopcel leeg is. hiervoor goed geschikt. Er kan een schakelaar worden toegevoegd, maar er is iets voor te zeggen om het simpel te houden.

Aanbevolen: