Satura rādītājs:

Audio skaņas failu atskaņošana (Wav) ar Arduino un DAC: 9 soļi
Audio skaņas failu atskaņošana (Wav) ar Arduino un DAC: 9 soļi

Video: Audio skaņas failu atskaņošana (Wav) ar Arduino un DAC: 9 soļi

Video: Audio skaņas failu atskaņošana (Wav) ar Arduino un DAC: 9 soļi
Video: Audacity - skaņas failu atvēršana un skaņas fragmentu iezīmēšana 2024, Jūlijs
Anonim
Audio skaņas failu atskaņošana (Wav) ar Arduino un DAC
Audio skaņas failu atskaņošana (Wav) ar Arduino un DAC
Audio skaņas failu atskaņošana (Wav) ar Arduino un DAC
Audio skaņas failu atskaņošana (Wav) ar Arduino un DAC
Audio skaņas failu atskaņošana (Wav) ar Arduino un DAC
Audio skaņas failu atskaņošana (Wav) ar Arduino un DAC

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

Prasības
Prasības
Prasības
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

Specifikācijas
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

Darba sākšana
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

Mazā ķēde
Mazā ķēde
Mazā ķēde
Mazā ķēde
Mazā ķēde
Mazā ķēde
Mazā ķēde
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

Izkāpiet no lodāmura
Izkāpiet no lodāmura
Izkāpiet no lodāmura
Izkāpiet no lodāmura
Izkāpiet no lodāmura
Izkāpiet no lodāmura

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

DAC pārbaude
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 galvenes lasīšana
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…

Pārtraukt, pārtraukt …
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

Pārtraukumi un dubultā buferizācija
Pārtraukumi un dubultā buferizācija
Pārtraukumi un dubultā buferizācija
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: