Përmbajtje:
- Hapi 1: Kërkesat
- Hapi 2: Specifikimet
- Hapi 3: Fillimi
- Hapi 4: Qarku i Vogël
- Hapi 5: Dilni hekurin e bashkuar
- Hapi 6: Testimi i DAC
- Hapi 7: Leximi i titullit Wav
- Hapi 8: Ndërprit, Ndërprit…
- Hapi 9: Ndërprerjet dhe Buferimi i Dyfishtë
Video: Luajtja e skedarëve audio të zërit (Wav) Me një Arduino dhe një DAC: 9 hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:27
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
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
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
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
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
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
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
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…
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ë
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:
Një makinë për frikësimin e Halloween -it duke përdorur një PIR, një kungull të printuar në 3D dhe një Pranker audio të pajtueshme me Troll Arduino/Bordi praktik i Shakasë.: 5 Hapa
Një makinë për frikësimin e Halloween -it duke përdorur një PIR, një kungull të printuar në 3D dhe Tran Arduino Compatible Audio Pranker/Joke Board praktike .: Bordi Troll i krijuar nga Patrick Thomas Mitchell i EngineeringShock Electronics, dhe u financua plotësisht në Kickstarter jo shumë kohë më parë. Unë mora shpërblimin disa javë më parë për të ndihmuar në shkrimin e disa shembujve të përdorimit dhe ndërtimin e një biblioteke Arduino në një përpjekje
Bërja e një kamere Pi Zero (f. 3): Menaxhimi i skedarëve dhe shtesat: 3 hapa
Bërja e një Pi Zero Dashcam (pt. 3): Menaxhimi dhe Përmirësimet e Skedarëve: Ne vazhdojmë me projektin e kamerës Pi Zero dhe në këtë postim, ne kujdesemi për menaxhimin e skedarëve ndërsa shtojmë edhe disa përmirësime në proces. Ky projekt është pothuajse i përfunduar dhe ne do të kryejmë teste rrugore në postimin/videon e javës së ardhshme
Treguesi i nivelit të zërit/zërit: 10 hapa
Treguesi i nivelit të zërit/zërit: Në këtë projekt, unë do t'ju tregoj se si të ndërtoni një tregues të thjeshtë të nivelit të zërit duke përdorur amplifikatorë operacionalë. Shënim: Për të bërë pyetje, ju lutemi vizitoni faqen time në Pyet Ekspertin. Video Plotësuese të Ndihmës: Qarku i Simuluar i Ngritur në Një Tabele Bukë (Proto-
Duke folur për Arduino - Luajtja e një MP3 me Arduino pa asnjë modul - Luajtja e skedarit Mp3 nga Arduino duke përdorur PCM: 6 hapa
Duke folur për Arduino | Luajtja e një MP3 me Arduino pa asnjë modul | Luajtja e skedarit Mp3 nga Arduino duke përdorur PCM: Në këtë udhëzues do të mësojmë se si të luajmë një skedar mp3 me arduino pa përdorur ndonjë modul audio, këtu do të përdorim bibliotekën PCM për Arduino e cila luan 16 bit PCM me frekuencë 8kHZ, kështu që le ta bëjmë këtë
Arduino Bascis - Luajtja e tingujve dhe toneve: 5 hapa
Arduino Bascis - Luajtja e tingujve dhe toneve: Unë doja të luaja disa efekte zanore dhe kuptova se kjo është një nga fushat e neglizhuara kur bëhet fjalë për mësime. Edhe në Youtube, mungojnë mësime të mira mbi Arduinos dhe tinguj, kështu që, duke qenë djalë i mirë, vendosa të ndaj njohuritë e mia