Բովանդակություն:
- Քայլ 1: Պահանջներ
- Քայլ 2: Տեխնիկական պայմաններ
- Քայլ 3: Սկսելու համար
- Քայլ 4: Փոքր շրջան
- Քայլ 5: Դուրս եկեք զոդման երկաթից
- Քայլ 6: DAC- ի փորձարկում
- Քայլ 7: Wav վերնագրի ընթերցում
- Քայլ 8: Ընդհատել, ընդհատել…
- Քայլ 9. Ընդհատումներ և կրկնակի բուֆերացում
Video: Ձայնային ձայնային ֆայլերի (Wav) նվագարկում Arduino- ով և DAC- ով ՝ 9 քայլ
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:51
Նվագարկեք wav ֆայլ Audio ձեր Audino SD քարտից: Այս Instructable- ը ցույց կտա ձեզ, թե ինչպես կարող է ձեր SdCard- ի wav ֆայլը նվագարկվել բարձրախոսին պարզ միացման միջոցով:
Wav ֆայլը պետք է լինի 8 բիթանոց մոնո: Ես 44 ԿՀց ֆայլեր նվագելու խնդիր չեմ ունեցել:
Չնայած բարձր հավատարմությանը, ձայնի որակը շատ գոհացուցիչ է:
Սերիական մոնիտորը օգտագործվում է ֆայլը ընտրելու համար: Ֆայլերը պետք է լինեն adlog կոչվող թղթապանակում:
Այս հրահանգը հետևում է ավելի վաղ նախագծից, որտեղ ես wav ձայնագրությունները պահեցի SdCard- ում ՝
Շղթան օգտագործում է էժան 8 բիթանոց թվայինից անալոգային փոխարկիչ (DAC) և մեկ չիպի ձայնային ուժեղացուցիչ:
Ընդհատումներ ստեղծելու հիմնական բաժինները վերցված են Ամանդա haասսայիի գերազանց հոդվածից ՝
Քայլ 1: Պահանջներ
Arduino- Ես օգտագործում եմ Mega- ն, սակայն ոչ մի պատճառ չկա, թե ինչու Uno- ն չպետք է աշխատի:
SdCard reader- ծրագիրը կազմաձևված է ՝ MicroSD Breakout Board Regulated with Logic Conversion V2
SdCard- ի տեղադրման մանրամասների համար տես այս հրահանգը ՝
DAC0832 LCN- հիանալի 8 բիթանոց թվայինից անալոգային փոխարկիչ- Մի քանի ֆունտ:
LM386 N-1 Op amp- էժան, ինչպես չիպսերը
20 ճանապարհ չիպերի վարդակից
8 ճանապարհ չիպերի վարդակից
9 վոլտ էներգիայի մատակարարում- մարտկոցը կանի:
LM336 2.5 Վ լարման տեղեկանք
10uF կոնդենսատոր * 3 (ցանկացած լարման ավելի քան 9 Վ)
10 օմ դիմադրություն
50nF կոնդենսատոր- (կամ ինչ-որ տեղ մոտ -47nF, 56nf, 68nf- կանի)
220uF կոնդենսատոր
64 Օմ բարձրախոս
10K գծային պոտենցիոմետր
Մալուխ Arduino- ի և սխեմայի միջև 8 տվյալների տողերը կապելու համար
Uno- ում 8 միացումները շարված են, Mega- ում `զույգերով:
Mega- ում ես օգտագործեցի 10 ճանապարհ ժապավենային մալուխ `10 ճանապարհ IDC վերնագրով: (2 լարերը պահեստային են)
0V, 9V և DAC միակցիչների միակցիչներ
Պղնձե տախտակ, զոդ, մետաղալար, կտրիչներ և այլն
Քայլ 2: Տեխնիկական պայմաններ
Սերիան ՝ 115200 բաուդ
Կա աջակցություն Hobbytronics MicroSD Breakout Board- ի համար ՝ օգտագործելով Mega: Չիպի ընտրությունը և այլ նավահանգիստները կփոխվեն Mega- ի և Uno- ի միջև:
Wav ֆայլերը պետք է գոյություն ունենան adlog կոչվող գրացուցակում: Ազատորեն անվանեք այն այլ կերպ և վերադասավորեք անհրաժեշտ կոդավորումը:
Wav ֆայլը պետք է լինի 8 բիթանոց մոնո: Ես փորձարկել եմ մինչև 44KHz:
Սերիական մոնիտորը ցուցադրում է wav ֆայլերը adlog պանակում: Ֆայլի անունները ուղարկվում են մոնիտորի ելքային տողից:
Ֆայլի չափը սահմանափակվում է միայն SdCard չափով:
Քայլ 3: Սկսելու համար
Միացրեք SD քարտի ընթերցողին: Սրանք Mega- ի միացումներն են:
0, 5 Վ
Սեղմեք 52 -րդ կապում
D0- ից մինչև կապում 50
D1- ից դեպի 51 կապում
CS- ն ամրացնել 53 -ին
(Տե՛ս մատակարարների կայքը Uno նավահանգստի միացման համար)
Դուք կցանկանաք ստուգել, որ ձեր քարտը գործում է այս փուլում. Օգտագործեք վաճառողի կողմից տրամադրված սցենարները:
Մենք պետք է մի փոքր շրջան կատարենք:
Մենք պատրաստվում ենք ուղարկել ձայնային բայթերի հոսք Arduino- ից:
Այս թվերը գտնվում են 0 -ից 255 -ի սահմաններում: Նրանք ներկայացնում են լարումը:
Լռությունը 127-128 է:
255 -ը բարձրախոս կոն դժվար է միակողմանի:
0 -ը բարձրախոս կոնն է այլ կերպ:
Այսպիսով, աուդիոն գրանցվում է որպես պահված թվեր, որոնք ստեղծում են տարբեր լարման, որոնք ստեղծում են բարձրախոսների շարժվող կոններ:
Մենք կարող ենք Arduino- ի 8 տողից թվերը միաժամանակ ուղարկել ՝ օգտագործելով «պորտ»:
Եթե մենք 8 տողերը կերակրում ենք թվայինից անալոգային փոխարկիչին, ապա այն կատարում է այն, ինչ ասում է անագի վրա և արտադրում է անալոգային լարում, որը համաչափ է թվային թվին:
Մեզ մնում է միայն լարումը անջատել մի փոքր գործառնական ուժեղացուցիչի, այնուհետև բարձրախոսի վրա:
Քայլ 4: Փոքր շրջան
DAC0832 LCN
Սա հիանալի, էժան 8 բիթանոց թվային անալոգային փոխարկիչ է: (DAC)
Այն կարող է լիովին վերահսկվել տվյալների պահման զանգվածի, տվյալների օրինակելի տողերի միջոցով:
Կամ այն կարող է կարգավորվել ՝ ամեն ինչ ինքնաբերաբար կատարելու համար «Հոսք գործարկման միջոցով» բաժնում:
Ձեռնարկը մեջբերելու համար.
Պարզապես հիմնավորելով CS, WR1, WR2 և XFER և ILE բարձր կապելը թույլ է տալիս ներքին ռեգիստրներին հետևել կիրառվող թվային մուտքերին (հոսք) և ուղղակիորեն ազդել DAC անալոգային ելքի վրա:
Լավ է, որ չորս միացում չիպերի հետ ցածր է, իսկ մեկը `9 Վ - հեշտ:
Մենք չենք ցանկանում որևէ բացասական լարման դուրս գալ, այնպես որ ձեռնարկում ասվում է, որ մենք պետք է օգտագործենք «լարման անջատման ռեժիմ», և նրանք տալիս են դիագրամը:
Մեզ մնում է միայն փոխարինել մի փոքրիկ Աուդիո ուժեղացուցիչ ՝ իրենց առաջարկածի փոխարեն:
LM386-N ձայնային ուժեղացուցիչ
Amp- ի ձեռնարկը տրամադրում է մասերի նվազագույն դիագրամ `ապահովելով 20 շահույթ (մեզ համար չափազանց շատ, բայց այն ունի ձայնի հսկողություն):
Մեզ մնում է միայն կոնդենսատոր ավելացնել DAC- ի և ուժեղացուցիչի միջև, որպեսզի մենք միայն ուժեղացնենք AC ազդանշանները:
Մենք նաև պետք է մի քանի կոնդենսատոր ավելացնենք մեր յուրաքանչյուր չիպերի մատակարարման պին մոտ, հակառակ դեպքում մենք կզզվանք մեր 9 Վ լարման աղբյուրից:
Քայլ 5: Դուրս եկեք զոդման երկաթից
Քանի որ շղթան պարզ է, ես մտադիր չեմ հարվածներ հասցնել հարվածի հաշվին:
Ահա որոշ ցուցումներ.
- Պատրաստեք պղնձե ժապավենի կտոր առնվազն 28 x 28 անցքերով: (Այո, ես գիտեմ, որ ուղեղի վիրաբույժները կարող են այն փոքրացնել)
- Եթե մտադիր եք այն պտուտակներով ամրացնել, սկզբում թույլատրեք դրանք:
- Տեղադրեք չիպսերը վարդակների վրա: Տեղադրեք չիպսերը միայն այն ժամանակ, երբ ամեն ինչ ստուգված է:
- Մուտքային լարերը հեռու պահեք ելքից:
- Դիտարկեք կոնդենսատորների ճիշտ բևեռականությունը:
- Անդրադարձեք դիագրամին LM336 լարման տեղեկանքի հիմնական տեսքի համար: Կարգավորող ոտքը չի օգտագործվում և կարող է կտրվել:
- Ուշադրություն դարձրեք DAC- ի 8-րդ կապին- դա շատ օգտակար է փորձարկման համար:
- Ես միացա Audino- ին ժապավենի մալուխով և 10 ճանապարհ IDC միակցիչով:
- Uno- ում միացումները ուղիղ գծով են. Դուք կարող եք նկատել, որ 8 մուտքային միացումները մեկ ուղիղ գծով դասավորելը թույլ է տալիս Arduino- ին կապել գնված, պատրաստի 8 ճանապարհի միակցիչով,
Ավարտվելուց հետո ստուգեք զոդումը և ստուգեք պղնձի հետքերի միջև եղած բացերը:
Ես գտնում եմ, որ 36 tpi կրտսեր կոտրած սղոցը շատ օգտակար է բեկորները մաքրելու համար: Ես հեռացնում եմ սայրի տեղադրման կապումներն ու սահեցնում սայրի եզրը դեպի հետք: Ակնհայտ է, որ սայրը շրջանակի մեջ չէ:
Քայլ 6: DAC- ի փորձարկում
Circuit- ի և Arduino- ի միջև կապը թողեք անջատված:
Ձայնի կարգավորիչը ձեր շղթայի վրա դրեք կեսգիշերին:
Միացրեք 9V DC հոսանքը ձեր նոր միացմանը:
Ստուգեք, որ սխեման նորմալ է. Ես չեմ կարող որևէ պատասխանատվություն կրել ձեր սխեմայի համար:
Անջատել
Միացրեք ձեր միացումը Arduino- ին:
Մեգայի վրա օգտագործեք 22-29 կապում: (ՊՈՐՏԱ) Մի՛ սխալեք վերը նշված 5 Վ լարման երկու կապում:
Uno- ում օգտագործեք 0-7 կապում: Սա PORTD- ն է
Միացրեք ձեր սնուցման աղբյուրի 0V- ը Arduino- ի 0V- ին:
Միացնել.
Բացեք այս թեստային ծրագիրը DAC_TEST
UNO- ի համար փոխարինեք PORTTA- ին PORTD- ի բոլոր հղումները
Փոխարինեք DDRA- ն DDRD- ով: Այս հրահանգը բոլոր 8 տողերը միանգամից թողարկում է: Սա տվյալների ուղղության գրանցամատյան է:
Սահմանեք ձեր սերիական մոնիտորը 115200 -ի վրա:
Միացրեք վոլտմետր DAC- ի և OV- ի միջև
Programրագիրը ելքը կկազմի 255 - բոլոր տողերը միացված `առավելագույն լարման:
Ելք 128- կես առավելագույն լարում:
Ելք 0- զրոյական լարման (Կամ, հավանաբար, գրեթե զրոյի):
Այնուհետև այն քայլ առ քայլ կընթանա ՝ 1, 2, 4, 8, 16, 32, 64, 128
Լարման կայուն աճը պետք է լինի:
Եթե լարումը հետ է ընկնում, մինչդեռ թիվը մեծանում է, հավանաբար փոխկապակցված երկու լարերը հակադարձված են:
Դուք նաև պետք է լսեք, թե ինչպես է բարձրախոսը հանգիստ սեղմում, երբ լարումը փոխվում է
Քայլ 7: Wav վերնագրի ընթերցում
Wav ֆայլերը պահվում են որոշակի հաճախականությամբ և տվյալների չափով:
Այս տեղեկատվությունը պարունակվում է 44 բայթ վերնագրում ՝ wav ֆայլի սկզբում:
Չնայած որոշ ծրագրեր ընդլայնում են վերնագիրը (բայթ 35 -ից հետո), ինչը ավելի դժվար է դարձնում տվյալների չափի գտնվելու վայրը:
Վերնագիրը կարդալու համար մենք ստեղծում ենք բուֆեր և պատճենում ֆայլի սկիզբը:
Հաճախականությունը պահվում է 4 բայթում ՝ սկսած 24 բայթ ֆայլում:
// wav ֆայլի վերնագրում նշված ընթերցման հաճախականությունը
բայթ գլխիկ [60]
tempfile.seek (0);
tempfile.read (headbuf, 60);
retval = headbuf [27];
retval = (retval << 8) | գլխիկ [26];
retval = (retval << 8) | գլխիկ [25];
retval = (retval << 8) | գլխիկ [24];
Serial.print (F («Ֆայլի հաճախականություն»));
Serial.print (retval);
Տվյալների չափի մասին տեղեկատվությունը գտնելու լավագույն միջոցը վերնագրում «տվյալներ» բառի որոնումն է:
Այնուհետեւ հանեք դրան հաջորդող 4 բայթերը, որոնք կազմում են երկար արժեքը
անստորագիր երկար հետադարձում;
int mypos = 40;
համար (int i = 36; i <60; i ++) {
if (headbuf == 'd') {
եթե (headbuf [i+1] == 'ա') {
եթե (headbuf [i+2] == 't') {
եթե (headbuf [i+3] == 'ա') {
// վերջապես մենք ունենք այն
mypos = i+4;
i = 60;
}
}
}
}
}
tempfile.seek (mypos);
retval = headbuf [mypos+3];
retval = (retval << 8) | headbuf [mypos+2];
retval = (retval << 8) | headbuf [mypos+1];
retval = (retval << 8) | headbuf [mypos];
Լավ, մենք ունենք տվյալների երկարությունը և հաճախականությունը:
Աուդիո տվյալները հետևում են տվյալների երկարության արժեքը կազմող 4 բայթին:
Քայլ 8: Ընդհատել, ընդհատել…
Մենք օգտագործում ենք հաճախականության մասին տեղեկությունները `ծրագրային ապահովման ընդհատում ստեղծելու համար անհրաժեշտ կամ հաճախականությամբ:
Ընդհատումը միշտ չէ, որ կարող է ճշգրիտ սահմանվել, բայց դա բավարար է: Ֆայլից կարդալու հաճախականությունը փոխանցվում է դադարի ենթածրագրին:
void setintrupt (float freq) {float bitval = 8; // 8 8 բիթանոց 0 և 2 ժամաչափերի համար, 1024 ՝ ժամաչափ 1 բայթ
setocroa = (16000000/(հաճախականությունը*bitval)) - 0.5;
// Սետոկրոայի արժեքը պահանջում է -1 -ի հանում: Այնուամենայնիվ, 0.5 պտույտ ավելացնելով մոտակա 0.5 -ին
// theամաչափի լուծաչափը սահմանափակ է
// Ի վերջո որոշվում է բիտվալի մեծությամբ
cli (); // անջատել ընդհատումները // սահմանել ժամանակաչափ 2 ընդհատում
TCCR2A = 0; // ամբողջ TCCR2A գրանցամատյանը սահմանել 0
TCCR2B = 0; // նույնը TCCR2B- ի համար
TCNT2 = 0; // նախաստորագրել հաշվիչի արժեքը 0 -ի համար
// սահմանել համեմատության համընկնումների գրանցամատյան հաճախականության (հց) ավելացման համար
OCR2A = սեթոկրոա; // = (16*10^6) / (հաճախականությունը*8) - 1 (պետք է լինի <256)
// միացնել CTC ռեժիմը
TCCR2A | = (1 << WGM21); // Սահմանել CS21 բիթը 8 նախալեզվիչի համար
TCCR2B | = (1 << CS21); // միացնել ժմչփի համեմատության ընդհատումը
// TIMSK2 | = (1 << OCIE2A); // սա աշխատում է, ինչպես և հետևյալ տողում
sbi (TIMSK2, OCIE2A); // միացնել ընդհատումը ժմչփի վրա 2
sei (); // միացնել ընդհատումները
Խորաթափանց ընթերցողները կունենան խայտաբղետ sbi (TIMSK2, OCIE2A)
Ես կարգավորում եմ մի քանի (ինտերնետով ձեռք բերված) գործառույթներ `գրանցամատյանների բիթերը տեղադրելու և մաքրելու համար.
// Սահմանում է ռեգիստրի բիտերի մաքրման համար#ifndef cbi
#սահմանել cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))
#էնդիֆ
// Սահմանում է գրանցամատյանների բիթերի տեղադրման համար
#ifndef sbi
#սահմանել sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))
#էնդիֆ
Այս գործառույթները ապահովում են հեշտ զանգ `ընդհատումը սահմանելու կամ մաքրելու համար:
Այսպիսով, ընդհատումը վազում է, ինչ կարող ենք ստիպել դա անել:
Քայլ 9. Ընդհատումներ և կրկնակի բուֆերացում
22 ԿՀց հաճախականությամբ յուրաքանչյուր 0,045 ms- ի համար դուրս է բերվում ձայնային տվյալների բայթ
512 բայթ (բուֆերի չափը) կարդացվում է 2.08 ms- ում:
Այսպիսով, բուֆերը չի կարող կարդալ SDCard- ից մեկ գրելու ցիկլով:
Այնուամենայնիվ, նավահանգիստ է գրվում 512 բայթ 23.22 մկմ -ում:
Այսպիսով, մեզ մնում է միայն տեղադրել նոր ֆայլ, որը կարդացվում է ամեն անգամ, երբ բուֆերը դատարկվում է, և մենք բավական ժամանակ ունենք տվյալները ստանալու համար ՝ նախքան տվյալների նոր բլոկ պահանջելը… Ենթադրելով, որ մենք օգտագործում ենք երկու բուֆեր ՝ մեկը դատարկելով մյուսը լրացնելով:
Սա կրկնակի բուֆերացում է:
Կրկնվող ընդհատմամբ ընթերցված ֆայլը կդանդաղեցվի, բայց այն կավարտվի:
Ես տեղադրել եմ երկու 512 բայթ բուֆեր, որոնք կոչվում են bufa և bufb:
Եթե դրոշը ճշմարիտ է, մենք կարդում ենք porta- ից, հակառակ դեպքում կարդում ենք portb- ից
Երբ բուֆերային դիրքը (bufcount) հասնում է բուֆերի չափին (BUF_SIZE 512) մենք դնում ենք readit կոչվող դրոշը true:
Void loop ռեժիմը փնտրում է այս դրոշը և սկսում բլոկի կարդալ.
if (կարդալ) {եթե (! aready) {
// նախաձեռնել SDCard բլոկի ընթերցումը bufa- ում
tempfile.read (bufa, BUF_SIZE);
} ուրիշ {
// նախաձեռնել SDCard բլոկի ընթերցումը bufb- ում
tempfile.read (bufb, BUF_SIZE);
}
readit = կեղծ;
}
Երբ այն ավարտի սովորական դրոշները readit = false:
Ընդհատման ռեժիմի շրջանակներում մենք պետք է ստուգենք, որ դատարկ շրջանն ավարտված է `ստուգելով, արդյոք readit == կեղծ է:
Սա այն դեպքում, երբ մենք ազդանշան ենք տալիս, որ մեկ այլ ընթերցում է պահանջվում և միացնում ենք տարածքի դրոշը ՝ բուֆերները փոխելու համար:
Եթե SDcard- ը դեռ կարդում է, մենք պետք է հետևենք մեկ ընթերցմանը (counter--; bufcount--;) և դուրս գանք ընդհատումից `ավելի ուշ նորից փորձելու համար: (Սեղմումները աուդիո ելքային ազդանշանի վրա ենթադրում են, որ դա տեղի է ունեցել):
Երբ բոլոր տվյալները կարդացվում են, ընդհատումը չեղյալ է հայտարարվում, նավահանգիստը նորից կարգավորվում է միջին լարման 128-ի արժեքի, և աուդիո ֆայլը փակվում է:
Նախքան dac2.ino սցենարը առաջին անգամ գործարկելը, ձեր ձայնի մակարդակը սահմանեք 50%: Սա չափազանց բարձր կլինի, բայց դա ավելի լավ է, քան 100%-ը:
Եթե ձեր ձայնի կարգավորիչը գործում է հակառակ փոխանակման միջոցով, ապա 10K պոտենցիոմետրի հակառակ ծայրերում գտնվող լարերը:
Թույլ տվեք իմանալ, թե ինչպես է դա հնչում:
Խորհուրդ ենք տալիս:
Raspberry Pi Samba Տեղական ֆայլերի սերվեր. 5 քայլ
Raspberry Pi Samba Տեղական ֆայլերի սերվեր. Տեղական ֆայլերի սերվեր տեղադրելու քայլ առ քայլ ընթացակարգ
Ձայնային թռիչք Arduino Uno- ի հետ Քայլ առ քայլ (8 քայլ) `8 քայլ
Ձայնային թռիչք Arduino Uno- ի հետ Քայլ առ քայլ (8 քայլ). Ուլտրաձայնային ձայնային փոխարկիչներ L298N Dc կանացի ադապտեր էներգիայի մատակարարում արական dc pin Arduino UNOBreadboard և անալոգային նավահանգիստներ ՝ կոդը փոխարկելու համար (C ++)
Խոսող Արդուինո - MP3 նվագելը Arduino- ի հետ `առանց որևէ մոդուլի - Arduino- ից Mp3 ֆայլի նվագարկում ՝ օգտագործելով PCM ՝ 6 քայլ
Խոսող Արդուինո | MP3 նվագելը Arduino- ի հետ `առանց որևէ մոդուլի | Arduino- ից Mp3 ֆայլի նվագարկում PCM- ի միջոցով. Այս հրահանգներում մենք կսովորենք, թե ինչպես կարելի է նվագարկել arduino- ով mp3 ֆայլ ՝ առանց որևէ աուդիո մոդուլ օգտագործելու, այստեղ մենք կօգտագործենք PCM գրադարանը Arduino- ի համար, որը նվագում է 16 բիթանոց PCM 8kHZ հաճախականությամբ, ուստի թույլ տվեք դա անել:
Arduino Bascis - Հնչյունների և հնչերանգների նվագարկում. 5 քայլ
Arduino Bascis - Հնչյուններ և հնչերանգներ. Ես ուզում էի նվագարկել որոշ ձայնային էֆեկտներ և հասկացա, որ սա անտեսված ոլորտներից մեկն է, երբ խոսքը վերաբերում է ձեռնարկներին: Նույնիսկ Youtube- ում Arduinos- ի և հնչյունների վերաբերյալ լավ ձեռնարկների բացակայություն կա, այնպես որ, ես, որպես լավ տղա, որոշեցի կիսվել իմ գիտելիքներով
Ինչպես փոխարկել իրական ձայնային հոսքերը MP3 ֆայլերի `7 քայլ
Ինչպես փոխարկել իրական աուդիո հոսքերը MP3 ֆայլերի: Բարև, հավանաբար, ձեզանից ոմանք լսում են աուդիո բովանդակություն կամ շոուներ վեբ ռադիոկայաններից `Real Audio Player- ի կամ վեբ զննարկչի Real Audio Plug-in- ի միջոցով: ԽՆԴԻՐ Այս ֆայլերը հաճախ հեռարձակվում են որպես հոսքային, բայց սովորաբար դրանք հնարավոր չէ ներբեռնել