Mundarija:

Miltillovchi, qo'shiq aytuvchi, marioman: 5 qadam
Miltillovchi, qo'shiq aytuvchi, marioman: 5 qadam

Video: Miltillovchi, qo'shiq aytuvchi, marioman: 5 qadam

Video: Miltillovchi, qo'shiq aytuvchi, marioman: 5 qadam
Video: XIT QOSHIQ 2024, Sentyabr
Anonim
Miltillovchi, qo'shiq aytuvchi, Marioman
Miltillovchi, qo'shiq aytuvchi, Marioman

"Super Mario Brothers" mavzusidagi qo'shiqni ijro etuvchi miltillovchi Mariomanni yaratish uchun attiny13a, ikkita LED va tabrik kartasi karnayidan foydalaning. qo'shiqlarning yozuvlari AVR mikrokontrolerining bitta pinida chiqarilgan to'rtburchaklar to'lqin yordamida yaratiladi. Har bir notada bir -birini almashtiradigan LEDlar bir xil chipning har biriga 2 pinli ulanadi.

1 -qadam: Materiallar va qurilish

Materiallar va qurilish
Materiallar va qurilish

1 attina13a

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

  • 2 LED - har qanday LED ishlaydi
  • 1 lityum tanga batareyali batareya

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

1 ta tanga xujayrasi ushlagichi

www.sparkfun.com/commerce/product_info.php?products_id=8822 Narxi: $ 1.25

Musiqiy tabriknomadan 1 ta kichik dinamik

Materiallarning umumiy qiymati ~ $ 5 Ikki LED to'g'ridan -to'g'ri ikkita pinga ulangan. Har bir LED uchun ikkita pin ishlatiladi, ikkinchi pin esa erga ulanish uchun past qilib o'rnatiladi. AVR -dagi kirish -chiqish pinlarining joriy chegarasi LEDlarning haddan tashqari ko'p chizilishiga to'sqinlik qiladi, shuning uchun rezistorni ulash shart emas. Ishlatiladigan karnay musiqiy tabriknomada uchraydi, har qanday kichkina ma'ruzachi buni qiladi, chunki bu kvadrat to'lqinli ohangni chiqaradi, dinamikni haydash yoki ovoz sifati haqida tashvishlanish juda muhim emas.

2 -qadam: AVRni LED va dinamikga lehimlash

AVRni LED va dinamikga lehimlash
AVRni LED va dinamikga lehimlash
AVRni LED va dinamikga lehimlash
AVRni LED va dinamikga lehimlash

LEDlar qo'llar kabi cho'zilishi uchun AVRning har bir tomonida bitta pin egilgan. AVR -ni shu tarzda yo'naltirish, karnayga (ikkinchi rasm) ulanishni osonlashtiradi, chunki ulanishlar ikkita pastki pimda. Estetika uchun siz chipning old tomoniga qaragan bo'lishni xohlaysiz, shuning uchun karnay xuddi shu tomonga qaraganligiga ishonch hosil qiling. u biriktirilgan.

3 -qadam: Attiny13a dasturlash

Attiny13a dasturlash
Attiny13a dasturlash

AVR -ni dasturlash uchun juda ko'p turli xil variantlar mavjud, bu loyiha uchun USBtiny ishlatilgan bo'lib, u ladyada saytining to'plami sifatida mavjud https://www.ladyada.net/make/usbtinyisp/index.html yoki ayol rozetkaga simlar ulang va ularni taxtaga ulang, yoki arzonroq AVR dasturlash adapterini oling, masalan: vilkasini ulash uchun 3x2 erkak sarlavhasi bilan..

4 -qadam: Marioman uchun dasturiy ta'minotni yaratish

Marioman uchun dasturiy ta'minotni yaratish
Marioman uchun dasturiy ta'minotni yaratish

Attiny13A -da 1K dasturlashtiriladigan fleshka va 64 -baytli SRAM bor, biriktirilgan tar fayli manba fayli va yuklab olish uchun dasturiy ta'minotni o'z ichiga oladi. Musiqani yaratish uchun c kodidagi uchta qator ishlatilgan.

  • freq - har bir notaning chastotalari
  • uzunlik - har bir notaning uzunligi
  • kechiktirish - har bir nota o'rtasida pauza

Chastotalar qatori haqiqiy chastotalarga ega emas, balki PB0 pinidan kvadrat to'lqin hosil qilish uchun TTCROB reestriga qo'yiladigan qiymatga ega. Bu erda kvadrat to'lqinlarni yaratish uchun hisoblar va pin konfiguratsiyasining qisqacha mazmuni:

  • Attiny13A 9,6 MGts ga o'rnatilgan ichki osilatorga ega
  • IO uchun ichki soat - bu 8 yoki 1,2 MGts ga bo'lingan osilator
  • Ichki taymer 8 bitli registrda o'rnatiladi, u har bir soat tsiklini 8 ga oldindan hisoblab chiqadi.
  • Bu 1 / (1,2MGts / 8) =.006667ms ga teng bo'lgan bitta belgiga olib keladi
  • Attiny13A 8 bitli TCCR0B registridagi narsalarni taymer bilan solishtirish va ular mos kelganda pinni almashtirish uchun tuzilgan.
  • Masalan, 524 Gts chastotali (C o'rtasidan bir oktava) kvadrat to'lqin hosil qilish uchun, uning davri 1.908 ms.

1.908ms = 286 soat (1.908/.0067) 286 ni 2 ga bo'linib, pinni t/2 ga aylantiring (286/2 = 143) Bu yozuvni yaratish uchun TTCR0B reestriga 143 ni qo'ying. taymerni sozlash uchun kvadrat to'lqinni solishtiring va chiqaring:

TCCR0A | = (1 << WGM01); // CTC rejimi uchun taymer 1ni sozlash TCCR0A | = (1 << COM0A0); // TCCR0B solishtirish moslamasida OC0A -ni almashtirish | = (1 << CS01); // clk/8 oldindan o'lchovli TTCR0B = 143; // 524 gigagertsli kvadrat to'lqin hosil qiladiOhanglar va ular orasidagi pauzalarni kechiktirish uchun oddiy kechiktirish funktsiyasi ishlatilgan

bo'sh uyqu (int ms) {int cnt; uchun (cnt = 0; cnt <(ms); cnt ++) {int i = 150; while (i--) {_asm ("YO'Q"); }}}Bu har bir NOP tsikli taxminan.006667ms ni tashkil etadigan 150 dan hisoblab chiqadi. Oxirgi kod - massivlarni aylanib o'tish, musiqani yaratish va ikkita LEDni miltillatish.

const uint8_t freq PROGMEM = {… ma'lumotlar}; const uint8_t uzunligi PROGMEM = {… ma'lumotlar}; const uint8_t kechikishi PROGMEM = {… ma'lumotlar};… esa (1) {uchun (cnt = 0; cnt < 156; cnt ++) {OCR0A = pgm_read_byte (& frek [cnt]); chiqish_toggle (PORTB, PB3); chiqish_toggle (PORTB, PB4); uyqu (pgm_read_byte (& length [cnt])); chiqish_toggle (PORTB, PB3); chiqish_toggle (PORTB, PB4); // to'xtash taymeri TCCR0B = 0; uxlash (pgm_read_word (& kechiktirish [cnt]))); // taymerni ishga tushirish TCCR0B | = (1 << CS01); // clk/8 oldindan o'lchov}}Chastotalar/uzunliklar/kechikish massivlarida 156 ta element bor, bu halqa ularni kesib o'tadi. PB3 va PB4 pinlari bir -biridan almashtiriladi, shuning uchun ular har bir eslatma bilan almashtiriladi. Birinchi uyqu - bu OCR0A registrini mos qiymatga o'rnatganimizdan so'ng, biz o'ynaydigan notaning uzunligi. Ikkinchi uyqu - bu biz o'ynaydigan notalar orasidagi pauza. Yuqoridagi kodda siz pgm_read_byte () va pgm_read_word () ikkita funktsiyasini, shuningdek PROGMEM kalit so'zini sezishingiz mumkin. Biz barcha chastota/kechikish/uzunlik ma'lumotlari uchun foydalanadigan qatorlar 64 baytdan kattaroqdir va shuning uchun ularni xotiraga yuklab bo'lmaydi. Maxsus PROGMEM avr-gcc ko'rsatmasidan foydalangan holda, bu katta hajmli ma'lumotlar xotiraga yuklanishining oldini oladi, aksincha ular fleshdan o'qiladi.

5 -qadam: Mariomanni bo'sh qoldiring

Yuqoridagi videoda Mariomanning harakati ko'rsatilgan. O'rtacha quvvat sarfi taxminan 25mA, shuning uchun u lityum tanga xujayrasini to'kib tashlashdan oldin taxminan 10 soat davomida miltillashi va shovqin chiqarishi mumkin, uni yoqish va o'chirishning yagona yo'li - tanga batareyali batareyani olib tashlash, materiallarda ko'rsatilgan mustahkam. buning uchun juda mos keladi. Kalitni qo'shish mumkin, lekin uni sodda saqlash uchun aytish kerak.

Tavsiya: