Satura rādītājs:
- 1. darbība. Prasības
- 2. darbība: specifikācijas
- 3. darbība. Darba sākšana
- 4. solis: Mazā ķēde
- 5. solis: izvelciet lodāmuru
- 6. darbība. DAC pārbaude
- 7. darbība: Wav galvenes lasīšana
- 8. solis: pārtraukt, pārtraukt…
- 9. darbība. Pārtraukumi un dubultā buferizācija
Video: Audio skaņas failu atskaņošana (Wav) ar Arduino un DAC: 9 soļi
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:57
Atskaņojiet wav failu audio no savas Audino SD kartes. Šī pamācība parādīs, kā jūsu SdCard wav failu var atskaņot, izmantojot vienkāršu ķēdi skaļrunim.
Wav failam jābūt 8 bitu melnbaltam. Man nav bijis problēmu atskaņot 44 KHz failus.
Lai arī skaņas kvalitāte nav augstvērtīga, tā ir ļoti apmierinoša.
Lai atlasītu failu, tiek izmantots sērijas monitors. Failiem jāatrodas mapē ar nosaukumu adlog.
Šī pamācība izriet no iepriekšējā projekta, kurā es saglabāju wav ierakstus SdCard:
Ķēde izmanto lētu 8 bitu digitālo analogo pārveidotāju (DAC) un vienas mikroshēmas audio pastiprinātāju.
Galvenās sadaļas pārtraukumu iestatīšanai tika ņemtas no lieliskā Amanda Ghassaei raksta:
1. darbība. Prasības
Arduino- Es izmantoju Mega, tomēr nav iemesla, kāpēc Uno nevajadzētu darboties.
SdCard lasītājs-programma ir konfigurēta: MicroSD Breakout Board, kas regulēta ar loģisko konversiju V2
SdCard iestatīšanas informāciju skatiet šajā instrukcijā:
DAC0832 LCN- lielisks 8 bitu digitālā-analogā pārveidotājs- dažas mārciņas.
LM386 N-1 Op pastiprinātājs- lēti kā mikroshēmas
20 virzienu mikroshēmas ligzda
8 virzienu mikroshēmas ligzda
9 voltu barošanas avots- derēs akumulators.
LM336 2,5 V sprieguma atskaite
10uF kondensators * 3 (jebkurš spriegums pārsniedz 9V)
10 omu rezistors
50 nF kondensators (vai kaut kur tuvu 47 nF, 56 nf, 68 nf- derēs)
220uF kondensators
64 omu skaļrunis
10K lineārais potenciometrs
Kabelis, lai savienotu 8 datu līnijas starp Arduino un ķēdi-
Uz Uno 8 savienojumi atrodas vienā rindā, uz Mega - pa pāriem.
Mega ierīcē es izmantoju 10 virzienu lentes kabeli ar 10 virzienu IDC galveni. (2 vadi ir rezerves)
Ligzdas savienotāji 0V, 9V un DAC izejai
Vara sloksnes plāksne, lodēt, stieple, griezēji utt
2. darbība: specifikācijas
Sērijas iestatījums ir 115200 baudu.
Atbalsts ir pieejams Hobbytronics MicroSD Breakout Board, izmantojot Mega. Mikroshēmas izvēle un citi porti mainīsies starp Mega un Uno.
Wav failiem ir jābūt direktorijā ar nosaukumu adlog. Jūtieties brīvi nosaukt to par kaut ko citu un pārkārtot nepieciešamo kodēšanu.
Wav failam jābūt 8 bitu melnbaltam. Esmu pārbaudījis līdz 44KHz.
Sērijas monitors parāda wav failus adlog mapē. Failu nosaukumi tiek nosūtīti no monitora izvades līnijas.
Faila lielumu ierobežo tikai SdCard izmērs.
3. darbība. Darba sākšana
Pievienojiet SD karšu lasītāju. Šie ir savienojumi Mega.
0, 5V
CLK līdz 52. tapai
D0 līdz 50. tapai
D1 līdz 51. tapai
CS līdz 53. tapai
(Uno porta savienojumu skatiet piegādātāju vietnē)
Jūs vēlaties pārbaudīt, vai jūsu karte darbojas šajā posmā- izmantojiet pārdevēja piegādātos skriptus.
Mums ir jāizveido neliela ķēde
Mēs nosūtīsim audio baitu straumi no Arduino.
Šie skaitļi ir no 0 līdz 255. Tie apzīmē spriegumu.
Klusums ir 127-128.
255 ir skaļruņu konuss vienā virzienā.
0 ir skaļruņu konuss citādi.
Tātad audio tiek ierakstīts kā saglabāti skaitļi, kas rada dažādus spriegumus, kas rada kustīgus skaļruņu konusus.
Mēs varam nosūtīt numurus no 8 rindām uz Arduino vienlaicīgi, izmantojot "portu".
Ja mēs ievadām 8 līnijas ciparu -analogo pārveidotājā, tas dara to, ko saka uz alvas, un rada analogo spriegumu, kas ir proporcionāls digitālajam skaitlim.
Viss, kas mums jādara, ir iepakot spriegumu mazam darbības pastiprinātājam un pēc tam skaļrunim.
4. solis: Mazā ķēde
DAC0832 LCN
Šis ir lielisks, lēts 8 bitu digitālā analogā pārveidotājs. (DAC)
To var pilnībā kontrolēt, izmantojot datu aizturēšanas masīvu, datu izlases līnijas.
Vai arī to var iestatīt, lai tas viss tiktu darīts automātiski sadaļā “Plūsma caur darbību”.
Lai citētu rokasgrāmatu:
Vienkārši CS, WR1, WR2 un XFER iezemēšana un augsta ILE sasiešana ļauj abiem iekšējiem reģistriem sekot pielietotajām digitālajām ieejām (caurplūde) un tieši ietekmēt DAC analogo izeju.
Labi, ka četri savienojumi ar mikroshēmu ir zemi un viens ir iestatīts uz 9 V - viegli.
Mēs nevēlamies negatīvus spriegumus, tāpēc rokasgrāmatā teikts, ka mums jāizmanto "sprieguma pārslēgšanas režīms", un tie piegādā diagrammu.
Viss, kas mums jādara, ir aizstāt nelielu audio pastiprinātāju, nevis to ieteikto.
Audio pastiprinātājs LM386-N
Pastiprinātāja rokasgrāmatā ir sniegta minimālā detaļu diagramma, kas nodrošina 20 pieaugumu (mums pārāk daudz, bet tai ir skaļuma kontrole).
Viss, kas mums jādara, ir pievienot kondensatoru starp DAC un pastiprinātāju, lai mēs pastiprinātu tikai maiņstrāvas signālus.
Mums ir jāpievieno arī pāris kondensatori katras mikroshēmas barošanas tapai, pretējā gadījumā mēs saņemsim dūkoņu no mūsu 9 V barošanas avota.
5. solis: izvelciet lodāmuru
Tā kā ķēde ir vienkārša, es nedomāju dot sitienu pa sitienu.
Šeit ir daži norādes:
- Sagatavojiet vara sloksnes plāksnes gabalu vismaz 28 x 28 caurumos. (Jā, es zinu, ka smadzeņu ķirurgi to var samazināt)
- Ja plānojat to piestiprināt ar skrūvēm, atļaujiet tās sākumā!
- Uzstādiet mikroshēmas uz kontaktligzdām. Ievietojiet mikroshēmas tikai tad, kad viss ir pārbaudīts.
- Turiet ievades vadus prom no izejas.
- Ievērojiet pareizo kondensatoru polaritāti.
- LM336 sprieguma atskaites bāzes skatu skatiet diagrammā. Pielāgošanas kāju neizmanto, un to var sagriezt.
- Ņemiet vērā tiešo savienojumu ar DAC 8. tapu- tas ir ļoti noderīgi testēšanai.
- Es izveidoju savienojumu ar Audino ar lentes kabeli un 10 virzienu IDC savienotāju.
- Uno savienojumi ir taisnā līnijā - iespējams, ka 8 ievades savienojumu sakārtošana vienā taisnā līnijā ļauj izveidot saiti ar Arduino ar iegādātu gatavu 8 virzienu savienotāju,
Kad tas ir izdarīts- pārbaudiet lodēšanu un pārbaudiet atstarpes starp vara sliedēm.
Man šķiet, ka 36 tpi junioru zāģa asmens ir ļoti noderīgs gružu tīrīšanai. Es noņemu asmens fiksējošās tapas un iebīdu asmens galu sliedē- Acīmredzot asmens nav rāmī.
6. darbība. DAC pārbaude
Atstājiet savienojumu starp ķēdi un Arduino izslēgtu.
Iestatiet ķēdes skaļuma regulatoru uz pusceļu.
Ieslēdziet 9 V līdzstrāvas barošanu savai jaunajai ķēdei.
Pārbaudiet, vai ķēde ir kārtībā- es nevaru uzņemties nekādu atbildību par jūsu ķēdi!
Izslēgt
Pievienojiet ķēdi Arduino.
Uz Mega izmantojiet tapas 22-29. (PORTA) Nekļūdieties ar iepriekš minētajām divām 5V tapām!
Uz Uno izmantojiet tapas 0-7. Tas ir PORTD
Pievienojiet 0 V barošanas avotu Arduino 0 V spriegumam.
Ieslēgt.
Atveriet šo testa programmu DAC_TEST
UNO aizstājiet visas atsauces uz PORTA uz PORTD
Nomainiet DDRA ar DDRD- šī instrukcija nosaka visas 8 rindas, lai tās izvadītu vienā piegājienā. Šis ir datu virzienu reģistrs.
Iestatiet sērijas monitoru uz 115200.
Pievienojiet voltmetru starp DAC izeju un OV
Programma iestatīs izeju uz 255 - visas līnijas ir ieslēgtas - maksimālais spriegums.
Izeja 128- puse no maksimālā sprieguma.
Izejas 0- nulles spriegums (vai, iespējams, gandrīz nulle).
Pēc tam solis būs pakāpeniski: 1, 2, 4, 8, 16, 32, 64, 128
Spriegumam vienmērīgi jāpalielinās.
Ja spriegums samazinās, kamēr skaitlis palielinās, iespējams, ka divi savstarpēji savienotie vadi ir apgriezti.
Jums vajadzētu arī dzirdēt skaļruņa klusu klikšķi, mainoties spriegumam
7. darbība: Wav galvenes lasīšana
Wav faili tiek saglabāti ar noteiktu frekvenci un datu lielumu.
Šī informācija ir ietverta 44 baitu galvenē wav faila sākumā.
Lai gan dažas programmatūras paplašina galveni (aiz 35. baita), padarot datu lieluma atrašanās vietu grūtāk atrodamu.
Lai lasītu galveni, mēs izveidojam buferi un nokopējam faila sākumu.
Frekvence tiek saglabāta 4 baitos, sākot ar 24 baitiem failā.
// lasīšanas biežums, kas norādīts wav faila galvenē
baits headbuf [60]
tempfile.seek (0);
tempfile.read (headbuf, 60);
retval = headbuf [27];
retval = (retval << 8) | headbuf [26];
retval = (retval << 8) | headbuf [25];
retval = (retval << 8) | headbuf [24];
Serial.print (F ("Failu biežums"));
Serial.print (retval);
Labākais veids, kā atrast informāciju par datu lielumu, ir meklēt galvenē vārdu "dati".
Pēc tam izvelciet 4 baitus pēc tā, kas veido garo vērtību
neparakstīts garš atkārtojums;
int mypos = 40;
par (int i = 36; i <60; i ++) {
ja (headbuf == 'd') {
ja (headbuf [i+1] == 'a') {
ja (headbuf [i+2] == 't') {
ja (headbuf [i+3] == 'a') {
// beidzot mums tas ir
mypos = i+4;
i = 60;
}
}
}
}
}
tempfile.seek (mypos);
retval = headbuf [mypos+3];
retval = (retval << 8) | headbuf [mypos+2];
retval = (retval << 8) | headbuf [mypos+1];
retval = (retval << 8) | headbuf [mypos];
Labi, mums ir datu garums un biežums!
Audio dati seko 4 baitiem, kas veido datu garuma vērtību.
8. solis: pārtraukt, pārtraukt…
Mēs izmantojam informāciju par frekvenci, lai izveidotu programmatūras pārtraukumu vajadzīgajā frekvencē vai tās tuvumā.
Pārtraukumu ne vienmēr var precīzi iestatīt, bet ar to pietiek. Faila nolasītā frekvence tiek nodota iestatītā pārtraukuma apakšprogrammai.
void setintrupt (float freq) {float bitval = 8; // 8 8 bitu taimeriem 0 un 2, 1024 taimera 1 baitam
setokroa = (16000000/(freq*bitval)) - 0,5;
// Setokroa vērtībai nepieciešams atņemt -1. Tomēr pievienojot 0,5 kārtas līdz tuvākajam 0,5
// Taimera izšķirtspēja ir ierobežota
// Galīgi nosaka bitvalda lielums
cli (); // atspējot pārtraukumus // iestatīt taimeri2 pārtraukt
TCCR2A = 0; // iestatiet visu TCCR2A reģistru uz 0
TCCR2B = 0; // tas pats TCCR2B
TCNT2 = 0; // inicializēt skaitītāja vērtību uz 0
// iestatiet salīdzināšanas atbilstības reģistru biežuma (hz) pieaugumam
OCR2A = setokroa; // = (16*10^6) / (biežums*8) - 1 (jābūt <256)
// ieslēdziet CTC režīmu
TCCR2A | = (1 << WGM21); // Iestatiet CS21 bitu 8 prescaler
TCCR2B | = (1 << CS21); // iespējot taimera salīdzināšanas pārtraukumu
// TIMSK2 | = (1 << OCIE2A); // tas darbojas, tāpat kā šī rinda
sbi (TIMSK2, OCIE2A); // iespējot pārtraukumu 2. taimerī
sei (); // iespējot pārtraukumus
Zinošākie lasītāji būs pamanījuši sbi (TIMSK2, OCIE2A)
Es iestatīju pāris (internetā iegūtās) funkcijas reģistra bitu iestatīšanai un dzēšanai:
// Definē reģistra bitu dzēšanai#ifndef cbi
#define cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))
#endif
// Nosaka reģistra bitu iestatīšanai
#ifndef sbi
#define sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))
#endif
Šīs funkcijas nodrošina vienkāršu zvanu, lai iestatītu vai notīrītu pārtraukumu.
Tātad pārtraukums darbojas, ko mēs varam darīt?
9. darbība. Pārtraukumi un dubultā buferizācija
Pie 22 Khz audio datu baits tiek izvadīts ik pēc 0,045 ms
512 baiti (bufera izmērs) tiek nolasīts 2,08 ms.
Tātad buferi nevar nolasīt no SDCard vienā rakstīšanas ciklā.
Tomēr ostā tiek ierakstīti 512 baiti 23,22 ms laikā.
Tātad viss, kas mums jādara, ir jāiestata jauns fails, kas jālasa katru reizi, kad buferis iztukšojas, un mums ir pietiekami daudz laika, lai iegūtu datus, pirms tiek prasīts jauns datu bloks … Pieņemot, ka mēs izmantojam divus buferus, vienu iztukšojot, aizpildot citu.
Tā ir dubultā buferizācija.
Atkārtota pārtraukšana palēninās faila lasīšanu, bet tas tiks paveikts.
Man ir iestatīti divi 512 baitu buferi, kurus sauc par bufa un bufb.
Ja karodziņš ir patiess, mēs lasām no porta, pretējā gadījumā lasām no portb
Kad bufera pozīcija (bufcount) sasniedz bufera lielumu (BUF_SIZE 512), mēs iestatām karodziņu readit uz true.
Tukšuma cikla rutīna meklē šo karodziņu un sāk bloķēt:
ja (lasīt) {ja (! aready) {
// uzsākt SDCard bloka lasīšanu bufa
tempfile.read (bufa, BUF_SIZE);
} vēl {
// uzsākt SDCard bloka lasīšanu bufb
tempfile.read (bufb, BUF_SIZE);
}
readit = nepatiess;
}
Kad tas ir pabeidzis ikdienas karodziņus readit = false.
Pārtraukšanas rutīnas ietvaros mums jāpārbauda, vai tukšuma cilpa ir pabeigta, pārbaudot, vai readit == false.
Šādā gadījumā mēs signalizējam, ka ir nepieciešama cita lasīšana, un pārslēdzam aready karodziņu, lai pārslēgtu buferus.
Ja SD karte joprojām tiek lasīta, mums ir jāatgriežas pie viena rādījuma (skaitītājs--; bufcount--;) un jāiziet no pārtraukuma, lai vēlāk mēģinātu vēlreiz. (Klikšķi audio izejas signālā norāda, ka tas ir noticis.)
Kad tiek nolasīti visi dati, pārtraukums tiek atcelts, ports tiek atkārtoti iestatīts uz vidējā sprieguma vērtību 128 un audio fails tiek aizvērts.
Pirms skripta dac2.ino palaišanas pirmo reizi iestatiet skaļumu līdz 50%. Tas būs pārāk skaļi, bet tas ir labāk nekā 100%!
Ja skaļuma kontrole darbojas pretēji, nomainiet vadus 10K potenciometra pretējos galos.
Ļaujiet man zināt, kā tas izklausās.
Ieteicams:
Video atskaņošana ar ESP32: 10 soļi (ar attēliem)
Atskaņot video ar ESP32: šajā instrukcijā ir parādīts kaut kas par video un audio atskaņošanu, izmantojot ESP32
Automašīnas skaņas signāls - pielāgoti skaņas efekti: 4 soļi (ar attēliem)
Automašīnas signāltaure - pielāgoti skaņas efekti: es savā automašīnā instalēju pielāgotus skaņas skaņas efektus, pamatojoties uz Marka Robera YouTube videoklipiem, un man patīk veidot lietas. Manuprāt, pamata automašīnas ragam ir vajadzīgas vairāk iespējas efektīvai saziņai starp autovadītājiem. Tur, kur esmu no standarta automašīnas raga, ir
Runājošais Arduino - MP3 atskaņošana ar Arduino bez moduļa - Mp3 faila atskaņošana no Arduino, izmantojot PCM: 6 soļi
Runājošais Arduino | MP3 atskaņošana ar Arduino bez moduļa | Mp3 faila atskaņošana no Arduino, izmantojot PCM: Šajā pamācībā mēs iemācīsimies atskaņot mp3 failu ar arduino, neizmantojot nevienu audio moduli, šeit mēs izmantosim PCM bibliotēku Arduino, kas atskaņo 16 bitu PCM ar 8 kHz frekvenci, tāpēc ļauj to izdarīt
Arduino Bascis - Skaņu un toņu atskaņošana: 5 soļi
Arduino Bascis - Skaņu un toņu atskaņošana: Es gribēju atskaņot dažus skaņas efektus un sapratu, ka šī ir viena no novārtā atstātajām jomām, kad runa ir par apmācībām. Pat vietnē Youtube trūkst labu pamācību par Arduinos un skaņām, tāpēc, būdams jauks puisis, nolēmu dalīties savās zināšanās
Pārvērtiet (gandrīz par) jebkuru multivides failu par (gandrīz par) jebkuru citu multivides failu bez maksas !: 4 soļi
Pārvērtiet (gandrīz par) jebkuru multivides failu par (gandrīz par) jebkuru citu multivides failu bez maksas!: Mans pirmais pamācāms, uzmundrinām! Jebkurā gadījumā es Google tīklā meklēju bezmaksas programmu, kas pārvērstu manus Youtube.flv failus tādā formātā ir universālāka, piemēram, wmv vai.mov. Es meklēju neskaitāmus forumus un vietnes un pēc tam atradu programmu ar nosaukumu