Sisukord:

Helifailide esitamine (Wav) Arduino ja DAC -iga: 9 sammu
Helifailide esitamine (Wav) Arduino ja DAC -iga: 9 sammu

Video: Helifailide esitamine (Wav) Arduino ja DAC -iga: 9 sammu

Video: Helifailide esitamine (Wav) Arduino ja DAC -iga: 9 sammu
Video: Что? Zoom H6 Black или Zoom H4n Pro? 2024, November
Anonim
Audio helifailide (Wav) esitamine Arduino ja DAC abil
Audio helifailide (Wav) esitamine Arduino ja DAC abil
Audio helifailide (Wav) esitamine Arduino ja DAC abil
Audio helifailide (Wav) esitamine Arduino ja DAC abil
Audio helifailide (Wav) esitamine Arduino ja DAC abil
Audio helifailide (Wav) esitamine Arduino ja DAC abil

Esitage wav -faili heli oma Audino SD -kaardilt. See juhend annab teile teada, kuidas teie SdCardil olevat wav -faili saab lihtsa vooluahela kaudu kõlarisse esitada.

Wav -fail peab olema 8 -bitine mustvalge. Mul pole olnud probleeme 44 KHz failide esitamisega.

Kuigi helikvaliteet pole ülitruudus, on see väga rahuldav.

Faili valimiseks kasutatakse jadamonitori. Failid peavad olema kaustas nimega adlog.

See juhis tuleneb varasemast projektist, kus salvestasin Wav-salvestused SdCardile:

Vooluahel kasutab odavat 8 -bitist digitaal -analoogmuundurit (DAC) ja ühe kiibiga helivõimendit.

Katkestuste seadistamise võtmejaotised on võetud Amanda Ghassaei suurepärasest artiklist:

Samm: nõuded

Nõuded
Nõuded
Nõuded
Nõuded

Arduino- ma kasutan Megat, kuid pole põhjust, miks Uno ei peaks töötama.

SdCardi lugeja-programm on konfigureeritud: MicroSD Breakout Board Regulated with Logic Conversion V2

Vaadake seda juhendit SdCardi seadistamise üksikasjade kohta:

DAC0832 LCN- suurepärane 8-bitine digitaal-analoogmuundur- paar naela.

LM386 N-1 Op amp- odav kiipidena

20 -suunaline kiibipesa

8 -suunaline kiibipesa

9-voldine toide- aku sobib.

LM336 2,5 V pinge võrdlus

10uF kondensaator * 3 (pinge üle 9V)

10 oomi takisti

50 nF kondensaator- (Või kusagil 47nF, 56nf, 68nf lähedal)

220uF kondensaator

64 oomi kõlar

10K lineaarne potentsiomeeter

Kaabel 8 andmeliini ühendamiseks Arduino ja vooluahela vahel

Unol on 8 ühendust reas, Megal paarikaupa.

Megas kasutasin 10 -suunalist lintkaablit 10 -suunalise IDC -päisega. (2 juhet on varuks)

Pistikupesad 0V, 9V ja DAC väljundiks

Vaskriba, jootmine, traat, lõikurid jne

2. samm: spetsifikatsioonid

Spetsifikatsioonid
Spetsifikatsioonid

Seerianumber 115200 baud.

Toetatakse Mega abil töötavat Hobbytronics MicroSD Breakout Boardi. Kiibi valik ja muud pordid muutuvad Mega ja Uno vahel.

Wav-failid peavad eksisteerima kataloogis nimega adlog- nimetage see julgelt millekski muuks ja korraldage vajalik kodeerimine uuesti.

Wav -fail peab olema 8 -bitine mustvalge. Olen testinud kuni 44KHz.

Sarjamonitor kuvab wl -failid kaustas adlog. Failide nimed saadetakse monitori väljundliinilt.

Faili suurust piirab ainult SdCardi suurus.

3. samm: alustamine

Alustamine
Alustamine

Ühendage SD -kaardilugeja. Need on Mega ühendused.

0, 5V

CLK kuni tihvtini 52

D0 kuni tihvt 50

D1 kuni tihvt 51

CS kuni tihvtini 53

(Uno pordiühenduse leiate tarnijate veebisaidilt)

Soovite testida, kas teie kaart töötab selles etapis- kasutage müüja pakutavaid skripte.

Peame tegema väikese ahela

Saadame Arduino helibaitide voo.

Need numbrid on vahemikus 0 kuni 255. Need tähistavad pinget.

Vaikus on 127-128.

255 on kõlari koonus ühes suunas raske.

0 on kõlari koonus teistpidi raske.

Nii salvestatakse heli salvestatud numbritena, mis tekitavad erineva pinge, mis tekitab liikuvaid kõlarikoonuseid.

Võime saata numbrid Arduino 8 realt korraga, kasutades "porti".

Kui sisestame 8 rida digitaalsest analoogmuundurisse, siis teeb see tinale öeldut ja annab analoogpinge, mis on proportsionaalne digitaalse numbriga.

Kõik, mida peame tegema, on pinge pakkimine väikesesse operatsioonivõimendisse ja seejärel kõlarisse.

4. samm: väike vooluring

Väike ringrada
Väike ringrada
Väike ringrada
Väike ringrada
Väike ringrada
Väike ringrada
Väike ringrada
Väike ringrada

DAC0832 LCN

See on suurepärane, odav 8 -bitine digitaal -analoogmuundur. (DAC)

Seda saab täielikult juhtida massiivse andmemahutiga, andmete näidisliinidega.

Või saab selle seadistada nii, et see teeks kõik automaatselt jaotises „Vool läbi toimingu”.

Kasutusjuhendi tsiteerimiseks:

CS, WR1, WR2 ja XFER lihtsalt maandamine ja ILE kõrge sidumine võimaldab mõlemal siseregistril järgida rakendatud digitaalseid sisendeid (läbivool) ja mõjutada otseselt DAC analoogväljundit.

OK, neli kiibiühendust on madal ja üks 9V - lihtne.

Me ei soovi negatiivseid pingeid välja, nii et käsiraamat ütleb, et peaksime kasutama "pinge lülitusrežiimi" ja need annavad skeemi.

Kõik, mida peame tegema, on nende soovitatud asemel asendada väike helivõimendi.

Helivõimendi LM386-N

Võimendi käsiraamat sisaldab minimaalset osade skeemi- võimendust 20 (meie jaoks liiga palju, kuid sellel on helitugevuse regulaator).

Kõik, mida peame tegema, on kondensaatori lisamine DAC -i ja võimendi vahele, nii et võimendame ainult vahelduvvoolu signaale.

Peame iga kiibi toitepistiku lähedale lisama ka paar kondensaatorit, vastasel juhul saame 9 V toiteallikast suminat.

Samm: võtke jootekolb välja

Võtke jootekolb välja
Võtke jootekolb välja
Võtke jootekolb välja
Võtke jootekolb välja
Võtke jootekolb välja
Võtke jootekolb välja

Kuna vooluring on lihtne, ei kavatse ma löögikontoga lööki anda.

Siin on mõned näpunäited:

  • Valmistage tükk vasest ribaplaati vähemalt 28 x 28 auguga. (Jah, ma tean, et ajukirurgid võivad selle väiksemaks muuta)
  • Kui kavatsete seda kruvidega kinnitada, lubage need alguses!
  • Paigaldage kiibid pistikupesadele. Sisestage kiibid alles siis, kui kõik on kontrollitud.
  • Hoidke sisendjuhtmed väljundist eemal.
  • Jälgige kondensaatorite õiget polaarsust.
  • Vaadake diagrammilt LM336 pinge võrdlusbaasi põhivaadet. Reguleerimisjalga ei kasutata ja seda saab lõigata.
  • Pange tähele otseühendust DAC-i tihvtiga 8- see on testimiseks väga kasulik.
  • Ühendasin Audino lintkaabli ja 10 -suunalise IDC -pistikuga.
  • Uno ühendused on sirgjoonelised - võite avastada, et 8 sisendühenduse paigutamine ühele sirgjoonele võimaldab teil Arduinoga linkida ostetud, valmis 8 -suunalise ühendusega,

Kui see on tehtud- kontrollige jootmist ja kontrollige vaskradade vahede vahel.

Leian, et 36 tpi juunioride häkkimissael on väga kasulik prahi puhastamiseks. Eemaldan lõiketera tihvtid ja libistan teraotsa rööbasesse- Ilmselgelt pole tera raamis.

6. samm: DAC -i testimine

DAC -i testimine
DAC -i testimine

Jätke ühendus vooluahela ja Arduino vahel välja.

Seadke oma vooluahela helitugevuse regulaator poole peale.

Lülitage 9 V alalisvool sisse oma uuele vooluringile.

Kontrollige, kas vooluring on korras- ma ei võta teie vooluringi eest mingit vastutust!

Lülitage toide välja

Ühendage oma vooluring Arduinoga.

Kasutage Mega tihvte 22-29. (PORTA) Ärge eksitage kahte ülaltoodud 5V kontakti!

Uno-l kasutage tihvte 0-7. See on PORTD

Ühendage oma toiteallika 0V Arduino 0V -ga.

Lülitage sisse.

Avage see testprogramm DAC_TEST

UNO puhul asendage kõik viited PORTA -le PORTD -iga

Asendage DDRA DDRD-ga- see käsk määrab kõik 8 rida ühe korraga. See on andmete suundade register.

Seadistage seeriamonitoriks 115200.

Ühendage voltmeeter DAC -väljundi ja OV vahel

Programm seab väljundiks 255 - kõik liinid on sisse lülitatud - maksimaalne pinge.

Väljund 128- pool maksimaalsest pingest.

Väljund 0- nullpinge (või tõenäoliselt peaaegu null).

Seejärel liigub see bitide kaupa: 1, 2, 4, 8, 16, 32, 64, 128

Pinge peaks pidevalt tõusma.

Kui pinge langeb arvu suurenemise ajal tagasi, on tõenäoliselt kaks omavahel ühendatud juhtmest tagurpidi.

Samuti peaksite kuulma, kuidas pinge muutudes kõlar vaikselt klõpsab

Samm 7: Wav päise lugemine

Wav päise lugemine
Wav päise lugemine

Wav -failid salvestatakse kindla sageduse ja andmete suurusega.

See teave sisaldub 44 -baidises päises wav -faili alguses.

Kuigi mõni tarkvara laiendab päist (pärast baiti 35), muutes andmete suuruse asukoha raskemaks.

Päise lugemiseks loome puhver ja kopeerime faili alguse.

Sagedus salvestatakse faili 4 baiti, alustades 24 baidist.

// lugemise sagedus, mis on määratud wav -faili päises

bait headbuf [60]

tempfile.seek (0);

tempfile.read (headbuf, 60);

retval = headbuf [27];

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

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

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

Serial.print (F ("Faili sagedus"));

Serial.print (kordus);

Parim viis andmete suuruse leidmiseks on otsida päisest sõna "andmed".

Seejärel eraldage sellele järgnevad 4 baiti, mis moodustavad pika väärtuse

allkirjata pikk retval;

int mypos = 40;

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

kui (headbuf == 'd') {

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

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

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

// lõpuks on see meil olemas

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];

OK, meil on andmete pikkus ja sagedus!

Heliandmed järgivad andmebaasi pikkuse väärtust moodustavat 4 baiti.

Samm: katkestage, katkestage…

Katkestada, katkestada…
Katkestada, katkestada…

Kasutame sagedusteavet, et luua tarkvara katkestus nõutaval sagedusel või selle lähedal.

Katkestust ei saa alati täpselt määrata, kuid see on piisav. Failist loetud sagedus edastatakse alamprogrammile setintrupt.

void setintrupt (float freq) {float bitval = 8; // 8 8 -bitiste taimerite 0 ja 2 jaoks, 1024 taimer 1 baidi jaoks

setokroo = (16000000/(sagedus*bitval)) - 0,5;

// Setokroa väärtus nõuab lahutamist -1. Kuid lisades 0,5 ringi 0,5 täpsusega

// Taimeri eraldusvõime on piiratud

// Lõppkokkuvõttes määrab bitvalli suurus

cli (); // keelata katkestused // seada taimer2 katkestus

TCCR2A = 0; // määrake kogu TCCR2A register väärtuseks 0

TCCR2B = 0; // sama TCCR2B puhul

TCNT2 = 0; // lähtestada loenduri väärtus väärtuseks 0

// määrake võrdluse vasteregister sageduse (hz) juurdekasvude jaoks

OCR2A = setokroo; // = (16*10^6) / (sagedus*8) - 1 (peab olema <256)

// lülitage CTC -režiim sisse

TCCR2A | = (1 <WGM21); // Määra CS21 bit 8 eelskalerile

TCCR2B | = (1 <CS21); // lubage taimerite võrdlus katkestada

// TIMSK2 | = (1 << OCIE2A); // see toimib, nagu ka järgmine rida

sbi (TIMSK2, OCIE2A); // katkestuse lubamine taimeril 2

sei (); // katkestuste lubamine

Teadlikumad lugejad on märganud sbi (TIMSK2, OCIE2A)

Seadistan paar (Interneti kaudu omandatud) funktsiooni registribittide seadistamiseks ja kustutamiseks:

// Määrab registribittide kustutamiseks#ifndef cbi

#define cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))

#endif

// Määrab registribittide seadistamiseks

#ifndef sbi

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

#endif

Need funktsioonid võimaldavad katkestuse seadistamiseks või kustutamiseks hõlpsalt helistada.

Nii et katkestus töötab, mida me saame teha?

9. samm: katkestused ja kahekordne puhverdamine

Katkestused ja kahekordne puhverdamine
Katkestused ja kahekordne puhverdamine
Katkestused ja kahekordne puhverdamine
Katkestused ja kahekordne puhverdamine

Kiirusel 22 khz väljastatakse iga 0,045 ms tagant audioandmete bait

512 baiti (puhvri suurus) loetakse 2,08 ms jooksul.

Seega ei saa puhvrit ühe kirjutamistsükli jooksul SDCardilt lugeda.

Siiski kirjutatakse sadamasse 512 baiti 23,22 ms jooksul.

Nii et kõik, mida me peame tegema, on seadistada uus fail, mida loetakse iga kord, kui puhver tühjeneb, ja meil on piisavalt aega andmete hankimiseks enne uue andmeploki nõudmist … Eeldades, et kasutame kahte puhvrit, tühjendame ühe, kui täidame teist.

See on kahekordne puhverdamine.

Faili lugemist aeglustab korduv katkestamine, kuid see saab tehtud.

Mul on seadistatud kaks 512 -baitilist puhvrit bufa ja bufb.

Kui lipp on halb, loeme portast, vastasel juhul loeme portbist

Kui puhverpositsioon (bufcount) jõuab puhvri suurusele (BUF_SIZE 512), seadistame lipu readit väärtuseks true.

Tühjusringi rutiin otsib seda lippu ja alustab ploki lugemist:

if (readit) {if (! aready) {

// algatada SDCardi ploki lugemine bufaks

tempfile.read (bufa, BUF_SIZE);

} muud {

// algatada bufb -le loetud SDCardi plokk

tempfile.read (bufb, BUF_SIZE);

}

readit = vale;

}

Kui see on lõpetanud rutiinsed lipud readit = false.

Katkestusrutiini raames peame kontrollima, kas tühjustsükkel on lõppenud, kontrollides, kas readit == false.

Sel juhul anname märku, et on vaja uuesti lugeda, ja lülitame puhvrite vahetamiseks aready lipu.

Kui SD-kaarti veel loetakse, peame ühe näidu (loendur--; bufcount--;) tagastama ja katkestusest väljuma, et hiljem uuesti proovida. (Heliväljundi signaalil tehtud klõpsud viitavad sellele, et see on toimunud.)

Kui kõik andmed on loetud, katkestatakse katkestus, seadistatakse port uuesti keskpinge väärtusele 128 ja helifail suletakse.

Enne dac2.ino skripti esmakordset käivitamist seadke helitugevus 50%. See on liiga vali, kuid parem kui 100%!

Kui helitugevuse regulaator töötab tagurpidi, vahetage 10K potentsiomeetri vastassuunalised juhtmed.

Andke mulle teada, kuidas see kõlab.

Soovitan: