Sadržaj:

Reprodukcija audiozvučnih datoteka (Wav) s Arduinom i DAC -om: 9 koraka
Reprodukcija audiozvučnih datoteka (Wav) s Arduinom i DAC -om: 9 koraka

Video: Reprodukcija audiozvučnih datoteka (Wav) s Arduinom i DAC -om: 9 koraka

Video: Reprodukcija audiozvučnih datoteka (Wav) s Arduinom i DAC -om: 9 koraka
Video: Дождь на баскетбольной площадке l высококачественный аудиофайл в формате wav - звуки дождя 2024, Srpanj
Anonim
Reprodukcija audiozvučnih datoteka (Wav) s Arduinom i DAC -om
Reprodukcija audiozvučnih datoteka (Wav) s Arduinom i DAC -om
Reprodukcija audiozvučnih datoteka (Wav) s Arduinom i DAC -om
Reprodukcija audiozvučnih datoteka (Wav) s Arduinom i DAC -om
Reprodukcija audiozvučnih datoteka (Wav) s Arduinom i DAC -om
Reprodukcija audiozvučnih datoteka (Wav) s Arduinom i DAC -om

Reproducirajte wav datoteku Audio sa svoje Audino SD kartice. Ovaj Instructable pokazat će vam kako se wav datoteka na vašoj SdCard kartici može reproducirati kroz jednostavno kolo do zvučnika.

Wav datoteka mora biti 8 bitna mono. Nisam imao problema s reprodukcijom datoteka od 44 KHz.

Iako nije visokokvalitetan, kvaliteta zvuka je vrlo zadovoljavajuća.

Za odabir datoteke koristi se serijski monitor. Datoteke moraju biti u mapi koja se zove adlog.

Ovo uputstvo proizlazi iz ranijeg projekta gdje sam spremao wav snimke na SdCard:

Krug koristi jeftini 8 -bitni digitalno -analogni pretvarač (DAC) i jednočipno audio pojačalo.

Ključni dijelovi za postavljanje prekida preuzeti su iz izvrsnog članka Amande Ghassaei:

Korak 1: Zahtjevi

Zahtjevi
Zahtjevi
Zahtjevi
Zahtjevi

Arduino- Ja koristim Mega, međutim nema razloga zašto Uno ne bi radio.

SdCard čitač-program je konfiguriran za: MicroSD Breakout Board reguliran logičkom pretvorbom V2

Za detalje o postavljanju SdCard kartice pogledajte ovo uputstvo:

DAC0832 LCN- izvrstan 8-bitni digitalno-analogni pretvarač- Nekoliko kilograma.

LM386 N-1 Op amp- jeftino kao čipovi

20 -struka utičnica za čip

8 -smjerna utičnica za čip

Napajanje od 9 volti- dovoljna je baterija.

LM336 Referenca napona 2,5 V

10uF kondenzator * 3 (bilo koji napon veći od 9V)

Otpor 10 ohma

50nF kondenzator- (Ili negdje blizu-47nF, 56nf, 68nf- može)

220uF kondenzator

64 ohmski zvučnik

Linearni potenciometar 10K

Kabel za povezivanje 8 podatkovnih linija između Arduina i strujnog kruga-

Na Unu je 8 veza u liniji, na Megi su u paru.

Na Mega -i sam koristio 10 -kraki ribbon kabel s 10 -putnim IDC zaglavljem. (2 žice su rezervne)

Utičnice za 0V, 9V i DAC izlaz

Bakrena ploča, lemljenje, žica, rezači itd

Korak 2: Specifikacije

Specifikacije
Specifikacije

Serijski postavljen na 115200 bauda.

Podrška je dostupna za Hobbytronics MicroSD Breakout Board koji koristi Mega. Odabir čipa i drugi priključci mijenjat će se između Mega i Uno.

Wav datoteke moraju postojati u direktoriju koji se zove adlog. Slobodno ga nazovite drugim imenom i preuredite potrebno kodiranje.

Wav datoteka mora biti 8 bitna mono. Testirao sam do 44KHz.

Serijski monitor prikazuje wav datoteke u adlog mapi. Nazivi datoteka šalju se s izlazne linije monitora.

Veličina datoteke ograničena je samo veličinom kartice SdCard.

Korak 3: Početak

Početak rada
Početak rada

Priključite čitač SD kartica. To su veze za Mega.

0, 5V

CLK za pin 52

D0 na pin 50

D1 na pin 51

CS na pin 53

(Za povezivanje porta Uno pogledajte web stranicu dobavljača)

U ovoj fazi želite provjeriti radi li vaša kartica- upotrijebite skripte koje je dostavio dobavljač.

Moramo napraviti mali krug

Poslat ćemo niz audio bajtova s Arduina.

Ti su brojevi između 0 i 255. Oni predstavljaju napon.

Tišina je 127-128.

255 je konus zvučnika tvrd u jednom smjeru.

0 je konus zvučnika tvrdi na drugi način.

Dakle, zvuk se snima kao spremljeni brojevi, koji stvaraju različite napone, koji stvaraju pokretne konusne zvučnike.

Možemo poslati brojeve iz 8 redaka na Arduinu, istovremeno, koristeći "port".

Ako unesemo 8 linija u digitalno -analogni pretvarač, on radi ono što piše na limu i proizvodi analogni napon koji je proporcionalan digitalnom broju.

Sve što trebamo učiniti je spakirati napon na malo operativno pojačalo, a zatim na zvučnik.

Korak 4: Mali krug

Mali krug
Mali krug
Mali krug
Mali krug
Mali krug
Mali krug
Mali krug
Mali krug

DAC0832 LCN

Ovo je vrhunski, jeftin 8 -bitni digitalno -analogni pretvarač. (DAC)

Može se u potpunosti kontrolirati nizom podataka o linijama uzorka podataka.

Ili se može postaviti da sve to radi automatski u "Protok kroz rad".

Da citiram priručnik:

Jednostavno uzemljenje CS, WR1, WR2 i XFER te visoko povezivanje ILE-a omogućuje da oba unutarnja registra prate primijenjene digitalne ulaze (protočni) i izravno utječu na analogni izlaz DAC-a.

U redu, četiri veze na nisko postavljeni čip i jedna na 9V - jednostavno.

Ne želimo izlaz negativnih napona pa priručnik kaže da bismo trebali koristiti "način prebacivanja napona", a oni daju dijagram.

Sve što trebamo učiniti je zamijeniti malo audio pojačalo umjesto onog koje predlažu.

Audio pojačalo LM386-N

Priručnik za pojačalo daje dijagram minimalnih dijelova- osiguravajući dobitak od 20 (za nas previše, ali ima kontrolu glasnoće).

Sve što trebamo učiniti je dodati kondenzator između DAC -a i pojačala tako da pojačavamo samo izmjenične signale.

Moramo također dodati nekoliko kondenzatora blizu napajanja svakog našeg čipa, u protivnom ćemo dobiti brujanje iz našeg napajanja od 9V.

Korak 5: Izvadite lemilicu

Izvadite lemilicu
Izvadite lemilicu
Izvadite lemilicu
Izvadite lemilicu
Izvadite lemilicu
Izvadite lemilicu

Kako je sklop jednostavan, ne namjeravam zadavati udarac udarcem.

Evo nekoliko smjernica:

  • Pripremite komad bakrene ploče najmanje 28 x 28 rupa. (Da, znam da ga kirurzi mozga mogu smanjiti)
  • Ako ga namjeravate pričvrstiti vijcima, dopustite ih na početku!
  • Postavite čipove na utičnice. Umetnite čips tek kad je sve provjereno.
  • Držite ulazne žice dalje od izlaza.
  • Pazite na pravilan polaritet kondenzatora.
  • Pogledajte dijagram za prikaz baze referentnog napona LM336. Noga za podešavanje se ne koristi i može se rezati.
  • Obratite pozornost na izravnu vezu s pinom 8 DAC-a. Vrlo je korisno za testiranje.
  • Spojio sam se na Audino pomoću vrpčnog kabela i 10 -putnog IDC konektora.
  • Na Uno -u su veze u ravnoj liniji - možda ćete otkriti da raspoređivanje 8 ulaznih veza u jednu ravnu liniju omogućuje povezivanje s Arduinom pomoću kupljenog, gotovog 8 -smjernog konektora,

Kad je gotovo- provjerite lemljenje i provjerite razmake između bakrenih tračnica.

Smatram da je oštrica pile za mlađe pile od 36 tpi vrlo korisna za čišćenje krhotina. Uklanjam klinove za lociranje oštrice i gurnem vrh oštrice u trag- Očigledno oštrica nije u okviru.

Korak 6: Testiranje DAC -a

Testiranje DAC -a
Testiranje DAC -a

Ostavite vezu između kruga i Arduina isključenom.

Postavite kontrolu glasnoće na vašem krugu na pola puta.

Uključite 9V DC napajanje u svoj novi krug.

Provjerite je li krug u redu- ne mogu preuzeti nikakvu odgovornost za vaš krug!

Isključite napajanje

Spojite svoj krug na Arduino.

Na Megi koristite igle 22-29. (PORTA) Nemojte pogriješiti dva gornja pina od 5 V!

Na Uno-u koristite pinove 0-7. Ovo je PORTD

Spojite 0V vašeg napajanja na 0V na Arduinu.

Uključiti.

Otvorite ovaj testni program DAC_TEST

Za UNO zamijenite sve reference na PORTA na PORTD

Zamijenite DDRA s DDRD- ova uputa postavlja svih 8 linija za izlaz u jednom potezu. Ovo je registar smjera podataka.

Postavite serijski monitor na 115200.

Spojite voltmetar između DAC izlaza i OV

Program će postaviti izlaz na 255 - sve linije uključene - maksimalni napon.

Izlaz 128- pola maksimalnog napona.

Izlaz 0- nulti napon (ili vjerojatno gotovo nula).

Zatim će koračati korak po korak: 1, 2, 4, 8, 16, 32, 64, 128

Napon bi trebao stalno rasti.

Ako napon padne dok se broj povećava, vjerojatno ste promijenili dvije međusobno povezane žice.

Također biste trebali čuti kako zvučnik tiho klikće pri promjeni napona

Korak 7: Čitanje zaglavlja Wava

Čitanje zaglavlja Wava
Čitanje zaglavlja Wava

Wav datoteke spremaju se s određenom frekvencijom i veličinom podataka.

Ove su informacije sadržane u zaglavlju od 44 bajta na početku wav datoteke.

Iako neki softver proširuje zaglavlje (nakon bajta 35), što otežava lociranje lokacije veličine podataka.

Za čitanje zaglavlja stvaramo međuspremnik i kopiramo početak datoteke.

Učestalost je pohranjena u 4 bajta počevši od 24 bajta u datoteku.

// učestalost čitanja navedena u zaglavlju wav datoteke

bajt headbuf [60]

tempfile.seek (0);

tempfile.read (headbuf, 60);

retval = zaglavlje [27];

retval = (retval << 8) | pokrivač za glavu [26];

retval = (retval << 8) | pokrivač za glavu [25];

retval = (retval << 8) | pokrivač za glavu [24];

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

Serial.print (retval);

Najbolji način za pronalaženje podataka o veličini podataka je traženje riječi "podaci" u zaglavlju.

Zatim izdvojite 4 bajta koja slijede, koji čine dugačku vrijednost

nepotpisani dugi povrat;

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') {

// napokon ga imamo

mypos = i+4;

i = 60;

}

}

}

}

}

tempfile.seek (mypos);

retval = headbuf [mypos+3];

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

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

retval = (retval << 8) | pokrivač za glavu [mypos];

U redu, imamo duljinu i učestalost podataka!

Zvučni podaci slijede 4 bajta koji čine vrijednost duljine podataka.

Korak 8: Prekini, Prekini …

Prekini, prekini …
Prekini, prekini …

Koristimo informacije o frekvenciji za stvaranje softverskog prekida na ili blizu potrebne frekvencije.

Prekid se ne može uvijek točno postaviti, ali je dovoljan. Učestalost čitanja iz datoteke prosljeđuje se podrutini setintrupt.

void setintrupt (float freq) {float bitval = 8; // 8 za 8 bitne timere 0 i 2, 1024 za timer 1 bajt

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

// Vrijednost setocroa zahtijeva oduzimanje -1. Međutim, dodajući 0,5 kruga najbližim 0,5

// Rezolucija timera je ograničena

// U konačnici određeno magnitudom bitvala

cli (); // onemogućiti prekide // postaviti timer2 prekid

TCCR2A = 0; // cijeli TCCR2A registar postavite na 0

TCCR2B = 0; // isto za TCCR2B

TCNT2 = 0; // inicijalizira vrijednost brojača na 0

// postavljanje usporedbe registra podudaranja za povećanja frekvencije (hz)

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

// uključuje CTC način rada

TCCR2A | = (1 << WGM21); // Postavite CS21 bit za 8 predkalera

TCCR2B | = (1 << CS21); // omogući timer usporedi prekid

// TIMSK2 | = (1 << OCIE2A); // ovo radi, kao i sljedeći redak

sbi (TIMSK2, OCIE2A); // omogući prekid na mjeraču vremena 2

sei (); // omogući prekide

Pronicljivi čitatelji će uočiti sbi (TIMSK2, OCIE2A)

Postavio sam nekoliko (nabavljenih putem Interneta) funkcija za postavljanje i brisanje registarskih bitova:

// Definira brisanje registarskih bitova#ifndef cbi

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

#završi ako

// Definira za postavljanje registarskih bitova

#ifndef sbi

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

#završi ako

Ove funkcije omogućuju jednostavan poziv za postavljanje ili brisanje prekida.

Dakle, prekid je pokrenut, što možemo učiniti?

Korak 9: Prekidi i dvostruko međuspremljenje

Prekidi i dvostruko međuspremljenje
Prekidi i dvostruko međuspremljenje
Prekidi i dvostruko međuspremljenje
Prekidi i dvostruko međuspremljenje

Na 22 Khz bajt audio podataka emitira se svakih 0,045 ms

512 bajtova (veličina međuspremnika) očitava se u 2,08 ms.

Tako se međuspremnik ne može očitati sa SDCard kartice u jednom ciklusu pisanja.

Međutim, 512 bajtova je zapisano na port za 23,22 ms.

Dakle, sve što moramo učiniti je postaviti novu datoteku koja će se čitati svaki put kada se međuspremnik isprazni i imamo dovoljno vremena za prikupljanje podataka prije nego što je potreban novi podatkovni blok … Pod pretpostavkom da koristimo dva međuspremnika, ispraznimo jedan dok popunjavamo drugi.

Ovo je dvostruko međuspremljenje.

Čitanje datoteke usporit će ponovljeni prekid, ali to će se učiniti.

Postavio sam dva međuspremnika od 512 bajtova koji se zovu bufa i bufb.

Ako je zastava aready istinita, čitamo s porta, inače čitamo iz portb

Kad pozicija međuspremnika (bufcount) dosegne veličinu međuspremnika (BUF_SIZE 512), zastavicu readit postavljamo na true.

Rutina petlje void traži ovu zastavicu i započinje čitanje bloka:

if (readit) {if (! aready) {

// inicira čitanje bloka SDCard u bufa

tempfile.read (bufa, BUF_SIZE);

} else {

// iniciranje čitanja SDCard bloka u bufb

tempfile.read (bufb, BUF_SIZE);

}

readit = false;

}

Kad završi, rutinske zastavice readit = false.

Unutar rutine prekida moramo provjeriti je li void petlja završila provjerom je li readit == false.

U tom slučaju signaliziramo da je potrebno još jedno čitanje i prebacujemo zastavicu aready za prebacivanje međuspremnika.

Ako SD kartica i dalje čita, moramo pratiti jedno očitanje (brojač--; bufcount--;) i izaći iz prekida da bismo pokušali kasnije. (Klikovi na izlaznom audio signalu ukazuju na to da se to dogodilo.)

Kad se pročitaju svi podaci, prekid se poništava, port se ponovno postavlja na vrijednost srednjeg napona 128 i audio datoteka se zatvara.

Prije nego što prvi put pokrenete skriptu dac2.ino, postavite glasnoću na 50%. Ovo će biti preglasno, ali bolje je od 100%!

Ako vaša kontrola glasnoće radi obrnuto, zamijenite kabele na suprotnim krajevima 10K potenciometra.

Javi mi kako zvuči.

Preporučeni: