Kazalo:

Predvajanje zvočnih zvočnih datotek (Wav) z Arduinom in DAC -om: 9 korakov
Predvajanje zvočnih zvočnih datotek (Wav) z Arduinom in DAC -om: 9 korakov

Video: Predvajanje zvočnih zvočnih datotek (Wav) z Arduinom in DAC -om: 9 korakov

Video: Predvajanje zvočnih zvočnih datotek (Wav) z Arduinom in DAC -om: 9 korakov
Video: Dodajanje zvočnih sledi (Audacity) 2024, November
Anonim
Predvajanje zvočnih zvočnih datotek (Wav) z Arduinom in DAC -om
Predvajanje zvočnih zvočnih datotek (Wav) z Arduinom in DAC -om
Predvajanje zvočnih zvočnih datotek (Wav) z Arduinom in DAC -om
Predvajanje zvočnih zvočnih datotek (Wav) z Arduinom in DAC -om
Predvajanje zvočnih zvočnih datotek (Wav) z Arduinom in DAC -om
Predvajanje zvočnih zvočnih datotek (Wav) z Arduinom in DAC -om

Predvajajte zvočno datoteko wav s kartice Audino SD. Ta Instructable vam bo pokazal, kako lahko datoteko wav na vaši kartici SdCard predvajate prek preprostega vezja do zvočnika.

Datoteka wav mora biti 8 -bitna mono. Nisem imel težav pri predvajanju datotek 44 KHz.

Čeprav ni vrhunske zvestobe, je kakovost zvoka zelo zadovoljiva.

Za izbiro datoteke se uporablja serijski monitor. Datoteke morajo biti v mapi, imenovani adlog.

To navodilo izhaja iz prejšnjega projekta, kjer sem shranil posnetke wav na kartico SdCard:

Vezje uporablja poceni 8 -bitni digitalno -analogni pretvornik (DAC) in avdio ojačevalnik z enim čipom.

Ključni odseki za nastavitev prekinitev so bili vzeti iz odličnega članka Amande Ghassaei:

1. korak: Zahteve

Zahteve
Zahteve
Zahteve
Zahteve

Arduino- uporabljam Mega, vendar ni razloga, da Uno ne bi deloval.

Čitalnik kartic SdCard-program je konfiguriran za: MicroSD Breakout Board, reguliran z logično pretvorbo V2

Za podrobnosti o nastavitvi kartice SdCard si oglejte ta navodila:

DAC0832 LCN- odličen 8-bitni digitalno-analogni pretvornik- nekaj kilogramov.

LM386 N-1 Op amp- poceni kot čipi

20 -smerna vtičnica za čipe

8 -smerna vtičnica za čipe

9-voltno napajanje- zadostuje baterija.

LM336 2,5 V referenčna napetost

10uF kondenzator * 3 (vsaka napetost večja od 9V)

10 ohmski upor

50nF kondenzator- (Ali pa bo blizu 47nF, 56nf, 68nf- bo)

220uF kondenzator

64 ohmski zvočnik

10K linearni potenciometer

Kabel za povezavo 8 podatkovnih linij med Arduinom in vezjem-

Na Unu je 8 povezav v vrsti, na Megi pa v parih.

Na Megi sem uporabil 10 -smerni tračni kabel z 10 -smerno IDC glavo. (2 žici sta rezervni)

Vtični priključki za 0V, 9V in DAC izhod

Bakrena tračna plošča, spajkanje, žica, rezalniki itd

2. korak: Specifikacije

Specifikacije
Specifikacije

Serijsko nastavljeno na 115200 baud.

Obstaja podpora za Hobbytronics MicroSD Breakout Board, ki uporablja Mega. Izbira čipa in druga vrata se bodo spremenila med Mega in Uno.

Datoteke Wav morajo obstajati v imeniku, imenovanem adlog. Pokličite ga drugače in znova uredite potrebno kodiranje.

Datoteka wav mora biti 8 -bitna mono. Testiral sem do 44KHz.

Serijski monitor prikazuje datoteke wav v mapi adlog. Imena datotek se pošiljajo iz izhodne vrstice monitorja.

Velikost datoteke je omejena le z velikostjo kartice SdCard.

3. korak: Začnite

Začetek
Začetek

Priključite bralnik kartic SD. To so povezave za Mega.

0, 5V

CLK na pin 52

D0 na pin 50

D1 na pin 51

CS na pin 53

(Za povezavo vrat Uno glejte spletno stran dobaviteljev)

Na tej stopnji boste želeli preveriti, ali vaša kartica deluje- uporabite skripte, ki jih dobavi prodajalec.

Moramo narediti majhno vezje

Poslali bomo tok zvočnih bajtov iz Arduina.

Te številke so med 0 in 255. Predstavljajo napetost.

Tišina je 127-128.

255 je trden enosmerni stožec zvočnika.

0 je zvočnik stožca drugače.

Tako se zvok snema kot shranjene številke, ki ustvarjajo različne napetosti, ki ustvarjajo gibljive stožce zvočnikov.

Številke iz 8 vrstic na Arduinu lahko pošljemo hkrati z uporabo "vrat".

Če vnesemo 8 linij v digitalno -analogni pretvornik, naredi tisto, kar piše na pločevinki, in proizvede analogno napetost, ki je sorazmerna z digitalno številko.

Vse, kar moramo storiti, je, da napetost izklopimo na majhen operacijski ojačevalnik in nato na zvočnik.

4. korak: Majhno vezje

Majhno vezje
Majhno vezje
Majhno vezje
Majhno vezje
Majhno vezje
Majhno vezje
Majhno vezje
Majhno vezje

DAC0832 LCN

To je odličen, poceni 8 -bitni digitalno -analogni pretvornik. (DAC)

V celoti ga je mogoče nadzorovati z vrsto podatkovnih linij za vzorčenje podatkov.

Ali pa lahko nastavite, da vse to naredi samodejno v "Pretok skozi operacijo".

Če citiram priročnik:

Preprosto ozemljitev CS, WR1, WR2 in XFER ter visoko vezava ILE omogoča, da oba notranja registra sledita uporabljenim digitalnim vhodom (pretočno) in neposredno vplivata na analogni izhod DAC.

V redu, to je štiri povezave z nizkim nizom čipov in ena nastavljena na 9V - enostavno.

Ne želimo, da bi prišlo do negativnih napetosti, zato v priročniku piše, da moramo uporabiti "način preklopa napetosti", ki podaja diagram.

Vse, kar moramo storiti, je, da namesto tistega, ki ga predlagajo, zamenjamo majhen zvočni ojačevalnik.

Zvočni ojačevalnik LM386-N

Navodilo za ojačevalnik vsebuje diagram minimalnih delov- zagotavlja dobiček 20 (za nas je preveč, vendar ima nadzor glasnosti).

Vse, kar moramo storiti, je, da med DAC in ojačevalnikom dodamo kondenzator, tako da ojačamo samo izmenične signale.

Poleg napajalnega zatiča vsakega čipa moramo dodati tudi nekaj kondenzatorjev, sicer bomo iz naše 9V napajalne napetosti.

5. korak: Odstranite spajkalnik

Odstranite spajkalnik
Odstranite spajkalnik
Odstranite spajkalnik
Odstranite spajkalnik
Odstranite spajkalnik
Odstranite spajkalnik

Ker je vezje preprosto, ne nameravam zadati udarca.

Tu je nekaj napotkov:

  • Pripravite kos bakrene trakove najmanj 28 x 28 lukenj. (Ja, vem, da ga možganski kirurgi lahko zmanjšajo)
  • Če ga nameravate pritrditi z vijaki, jih dovolite na začetku!
  • Namestite čipe na vtičnice. Žetone vstavite šele, ko je vse preverjeno.
  • Vhodne žice držite stran od izhoda.
  • Upoštevajte pravilno polariteto kondenzatorjev.
  • Za osnovni pogled referenčne napetosti LM336 glejte diagram. Nastavljiva noga se ne uporablja in jo je mogoče rezati.
  • Upoštevajte neposredno povezavo z zatičem 8 DAC- To je zelo uporabno za testiranje.
  • Na Audino sem se povezal s trakovnim kablom in 10 -smernim IDC priključkom.
  • Na Unu so povezave v ravni črti - morda boste ugotovili, da razporeditev 8 vhodnih povezav v eno samo ravno črto omogoča povezavo z Arduinom s kupljenim, že pripravljenim 8 -smernim priključkom,

Ko je končano- preverite spajkanje in preverite vrzeli med bakrenimi tirnicami.

Se mi zdi, da je list žage za mlajše žage velikosti 36 tpi za čiščenje naplavin. Odstranim zatiče za rezanje rezila in potisnem konico rezila v tirnico- očitno rezilo ni v okvirju.

6. korak: Preizkusite DAC

Testiranje DAC -a
Testiranje DAC -a

Pustite povezavo med vezjem in Arduinom izključeno.

Nastavite glasnost na svojem vezju na sredino.

Vklopite 9V DC napajanje v novo vezje.

Preverite, ali je vezje v redu- ne prevzemam nobene odgovornosti za vaše vezje!

Ugasniti

Priključite vezje na Arduino.

Na Megi uporabite zatiče 22-29. (PORTA) Ne zamenjujte zgornjih dveh 5V zatičev!

Na Uno uporabite zatiče 0-7. To je PORTD

Priključite 0V vašega napajalnika na 0V na Arduinu.

Prižgi.

Odprite ta preskusni program DAC_TEST

Za UNO zamenjajte vse sklice na PORTA na PORTD

Zamenjajte DDRA z DDRD- to navodilo nastavi, da se vseh 8 vrstic prikaže naenkrat. To je register smeri podatkov.

Serijski monitor nastavite na 115200.

Priključite voltmeter med izhodom DAC in OV

Program bo nastavil izhod na 255 - vse vrstice vklopljene - največja napetost.

Izhodna 128- pol največja napetost.

Izhodna napetost 0- nič (ali verjetno skoraj nič).

Nato bo stopal po korakih: 1, 2, 4, 8, 16, 32, 64, 128

Napetost se mora stalno povečevati.

Če napetost upade, medtem ko se število poveča, imate verjetno obrnjeni dve medsebojno povezani žici.

Prav tako bi morali slišati, kako zvočnik tiho klikne, ko se napetost spremeni

7. korak: branje glave Wav

Branje glave Wav
Branje glave Wav

Datoteke Wav se shranijo z določeno frekvenco in velikostjo podatkov.

Ti podatki so v 44 -bajtni glavi na začetku datoteke wav.

Čeprav nekatera programska oprema razširja glavo (po bajtu 35), zaradi česar je težje najti lokacijo velikosti podatkov.

Za branje glave ustvarimo medpomnilnik in kopiramo začetek datoteke.

Frekvenca je shranjena v 4 bajtih, začenši 24 bajtov v datoteko.

// branje frekvence, navedene v glavi datoteke wav

bajtov headbuf [60]

tempfile.seek (0);

tempfile.read (pokrivalo za glavo, 60);

retval = pokrivalo za glavo [27];

retval = (retval << 8) | pokrivalo za glavo [26];

retval = (retval << 8) | pokrivalo za glavo [25];

retval = (retval << 8) | pokrivalo za glavo [24];

Serial.print (F ("Pogostost datoteke"));

Serial.print (retval);

Najboljši način za iskanje podatkov o velikosti podatkov je iskanje besede "podatki" v glavi.

Nato izvlecite 4 bajte, ki sledijo, ki sestavljajo dolgo vrednost

dolg podpis brez podpisa;

int mypos = 40;

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

if (headbuf == 'd') {

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

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

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

// končno ga imamo

mypos = i+4;

i = 60;

}

}

}

}

}

tempfile.seek (mypos);

retval = headbuf [mypos+3];

retval = (retval << 8) | pokrivalo za glavo [mypos+2];

retval = (retval << 8) | pokrivalo za glavo [mypos+1];

retval = (retval << 8) | pokrivalo za glavo [mypos];

V redu imamo dolžino in pogostost podatkov!

Zvočni podatki sledijo 4 bajtom, ki sestavljajo vrednost dolžine podatkov.

8. korak: Prekini, Prekini …

Prekini, Prekini …
Prekini, Prekini …

Podatke o frekvenci uporabljamo za ustvarjanje programske prekinitve na zahtevani frekvenci ali blizu nje.

Prekinitve ni mogoče vedno natančno nastaviti, vendar je dovolj. Odčitana frekvenca iz datoteke se prenese v podprogram setintrupt.

void setintrupt (float freq) {float bitval = 8; // 8 za 8 -bitne časovnike 0 in 2, 1024 za 1 -časovni timer

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

// Vrednost setocroa zahteva odštevanje -1. Vendar dodamo 0,5 kroga najbližjemu 0,5

// Ločljivost časovnika je omejena

// Končno določeno z velikostjo bitvala

cli (); // onemogoči prekinitve // nastavi timer2 prekinitev

TCCR2A = 0; // nastavimo celoten register TCCR2A na 0

TCCR2B = 0; // enako za TCCR2B

TCNT2 = 0; // inicializiramo vrednost števca na 0

// nastavimo primerjavo registra ujemanja za frekvence (hz)

OCR2A = setocroa; // = (16*10^6) / (frekvenca*8) - 1 (mora biti <256)

// vklop načina CTC

TCCR2A | = (1 << WGM21); // Nastavite bit CS21 za 8 predkalerjev

TCCR2B | = (1 << CS21); // omogoči časovnik za primerjavo prekinitve

// TIMSK2 | = (1 << OCIE2A); // to deluje, prav tako kot naslednja vrstica

sbi (TIMSK2, OCIE2A); // omogoči prekinitev pri časovniku 2

sei (); // omogoči prekinitve

Preudarni bralci bodo opazili sbi (TIMSK2, OCIE2A)

Nastavil sem nekaj (z internetom pridobljenih) funkcij za nastavitev in brisanje registrskih bitov:

// Določa brisanje registrskih bitov#ifndef cbi

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

#endif

// Določa nastavitev registrskih bitov

#ifndef sbi

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

#endif

Te funkcije omogočajo enostaven klic za nastavitev ali brisanje prekinitve.

Torej se prekinitev izvaja, kaj lahko naredimo?

9. korak: Prekinitve in dvojno medpomnjenje

Prekinitve in dvojno medpomnjenje
Prekinitve in dvojno medpomnjenje
Prekinitve in dvojno medpomnjenje
Prekinitve in dvojno medpomnjenje

Pri 22 Khz se bajt zvočnih podatkov izpiše vsakih 0,045 ms

512 bajtov (velikost vmesnega pomnilnika) se prebere v 2,08 ms.

Tako medpomnilnika ni mogoče prebrati s kartice SD v enem ciklu pisanja.

Vendar je 512 bajtov zapisanih v vrata v 23,22 ms.

Vse, kar moramo storiti, je, da vsakič, ko se vmesni pomnilnik izprazni, nastavimo novo datoteko za branje in imamo dovolj časa, da dobimo podatke, preden je potreben nov podatkovni blok … Ob predpostavki, da uporabljamo dva medpomnilnika, enega izpraznimo, ko zapolnimo drugega.

To je dvojno pufranje.

Branje datoteke se bo zaradi ponavljajoče se prekinitve upočasnilo, vendar bo to storjeno.

Namestil sem dva 512 -bajtna medpomnilnika, imenovana bufa in bufb.

Če je zastavica aready res, beremo iz porta, sicer pa iz portb

Ko položaj medpomnilnika (bufcount) doseže velikost medpomnilnika (BUF_SIZE 512), zastavico readit nastavimo na true.

Rutina zanke void poišče to zastavico in začne prebrati blok:

if (readit) {if (! aready) {

// sproži branje kartice SDCard v bufa

tempfile.read (bufa, BUF_SIZE);

} drugo {

// sproži branje kartice SDCard v bufb

tempfile.read (bufb, BUF_SIZE);

}

readit = false;

}

Ko konča, rutinske zastavice readit = false.

Znotraj rutine prekinitev moramo preveriti, ali je zanka void končana, tako da preverimo, ali je readit == false.

V tem primeru signaliziramo, da je potrebno še eno branje, in preklopimo zastavico aready za preklop medpomnilnikov.

Če kartica SD še bere, moramo slediti enemu odčitku (števec--; bufcount--;) in zapustiti prekinitev, da poskusimo znova pozneje. (Kliki v izhodnem zvočnem signalu pomenijo, da se je to zgodilo.)

Ko so vsi podatki prebrani, se prekinitev prekliče, vrata se znova nastavijo na srednjo vrednost napetosti 128 in zvočna datoteka se zapre.

Preden prvič zaženete skript dac2.ino, nastavite glasnost na 50%. To bo preglasno, vendar je bolje kot 100%!

Če vaš regulator glasnosti deluje v obratni smeri, zamenjajte kable na nasprotnih koncih 10K potenciometra.

Povej mi, kako se sliši.

Priporočena: