Sadržaj:
- Korak 1: Zahtjevi
- Korak 2: Specifikacije
- Korak 3: Početak
- Korak 4: Mali krug
- Korak 5: Izvadite lemilicu
- Korak 6: Testiranje DAC -a
- Korak 7: Čitanje Wav zaglavlja
- Korak 8: Prekini, Prekini…
- Korak 9: Prekidi i dvostruko međuspremljenje
Video: Reprodukcija audio zvučnih datoteka (Wav) s Arduinom i DAC -om: 9 koraka
2024 Autor: John Day | [email protected]. Zadnja izmjena: 2024-01-30 08:08
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
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
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
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
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
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
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
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…
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
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:
Znanje analognog kruga - kolo zvučnih efekata sata sa kucanjem bez IC -a: 7 koraka (sa slikama)
Znanje o analognom krugu - Uradite sami krug zvučnih efekata sata koji otkucava bez IC -a: Ovaj krug zvučnog efekta sata koji je otkucavan napravljen je samo od tranzistora i otpornika i kondenzatora bez ikakve IC komponente. Idealno je za vas da naučite osnovno znanje o krugu pomoću ovog praktičnog i jednostavnog kruga. Potrebna podloga
Time Lapse Con Móvil Y Reprodukcija i gif: 4 koraka
Time Lapse Con Móvil Y Reprodukcija na Gif-u: Necesitamos tres programi, un time-lapse1.04, el otro kreator gif kamere i animirani gif player, besplatni programi
Stvaranje zvučnih apsorbirajućih zvučnih ploča sa čepovima za vino: 4 koraka
Izrada akustičnih ploča koje apsorbiraju zvuk sa čepovima za vino: Nakon što sam godinama skupljao čepove za vino, napokon sam im pronašao primjenu: napraviti zvučne ploče koje apsorbiraju zvuk za moj kućni glas preko govornice. Otkad su boce vina s navojem postale sve prisutnije, štedio sam čepove za razne kućne profesionalce
Razgovarajući Arduino - Reprodukcija MP3 s Arduinom bez ikakvog modula - Reprodukcija MP3 datoteke s Arduina pomoću PCM -a: 6 koraka
Razgovarajući Arduino | Reprodukcija MP3 s Arduinom bez ikakvog modula | Reproduciranje MP3 datoteke s Arduina pomoću PCM -a: U ovom uputstvu naučit ćemo kako reproducirati mp3 datoteku s arduinom bez korištenja bilo kojeg audio modula, ovdje ćemo koristiti PCM biblioteku za Arduino koja reproducira 16 bitni PCM frekvencije 8 kHz, pa učinimo to
Minimalna kutija Arduino zvučnih efekata: 5 koraka
Minimalna Arduino kutija za zvučne efekte: Ovo je brzi projekt kutije za zvučne efekte. Uređaj čita unaprijed snimljenu wav datoteku s microSD kartice dodijeljene određenom gumbu i reproducira je kad se pritisne