Բովանդակություն:

Ձայնային ձայնային ֆայլերի (Wav) նվագարկում Arduino- ով և DAC- ով ՝ 9 քայլ
Ձայնային ձայնային ֆայլերի (Wav) նվագարկում Arduino- ով և DAC- ով ՝ 9 քայլ

Video: Ձայնային ձայնային ֆայլերի (Wav) նվագարկում Arduino- ով և DAC- ով ՝ 9 քայլ

Video: Ձայնային ձայնային ֆայլերի (Wav) նվագարկում Arduino- ով և DAC- ով ՝ 9 քայլ
Video: 【TASCAM DR-10L Pro】これはYouTubeやVlog撮影で絶対に失敗しないためのマイクです 。SIGMA fp + Canon FD 28mm F2で撮影 2024, Հունիսի
Anonim
Ձայնային ձայնային ֆայլերի (Wav) նվագարկում Arduino- ով և DAC- ով
Ձայնային ձայնային ֆայլերի (Wav) նվագարկում Arduino- ով և DAC- ով
Ձայնային ձայնային ֆայլերի (Wav) նվագարկում Arduino- ով և DAC- ով
Ձայնային ձայնային ֆայլերի (Wav) նվագարկում Arduino- ով և DAC- ով
Ձայնային ձայնային ֆայլերի (Wav) նվագարկում Arduino- ով և DAC- ով
Ձայնային ձայնային ֆայլերի (Wav) նվագարկում Arduino- ով և DAC- ով

Նվագարկեք 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: Դուրս եկեք զոդման երկաթից

Դուրս եկեք oldոդվող երկաթից
Դուրս եկեք oldոդվող երկաթից
Դուրս եկեք oldոդվող երկաթից
Դուրս եկեք oldոդվող երկաթից
Դուրս եկեք oldոդվող երկաթից
Դուրս եկեք oldոդվող երկաթից

Քանի որ շղթան պարզ է, ես մտադիր չեմ հարվածներ հասցնել հարվածի հաշվին:

Ահա որոշ ցուցումներ.

  • Պատրաստեք պղնձե ժապավենի կտոր առնվազն 28 x 28 անցքերով: (Այո, ես գիտեմ, որ ուղեղի վիրաբույժները կարող են այն փոքրացնել)
  • Եթե մտադիր եք այն պտուտակներով ամրացնել, սկզբում թույլատրեք դրանք:
  • Տեղադրեք չիպսերը վարդակների վրա: Տեղադրեք չիպսերը միայն այն ժամանակ, երբ ամեն ինչ ստուգված է:
  • Մուտքային լարերը հեռու պահեք ելքից:
  • Դիտարկեք կոնդենսատորների ճիշտ բևեռականությունը:
  • Անդրադարձեք դիագրամին LM336 լարման տեղեկանքի հիմնական տեսքի համար: Կարգավորող ոտքը չի օգտագործվում և կարող է կտրվել:
  • Ուշադրություն դարձրեք DAC- ի 8-րդ կապին- դա շատ օգտակար է փորձարկման համար:
  • Ես միացա Audino- ին ժապավենի մալուխով և 10 ճանապարհ IDC միակցիչով:
  • Uno- ում միացումները ուղիղ գծով են. Դուք կարող եք նկատել, որ 8 մուտքային միացումները մեկ ուղիղ գծով դասավորելը թույլ է տալիս Arduino- ին կապել գնված, պատրաստի 8 ճանապարհի միակցիչով,

Ավարտվելուց հետո ստուգեք զոդումը և ստուգեք պղնձի հետքերի միջև եղած բացերը:

Ես գտնում եմ, որ 36 tpi կրտսեր կոտրած սղոցը շատ օգտակար է բեկորները մաքրելու համար: Ես հեռացնում եմ սայրի տեղադրման կապումներն ու սահեցնում սայրի եզրը դեպի հետք: Ակնհայտ է, որ սայրը շրջանակի մեջ չէ:

Քայլ 6: DAC- ի փորձարկում

DAC- ի փորձարկում
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- ի վերնագիրը կարդալը
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 պոտենցիոմետրի հակառակ ծայրերում գտնվող լարերը:

Թույլ տվեք իմանալ, թե ինչպես է դա հնչում:

Խորհուրդ ենք տալիս: