Índice:

Piscando, cantando, Marioman: 5 etapas
Piscando, cantando, Marioman: 5 etapas

Vídeo: Piscando, cantando, Marioman: 5 etapas

Vídeo: Piscando, cantando, Marioman: 5 etapas
Vídeo: 3 JOGOS TERROR DO MARIO EM 1 VÍDEO! 2024, Novembro
Anonim
Piscando, cantando, Marioman
Piscando, cantando, Marioman

Use um attiny13a, dois LEDs e um alto-falante de cartão comemorativo para criar um Marioman piscando que reproduz a música tema do Super Mario Brothers. Este pode ser um projeto fácil de baixo custo para quem está procurando uma maneira divertida de entrar na programação AVR! as notas das músicas são geradas por uma onda quadrada emitida em um único pino do microcontrolador AVR. Os LEDs que se alternam em cada nota são conectados a 2 pinos cada um do mesmo chip.

Etapa 1: Materiais e construção

Materiais e construção
Materiais e construção

1 attiny13a

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

  • 2 LEDs - qualquer LED servirá
  • 1 bateria de célula tipo moeda de lítio

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

1 porta-célula de moeda

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

1 pequeno alto-falante de um cartão musical

Custo total dos materiais ~ $ 5 Os dois LEDs foram conectados diretamente a dois pinos de cada um do attiny13A. Dois pinos são usados para cada LED, o segundo pino é definido como baixo para ser usado como uma conexão de aterramento. O limite de corrente dos pinos de E / S no AVR impedirá que os LEDs puxem muito, então um resistor não é necessário para conectar série. O alto-falante usado é típico de um cartão musical, qualquer alto-falante pequeno serve, visto que ele está emitindo um tom de onda quadrada, não é muito importante se preocupar com a direção do alto-falante ou com a qualidade do som.

Etapa 2: soldando o AVR aos LEDs e alto-falante

Soldando o AVR aos LEDs e alto-falante
Soldando o AVR aos LEDs e alto-falante
Soldando o AVR aos LEDs e alto-falante
Soldando o AVR aos LEDs e alto-falante

Para que os LEDs se estendam como braços, um pino é dobrado sobre o AVR de cada lado. Orientar o AVR dessa forma facilita a conexão com o alto-falante (segunda imagem), uma vez que as conexões estão nos dois pinos inferiores. Para a estética, você deseja que a frente do chip fique voltada para fora, então certifique-se de que o alto-falante esteja voltado da mesma maneira quando está anexado.

Etapa 3: Programando o Attiny13a

Programando o Attiny13a
Programando o Attiny13a

Existem muitas opções diferentes para programar AVRs.para este projeto, o USBtiny foi usado, que está disponível como um kit no site da ladyadahttps://www.ladyada.net/make/usbtinyisp/index.htmlPara conectar o AVR ao programador, você pode conecte os fios ao soquete fêmea e conecte-os a uma placa de ensaio ou, melhor ainda, obtenha um adaptador de programação AVR barato como estehttps://www.sparkfun.com/commerce/product_info.php? products_id = 8508 junto com conectores macho 3x2 para conectar o plugue.

Etapa 4: Criando o Firmware para Marioman

Criando o Firmware para Marioman
Criando o Firmware para Marioman

O attiny13A tem 1K de flash programável e 64 bytes de SRAM. O arquivo tar anexado contém o arquivo de origem, bem como o firmware compilado para download. Três matrizes no código c foram usadas para gerar a música

  • freq - frequências de cada nota
  • comprimento - comprimento de cada nota
  • atraso - pausa entre cada nota

A matriz de frequência não tem as frequências reais, mas sim o valor a ser colocado no registro TTCROB para gerar a onda quadrada do pino PB0. Aqui está um breve resumo dos cálculos e configuração do pino para geração de onda quadrada:

  • O attiny13A tem um oscilador interno definido para 9,6 MHz
  • O clock interno para IO é o oscilador dividido por 8 ou 1,2 MHz
  • Um temporizador interno é configurado em um registrador de 8 bits para contar cada ciclo de clock com pré-escala de 8.
  • Isso resulta em um tick igual a 1 / (1,2 MHz / 8) = 0,006667ms
  • O attiny13A é configurado para comparar o que está no registro TCCR0B de 8 bits com o temporizador e alternar um pino quando eles corresponderem.
  • Por exemplo, para gerar uma onda quadrada em 524 Hz (uma oitava acima do dó médio) que tem um período de 1,908 ms.

1,908 ms = 286 tiques do relógio (1,908 / 0,0067) Divida 286 por 2 para alternar o pino em t / 2 (286/2 = 143) Coloque 143 no registrador TTCR0B para gerar esta nota. Este é todo o código necessário para configurar o cronômetro, compare e produza uma onda quadrada:

TCCR0A | = (1 << WGM01); // configura o temporizador 1 para o modo CTC TCCR0A | = (1 << COM0A0); // alterna OC0A na comparação de correspondência TCCR0B | = (1 << CS01); // clk / 8 pré-escala TTCR0B = 143; // gera uma onda quadrada em 524 HzPara atrasar os tons e as pausas entre eles, uma função de atraso simples foi usada

anular o sono (int ms) {int cnt; para (cnt = 0; cnt <(ms); cnt ++) {int i = 150; while (i--) {_asm ("NOP"); }}}Isso faz uma contagem regressiva de 150, onde cada ciclo NOP é de aproximadamente 0,006667ms. A última coisa que o código faz é percorrer os arrays, gerar a música e piscar os dois LEDs. Isso é feito em um loop for contínuo com o seguinte código

const uint8_t freq PROGMEM = {… dados}; const uint8_t comprimento PROGMEM = {… dados}; const uint8_t atraso PROGMEM = {… dados};… while (1) {for (cnt = 0; cnt < 156; cnt ++) {OCR0A = pgm_read_byte (& freq [cnt]); output_toggle (PORTB, PB3); output_toggle (PORTB, PB4); dormir (pgm_read_byte (& comprimento [cnt])); output_toggle (PORTB, PB3); output_toggle (PORTB, PB4); // parar o cronômetro TCCR0B = 0; dormir (pgm_read_word (& delay [cnt])); // inicia o temporizador TCCR0B | = (1 << CS01); // clk / 8 prescale}}Existem 156 elementos nas matrizes de frequências / comprimentos / atrasos, este loop os atravessa. Os pinos PB3 e PB4 são alternados para alternar com cada nota. O primeiro sono é a duração da nota que tocamos depois de definir o registro OCR0A para o valor apropriado. O segundo sono é a pausa entre as notas que tocamos. No código acima você deve ter notado as duas funções pgm_read_byte () e pgm_read_word (), bem como a palavra-chave PROGMEM. Com um chip embutido como o attiny, a quantidade de SRAM é muito limitada, neste caso apenas 64 bytes. As matrizes que estamos usando para todos os dados de frequência / atraso / comprimento são muito maiores do que 64 bytes e, portanto, não podem ser carregadas na memória. Usando a diretiva especial do PROGMEM avr-gcc, esses grandes conjuntos de dados são impedidos de carregar na memória, em vez disso, eles são lidos da memória flash.

Etapa 5: deixando o Marioman solto

O vídeo acima mostra Marioman em ação. O consumo médio de energia é de cerca de 25mA, então ele pode piscar e fazer barulho por cerca de 10 horas antes de drenar a célula tipo moeda de lítio. A única maneira de ligá-lo e desligá-lo é remover a bateria de célula tipo moeda, a resistente listada nos materiais é bem adequado para isso. Um switch pode ser adicionado, mas há algo a ser dito para mantê-lo simples.

Recomendado: