Mundarija:

Ovozli ovozli fayllarni (Wav) Arduino va DAC yordamida ijro etish: 9 qadam
Ovozli ovozli fayllarni (Wav) Arduino va DAC yordamida ijro etish: 9 qadam

Video: Ovozli ovozli fayllarni (Wav) Arduino va DAC yordamida ijro etish: 9 qadam

Video: Ovozli ovozli fayllarni (Wav) Arduino va DAC yordamida ijro etish: 9 qadam
Video: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, Iyun
Anonim
Arduino va DAC yordamida ovozli ovozli fayllarni (Wav) ijro etish
Arduino va DAC yordamida ovozli ovozli fayllarni (Wav) ijro etish
Arduino va DAC yordamida ovozli ovozli fayllarni (Wav) ijro etish
Arduino va DAC yordamida ovozli ovozli fayllarni (Wav) ijro etish
Arduino va DAC yordamida ovozli ovozli fayllarni (Wav) ijro etish
Arduino va DAC yordamida ovozli ovozli fayllarni (Wav) ijro etish

Audino SD -kartangizdan wav faylli audio ijro qiling. Bu ko'rsatma sizga SdCard -dagi wav faylini dinamikdan oddiy zanjir orqali qanday ijro etish mumkinligini ko'rsatib beradi.

Wav fayli 8 bitli mono bo'lishi kerak. Men 44 kHz chastotali fayllarni ijro etishda muammoga duch kelmadim.

Ishonchli bo'lmasa ham, ovoz sifati juda qoniqarli.

Faylni tanlash uchun ketma -ket monitor ishlatiladi. Fayllar adlog nomli papkada bo'lishi kerak.

Bu ko'rsatma, men wav yozuvlarini SdCard-da saqlagan oldingi loyihadan kelib chiqadi:

O'chirish uchun 8 bitli raqamli analogli konvertor (DAC) va bitta chipli audio kuchaytirgich ishlatiladi.

Uzilishlarni o'rnatish uchun asosiy bo'limlar Amanda Gasseyining ajoyib maqolasidan olingan:

1 -qadam: talablar

Talablar
Talablar
Talablar
Talablar

Arduino- Men Mega-dan foydalanaman, lekin Uno ishlamasligi uchun hech qanday sabab yo'q.

SdCard o'quvchi- dastur quyidagilar uchun tuzilgan: MicroSD Breakout Board Logic Conversion V2 bilan tartibga solingan

SdCard-ni sozlash bo'yicha ko'rsatmalar uchun qarang:

DAC0832 LCN- analogli konvertorga ega 8 bitli raqamli- bir necha funt.

LM386 N-1 Op amp- chiplar kabi arzon

20 tomonlama chipli soket

8 tomonlama chipli soket

9 voltli quvvat manbai- batareya.

LM336 2,5 V kuchlanishli mos yozuvlar

10uF kondansatör * 3 (har qanday kuchlanish 9V dan yuqori)

10 ohmli qarshilik

50nF kondansatör- (Yoki 47nF, 56nf, 68nf yaqinida bo'ladi)

220vF kondansatör

64 ohmli dinamik

10K chiziqli potentsiometr

Arduino va kontaktlarning zanglashiga olib keladigan 8 ta ma'lumot uzatish liniyasi.

Uno -da 8 ta ulanish navbatda, Mega -da ular juft bo'lib.

Mega -da men 10 tomonlama IDC sarlavhali 10 tomonlama tasma kabelidan foydalandim. (2 sim zaxira)

0V, 9V va DAC chiqishi uchun soket ulagichlari

Mis tasma taxtasi, lehim, sim, kesuvchi va boshqalar

2 -qadam: Xususiyatlar

Xususiyatlar
Xususiyatlar

Seriya 115200 bod.

Mega -dan foydalangan holda, Hobbytronics MicroSD -ni qo'llab -quvvatlash kengashi mavjud. Chip tanlash va boshqa portlar Mega va Uno o'rtasida o'zgaradi.

Wav fayllari adlog nomli katalogda bo'lishi kerak- unga boshqa nom berishdan va kerakli kodlashni qayta tartibga solishdan xursand bo'ling.

Wav fayli 8 bitli mono bo'lishi kerak. Men 44 kHz gacha sinov qildim.

Serial monitor wav fayllarini adlog papkasida ko'rsatadi. Fayl nomlari monitorning chiqish liniyasidan yuboriladi.

Fayl hajmi faqat SdCard hajmi bilan cheklangan.

3 -qadam: Ishga kirishish

Ishni boshlash
Ishni boshlash

SD -kartani o'quvchi ulang. Bu Mega uchun ulanishlar.

0, 5V

52 -pinni bosing

D0 dan 50 gacha

D1 - 51 -pingacha

CS 53 -raqamli

(Uno portiga ulanish uchun etkazib beruvchilar veb -saytiga qarang)

Siz ushbu bosqichda sizning kartangiz ishlashini tekshirishni xohlaysiz- sotuvchi tomonidan berilgan skriptlardan foydalaning.

Biz kichik sxemani yaratishimiz kerak

Biz Arduino -dan audio baytlar oqimini yubormoqchimiz.

Bu raqamlar 0 dan 255 gacha. Ular kuchlanishni ifodalaydi.

Jimlik-127-128.

255 - bir tomonlama dinamik konus.

0 - boshqa tomondan, konusning konusi.

Shunday qilib, audio saqlanadigan raqamlar sifatida yoziladi, ular turli xil kuchlanishlarni hosil qiladi, bu esa dinamik dinamik konuslarini yaratadi.

Biz raqamlarni Arduino -dagi 8 qatordan bir vaqtning o'zida "port" yordamida yuborishimiz mumkin.

Agar biz 8 qatorni raqamli -analogli konvertorga uzatadigan bo'lsak, u kalayda aytilganini bajaradi va raqamli raqamga mutanosib analog kuchlanish hosil qiladi.

Biz qilishimiz kerak bo'lgan narsa - kuchlanishni kichik operatsion kuchaytirgichga, so'ngra karnayga yig'ish.

4 -qadam: Kichik davr

Kichik davr
Kichik davr
Kichik davr
Kichik davr
Kichik davr
Kichik davr
Kichik davr
Kichik davr

DAC0832 LCN

Bu ajoyib, arzon 8 bitli raqamli -analogli konvertor. (DAC)

Ma'lumotni saqlash, ma'lumotlar namunalari qatorlari yordamida uni to'liq boshqarish mumkin.

Yoki hammasini "Ish oqimi" bo'limida avtomatik tarzda bajarish uchun sozlash mumkin.

Qo'llanmani taklif qilish uchun:

CS, WR1, WR2 va XFER-ni oddiygina erga ulash va ILE-ni yuqori bog'lash ikkala ichki registrga ham qo'llaniladigan raqamli kirishni (oqim) kuzatishi va DAC analog chiqishiga bevosita ta'sir qilishiga imkon beradi.

OK - bu chipning to'rtta ulanishi past va bitta - 9V - oson.

Biz hech qanday salbiy kuchlanishni xohlamaymiz, shuning uchun qo'llanmada "kuchlanishni o'zgartirish rejimi" dan foydalanish kerakligi aytilgan va ular diagramma bilan ta'minlangan.

Biz qilishimiz kerak bo'lgan narsa - ular taklif qilayotgani o'rniga kichik audio kuchaytirgichni almashtirish.

LM386-N ovoz kuchaytirgichi

Amp qo'llanmasi minimal qismlar diagrammasini taqdim etadi- 20 daromadni ta'minlaydi (biz uchun juda ko'p, lekin ovozni boshqarish moslamasi bor).

Biz faqat AC signallarini kuchaytiradigan DAC va kuchaytirgich o'rtasida kondansatör qo'shishimiz kerak.

Bundan tashqari, biz har bir chipning besleme piniga yaqin bo'lgan ikkita kondansatkichni qo'shishimiz kerak, aks holda biz 9V quvvat manbasidan shovqin olamiz.

5 -qadam: Lehimlash temiridan chiqing

Lehimlash temiridan chiqing
Lehimlash temiridan chiqing
Lehimlash temiridan chiqing
Lehimlash temiridan chiqing
Lehimlash temiridan chiqing
Lehimlash temiridan chiqing

O'chirish oddiy bo'lgani uchun men zarba hisobidan zarba berishni xohlamayman.

Mana ba'zi ko'rsatkichlar:

  • Eng kamida 28 x 28 teshikli mis lenta taxtasini tayyorlang. (Ha, bilaman, miya jarrohlari uni kichraytirishi mumkin)
  • Agar siz uni vintlar bilan o'rnatmoqchi bo'lsangiz, boshida ularga ruxsat bering!
  • Chipslarni rozetkalarga joylashtiring. Chipsni hamma narsa tekshirilgandan keyingina joylashtiring.
  • Kirish simlarini chiqish joyidan uzoqroq tuting.
  • Kondensatorlarning to'g'ri kutupluluğuna e'tibor bering.
  • LM336 kuchlanish ma'lumotnomasining asosiy ko'rinishi uchun diagramaga qarang. O'rnatish oyog'i ishlatilmaydi va uni kesish mumkin.
  • DAC-ning 8-piniga to'g'ridan-to'g'ri ulanishga e'tibor bering- bu sinov uchun juda foydali.
  • Men Audino -ga tasma kabeli va 10 tomonlama IDC ulagichi bilan ulandim.
  • Uno -da ulanishlar to'g'ri chiziqda - siz 8 ta kirish ulanishini bitta to'g'ri chiziqda joylashtirish Arduino -ga sotib olingan, tayyor 8 tomonlama ulagich bilan bog'lanish imkonini beradi.

Ish tugagach- lehimni va mis yo'llar orasidagi bo'shliqlarni tekshiring.

Men 36 tpi kichik arra pichog'ini qoldiqlarni tozalash uchun juda foydali deb bilaman. Men pichoqni aniqlash pimlarini olib tashlayman va pichoqning uchini izga siljitaman- pichoq ramkada emas.

6 -qadam: DACni tekshirish

DACni sinovdan o'tkazish
DACni sinovdan o'tkazish

O'chirish va Arduino o'rtasidagi aloqani o'chiring.

O'chirish moslamasini ovoz balandligini o'rtasiga qo'ying.

9V doimiy quvvat manbaini yangi kontaktlarning zanglashiga o'tkazing.

Tarmoq yaxshi ekanligini tekshiring- men sizning davrangiz uchun hech qanday javobgarlikni qabul qila olmayman!

Quvvatni o'chirish

O'chirish tizimini Arduino -ga ulang.

Mega-da 22-29 pinlardan foydalaning. (PORTA) Yuqoridagi ikkita 5V pinni xato qilmang!

Uno-da 0-7 pinlarini ishlating. Bu PORTD

0V quvvat manbaini Arduino -dagi 0V ga ulang.

Quvvatlantiring.

DAC_TEST test dasturini oching

Birlashgan Millatlar Tashkiloti uchun PORTAga havolalarni PORTDga almashtiring

DDRA-ni DDRD bilan almashtiring- bu ko'rsatma barcha 8 qatorni bir vaqtning o'zida chiqarishga o'rnatadi. Bu ma'lumotlar yo'nalishi registri.

Seriyali monitorni 115200 ga o'rnating.

DAC chiqishi va OV o'rtasida voltmetrni ulang

Dastur chiqishni 255 ga o'rnatadi - barcha chiziqlar - maksimal kuchlanish.

Chiqish 128- maksimal kuchlanish.

Chiqish 0- nol kuchlanish (yoki ehtimol deyarli nol).

Keyin u asta -sekin o'tadi: 1, 2, 4, 8, 16, 32, 64, 128

Voltaj doimiy ravishda oshishi kerak.

Agar kuchlanish ortib borayotgan paytda kuchlanish pasayib ketsa, ehtimol siz o'zaro bog'langan ikkita simni teskari yo'naltirgan bo'lasiz.

Bundan tashqari, kuchlanish o'zgarganda dinamikning jimgina bosilishini eshitishingiz kerak

7 -qadam: Wav sarlavhasini o'qish

Wav sarlavhasini o'qish
Wav sarlavhasini o'qish

Wav fayllari belgilangan chastota va ma'lumotlar hajmi bilan saqlanadi.

Bu ma'lumotlar wav faylining boshida 44 baytlik sarlavhada mavjud.

Garchi ba'zi dasturlar sarlavhani uzaytirsa -da (35 -baytdan keyin), bu ma'lumotlar hajmining joylashishini aniqlashni qiyinlashtiradi.

Sarlavhani o'qish uchun biz bufer yaratamiz va faylning boshidan nusxa ko'chiramiz.

Chastotani faylga 24 baytdan boshlab 4 baytda saqlanadi.

// wav fayl sarlavhasida ko'rsatilgan o'qish chastotasi

bayt boshi [60]

tempfile.seek (0);

tempfile.read (headbuf, 60);

retval = boshcha [27];

retval = (retval << 8) | boshcha [26];

retval = (retval << 8) | boshcha [25];

retval = (retval << 8) | boshcha [24];

Serial.print (F ("Fayl chastotasi"));

Serial.print (retval);

Ma'lumotlar hajmi ma'lumotlarini topishning eng yaxshi usuli - bu "ma'lumotlar" so'zini sarlavhada qidirish.

Keyin undan keyingi 4 baytni chiqaring, bu uzun qiymatni tashkil qiladi

imzosiz uzoq muddat;

int mypos = 40;

uchun (int i = 36; i <60; i ++) {

agar (headbuf == 'd') {

agar (headbuf [i+1] == 'a') {

if (headbuf [i+2] == 't') {

agar (headbuf [i+3] == 'a') {

// nihoyat bizda bor

mypos = i+4;

i = 60;

}

}

}

}

}

tempfile.seek (mypos);

retval = headbuf [mypos+3];

retval = (retval << 8) | bosh og'rig'i [mypos+2];

retval = (retval << 8) | bosh og'rig'i [mypos+1];

retval = (retval << 8) | bosh og'rig'i [mypos];

OK, bizda ma'lumotlar uzunligi va chastotasi bor!

Ovozli ma'lumotlar 4 baytdan iborat bo'lib, ma'lumotlar uzunligi qiymatini tashkil qiladi.

8 -qadam: uzilish, uzilish …

To'xtatish, uzilish …
To'xtatish, uzilish …

Biz kerakli chastotada yoki yaqinida dasturiy ta'minot uzilishini yaratish uchun chastota ma'lumotidan foydalanamiz.

To'xtatish har doim ham aniq belgilanmaydi, lekin bu etarli. Fayldan o'qiladigan chastota setintrupt dasturiga uzatiladi.

void setintrupt (float freq) {float bitval = 8; // 8 bitli taymerlar uchun 8 0 va 2, taymer 1 bayt uchun 1024

setocroa = (16000000/(freq*bitval)) - 0,5;

// Setocroa qiymati -1 ga ayirishni talab qiladi. Ammo 0,5 turni 0,5 ga yaqin qo'shish

// Taymerning o'lchamlari cheklangan

// Oxir -oqibat bitvalning kattaligi bilan belgilanadi

cli (); // uzilishlarni o'chirish // taymer2 uzilishni o'rnatish

TCCR2A = 0; // butun TCCR2A registrini 0 ga o'rnating

TCCR2B = 0; // TCCR2B uchun ham xuddi shunday

TCNT2 = 0; // hisoblagich qiymatini 0 ga boshlang

// chastota (hz) ortishi uchun taqqoslash mos yozuvlar registrini o'rnating

OCR2A = setokroa; // = (16*10^6) / (chastota*8) - 1 (<256 bo'lishi kerak)

// CTC rejimini yoqing

TCCR2A | = (1 << WGM21); // 8 ta oldindan hisoblagich uchun CS21 bitini o'rnating

TCCR2B | = (1 << CS21); // taymerni taqqoslashni to'xtatishni yoqish

// TIMSK2 | = (1 << OCIE2A); // bu quyidagi satrda bo'lgani kabi ishlaydi

sbi (TIMSK2, OCIE2A); // taymerda uzilishni yoqish 2

sei (); // uzilishlarni yoqish

Aqlli o'quvchilar sbi (TIMSK2, OCIE2A) ni ko'rishadi.

Men registr bitlarini sozlash va tozalash uchun bir nechta (Internetda sotib olingan) funktsiyalarni o'rnatdim:

// Registr bitlarini tozalashni belgilaydi#ifndef cbi

#ta'rif cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))

#endif

// Ro'yxatdan o'tish bitlarini belgilashni belgilaydi

#ifndef sbi

#debine sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))

#endif

Bu funktsiyalar uzilishni o'rnatish yoki tozalash uchun oson qo'ng'iroqni ta'minlaydi.

Shunday qilib, uzilish ishlamoqda, biz nima qila olamiz?

9 -qadam: uzilishlar va ikkita buferlash

Uzilishlar va ikki tomonlama buferlash
Uzilishlar va ikki tomonlama buferlash
Uzilishlar va ikki tomonlama buferlash
Uzilishlar va ikki tomonlama buferlash

22 KGts chastotasida har 0,045 msda audio ma'lumotlar bayti chiqariladi

512 bayt (bufer hajmi) 2,08 milodiyda o'qiladi.

Shunday qilib, buferni SDCard -dan bitta yozish tsiklida o'qib bo'lmaydi.

Shu bilan birga, portga 23.22 ms ichida 512 bayt yoziladi.

Shunday qilib, biz bufer bo'shatilgandan keyin har safar o'qiladigan yangi faylni o'rnatishimiz kerak, va bizda yangi ma'lumotlar bloki kerak bo'lmaguncha ma'lumotlarni olish uchun etarli vaqt bor … Biz ikkita buferdan foydalangan holda, boshqasini to'ldirganimizda bo'shatamiz.

Bu ikki tomonlama buferlash.

Qayta uzilish natijasida fayl o'qilishi sekinlashadi, lekin bajariladi.

Menda bufa va bufb deb nomlangan ikkita 512 baytli bufer o'rnatilgan.

Agar bayroq to'g'ri bo'lsa, biz portadan o'qiymiz, aks holda biz portbdan o'qiymiz

Tampon holati (bufcount) bufer o'lchamiga (BUF_SIZE 512) yetganda readit deb nomlangan bayroqni rost qilib qo'yamiz.

Void loop dasturi bu bayroqni qidiradi va blokni o'qishni boshlaydi:

if (readit) {if (! aready) {

// bufa o'qiladigan SDCard blokini ishga tushiring

tempfile.read (bufa, BUF_SIZE);

} boshqa {

// bufb -ga o'qiladigan SDCard blokini ishga tushiring

tempfile.read (bufb, BUF_SIZE);

}

readit = noto'g'ri;

}

Muntazam bayroqlar tugagandan so'ng readit = false.

To'xtatish tartibida biz o'qish == noto'g'ri ekanligini tekshirish orqali bo'shliq tugallanganligini tekshirishimiz kerak.

Bunday holda, biz buferlarni almashtirish uchun boshqa o'qish zarurligini bildiramiz va bayroqni o'zgartiramiz.

Agar SDcard hali ham o'qiyotgan bo'lsa, biz bir o'qishni orqaga qaytarishimiz kerak (hisoblagich--; bufcount--;) va keyinroq qaytadan urinish uchun uzilishdan chiqishimiz kerak. (Ovoz chiqish signalining bosilishi bu sodir bo'lganligini bildiradi.)

Barcha ma'lumotlar o'qilganda, uzilish bekor qilinadi, port 128 voltli o'rta kuchlanish qiymatiga qayta o'rnatiladi va audio fayl yopiladi.

Dac2.ino skriptini birinchi marta ishga tushirishdan oldin ovoz balandligini 50%ga sozlang. Bu juda baland bo'ladi, lekin bu 100%dan yaxshiroq!

Agar sizning ovozni boshqarish moslamasi teskari yo'nalishda ishlasa, 10K potansiyometrning qarama -qarshi uchidagi simlarni almashtiring.

Menga bu qanday eshitilishini aytib bering.

Tavsiya: