Mundarija:
- 1 -qadam: talablar
- 2 -qadam: Xususiyatlar
- 3 -qadam: Ishga kirishish
- 4 -qadam: Kichik davr
- 5 -qadam: Lehimlash temiridan chiqing
- 6 -qadam: DACni tekshirish
- 7 -qadam: Wav sarlavhasini o'qish
- 8 -qadam: uzilish, uzilish …
- 9 -qadam: uzilishlar va ikkita buferlash
Video: Ovozli ovozli fayllarni (Wav) Arduino va DAC yordamida ijro etish: 9 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:27
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
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
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
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
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
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
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 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 …
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
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:
Qanday qilib Ford audiofilli stereo radiodan Mp3 fayllarni ijro etish mumkin: 7 qadam
Mp3 audio fayllarini Ford audiofilining stereo radiosini qanday ijro etish mumkin: Bu ko'rsatma sizga Ford Audiofilining MP3 CD-R muvofiqligi talablariga (va, ehtimol, Mach 300, Shaker 500 va Shaker 1000) qanday javob berish haqida bir qancha muhim ma'lumotlarni beradi. ) MP3 formatidagi fayllarni kompakt diskda yoqish va zavqlanish uchun zavod stereo
Gapirish Arduino - Hech qanday modulsiz Arduino bilan MP3 ijro etish - PC fayllari yordamida Arduino -dan Mp3 faylini ijro etish: 6 qadam
Gapirish Arduino | Hech qanday modulsiz Arduino bilan MP3 ijro etish | PC faylini ishlatib, Arduino -dan Mp3 faylini ijro etish: Bu erda biz audio faylni ishlatmasdan mp3 faylini arduino -da qanday ijro etishni bilib olamiz, bu erda biz Arduino uchun 8 -gigagertsli chastotali 16 -bitli PCM -ni o'ynaydigan PCM kutubxonasidan foydalanamiz
Flyback transformatorida yoki karnayda PWM uchun ADC yordamida Arduino bilan qo'shiqlar ijro etish: 4 qadam
Flyback transformatorida yoki karnayda PWM uchun ADC yordamida Arduino bilan qo'shiqlar ijro eting: Salom bolalar, bu mening boshqa o'rgatuvchi qismim (bu juda qiyin edi), asosan, men ushbu loyihada Arduino -dagi ADC va TIMER -ni ishlatganman. Ovoz signalini PWM signaliga aylantiring, bu avvalgi ko'rsatmaga qaraganda ancha oson
Karnay yoki Flyback transformatorida PWM yordamida Arduino yordamida qo'shiqlarni (MP3) ijro etish: 6 qadam (rasmlar bilan)
Qo'shiqlarni (MP3) Arduino bilan PWM yordamida karnay yoki Flyback transformatorida ijro eting: Salom bolalar, bu mening birinchi ko'rsatmam, sizga yoqadi degan umiddaman !! Asosan, men ushbu loyihada Arduino va noutbuk o'rtasidagi ketma -ket aloqani qo'lladim. musiqa ma'lumotlarini noutbukdan Arduino -ga uzatish. Va Arduino TIMERS -dan foydalanish
Arduino Bascis - Ovoz va ohanglarni ijro etish: 5 qadam
Arduino Bascis - Ovozlar va ohanglarni ijro etish: Men bir nechta ovoz effektlarini ijro etmoqchi edim va darsliklar haqida gap ketganda, bu e'tibordan chetda qolgan joylardan biri ekanligini tushundim. Hatto Youtube -da ham Arduino va tovushlar bo'yicha yaxshi darsliklar yo'q, shuning uchun men yaxshi yigit bo'lib, o'z bilimlarim bilan bo'lishishga qaror qildim