İçindekiler:

Yanıp Sönen, Şarkı Söyleyen, Marioman: 5 Adım
Yanıp Sönen, Şarkı Söyleyen, Marioman: 5 Adım

Video: Yanıp Sönen, Şarkı Söyleyen, Marioman: 5 Adım

Video: Yanıp Sönen, Şarkı Söyleyen, Marioman: 5 Adım
Video: Disco (IŞIKLARI KAPATIP İZLEYİN) 2024, Haziran
Anonim
Yanıp Sönen, Şarkı Söyleyen, Marioman
Yanıp Sönen, Şarkı Söyleyen, Marioman

Super Mario Brothers tema şarkısını çalan yanıp sönen bir Marioman oluşturmak için bir attiny13a, iki LED ve bir tebrik kartı hoparlörü kullanın. Bu, AVR programlamaya girmenin eğlenceli bir yolunu arayan herkes için kolay ve düşük maliyetli bir proje olabilir! şarkıların notaları, AVR mikrodenetleyicisinin tek bir pininde çıkan bir kare dalga tarafından üretilir. Her notada değişen LED'ler, aynı çipin her birinin 2 pinine bağlanır.

Adım 1: Malzemeler ve İnşaat

Malzemeler ve İnşaat
Malzemeler ve İnşaat

1 attiny13a

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

  • 2 LED - herhangi bir LED yapacak
  • 1 lityum düğme pil

www.sparkfun.com/commerce/product_info.php?products_id=338Maliyet: 2,00 ABD doları

1 adet madeni para hücresi tutucusu

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

Müzikal bir tebrik kartından 1 küçük hoparlör

Toplam malzeme maliyeti ~ 5 $ İki LED, attiny13A'nın her birinin iki pimine doğrudan bağlandı. Her LED için iki pin kullanılır, ikinci pin toprak bağlantısı olarak kullanılmak üzere düşük olarak ayarlanır. AVR üzerindeki I/O pinlerinin akım limiti LED'lerin çok fazla çekmesini engelleyecek ve böylece bir direnç bağlanmasına gerek kalmayacaktır. series. Kullanılan hoparlör, müzikal bir tebrik kartında bulunan tipik bir hoparlördür, herhangi bir küçük hoparlör, bunun kare dalga tonu çıkardığı göz önüne alındığında, hoparlörü sürmek veya ses kalitesi hakkında endişelenmek çok önemli değildir.

Adım 2: AVR'yi LED'lere ve Hoparlöre Lehimleme

AVR'yi LED'lere ve Hoparlöre Lehimleme
AVR'yi LED'lere ve Hoparlöre Lehimleme
AVR'yi LED'lere ve Hoparlöre Lehimleme
AVR'yi LED'lere ve Hoparlöre Lehimleme

LED'lerin kollar gibi uzanması için her iki tarafta AVR'nin üzerine bir pim bükülür. AVR'yi bu şekilde yönlendirmek, bağlantılar iki alt pimde olduğundan hoparlöre bağlanmayı kolaylaştırır (ikinci resim). Bağlı.

Adım 3: Attiny13a'nın Programlanması

Attiny13a'nın Programlanması
Attiny13a'nın Programlanması

AVR'leri programlamak için birçok farklı seçenek vardır. Bu proje için, ladyada'nın sitesinden bir kit olarak temin edilebilen USBtiny kullanıldı:https://www.ladyada.net/make/usbtinyisp/index.htmlAVR'yi programlayıcıya bağlamak için şunları yapabilirsiniz: ya kabloları dişi sokete takın ve bunları bir devre tahtasına takın ya da daha iyisi henüz bunun gibi ucuz bir AVR programlama adaptörü edininhttps://www.sparkfun.com/commerce/product_info.php?products_id=8508ve fişi bağlamak için 3x2 erkek başlıklarla birlikte.

Adım 4: Marioman için Bellenimi Oluşturma

Marioman için Bellenim Oluşturma
Marioman için Bellenim Oluşturma

attiny13A'da 1K programlanabilir flaş ve 64 bayt SRAM bulunur. Ekli tar dosyası, kaynak dosyanın yanı sıra indirilmek üzere derlenmiş bellenime sahiptir. Müziği oluşturmak için c kodundaki üç dizi kullanılmıştır.

  • freq - her notanın frekansı
  • uzunluk - her notanın uzunluğu
  • gecikme - her nota arasında duraklama

