Sadržaj:

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

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

Video: Reprodukcija audio zvučnih datoteka (Wav) s Arduinom i DAC -om: 9 koraka
Video: Специальная лекция №3. Сайт для скачивания бесплатной фоновой музыки и звуковых эффектов 2024, Novembar
Anonim
Reprodukcija audio zvučnih datoteka (Wav) s Arduinom i DAC -om
Reprodukcija audio zvučnih datoteka (Wav) s Arduinom i DAC -om
Reprodukcija audio zvučnih datoteka (Wav) s Arduinom i DAC -om
Reprodukcija audio zvučnih datoteka (Wav) s Arduinom i DAC -om
Reprodukcija audio zvučnih datoteka (Wav) s Arduinom i DAC -om
Reprodukcija audio zvučnih datoteka (Wav) s Arduinom i DAC -om

Reproducirajte wav datoteku Audio sa svoje Audino SD kartice. Ovaj Instructable će vam pokazati 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. Nije mi bilo teško reproducirati datoteke na 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:

Kolo 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

Zahtevi
Zahtevi
Zahtevi
Zahtevi

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

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

Za detalje o postavljanju SdCard kartice pogledajte ovo uputstvo:

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

LM386 N-1 Op amp- jeftino kao čipovi

20 -struka utičnica

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- će uspjeti)

220uF kondenzator

64 ohmski zvučnik

10K linearni potenciometar

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

Na Uno -u je 8 veza u liniji, na Mega -i su u paru.

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

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

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

Korak 2: Specifikacije

Specifikacije
Specifikacije

Serijski postavljen na 115200 bauda.

Postoji podrška za Hobbytronics MicroSD Breakout Board koji koristi Mega. Odabir čipa i drugi portovi će se mijenjati 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 folderu. Imena datoteka se šalju s izlazne linije monitora.

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

Korak 3: Početak

Počinjemo
Počinjemo

Povežite čitač SD kartica. Ovo 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 ćete htjeti provjeriti radi li vaša kartica- koristite skripte isporučene od dobavljača.

Moramo napraviti mali krug

Poslat ćemo niz audio bajtova s Arduina.

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

Tišina je 127-128.

255 je konus zvučnika u jednom smjeru.

0 je konus zvučnika na drugu stranu.

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

Možemo poslati brojeve iz 8 linija 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 spojiti 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 linija podataka za uzorkovanje 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 i visoko povezivanje ILE-a omogućava oba interna registra da prate primijenjene digitalne ulaze (protočni) i direktno utiču na analogni izlaz DAC-a.

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

Ne želimo negativne napone, 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

Upute za pojačalo daju 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 dodati i nekoliko kondenzatora blizu napajanja svakog našeg čipa, u protivnom ćemo čuti 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 kolo jednostavno, ne namjeravam zadati udarac udarcem.

Evo nekoliko smjernica:

  • Pripremite komad bakrene ploče najmanje 28 x 28 rupa. (Da, znam da ga moždani hirurzi 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 pažnju na izravnu vezu s pinom 8 DAC-a. Vrlo je korisno za testiranje.
  • Povezao sam se s Audinom pomoću vrpčnog kabela i 10 -putnog IDC konektora.
  • Na Uno -u su veze u pravoj liniji - možda ćete otkriti da vam raspoređivanje 8 ulaznih veza u jednoj pravoj liniji 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 list pile za mlađe pile od 36 tpi vrlo koristan za čišćenje krhotina. Uklanjam klinove za lociranje noža i gurnem vrh oštrice u trag- Očigledno sečivo 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 novo kolo.

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

Iskljuciti

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

Priključite 0V vašeg napajanja na 0V na Arduinu.

Uključite napajanje.

Otvorite ovaj testni program DAC_TEST

Za UNO, zamijenite sve reference na PORTA na PORTD

Zamijenite DDRA sa DDRD- ovo uputstvo 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 imate obrnute dvije međusobno povezane žice.

Trebali biste čuti i zvučnik koji tiho klikće pri promjeni napona

Korak 7: Čitanje Wav zaglavlja

Čitanje zaglavlja Wava
Čitanje zaglavlja Wava

Wav datoteke se spremaju s navedenom frekvencijom i veličinom podataka.

Ove informacije se nalaze 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 tampon 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 = headbuf [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 informacija o veličini podataka je traženje riječi "podaci" u zaglavlju.

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

nepotpisano dugo vraćanje;

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) | pokrivač za glavu [mypos+2];

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

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

U redu, imamo dužinu i učestalost podataka!

Audio podaci slijede 4 bajta koji čine vrijednost dužine 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 precizno postaviti, ali je dovoljan. Učestalost čitanja iz datoteke prosljeđuje se podrutini setintrupt.

void setintrupt (float frekvencija) {float bitval = 8; // 8 za 8 bitne tajmere 0 i 2, 1024 za timer od 1 bajta

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

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

// Rezolucija tajmera je ograničena

// Na kraju određeno magnitudom bitvala

cli (); // onemogućava prekide // postavlja timer2 prekid

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

TCCR2B = 0; // isto za TCCR2B

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

// postavlja poređenje registara podudaranja za priraste 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ćava tajmer za upoređivanje prekida

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

sbi (TIMSK2, OCIE2A); // omogući prekid na tajmeru 2

sei (); // omogući prekide

Pronicljivi čitaoci ć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))

#endif

// Definira za postavljanje registarskih bitova

#ifndef sbi

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

#endif

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

Dakle, prekid je pokrenut, šta 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 se emitira svakih 0,045 ms

512 bajtova (veličina međuspremnika) se čita za 2,08 ms.

Tako se bafer 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 trebamo učiniti je postaviti novu datoteku za čitanje svaki put kada se bafer isprazni i imamo dovoljno vremena da dobijemo podatke prije nego što je potreban novi blok podataka … Pod pretpostavkom da koristimo dva međuspremnika, ispraznimo jedan dok popunjavamo drugi.

Ovo je dvostruko međuspremljenje.

Čitanje datoteke će biti usporeno ponovljenim prekidom, ali će se to učiniti.

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

Ako je zastavica aready istinita, čitamo iz porta, u suprotnom čitamo iz portb

Kada pozicija međuspremnika (bufcount) dostigne 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 {

// inicira čitanje SDCard bloka na bufb

tempfile.read (bufb, BUF_SIZE);

}

readit = false;

}

Kada završi, rutinske zastavice readit = false.

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

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

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

Kada se pročitaju svi podaci, prekid se poništava, port se ponovo postavlja na srednju vrijednost napona 128 i audio datoteka se zatvara.

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

Ako vaša kontrola jačine zvuka radi obrnuto, zamijenite elektrode na suprotnim krajevima 10K potenciometra.

Javi mi kako zvuči.

Preporučuje se: