Përmbajtje:

Luajtja e skedarëve audio të zërit (Wav) Me një Arduino dhe një DAC: 9 hapa
Luajtja e skedarëve audio të zërit (Wav) Me një Arduino dhe një DAC: 9 hapa

Video: Luajtja e skedarëve audio të zërit (Wav) Me një Arduino dhe një DAC: 9 hapa

Video: Luajtja e skedarëve audio të zërit (Wav) Me një Arduino dhe një DAC: 9 hapa
Video: Hakmarrja e Skënderbeut Pjesa 1 - Beteja e Valikardhës 26 Tetor 1465 2024, Korrik
Anonim
Luajtja e skedarëve audio të zërit (Wav) me një Arduino dhe një DAC
Luajtja e skedarëve audio të zërit (Wav) me një Arduino dhe një DAC
Luajtja e skedarëve audio të zërit (Wav) me një Arduino dhe një DAC
Luajtja e skedarëve audio të zërit (Wav) me një Arduino dhe një DAC
Luajtja e skedarëve audio të zërit (Wav) me një Arduino dhe një DAC
Luajtja e skedarëve audio të zërit (Wav) me një Arduino dhe një DAC

Luani skedarin wav Audio nga karta juaj Audino SD. Ky udhëzues do t'ju tregojë se si një skedar wav në SdCard tuaj mund të luhet përmes një qarku të thjeshtë në një altoparlant.

Skedari wav duhet të jetë mono 8 bit. Nuk kam pasur asnjë problem të luaj skedarë 44 KHz.

Përderisa nuk është besnikëri e lartë, cilësia e zërit është shumë e kënaqshme.

Monitori serik përdoret për të zgjedhur skedarin. Skedarët duhet të jenë në një dosje të quajtur adlog.

Ky udhëzues vjen nga një projekt i mëparshëm ku ruaja regjistrimet wav në SdCard:

Qarku përdor një konvertues të lirë dixhital në analog 8 bit (DAC) dhe një përforcues audio me një çip të vetëm.

Seksionet kryesore për vendosjen e ndërprerjeve u morën nga artikulli i shkëlqyer nga Amanda Ghassaei:

Hapi 1: Kërkesat

Kërkesat
Kërkesat
Kërkesat
Kërkesat

Arduino- Unë përdor Mega, megjithatë nuk ka asnjë arsye pse Uno të mos punojë.

Lexuesi SdCard- programi është i konfiguruar për: MicroSD Breakout Board Regulated with Logic Conversion V2

Shihni këtë udhëzues për detajet e konfigurimit të SdCard:

DAC0832 LCN- një konvertues i shkëlqyer 8-bit dixhital në analog- Disa paund.

LM386 N-1 Op amp- i lirë si patate të skuqura

Fole e çipit me 20 drejtime

Fole e çipit me 8 drejtime

Furnizimi me energji 9 volt- një bateri do të bëjë.

LM336 Referenca e tensionit 2.5 V

Kondensator 10uF * 3 (çdo tension më shumë se 9V)

Rezistencë 10 ohm

Kondensator 50nF- (Ose diku afër-47nF, 56nf, 68nf- do të bëjë)

Kondensator 220uF

Altoparlant 64 ohm

Potenciometër linear 10K

Kabllo për të lidhur 8 linjat e të dhënave midis Arduino dhe qarkut

Në Uno 8 lidhjet janë në linjë, në Mega ato janë në çifte.

Në Mega kam përdorur kabllo fjongo me 10 drejtime me një kokë IDC me 10 drejtime. (2 tela janë rezervë)

Lidhës fole për 0V, 9V dhe DAC jashtë

Bordi i shiritit të bakrit, lidhës, tela, hapëse etj

Hapi 2: Specifikimet

Specifikimet
Specifikimet

Serial i vendosur në 115200 baud.

Ekziston mbështetje për Bordin Hobbytronics MicroSD Breakout duke përdorur një Mega. Zgjedhja e çipit dhe portet e tjera do të ndryshojnë midis Mega dhe Uno.

Skedarët Wav duhet të ekzistojnë në një drejtori të quajtur adlog- Mos ngurroni ta emërtoni diçka tjetër dhe riorganizoni kodimin e nevojshëm.

Skedari wav duhet të jetë mono 8 bit. Kam testuar deri në 44KHz.

Monitori Serial shfaq skedarët wav në dosjen adlog. Emrat e skedarëve dërgohen nga linja e daljes së monitorit.

Madhësia e skedarit është e kufizuar vetëm nga madhësia e SdCard.

Hapi 3: Fillimi

Fillimi
Fillimi

Lidhni lexuesin e kartës SD. Këto janë lidhjet për Mega.

0, 5V

CLK te kunja 52

D0 në pin 50

D1 në pin 51

CS në pin 53

(Shihni faqen e internetit të furnizuesve për lidhjen e portit Uno)

Ju do të dëshironi të provoni që karta juaj punon në këtë fazë- përdorni skriptet e ofruara nga shitësi.

Duhet të bëjmë një qark të vogël

Ne do të dërgojmë një rrjedhë audio byte nga Arduino.

Këta numra janë midis 0 dhe 255. Ato përfaqësojnë tensionin.

Heshtja është 127-128.

255 është koni i altoparlantit i vështirë në një drejtim.

0 është koni i altoparlantit i vështirë në anën tjetër.

Pra, audio regjistrohet si numra të ruajtur, të cilët krijojnë tensione të ndryshme, të cilat krijojnë kone lëvizëse të altoparlantëve.

Ne mund t'i dërgojmë numrat nga 8 rreshta në Arduino, njëkohësisht, duke përdorur një "port".

Nëse i ushqejmë 8 rreshtat në një konvertues dixhital në analog, ai bën atë që thotë në kallaj dhe prodhon një tension analog i cili është proporcional me numrin dixhital.

E tëra çfarë na duhet të bëjmë është të paketojmë tensionin në një përforcues të vogël operacional dhe më pas në një altoparlant.

Hapi 4: Qarku i Vogël

Qarku i Vogël
Qarku i Vogël
Qarku i Vogël
Qarku i Vogël
Qarku i Vogël
Qarku i Vogël
Qarku i Vogël
Qarku i Vogël

LCN e DAC0832

Ky është një konvertues i shkëlqyeshëm, i lirë 8 -bit dixhital në analog. (DAC)

Mund të kontrollohet plotësisht me një grup të ruajtjes së të dhënave, linjave të mostrës së të dhënave.

Ose mund të konfigurohet për t'i bërë të gjitha automatikisht në "Rrjedha përmes operacionit".

Për të cituar manualin:

Thjesht argumentimi i CS, WR1, WR2 dhe XFER dhe lidhja e ILE e lartë lejon që të dy regjistrat e brendshëm të ndjekin hyrjet dixhitale të aplikuara (rrjedhja) dhe të ndikojnë drejtpërdrejt në daljen analoge DAC.

OK, kjo është katër lidhje me çipin e ulët dhe një të caktuar në 9V - e lehtë.

Ne nuk duam asnjë tension negativ jashtë, kështu që manuali thotë se duhet të përdorim "modalitetin e ndërrimit të tensionit" dhe ato japin diagramin.

E tëra çfarë duhet të bëjmë është të zëvendësojmë një përforcues të vogël Audio në vend të atij që ata sugjerojnë.

Audio Amp LM386-N

Manuali i Amp siguron një diagram minimal të pjesëve- duke siguruar një fitim prej 20 (Shumë për ne- por ka një kontroll volumi).

E tëra çfarë duhet të bëjmë është të shtojmë një kondensator midis DAC dhe amplifikatorit në mënyrë që të amplifikojmë vetëm sinjalet AC.

Ne gjithashtu duhet të shtojmë disa kondensatorë pranë kunjit të furnizimit të secilit prej patate të skuqura tona, përndryshe do të marrim zhurmë nga furnizimi ynë 9V.

Hapi 5: Dilni hekurin e bashkuar

Dilni nga hekuri i bashkuar
Dilni nga hekuri i bashkuar
Dilni nga hekuri i bashkuar
Dilni nga hekuri i bashkuar
Dilni nga hekuri i bashkuar
Dilni nga hekuri i bashkuar

Meqenëse qarku është i thjeshtë, nuk kam ndërmend të jap një goditje me llogari goditje.

Këtu janë disa këshilla:

  • Përgatitni një copë dërrasë të shiritit të bakrit të paktën 28 me 28 vrima. (Po unë e di që kirurgët e trurit mund ta bëjnë atë më të vogël)
  • Nëse keni ndërmend ta montoni me vida, lejojini ato në fillim!
  • Montoni patate të skuqura në bazat. Futni patate të skuqura vetëm kur gjithçka është kontrolluar.
  • Mbani telat e hyrjes larg daljes.
  • Vëzhgoni polaritetin e saktë për kondensatorët.
  • Referojuni diagramit për pamjen bazë të referencës së tensionit LM336. Këmba e rregulluar nuk përdoret dhe mund të pritet.
  • Vini re lidhjen direkte me pin 8 të DAC- veryshtë shumë e dobishme për testim.
  • Unë u lidha me Audino me kabllo shiriti dhe një lidhës IDC me 10 drejtime.
  • Në Uno lidhjet janë në një vijë të drejtë - mund të zbuloni se rregullimi i 8 lidhjeve hyrëse në një vijë të vetme të drejtë ju lejon të lidheni me Arduino me një lidhës të blerë, të gatshëm me 8 drejtime,

Kur të ketë mbaruar- kontrolloni saldimin dhe kontrolloni boshllëqet midis shinave të bakrit.

Unë gjej një teh sharrë 36 tpi junior shumë i dobishëm për pastrimin e mbeturinave. I heq kunjat e lokalizimit të tehut dhe e rrëshqas majën e tehut në pistë- Natyrisht që tehu nuk është në një kornizë.

Hapi 6: Testimi i DAC

Testimi i DAC
Testimi i DAC

Lëreni Lidhjen midis Qarkut dhe Arduinos të fikur.

Vendosni kontrollin e volumit në qarkun tuaj në mes të rrugës.

Ndizni 9V DC Power në qarkun tuaj të ri.

Kontrolloni që qarku është në rregull- nuk mund të pranoj asnjë përgjegjësi për qarkun tuaj!

Fike

Lidhni qarkun tuaj me Arduino.

Në Mega përdorni kunjat 22-29. (PORTA) Mos i gaboni dy kunjat 5V më lart!

Në Uno përdorni kunjat 0-7. Kjo është PORTD

Lidhni 0V e furnizimit me energji elektrike me 0V në Arduino.

Fuqizo.

Hapni këtë program testi DAC_TEST

Për UNO, zëvendësoni të gjitha referencat për PORTA në PORTD

Zëvendësoni DDRA me DDRD- ky udhëzim vendos që të 8 linjat të dalin me një lëvizje. Ky është regjistri i drejtimit të të dhënave.

Vendosni monitorin tuaj serik në 115200.

Lidhni një voltmetër midis daljes DAC dhe OV

Programi do të vendosë daljen në 255 - të gjitha linjat e ndezura - tension maksimal.

Dalja 128- gjysma e tensionit maksimal.

Dalja 0- tension zero (Ose ndoshta gati zero).

Pastaj do të hapë pak: 1, 2, 4, 8, 16, 32, 64, 128

Tensioni duhet të rritet vazhdimisht.

Nëse voltazhi bie kur numri rritet, me siguri keni dy nga telat e ndërlidhur të përmbysur.

Ju gjithashtu duhet të dëgjoni altoparlantin duke klikuar në heshtje ndërsa tensioni ndryshon

