Inhaltsverzeichnis:

Blinken, Singen, Marioman - Gunook
Blinken, Singen, Marioman - Gunook

Video: Blinken, Singen, Marioman - Gunook

Video: Blinken, Singen, Marioman - Gunook
Video: WALTER&ME 😋 ES KRIBBELT #djsunflower #comedy #dino #baby 2024, September
Anonim
Blinzeln, Singen, Marioman
Blinzeln, Singen, Marioman

Verwenden Sie einen attiny13a, zwei LEDs und einen Grußkartenlautsprecher, um einen blinkenden Marioman zu erstellen, der den Super Mario Brothers-Titelsong spielt. Dies kann ein einfaches, kostengünstiges Projekt für jeden sein, der nach einer unterhaltsamen Möglichkeit sucht, in die AVR-Programmierung einzusteigen! Noten der Songs werden durch eine Rechteckwelle erzeugt, die an einem einzelnen Pin des AVR-Mikrocontrollers ausgegeben wird. Die LEDs, die sich bei jeder Note abwechseln, sind mit jeweils 2 Pins desselben Chips verbunden.

Schritt 1: Materialien und Konstruktion

Materialien und Konstruktion
Materialien und Konstruktion

1 attiny13a

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

  • 2 LEDs - alle LEDs reichen aus
  • 1 Lithium-Knopfzellenbatterie

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

1 Knopfzellenhalter

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

1 kleiner Lautsprecher aus einer musikalischen Grußkarte

Gesamtmaterialkosten ~ $ 5 Die beiden LEDs wurden direkt an jeweils zwei Pins des attiny13A angeschlossen. Für jede LED werden zwei Pins verwendet, der zweite Pin ist niedrig eingestellt, um als Masseanschluss verwendet zu werden. Die Strombegrenzung der I / O-Pins am AVR verhindert, dass die LEDs zu viel ziehen, sodass kein Widerstand zum Anschließen erforderlich ist Serie. Der verwendete Lautsprecher ist typisch für eine Musik-Grußkarte, jeder kleine Lautsprecher reicht aus, da dieser einen Rechteckwellenton ausgibt, ist es nicht allzu wichtig, sich um die Ansteuerung des Lautsprechers oder die Klangqualität zu kümmern.

Schritt 2: Löten des AVR an die LEDs und den Lautsprecher

Löten des AVR an die LEDs und den Lautsprecher
Löten des AVR an die LEDs und den Lautsprecher
Löten des AVR an die LEDs und den Lautsprecher
Löten des AVR an die LEDs und den Lautsprecher

Damit die LEDs wie Arme ausgreifen, wird auf jeder Seite ein Stift über den AVR gebogen. Wenn Sie den AVR auf diese Weise ausrichten, ist es einfach, den Lautsprecher (zweites Bild) anzuschließen, da sich die Anschlüsse an den beiden unteren Pins befinden. Aus ästhetischen Gründen möchten Sie, dass die Vorderseite des Chips nach außen zeigt, also stellen Sie sicher, dass der Lautsprecher in die gleiche Richtung zeigt, wenn es ist angehängt.

Schritt 3: Programmierung des Attiny13a

Programmierung des Attiny13a
Programmierung des Attiny13a

Es gibt viele verschiedene Optionen zum Programmieren von AVRs. Für dieses Projekt wurde die USBtiny verwendet, die als Kit auf der Ladyada-Site https://www.ladyada.net/make/usbtinyisp/index.html erhältlich ist Schließen Sie entweder Drähte an die Buchse an und stecken Sie sie in ein Steckbrett oder besser noch einen billigen AVR-Programmieradapter wie diesen https://www.sparkfun.com/commerce/product_info.php?products_id=8508zusammen mit 3x2 Stiftleisten zum Anschließen des Steckers.

Schritt 4: Erstellen der Firmware für Marioman

Erstellen der Firmware für Marioman
Erstellen der Firmware für Marioman

Der attiny13A hat 1K programmierbaren Flash und 64Byte SRAM. Die angehängte Tar-Datei enthält die Quelldatei sowie kompilierte Firmware zum Download. Drei Arrays im C-Code wurden verwendet, um die Musik zu generieren

  • freq - Frequenzen jeder Note
  • length - Länge jeder Note
  • delay - Pause zwischen jeder Note

Das Frequenzarray enthält nicht die tatsächlichen Frequenzen, sondern den Wert, der in das TTCROB-Register eingegeben werden muss, um die Rechteckwelle vom PB0-Pin zu erzeugen. Hier ist eine kurze Zusammenfassung der Berechnungen und der Pinkonfiguration für die Rechteckwellenerzeugung:

  • Der attiny13A hat einen internen Oszillator, der auf 9,6MHz eingestellt ist
  • Der interne Takt für IO ist der Oszillator geteilt durch 8 oder 1,2 MHz
  • Ein interner Timer ist in einem 8-Bit-Register eingerichtet, um jeden Taktzyklus mit einer Vorskalierung von 8 hochzuzählen.
  • Dies führt zu einem Tick gleich 1 / (1,2 MHz / 8) = 0,006667 ms
  • Der attiny13A ist so konfiguriert, dass er den Inhalt des 8-Bit-TCCR0B-Registers mit dem Timer vergleicht und einen Pin umschaltet, wenn sie übereinstimmen.
  • Zum Beispiel, um eine Rechteckwelle mit 524 Hz (eine Oktave über dem mittleren C) zu erzeugen, die eine Periode von 1,908 ms hat.

1.908ms = 286 Takt-Ticks (1.908/.0067)Teilen Sie 286 durch 2, um den Pin bei t/2 (286/2 = 143) umzuschalten. Geben Sie 143 in das TTCR0B-Register ein, um diese Note zu generieren Um den Timer einzurichten, führen Sie den Vergleich durch und geben Sie eine Rechteckwelle aus:

TCCR0A |= (1<<WGM01); // Timer 1 für CTC-Modus konfigurieren TCCR0A |= (1<<COM0A0); // OC0A bei Vergleichsübereinstimmung umschalten TCCR0B |= (1<<CS01); // clk/8 Vorskalierung TTCR0B = 143; // eine Rechteckwelle bei 524Hz erzeugenUm die Töne und die Pausen dazwischen zu verzögern, wurde eine einfache Verzögerungsfunktion verwendet

Leerer Schlaf (int ms) {int cnt; für (cnt=0; cnt<(ms); cnt++) {int i = 150; while(i--) {_asm("NOP"); } }}Dies zählt von 150 herunter, wobei jeder NOP-Zyklus ungefähr 0,006667 ms beträgt. Das letzte, was der Code durchläuft, ist die Arrays zu durchlaufen, die Musik zu generieren und die beiden LEDs zu blinken. Dies geschieht in einer kontinuierlichen for-Schleife mit dem folgenden Code

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); // Stoppuhr TCCR0B = 0; Schlaf (pgm_read_word(&delay[cnt])); // Timer starten TCCR0B |= (1<<CS01); // clk/8 vorskalieren }}Es gibt 156 Elemente in den Frequenzen/Längen/Verzögerungs-Arrays, diese Schleife durchläuft sie. Pin PB3 und PB4 werden jeweils umgeschaltet, so dass sie sich mit jeder Note abwechseln. Der erste Sleep ist die Länge der Note, die wir spielen, nachdem wir das OCR0A-Register auf den entsprechenden Wert gesetzt haben. Der zweite Schlaf ist die Pause zwischen den Noten, die wir spielen. Im obigen Code sind Ihnen vielleicht die beiden Funktionen pgm_read_byte() und pgm_read_word() sowie das Schlüsselwort PROGMEM aufgefallen. Bei einem eingebetteten Chip wie dem attiny ist die Menge an SRAM sehr begrenzt, in diesem Fall nur 64Byte. Die Arrays, die wir für alle Frequenz-/Verzögerungs-/Längendaten verwenden, sind viel größer als 64 Byte und können daher nicht in den Speicher geladen werden. Durch die Verwendung der speziellen PROGMEM avr-gcc-Direktive wird verhindert, dass diese großen Daten-Arrays in den Speicher geladen werden, sondern sie werden aus dem Flash gelesen.

Schritt 5: Den Marioman loslassen

Das obige Video zeigt Marioman in Aktion. Der durchschnittliche Stromverbrauch beträgt etwa 25 mA, sodass er etwa 10 Stunden lang blinken und Geräusche machen kann, bevor die Lithium-Knopfzelle entleert wird. Die einzige Möglichkeit, ihn ein- und auszuschalten, besteht darin, die Knopfzellenbatterie zu entfernen. Die robuste in den Materialien aufgeführte ist dafür gut geeignet. Ein Schalter kann hinzugefügt werden, aber es gibt etwas, um es einfach zu halten.

Empfohlen: