Sisällysluettelo:
- Vaihe 1: Vaatimukset
- Vaihe 2: Tekniset tiedot
- Vaihe 3: Aloittaminen
- Vaihe 4: Pieni piiri
- Vaihe 5: Ota ulos juotosraudasta
- Vaihe 6: DAC: n testaaminen
- Vaihe 7: Wav -otsikon lukeminen
- Vaihe 8: Keskeytä, keskeytä…
- Vaihe 9: Keskeytykset ja kaksinkertainen puskurointi
Video: Äänitiedostojen toistaminen (Wav) Arduinolla ja DAC: llä: 9 vaihetta
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 09:03
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
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
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
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
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
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
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 -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ä…
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
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:
Bluetooth RC -auto STM32F103C: llä ja L293D: llä - Edullinen: 5 vaihetta
Bluetooth RC -auto STM32F103C: llä ja L293D: llä - Edullista: Tein Bluetooth Arduino -auton, kuten tässä kuvattu, Ardumotive_com. Ongelmani olivat akut ja niiden paino sekä kustannukset. Sittemmin matkapuhelimien halvoista virtapankkeista on tullut erittäin edullisia. Kaikki mitä tarvitsen
Alexa Ääniohjattu Raspberry Pi Drone IoT: llä ja AWS: llä: 6 vaihetta (kuvilla)
Alexa Ääniohjattu Raspberry Pi Drone IoT: llä ja AWS: llä: Hei! Nimeni on Armaan. Olen 13-vuotias Massachusettsin poika. Tämä opetusohjelma näyttää, kuten voit päätellä otsikosta, kuinka rakentaa Raspberry Pi Drone. Tämä prototyyppi osoittaa, kuinka dronit kehittyvät ja kuinka suuri rooli niillä voi olla
Sisäkasvien kastelu NodeMCU: lla, paikallisella Blynk -palvelimella ja Blynk Apk: lla, säädettävä asetuspiste: 3 vaihetta
Sisäkasvien kastelu NodeMCU: lla, paikallisella Blynk -palvelimella ja Blynk Apk: llä, säädettävä asetuspiste: Olen rakentanut tämän projektin, koska sisäkasvieni on oltava terveitä, vaikka olen lomalla pitkään ja pidän ajatuksesta hallita tai ainakin seurata kaikkia mahdollisia asioita, joita kotona tapahtuu Internetin kautta
Puhuva Arduino - MP3 -tiedoston toistaminen Arduinolla ilman moduulia - Mp3 -tiedoston toistaminen Arduinosta PCM: llä: 6 vaihetta
Puhuva Arduino | MP3 -tiedoston toistaminen Arduinolla ilman moduulia | Mp3 -tiedoston toistaminen Arduinolta PCM: n avulla: Tässä ohjeessa opimme MP3 -tiedoston toistamisen arduinolla ilman äänimoduulia, tässä käytämme PCM -kirjastoa Arduinolle, joka toistaa 16 -bittistä PCM: ää 8 kHz: n taajuudella, joten voit tehdä tämän
Kappaleiden toistaminen Arduinolla ADC: n ja PWM: n käyttäminen Flyback -muuntajassa tai kaiuttimessa: 4 vaihetta
Toista kappaleita Arduinolla käyttämällä ADC: tä PWM: ään Flyback -muuntajassa tai kaiuttimessa: Hei kaverit, Tämä on toinen osa toisesta ohjeistuksestani (se oli paljon vaikeaa). Pohjimmiltaan tässä projektissa olen käyttänyt Arduinon ADC: tä ja AJASTIMIA Muunna äänisignaali PWM -signaaliksi.Tämä on paljon helpompaa kuin edellinen Instructa