Frekans dizisi gerçek frekanslara sahip değildir, bunun yerine PB0 pininden kare dalga oluşturmak için TTCROB kaydına koyulacak değere sahiptir. Kare dalga üretimi için hesaplamaların ve pin konfigürasyonunun kısa bir özeti:

  • Attiny13A, 9.6MHz'e ayarlanmış dahili bir osilatöre sahiptir.
  • IO için dahili saat, 8 veya 1.2MHz'e bölünmüş osilatördür.
  • Her saat döngüsünü 8'lik ön ölçekle saymak için 8 bitlik bir kayıtta dahili bir zamanlayıcı kurulur.
  • Bu, 1 / (1.2MHz / 8) =.006667ms'ye eşit bir onay işaretiyle sonuçlanır
  • Attiny13A, 8 bit TCCR0B kaydındakileri zamanlayıcı ile karşılaştırmak ve eşleştiğinde bir pimi değiştirmek için yapılandırılmıştır.
  • Örneğin, 524Hz'de (orta C'nin bir oktav üstünde) 1.908ms periyodu olan bir kare dalga üretmek için.

1.908ms = 286 saat tıklaması (1.908/.0067) 286'yı t/2'de değiştirmek için 2'ye bölün (286/2 = 143)Bu notu oluşturmak için TTCR0B kaydına 143 koyun. Gerekli olan tüm kod budur zamanlayıcıyı ayarlamak için karşılaştırmayı yapın ve bir kare dalga çıktısı alın:

TCCR0A |= (1<<WGM01); // zamanlayıcı 1'i CTC modu için yapılandırın TCCR0A |= (1<<COM0A0); // karşılaştırma eşleşmesinde OC0A'yı değiştir TCCR0B |= (1<<CS01); // clk/8 ön ölçek TTCR0B = 143; // 524Hz'de bir kare dalga üretTonları ve aralarındaki duraklamaları geciktirmek için basit bir gecikme işlevi kullanıldı

geçersiz uyku(int ms) { int cnt; for (cnt=0; cnt<(ms);cnt++) { int i = 150; while(i--) { _asm("NOP"); } }}Bu, her NOP döngüsünün yaklaşık.006667ms olduğu 150'den geri sayım yapar. Kodun yaptığı son şey diziler arasında döngü yapmak, müziği oluşturmak ve iki LED'i yanıp sönmektir. Bu, aşağıdaki kodla sürekli bir for döngüsü içinde yapılır.

const uint8_t freq PROGMEM = { … veri };const uint8_t uzunluk PROGMEM = { … veri };const uint8_t gecikme PROGMEM = { … veri };…while (1) { for (cnt=0; cnt< 156; cnt++) { OCR0A=pgm_read_byte(&freq[cnt]); output_toggle(PORTB, PB3); output_toggle(PORTB, PB4); uyku(pgm_read_byte(&uzunluk[cnt])); output_toggle(PORTB, PB3); output_toggle(PORTB, PB4); // zamanlayıcıyı durdur TCCR0B = 0; uyku (pgm_read_word(&delay[cnt])); // zamanlayıcıyı başlat TCCR0B |= (1<<CS01); // clk/8 ön ölçek }}Frekanslar/uzunluklar/gecikme dizilerinde 156 eleman vardır, bu döngü onları çaprazlar. Pin PB3 ve PB4'ün her biri değiştirilir, böylece her nota ile değişirler. İlk uyku, OCR0A kaydını uygun değere ayarladıktan sonra çaldığımız notanın uzunluğudur. İkinci uyku, çaldığımız notalar arasındaki duraklamadır. Yukarıdaki kodda, pgm_read_byte() ve pgm_read_word() işlevlerinin yanı sıra PROGMEM anahtar sözcüğünü fark etmiş olabilirsiniz. Attiny gibi gömülü bir çip ile SRAM miktarı çok sınırlıdır, bu durumda sadece 64bayt. Tüm frekans/gecikme/uzunluk verileri için kullandığımız diziler 64 bayttan çok daha büyüktür ve bu nedenle belleğe yüklenemez. Özel PROGMEM avr-gcc yönergesi kullanılarak bu büyük veri dizilerinin belleğe yüklenmesi engellenir, bunun yerine flaştan okunur.

Adım 5: Marioman'ı Gevşetmek

Yukarıdaki video Marioman'ı çalışırken gösteriyor. Ortalama güç tüketimi yaklaşık 25mA'dır, bu nedenle lityum düğme pili boşaltmadan önce yaklaşık 10 saat boyunca yanıp sönebilir ve ses çıkarabilir. Onu açmanın ve kapatmanın tek yolu düğme pili çıkarmaktır, malzemelerde listelenen sağlam pil, düğme pili çıkarmaktır. bunun için çok uygun. Bir anahtar eklenebilir ancak basit olması için söylenecek bir şey var.

Önerilen: