Sisällysluettelo:

Äänitiedostojen toistaminen (Wav) Arduinolla ja DAC: llä: 9 vaihetta
Äänitiedostojen toistaminen (Wav) Arduinolla ja DAC: llä: 9 vaihetta

Video: Äänitiedostojen toistaminen (Wav) Arduinolla ja DAC: llä: 9 vaihetta

Video: Äänitiedostojen toistaminen (Wav) Arduinolla ja DAC: llä: 9 vaihetta
Video: Videoeditori - käyttöohje, Windows 10 | Video Editor - User Guide 2024, Marraskuu
Anonim
Äänitiedostojen toistaminen (Wav) Arduinolla ja DAC: llä
Äänitiedostojen toistaminen (Wav) Arduinolla ja DAC: llä
Äänitiedostojen toistaminen (Wav) Arduinolla ja DAC: llä
Äänitiedostojen toistaminen (Wav) Arduinolla ja DAC: llä
Äänitiedostojen toistaminen (Wav) Arduinolla ja DAC: llä
Äänitiedostojen toistaminen (Wav) Arduinolla ja DAC: llä

Toista wav -tiedoston ääni Audino SD -kortilta. Tämä opetusohjelma näyttää, kuinka SdCard -kortin wav -tiedosto voidaan toistaa yksinkertaisen piirin kautta kaiuttimelle.

Wav -tiedoston on oltava 8 -bittinen mono. Minulla ei ole ollut ongelmia 44 kHz: n tiedostojen toistamisessa.

Vaikka se ei ole hi-fidelity, äänenlaatu on erittäin tyydyttävä.

Sarjanäyttöä käytetään tiedoston valitsemiseen. Tiedostojen on oltava kansiossa nimeltä adlog.

Tämä ohje on peräisin aiemmasta projektista, jossa tallensin wav-tallenteita SdCard-kortille:

Piiri käyttää halpaa 8 -bittistä digitaalista analogiamuunninta (DAC) ja yhden sirun äänivahvistinta.

Keskeiset osiot keskeytysten määrittämiseen on otettu Amanda Ghassaei'n erinomaisesta artikkelista:

Vaihe 1: Vaatimukset

Vaatimukset
Vaatimukset
Vaatimukset
Vaatimukset

Arduino- Käytän Megaa, mutta ei ole mitään syytä, miksi Unon ei pitäisi toimia.

SdCard-lukija-ohjelma on määritetty: MicroSD Breakout Board -laitteelle, joka on säännelty Logic Conversion V2: lla

Katso tästä ohjeesta SdCard-asennustiedot:

DAC0832 LCN- erinomainen 8-bittinen digitaalinen analogiamuunnin- Muutama kilo.

LM386 N-1 Op-vahvistin- halpa pelimerkkeinä

20 -suuntainen siruliitin

8 -suuntainen siruliitin

9 voltin virtalähde- akku riittää.

LM336 2,5 V: n jänniteohje

10uF kondensaattori * 3 (mikä tahansa jännite yli 9 V)

10 ohmin vastus

50nF kondensaattori- (Tai jossain lähellä 47nF, 56nf, 68nf- kelpaa)

220uF kondensaattori

64 ohmin kaiutin

10K lineaarinen potentiometri

Kaapeli yhdistämään 8 datalinjaa Arduinon ja piirin välille

Unossa 8 liitäntää on linjassa, Megassa pareittain.

Megassa käytin 10 -suuntaista nauhakaapelia 10 -suuntaisella IDC -otsikolla. (2 johtoa vapaana)

Pistokeliittimet 0V, 9V ja DAC -lähtöille

Kuparinauhalevy, juote, lanka, leikkurit jne

Vaihe 2: Tekniset tiedot

Tekniset tiedot
Tekniset tiedot

Sarjanopeus 115200 baudia.

Tukea on saatavilla Mega -tekniikkaa käyttävälle Hobbytronics MicroSD Breakout Boardille. Sirun valinta ja muut portit muuttuvat Megan ja Unon välillä.

Wav-tiedostojen on oltava olemassa hakemistossa nimeltä adlog- Voit nimetä sen muuksi ja järjestää tarvittavan koodauksen uudelleen.

Wav -tiedoston on oltava 8 -bittinen mono. Olen testannut jopa 44 kHz.

Sarjamonitori näyttää wav -tiedostot adlog -kansiossa. Tiedostonimet lähetetään näytön tulostusriviltä.

Tiedoston kokoa rajoittaa vain SdCard -koko.

Vaihe 3: Aloittaminen

Päästä alkuun
Päästä alkuun

Liitä SD -kortinlukija. Nämä ovat Megan liitännät.

0, 5V

CLK nastaan 52

D0 - nasta 50

D1 - nasta 51

CS nastaan 53

(Katso Uno -porttiyhteys toimittajien verkkosivustolta)

Haluat testata, että korttisi toimii tässä vaiheessa- käytä myyjän toimittamia skriptejä.

Meidän on tehtävä pieni piiri

Lähetämme äänitavuvirran Arduinosta.

Nämä luvut ovat välillä 0 ja 255. Ne edustavat jännitettä.

Hiljaisuus on 127-128.

255 on kaiutinkartio kova.

0 on kaiutinkartio kova toisinpäin.

Ääni tallennetaan siis tallennetuina numeroina, jotka luovat vaihtelevia jännitteitä ja luovat liikkuvia kaiutinkartioita.

Voimme lähettää numerot kahdeksasta rivistä Arduinolla samanaikaisesti käyttämällä "porttia".

Jos syötämme 8 riviä digitaalista analogiamuuntimeen, se tekee sen, mitä se sanoo tinaan, ja tuottaa analogisen jännitteen, joka on verrannollinen digitaaliseen numeroon.

Meidän tarvitsee vain pakata jännite pieneen operaatiovahvistimeen ja sitten kaiuttimeen.

Vaihe 4: Pieni piiri

Pieni piiri
Pieni piiri
Pieni piiri
Pieni piiri
Pieni piiri
Pieni piiri
Pieni piiri
Pieni piiri

DAC0832 LCN

Tämä on erinomainen, halpa 8 -bittinen digitaalinen analogiamuunnin. (DAC)

Sitä voidaan täysin hallita joukolla datanpitoa, datanäytelinjoja.

Tai se voidaan määrittää tekemään kaikki automaattisesti "Virtaus toiminnassa".

Lainaan käyttöohjetta:

Yksinkertaisesti maadoitetut CS, WR1, WR2 ja XFER ja sitominen ILE high mahdollistavat molemmat sisäiset rekisterit seuraamaan käytettyjä digitaalituloja (läpivirtaus) ja vaikuttamaan suoraan DAC-analogilähtöön.

OK, neljä liitäntää sirulle on matala ja yksi 9 V: lle - helppoa.

Emme halua negatiivisia jännitteitä, joten käsikirja sanoo, että meidän pitäisi käyttää "jännitekytkentätilaa" ja ne toimittavat kaavion.

Meidän tarvitsee vain korvata pieni äänivahvistin heidän ehdottamansa vahvistimen sijasta.

LM386-N-äänivahvistin

Vahvistimen käsikirja sisältää vähimmäisosakaavion, joka antaa 20 vahvistuksen (liian paljon meille- mutta siinä on äänenvoimakkuuden säätö).

Meidän tarvitsee vain lisätä kondensaattori DAC: n ja vahvistimen väliin, jotta vahvistamme vain AC -signaaleja.

Meidän on myös lisättävä pari kondensaattoria lähelle jokaisen sirumme syöttötappia, muuten saamme huminaa 9 V: n virtalähteestämme.

Vaihe 5: Ota ulos juotosraudasta

Ota ulos juotosraudasta
Ota ulos juotosraudasta
Ota ulos juotosraudasta
Ota ulos juotosraudasta
Ota ulos juotosraudasta
Ota ulos juotosraudasta

Koska piiri on yksinkertainen, en aio antaa iskua isku -tilillä.

Tässä muutamia vihjeitä:

  • Valmistele pala kuparilevylevyä, jossa on vähintään 28 x 28 reikää. (Kyllä, tiedän, että aivokirurgit voivat pienentää sitä)
  • Jos aiot asentaa sen ruuveilla, anna niiden olla alussa!
  • Kiinnitä sirut pistorasioihin. Aseta pelimerkit vasta, kun kaikki on tarkistettu.
  • Pidä tulojohdot kaukana lähdöstä.
  • Noudata kondensaattoreiden oikeaa napaisuutta.
  • Katso kaaviosta LM336 -jänniteohjeen pohjakuva. Säätöjalkaa ei käytetä ja se voidaan leikata.
  • Huomaa suora yhteys DAC-nastaan 8- Se on erittäin hyödyllinen testauksessa.
  • Yhdistin Audinoon nauhakaapelilla ja 10 -suuntaisella IDC -liittimellä.
  • Uno -liitännät ovat suorassa linjassa - saatat huomata, että 8 tuloliitännän järjestäminen yhdeksi suoraksi mahdollistaa yhteyden Arduinoon ostetun, valmiiden 8 -suuntaisen liittimen avulla,

Kun se on tehty- tarkista juotos ja tarkista kuparikiskojen väliset raot.

Minusta 36 tpi: n juniori -hakkerisahanterä on erittäin hyödyllinen roskien puhdistamiseen. Irrotan terän paikannustapit ja työnnän terän kärjen rataan- Ilmeisesti terä ei ole kehyksessä.

Vaihe 6: DAC: n testaaminen

DAC: n testaus
DAC: n testaus

Jätä piirin ja Arduinon välinen yhteys pois päältä.

Aseta piirisi äänenvoimakkuuden säädin puoliväliin.

Kytke 9 V: n tasavirta uuteen piiriin.

Tarkista, että piiri on kunnossa- en voi ottaa vastuuta piiristäsi!

Virta pois

Liitä piiri Arduinoon.

Käytä Mega-nastoja 22-29. (PORTA) Älä erehdy yllä olevien 5 V: n nastojen kanssa!

Käytä Unossa nastoja 0-7. Tämä on PORTD

Liitä virtalähteen 0V Arduinon 0V -jännitteeseen.

Käynnistää.

Avaa tämä testiohjelma DAC_TEST

Korvaa UNO: ssa kaikki viittaukset PORTAAN PORTD

Korvaa DDRA DDRD: llä- tämä ohje asettaa kaikki 8 riviä lähtöön kerralla. Tämä on tietojen suuntarekisteri.

Aseta sarjamonitori arvoon 115200.

Kytke voltimittari DAC -ulostulon ja OV: n väliin

Ohjelma asettaa lähdön arvoon 255 - kaikki linjat päällä - maksimijännite.

Lähtö 128- puolet maksimijännitteestä.

Lähtö 0- nollajännite (tai luultavasti lähes nolla).

Sitten se siirtyy bittikohtaisesti: 1, 2, 4, 8, 16, 32, 64, 128

Jännitteen pitäisi kasvaa tasaisesti.

Jos jännite laskee takaisin numeron kasvaessa, luultavasti kaksi kytkentäjohtoa on käännetty toisinpäin.

Sinun pitäisi myös kuulla kaiuttimen hiljainen naksahdus jännitteen muuttuessa

Vaihe 7: Wav -otsikon lukeminen

Wav -otsikon lukeminen
Wav -otsikon lukeminen

Wav -tiedostot tallennetaan määrätyllä taajuudella ja datakoolla.

Nämä tiedot sisältyvät 44 tavun otsikkoon wav -tiedoston alussa.

Vaikka jotkin ohjelmistot laajentavat otsikkoa (tavun 35 jälkeen), vaikeuttavat datakoon sijainnin löytämistä.

Otsikon lukemiseksi luomme puskurin ja kopioimme tiedoston alun.

Taajuus tallennetaan 4 tavuun alkaen 24 tavusta tiedostoon.

// lukutaajuus määritetty wav -tiedoston otsikossa

tavu headbuf [60]

tempfile.seek (0);

tempfile.read (headbuf, 60);

retval = headbuf [27];

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

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

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

Serial.print (F ("Tiedoston taajuus"));

Serial.print (uusinta);

Paras tapa löytää datakokotiedot on etsiä otsikosta sana "data".

Pura sen jälkeen 4 tavua, jotka muodostavat pitkän arvon

allekirjoittamaton pitkä toistoaika;

int mypos = 40;

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

jos (headbuf == 'd') {

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

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

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

// vihdoinkin meillä on se

mypos = i+4;

i = 60;

}

}

}

}

}

tempfile.seek (mypos);

retval = headbuf [mypos+3];

retval = (uusinta << 8) | headbuf [mypos+2];

retval = (uusinta << 8) | headbuf [mypos+1];

retval = (uusinta << 8) | headbuf [mypos];

OK, meillä on datan pituus ja taajuus!

Audiodata seuraa 4 tavua, jotka muodostavat datan pituusarvon.

Vaihe 8: Keskeytä, keskeytä…

Keskeytä, keskeytä…
Keskeytä, keskeytä…

Käytämme taajuustietoja luodaksemme ohjelmiston keskeytyksen vaaditulla taajuudella tai lähellä sitä.

Keskeytystä ei voi aina asettaa tarkasti, mutta se riittää. Tiedostosta luettu taajuus välitetään setintrupt -aliohjelmalle.

void setintrupt (float freq) {float bitval = 8; // 8 8 -bittisille ajastimille 0 ja 2, 1024 ajastimelle 1 tavu

setokroo = (16000000/(taajuus*bittiarvo)) - 0,5;

// Setokroa -arvo vaatii vähennyksen -1. Kuitenkin lisätään 0,5 kierrosta lähimpään 0,5: een

// Ajastimen resoluutio on rajoitettu

// Lopulta määräytyy bittivalon suuruuden mukaan

cli (); // poista keskeytykset käytöstä // aseta timer2 keskeytys

TCCR2A = 0; // aseta koko TCCR2A -rekisteri arvoon 0

TCCR2B = 0; // sama TCCR2B: lle

TCNT2 = 0; // alustetaan laskurin arvoksi 0

// aseta vertaa ottelurekisteriä taajuuden (hz) lisäyksille

OCR2A = setokroo; // = (16*10^6) / (taajuus*8) - 1 (on oltava <256)

// kytke CTC -tila päälle

TCCR2A | = (1 << WGM21); // Aseta CS21 -bitti 8 esiskaalaimelle

TCCR2B | = (1 << CS21); // ota ajastinvertailun keskeytys käyttöön

// TIMSK2 | = (1 << OCIE2A); // tämä toimii, kuten myös seuraava rivi

sbi (TIMSK2, OCIE2A); // ota keskeytys käyttöön ajastimessa 2

sei (); // ottaa keskeytykset käyttöön

Vaativat lukijat ovat havainneet sbi: n (TIMSK2, OCIE2A)

Asetin pari (Internetistä hankittua) toimintoa rekisteribittien asettamiseen ja tyhjentämiseen:

// Määrittää rekisteribittien tyhjennyksen#ifndef cbi

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

#loppu Jos

// Määrittää rekisteribittien asettamisen

#ifndef sbi

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

#loppu Jos

Nämä toiminnot tarjoavat helpon puhelun keskeytyksen asettamiseksi tai poistamiseksi.

Joten keskeytys on käynnissä, mitä voimme tehdä sen tekemään?

Vaihe 9: Keskeytykset ja kaksinkertainen puskurointi

Keskeytykset ja kaksinkertainen puskurointi
Keskeytykset ja kaksinkertainen puskurointi
Keskeytykset ja kaksinkertainen puskurointi
Keskeytykset ja kaksinkertainen puskurointi

22 KHz: n taajuudella äänitietoja lähetetään 0,045 ms: n välein

512 tavua (puskurikoko) luetaan 2,08 ms: ssa.

Puskuria ei siis voi lukea SDCard -kortilta yhdessä kirjoitusjaksossa.

Kuitenkin 512 tavua kirjoitetaan porttiin 23,22 ms: n kuluessa.

Joten meidän tarvitsee vain asentaa uusi tiedosto, joka luetaan joka kerta, kun puskuri tyhjenee, ja meillä on tarpeeksi aikaa saada tiedot ennen uuden tietolohkon tarvitsemista… Olettaen, että käytämme kahta puskuria, tyhjennämme toisen täytettäessä.

Tämä on kaksinkertainen puskurointi.

Toistuva keskeytys hidastaa tiedoston lukemista, mutta se suoritetaan.

Olen asentanut kaksi 512 tavun puskuria nimeltä bufa ja bufb.

Jos lippu ei ole totta, luemme portasta, muuten luemme portista

Kun puskuripaikka (bufcount) saavuttaa puskurin koon (BUF_SIZE 512), asetamme readit -nimisen lipun arvoksi true.

Void loop -rutiini etsii tätä lippua ja aloittaa lohkon lukemisen:

if (readit) {if (! aready) {

// aloittaa SDCard -lohkon lukemisen bufaksi

tempfile.read (bufa, BUF_SIZE);

} muuta {

// aloittaa SDCard -lohkon lukemisen bufb: lle

tempfile.read (bufb, BUF_SIZE);

}

luku = väärä;

}

Kun se on suorittanut rutiiniliput readit = false.

Keskeytysrutiinin sisällä meidän on tarkistettava, että tyhjä silmukka on päättynyt, tarkistamalla, onko readit == false.

Tässä tapauksessa ilmoitamme, että tarvitaan toinen luku, ja vaihdamme aready -lipun puskureiden vaihtamiseksi.

Jos SD-kortti lukee edelleen, meidän on palautettava yksi lukema (laskuri--; bufcount--;) ja poistuttava keskeytyksestä yrittääksesi myöhemmin uudelleen. (Audiosignaalin napsautukset osoittavat, että näin on tapahtunut.)

Kun kaikki tiedot luetaan, keskeytys peruutetaan, portti asetetaan uudelleen keskijännitearvoon 128 ja äänitiedosto suljetaan.

Ennen kuin suoritat dac2.ino -komentosarjan ensimmäistä kertaa, aseta äänenvoimakkuudeksi 50%. Tämä on liian kovaa, mutta se on parempi kuin 100%!

Jos äänenvoimakkuuden säätö toimii taaksepäin, vaihda 10K -potentiometrin vastakkaisissa päissä olevat johdot.

Kerro minulle, miltä se kuulostaa.

Suositeltava: