Kazalo:
- 1. korak: Zahteve
- 2. korak: Specifikacije
- 3. korak: Začnite
- 4. korak: Majhno vezje
- 5. korak: Odstranite spajkalnik
- 6. korak: Preizkusite DAC
- 7. korak: branje glave Wav
- 8. korak: Prekini, Prekini …
- 9. korak: Prekinitve in dvojno medpomnjenje
Video: Predvajanje zvočnih zvočnih datotek (Wav) z Arduinom in DAC -om: 9 korakov
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:07
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
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
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
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
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
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
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
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 …
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
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:
Kako ustvariti avdiofilski stereo radijski predvajalnik Forda za predvajanje datotek Mp3: 7 korakov
Kako ustvariti Fordove avdiofilske stereo radijske predvajalne datoteke Mp3 ) tovarniški stereo, tako da lahko zapisujete in uživate v datotekah MP3 na CD-ju
Pogovorni Arduino - Predvajanje MP3 z Arduinom brez modula - Predvajanje datoteke MP3 iz Arduina z uporabo PCM: 6 korakov
Pogovorni Arduino | Predvajanje MP3 z Arduinom brez modula | Predvajanje datoteke MP3 iz Arduina z uporabo PCM: V tem navodilu se bomo naučili predvajati datoteko mp3 z arduinom brez uporabe zvočnega modula, tukaj bomo uporabili knjižnico PCM za Arduino, ki predvaja 16 -bitni PCM s frekvenco 8 kHz, zato naredimo to
Minimalna škatla zvočnih učinkov Arduino: 5 korakov
Minimal Arduino Box Effect Box: To je hiter projekt škatle za zvočne učinke. Naprava prebere vnaprej posneto datoteko wav iz kartice microSD, dodeljene določenemu gumbu, in jo predvaja ob pritisku
Predvajanje pesmi (MP3) z Arduinom z uporabo PWM na zvočniku ali povratnem transformatorju: 6 korakov (s slikami)
Predvajajte pesmi (MP3) z Arduinom z uporabo PWM na zvočniku ali Flyback Transformerju: Pozdravljeni fantje, to je moj prvi pouk, upam, da vam bo všeč !! V bistvu sem v tem projektu uporabil serijsko komunikacijo med mojim Arduinom in prenosnim računalnikom, za prenos glasbenih podatkov iz prenosnega računalnika v Arduino. In z uporabo Arduino TIMERS t
Kako sestaviti predvajalnik zvočnih knjig za svojo babico: 8 korakov (s slikami)
Kako sestaviti predvajalnik zvočnih knjig za svojo babico: Večina avdio predvajalnikov, ki so na voljo na trgu, so ustvarjeni za mlade in njihova glavna funkcija je predvajanje glasbe. So majhne in imajo več funkcij, kot so naključno predvajanje, ponavljanje, radio in celo predvajanje videa. Vse te funkcije omogočajo priljubljeno predvajanje