Hapi 7: Leximi i titullit Wav

Leximi i kokës së valës
Leximi i kokës së valës

Skedarët Wav ruhen me një frekuencë të caktuar dhe madhësi të të dhënave.

Ky informacion përmbahet në një kokë 44 bajtësh në fillim të një skedari wav.

Edhe pse disa programe e zgjerojnë kokën (pas bajtit 35), duke e bërë vendndodhjen e madhësisë së të dhënave më të vështirë për tu gjetur.

Për të lexuar titullin krijojmë një tampon dhe kopjojmë fillimin e skedarit.

Frekuenca ruhet në 4 bajt duke filluar 24 bajt në skedar.

// frekuenca e leximit e specifikuar në kokën e skedarit wav

byte headbuf [60]

tempfile.kërko (0);

tempfile.read (headbuf, 60);

retval = kokë [27];

retval = (retval << 8) | kokë [26];

retval = (retval << 8) | kokë [25];

retval = (retval << 8) | kokë [24];

Serial.print (F ("Frekuenca e Skedarit"));

Serial.print (retval);

Mënyra më e mirë për të gjetur informacionin e madhësisë së të dhënave është të kërkoni fjalën "të dhëna" në kokë.

Pastaj nxirrni 4 bajtët që e pasojnë atë, që përbëjnë vlerën e gjatë

rivlerësim i gjatë i panënshkruar;

int mypos = 40;

për (int i = 36; i <60; i ++) {

nëse (headbuf == 'd') {

nëse (headbuf [i+1] == 'a') {

nëse (headbuf [i+2] == 't') {

nëse (headbuf [i+3] == 'a') {

// më në fund e kemi

mypos = i+4;

i = 60;

}

}

}

}

}

tempfile.kërkoj (mypos);

retval = headbuf [mypos+3];

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

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

retval = (retval << 8) | kokë [mypos];

OK kemi gjatësinë dhe frekuencën e të dhënave!

Të dhënat audio ndjekin 4 bajtët që përbëjnë vlerën e gjatësisë së të dhënave.

Hapi 8: Ndërprit, Ndërprit…

Ndërprit, Ndërprit…
Ndërprit, Ndërprit…

Ne përdorim informacionin e frekuencës për të krijuar një ndërprerje të softuerit në, ose pranë, frekuencës së kërkuar.

Ndërprerja nuk mund të vendoset gjithmonë me saktësi, por është e mjaftueshme. Frekuenca e lexuar nga skedari kalohet në nën -programin e ndërprerë.

void setintrupt (frekuenca float) {float bitval = 8; // 8 për kohëmatësit 8 bit 0 dhe 2, 1024 për kohëmatës 1 bajt

setokroa = (16000000/(frekuenca*bitval)) - 0.5;

// Vlera e setokroas kërkon një zbritje prej -1. Sidoqoftë, shtoni 0.5 raunde në 0.5 më të afërt

// Rezolucioni i kohëmatësit është i kufizuar

// Përfundimisht përcaktohet nga madhësia e bitvalit

cli (); // çaktivizoni ndërprerjet // vendosni ndërprerjen e kohëmatësit2

TCCR2A = 0; // vendosni të gjithë regjistrin TCCR2A në 0

TCCR2B = 0; // e njëjtë për TCCR2B

TCNT2 = 0; // inicoj vlerën e kundërsulmit në 0

// vendosni krahasimin e regjistrit të ndeshjeve për rritjen e frekuencës (hz)

OCR2A = setokroa; // = (16*10^6) / (frekuenca*8) - 1 (duhet të jetë <256)

// aktivizoni modalitetin CTC

TCCR2A | = (1 << WGM21); // Vendosni bit CS21 për 8 parashkrues

TCCR2B | = (1 << CS21); // aktivizoni ndërprerjen e krahasimit të kohëmatësit

// TIMSK2 | = (1 << OCIE2A); // kjo funksionon, siç bën rreshti i mëposhtëm

sbi (TIMSK2, OCIE2A); // aktivizoni ndërprerjen në kohëmatësin 2

sei (); // aktivizoni ndërprerjet

Lexuesit me aftësi dalluese do të kenë njollosur sbi (TIMSK2, OCIE2A)

Unë vendos disa funksione (të fituara nga interneti) për vendosjen dhe pastrimin e pjesëve të regjistrit:

// Përcakton për pastrimin e bitëve të regjistrit#ifndef cbi

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

#endif

// Përcakton për vendosjen e bitëve të regjistrit

#ifndef sbi

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

#endif

Këto funksione sigurojnë një thirrje të lehtë për të vendosur ose pastruar ndërprerjen.

Pra, ndërprerja po funksionon, çfarë mund ta bëjmë atë të bëjë?

Hapi 9: Ndërprerjet dhe Buferimi i Dyfishtë

Ndërprerje dhe Buferim i Dyfishtë
Ndërprerje dhe Buferim i Dyfishtë
Ndërprerje dhe Buferim i Dyfishtë
Ndërprerje dhe Buferim i Dyfishtë

Në 22 Khz del një bajt i të dhënave audio çdo 0.045 ms

512 bajt (madhësia e tamponit) lexohet në 2.08 ms.

Pra, tamponi nuk mund të lexohet nga SDCard në një cikël shkrimi.

Megjithatë 512 bajtë janë shkruar në port në 23.22ms.

Pra, gjithçka që duhet të bëjmë është të vendosim një skedar të ri të lexuar sa herë që zbrazet tamponi dhe kemi kohë të mjaftueshme për të marrë të dhënat para se të kërkohet një bllok i ri i të dhënave … Duke supozuar se ne përdorim dy tamponë, duke zbrazur njërën ndërsa mbushim një tjetër.

Ky është ruajtje e dyfishtë.

Skedari i lexuar do të ngadalësohet nga ndërprerja e përsëritur, por do të përfundojë.

Unë kam konfiguruar dy buffers 512 byte të quajtur bufa dhe bufb.

Nëse flamuri aready është i vërtetë lexojmë nga porta përndryshe lexojmë nga portb

Kur pozicioni tampon (bufcount) arrin madhësinë e tamponit (BUF_SIZE 512) vendosim një flamur të quajtur readit në true.

Rutina e lakut të zbrazët kërkon këtë flamur dhe fillon leximin e bllokut:

nëse (lexo) {nëse (! aready) {

// filloni leximin e bllokut SDCard në bufa

tempfile.read (bufa, BUF_SIZE);

} tjetër {

// filloni leximin e bllokut SDCard në bufb

tempfile.read (bufb, BUF_SIZE);

}

readit = false;

}

Kur të ketë mbaruar flamujt rutinë readit = false.

Brenda rutinës së ndërprerjes duhet të kontrollojmë që cikli void ka përfunduar duke kontrolluar nëse readit == false.

Ky është rasti që ne sinjalizojmë që kërkohet një lexim tjetër dhe kalojmë flamurin aready për të ndërruar tamponët.

Nëse karta SD është ende duke lexuar, ne duhet të ndjekim një nga leximet (counter--; bufcount--;) dhe të dalim nga ndërprerja për të provuar përsëri më vonë. (Klikimet në sinjalin e daljes audio nënkuptojnë që kjo ka ndodhur.)

Kur të gjitha të dhënat lexohen, ndërprerja anulohet, porta rivendoset në vlerën e tensionit të mesëm prej 128 dhe skedari audio mbyllet.

Para se të përdorni skenarin dac2.ino për herë të parë, vendosni vëllimin tuaj në 50%. Kjo do të jetë shumë e zhurmshme, por është më mirë se 100%!

Nëse kontrolli juaj i volumit funksionon në këmbim të kundërt, prizat në skajet e kundërta të potenciometrit 10K.

Më tregoni se si tingëllon.

Recommended: