Sommario:

Sbattere le palpebre, cantare, Marioman: 5 passi
Sbattere le palpebre, cantare, Marioman: 5 passi

Video: Sbattere le palpebre, cantare, Marioman: 5 passi

Video: Sbattere le palpebre, cantare, Marioman: 5 passi
Video: È LA NOTTE DI HALLOWEEN - La Brigata Canterina 2024, Settembre
Anonim
Lampeggiante, cantando, Marioman
Lampeggiante, cantando, Marioman

Usa un attiny13a, due LED e un altoparlante per biglietti di auguri per creare un Marioman lampeggiante che riproduce la sigla di Super Mario Brothers. Questo può essere un progetto facile a basso costo per chiunque sia alla ricerca di un modo divertente per entrare nella programmazione AVR! le note delle canzoni sono generate da un'onda quadra emessa su un singolo pin del microcontrollore AVR. I LED che si alternano su ogni nota sono collegati a 2 pin ciascuno dello stesso chip.

Passaggio 1: materiali e costruzione

Materiali e costruzione
Materiali e costruzione

1 attiny13a

www.mouser.com/Search/ProductDetail.aspx?qs=sGAEpiMZZMvu0Nwh4cA1wRKJzS2Lmyk%252bEP0e%2f7dEeq0%3dCosto: $1.40

  • 2 LED: qualsiasi LED va bene
  • 1 batteria a bottone al litio

www.sparkfun.com/commerce/product_info.php?products_id=338Costo: $2.00

1 portacellulare

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

1 piccolo altoparlante da un biglietto di auguri musicale

Costo totale dei materiali ~ $ 5 I due LED sono stati collegati direttamente a due pin ciascuno dell'attiny13A. Vengono utilizzati due pin per ciascun LED, il secondo pin è impostato su un valore basso per essere utilizzato come connessione a terra. Il limite di corrente dei pin I/O sull'AVR impedirà ai LED di assorbire troppo, quindi non è necessario collegare un resistore serie. L'altoparlante utilizzato è tipico di uno che si trova in un biglietto di auguri musicale, qualsiasi piccolo altoparlante andrà bene, dato che emette un tono ad onda quadra, non è troppo importante preoccuparsi del pilotaggio dell'altoparlante o della qualità del suono.

Passaggio 2: saldatura dell'AVR ai LED e all'altoparlante

Saldatura dell'AVR ai LED e all'altoparlante
Saldatura dell'AVR ai LED e all'altoparlante
Saldatura dell'AVR ai LED e all'altoparlante
Saldatura dell'AVR ai LED e all'altoparlante

Affinché i LED si allunghino come braccia, un perno è piegato sopra l'AVR su ciascun lato. Orientare l'AVR in questo modo facilita il collegamento all'altoparlante (seconda immagine) poiché le connessioni sono sui due pin inferiori. Per l'estetica si desidera che la parte anteriore del chip sia rivolta verso l'esterno, quindi assicurarsi che l'altoparlante sia rivolto allo stesso modo quando è allegato.

Passaggio 3: Programmazione di Attiny13a

Programmazione di Attiny13a
Programmazione di Attiny13a

Ci sono molte opzioni diverse per programmare gli AVR. per questo progetto è stato utilizzato l'USBtiny che è disponibile come kit dal sito di ladyada https://www.ladyada.net/make/usbtinyisp/index.html Per collegare l'AVR al programmatore è possibile collegare i cavi alla presa femmina e collegarli a una breadboard o, meglio ancora, ottenere un adattatore di programmazione AVR economico come questo https://www.sparkfun.com/commerce/product_info.php?products_id=8508 insieme a intestazioni maschio 3x2 per collegare la spina.

Passaggio 4: creazione del firmware per Marioman

Creazione del firmware per Marioman
Creazione del firmware per Marioman

L'attiny13A ha 1K di flash programmabile e 64 byte di SRAM. Il file tar allegato ha il file sorgente e il firmware compilato per il download. Tre array nel codice c sono stati utilizzati per generare la musica

  • freq - frequenze di ogni nota
  • length - lunghezza di ogni nota
  • delay - pausa tra ogni nota

L'array di frequenza non ha le frequenze effettive ma piuttosto il valore da inserire nel registro TTCROB per generare l'onda quadra dal pin PB0. Ecco un breve riepilogo dei calcoli e della configurazione dei pin per la generazione dell'onda quadra:

  • Attiny13A ha un oscillatore interno impostato su 9.6MHz
  • Il clock interno per IO è l'oscillatore diviso per 8 o 1.2MHz
  • Un timer interno è impostato in un registro a 8 bit per contare ogni ciclo di clock con prescala di 8.
  • Ciò si traduce in un tick pari a 1 / (1,2 MHz / 8) =.006667 ms
  • Attiny13A è configurato per confrontare ciò che è nel registro TCCR0B a 8 bit con il timer e attivare un pin quando corrispondono.
  • Ad esempio, per generare un'onda quadra a 524Hz (un'ottava sopra il Do centrale) che ha un periodo di 1.908ms.

1.908ms = 286 tick di clock (1.908/.0067)Dividi 286 per 2 per commutare il pin a t/2 (286/2 = 143)Metti 143 nel registro TTCR0B per generare questa nota. Questo è tutto il codice necessario per impostare il timer, fai il confronto e genera un'onda quadra:

TCCR0A |= (1<<WGM01); // configura il timer 1 per la modalità CTC TCCR0A |= (1<<COM0A0); // attiva OC0A sulla corrispondenza di confronto TCCR0B |= (1<<CS01); // clk/8 prescala TTCR0B = 143; // genera un'onda quadra a 524HzPer ritardare i toni e le pause tra di essi è stata utilizzata una semplice funzione di ritardo

void sleep(int ms) { int cnt; for (cnt=0; cnt<(ms); cnt++) { int i = 150; while(i--) { _asm("NOP"); } }}Questo conto alla rovescia da 150 in cui ogni ciclo NOP è di circa.006667 ms. L'ultima cosa che il codice fa è scorrere gli array, generare la musica e far lampeggiare i due LED. Questo viene fatto in un ciclo for continuo con il seguente codice

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); // ferma il timer TCCR0B = 0; sleep (pgm_read_word(&delay[cnt])); // avvia il timer TCCR0B |= (1<<CS01); // clk/8 prescala }}Ci sono 156 elementi negli array frequenze/lunghezze/ritardo, questo ciclo li attraversa. I pin PB3 e PB4 sono ciascuno commutati in modo che si alterneranno con ogni nota La prima sospensione è la lunghezza della nota che suoniamo dopo aver impostato il registro OCR0A sul valore appropriato. Il secondo sonno è la pausa tra le note che suoniamo. Nel codice sopra potresti aver notato le due funzioni pgm_read_byte() e pgm_read_word() e la parola chiave PROGMEM. Con un chip integrato come l'attiny la quantità di SRAM è molto limitata, in questo caso solo 64 byte. Gli array che stiamo usando per tutti i dati di frequenza/ritardo/lunghezza sono molto più grandi di 64 byte e quindi non possono essere caricati in memoria. Usando la speciale direttiva PROGMEM avr-gcc questi grandi array di dati non vengono caricati in memoria, ma vengono letti dalla flash.

Passaggio 5: lasciare libero il Marioman

Il video qui sopra mostra Marioman in azione. Il consumo medio di energia è di circa 25 mA, quindi può lampeggiare e fare rumori per circa 10 ore prima di scaricare la batteria a bottone al litio. L'unico modo per accenderlo e spegnerlo è rimuovere la batteria a bottone, quella robusta elencata nei materiali è adatto per questo. È possibile aggiungere un interruttore, ma c'è qualcosa da dire per mantenerlo semplice.

Consigliato: