Talaan ng mga Nilalaman:

Nagpe-play ng Audio Sound Files (Wav) Sa isang Arduino at isang DAC: 9 Mga Hakbang
Nagpe-play ng Audio Sound Files (Wav) Sa isang Arduino at isang DAC: 9 Mga Hakbang

Video: Nagpe-play ng Audio Sound Files (Wav) Sa isang Arduino at isang DAC: 9 Mga Hakbang

Video: Nagpe-play ng Audio Sound Files (Wav) Sa isang Arduino at isang DAC: 9 Mga Hakbang
Video: How to ADD AUDIO FILES into FL Studio Mobile – import any song! (mp3, wav) 2024, Hulyo
Anonim
Nagpe-play ng Audio Sound Files (Wav) Sa isang Arduino at isang DAC
Nagpe-play ng Audio Sound Files (Wav) Sa isang Arduino at isang DAC
Nagpe-play ng Audio Sound Files (Wav) Sa isang Arduino at isang DAC
Nagpe-play ng Audio Sound Files (Wav) Sa isang Arduino at isang DAC
Nagpe-play ng Audio Sound Files (Wav) Sa isang Arduino at isang DAC
Nagpe-play ng Audio Sound Files (Wav) Sa isang Arduino at isang DAC

I-play ang wav file na Audio mula sa iyong Audino SD card. Ipapakita sa iyo ng Instructable na ito kung paano maaaring i-play ang isang wav file sa iyong SdCard sa pamamagitan ng isang simpleng circuit sa isang speaker.

Ang file na wav ay dapat na 8 bit mono. Wala akong problema sa paglalaro ng 44 KHz file.

Habang hindi hi-fidelity, ang kalidad ng tunog ay lubos na kasiya-siya.

Ginagamit ang serial monitor upang mapili ang file. Ang mga file ay dapat nasa isang folder na tinatawag na adlog.

Ang itinuturo na ito ay sumusunod mula sa isang naunang proyekto kung saan nai-save ko ang mga recording ng wav sa SdCard:

Gumagamit ang circuit ng isang murang 8 bit digital sa analog converter (DAC) at isang solong chip audio amplifier.

Ang mga pangunahing seksyon para sa pag-set up ng mga nakakagambala ay kinuha mula sa mahusay na artikulo ni Amanda Ghassaei:

Hakbang 1: Mga Kinakailangan

Mga Kinakailangan
Mga Kinakailangan
Mga Kinakailangan
Mga Kinakailangan

Arduino- Gumagamit ako ng Mega, subalit walang dahilan kung bakit hindi dapat gumana ang Uno.

Mambabasa ng SdCard- ang programa ay naka-configure para sa: MicroSD Breakout Board na Kinokontrol sa Logic Conversion V2

Tingnan ang itinuturo na ito para sa mga detalye ng pag-set up ng SdCard:

DAC0832 LCN- isang mahusay na 8 bit digital sa converter ng analogue- Ilang pounds.

LM386 N-1 Op amp- murang bilang chips

20 way chip socket

8 way chip socket

9 volt supply ng kuryente- magagawa ang isang baterya.

LM336 2.5 V boltahe na sanggunian

10uF Capacitor * 3 (anumang boltahe na higit sa 9V)

10 ohm risistor

50nF capacitor- (O saan sa malapit-47nF, 56nf, 68nf- gagawin)

220uF Capacitor

64 ohm speaker

10K linear potentiometer

Cable upang maiugnay ang 8 mga linya ng data sa pagitan ng Arduino at ng circuit-

Sa Uno ang 8 na koneksyon ay nasa linya, sa Mega sila ay pares.

Sa Mega gumamit ako ng 10 way ribbon cable na may isang 10 way na IDC header. (2 wires ay ekstrang)

Mga konektor ng socket para sa 0V, 9V at DAC out

Copper strip board, solder, wire, cutter atbp

Hakbang 2: Ang Mga Pagtukoy

Ang Mga pagtutukoy
Ang Mga pagtutukoy

Itinakda ang serial sa 115200 baud.

Nasa lugar ang suporta para sa Hobbytronics MicroSD Breakout Board na gumagamit ng isang Mega. Ang chip select at iba pang mga port ay magbabago sa pagitan ng Mega at Uno.

Ang mga file ng Wav ay dapat na umiiral sa isang direktoryo na tinatawag na adlog- Huwag mag-atubiling pangalanan ito ng iba pa at muling ayusin ang kinakailangang pag-coding.

Ang file na wav ay dapat na 8 bit mono. Nasubukan ko ang hanggang sa 44KHz.

Ipinapakita ng Serial monitor ang mga wav file sa folder ng adlog. Ang mga pangalan ng file ay ipinadala mula sa linya ng output ng monitor.

Ang laki ng file ay limitado lamang sa laki ng SdCard.

Hakbang 3: Pagsisimula

Nagsisimula
Nagsisimula

Ikonekta ang SD card reader. Ito ang mga koneksyon para sa Mega.

0, 5V

CLK upang i-pin 52

D0 upang i-pin 50

D1 upang i-pin 51

CS upang i-pin 53

(Tingnan ang website ng mga tagapagtustos para sa koneksyon ng Uno port)

Gusto mong subukan na gumagana ang iyong card sa yugtong ito- gamitin ang mga script na ibinibigay ng vendor.

Kailangan naming gumawa ng isang maliit na circuit

Magpapadala kami ng isang stream ng mga audio byte mula sa Arduino.

Ang mga bilang na ito ay nasa pagitan ng 0 at 255. Kinakatawan nila ang boltahe.

Ang katahimikan ay 127-128.

255 ay speaker kono mahirap isang paraan.

0 ay ang speaker cone mahirap sa ibang paraan.

Kaya't ang audio ay naitala bilang nai-save na mga numero, na lumilikha ng iba't ibang mga voltages, na lumilikha ng gumagalaw na mga speaker speaker.

Maaari naming ipadala ang mga numero sa labas ng 8 mga linya sa Arduino, nang sabay-sabay, sa pamamagitan ng paggamit ng isang "port".

Kung pakainin natin ang 8 mga linya sa isang digital sa analogue converter, ginagawa nito ang sinasabi sa lata at gumagawa ng isang analogue boltahe na proporsyonal sa digital na numero.

Ang kailangan lang nating gawin pagkatapos ay i-pack ang boltahe sa isang maliit na amplifier ng pagpapatakbo at pagkatapos ay sa isang speaker.

Hakbang 4: Ang Maliit na Circuit

Ang Maliit na Circuit
Ang Maliit na Circuit
Ang Maliit na Circuit
Ang Maliit na Circuit
Ang Maliit na Circuit
Ang Maliit na Circuit
Ang Maliit na Circuit
Ang Maliit na Circuit

Ang DAC0832 LCN

Ito ay isang napakahusay, murang 8 bit na Digital sa converter ng analogue. (DAC)

Maaari itong ganap na makontrol gamit ang isang hanay ng paghawak ng data, mga linya ng sample ng data.

O maaari itong i-setup upang gawin itong lahat nang awtomatiko sa "Daloy sa pamamagitan ng pagpapatakbo".

Upang quote ang manu-manong:

Ang saligan lamang ng CS, WR1, WR2, at XFER at tinali ang mataas na ILE ay nagbibigay-daan sa parehong panloob na mga rehistro na sundin ang inilapat na mga digital na input (flow-through) at direktang nakakaapekto sa output ng DAC analog.

OK na ang apat na koneksyon sa maliit na maliit na maliit na tilad at isang hanay sa 9V - madali.

Hindi namin nais ang anumang mga negatibong boltahe kaya sinabi ng manu-manong dapat naming gamitin ang "boltahe switching mode" at ibinibigay nila ang diagram.

Ang kailangan lang nating gawin ay kapalit ng isang maliit na Audio amp sa halip na isa na iminumungkahi nila.

Ang LM386-N Audio Amp

Ang manwal ng Amp ay nagbibigay ng isang minimum na diagram ng mga bahagi- na nagbibigay ng isang nakuha na 20 (Masyadong maraming para sa amin-ngunit mayroon itong kontrol sa dami).

Ang kailangan lang nating gawin ay magdagdag ng isang capacitor sa pagitan ng DAC at ng amp upang mapalakas lang namin ang mga AC signal.

Dapat din kaming magdagdag ng isang pares ng mga capacitor malapit sa supply pin ng bawat isa sa aming mga chips kung hindi man makakakuha kami ng hum mula sa aming 9V supply.

Hakbang 5: Lumabas sa Soldering Iron

Lumabas sa Soldering Iron
Lumabas sa Soldering Iron
Lumabas sa Soldering Iron
Lumabas sa Soldering Iron
Lumabas sa Soldering Iron
Lumabas sa Soldering Iron

Tulad ng circuit ay simple hindi ko balak na magbigay ng isang blow by blow account.

Narito ang ilang mga payo:

  • Maghanda ng isang piraso ng Copper strip board kahit 28 hanggang 28 na butas. (Oo alam kong maaaring gawing mas maliit ito ng mga siruhano sa utak)
  • Kung balak mong i-mount ito ng mga tornilyo, payagan ang mga ito sa simula!
  • I-mount ang mga chips sa mga socket. Ipasok lamang ang mga chips kapag nasuri ang lahat.
  • Panatilihin ang mga wire ng input mula sa output.
  • Pagmasdan ang tamang polarity para sa mga capacitor.
  • Sumangguni sa diagram para sa batayang pagtingin sa sanggunian ng boltahe ng LM336. Ang adjust leg ay hindi ginagamit at maaaring putulin.
  • Tandaan ang direktang koneksyon sa pin 8 ng DAC- Napaka kapaki-pakinabang para sa pagsubok.
  • Nakakonekta ako sa Audino na may ribbon cable at isang 10 way IDC connecter.
  • Sa Uno ang mga koneksyon ay nasa isang tuwid na linya - maaari mong malaman na ang pag-aayos ng 8 mga koneksyon sa pag-input sa isang solong tuwid na linya ay nagbibigay-daan sa iyo upang mag-link sa Arduino na may isang binili, handa nang gumawa ng 8 way na connecter,

Kapag tapos na ito - suriin ang paghihinang at suriin ang mga puwang sa pagitan ng mga tanso na tanso.

Nahanap ko ang isang 36 tpi junior hack saw talim na lubhang kapaki-pakinabang para sa pag-clear ng mga labi. Inalis ko ang mga pin na matatagpuan ng talim at isinasara ang dulo ng talim sa track- Malinaw na ang talim ay wala sa isang frame.

Hakbang 6: Pagsubok sa DAC

Pagsubok sa DAC
Pagsubok sa DAC

Iwanan ang Koneksyon sa pagitan ng Circuit at ng Arduino.

Itakda ang kontrol ng lakas ng tunog sa iyong circuit sa gitna.

Lumipat sa 9V DC Power sa iyong bagong circuit.

Suriin na ang circuit ay ok- Hindi ako makakatanggap ng anumang pananagutan para sa iyong circuit!

Patayin

Ikonekta ang iyong circuit sa Arduino.

Sa Mega gamitin ang mga pin 22-29. (PORTA) Huwag pagkakamali ang dalawang 5V na mga pin sa itaas!

Sa Uno gamitin ang mga pin na 0-7. Ito ay PORTD

Ikonekta ang 0V ng iyong supply ng kuryente sa 0V sa Arduino.

Pag lakas.

Buksan ang programang pagsubok na ito DAC_TEST

Para sa UNO, palitan ang lahat ng mga sanggunian sa PORTA sa PORTD

Palitan ang DDRA ng DDRD- itinuturo ng tagubiling ito ang lahat ng 8 mga linya upang mag-output nang sabay-sabay. Ito ang rehistro ng direksyon ng data.

Itakda ang iyong serial monitor sa 115200.

Ikonekta ang isang voltmeter sa pagitan ng DAC out at OV

Itatakda ng programa ang output sa 255- lahat ng mga linya sa - maximum na boltahe.

Output 128- kalahati ng maximum na boltahe.

Output 0- zero boltahe (O marahil halos zero).

Pagkatapos ay hakbang ito sa bahagya: 1, 2, 4, 8, 16, 32, 64, 128

Ang boltahe ay dapat na tumaas nang tuluy-tuloy.

Kung ang boltahe ay bumaba habang ang bilang ay nagdaragdag marahil ay may dalawang ng magkakaugnay na mga wire na baligtad.

Dapat mo ring marinig ang speaker na tahimik na nag-click sa pagbabago ng boltahe

Hakbang 7: Pagbasa ng Wav Header

Pagbasa ng Wav Header
Pagbasa ng Wav Header

Ang mga Wav file ay nai-save na may tinukoy na dalas at laki ng data.

Ang impormasyong ito ay nakapaloob sa isang 44 byte header sa simula ng isang wav file.

Kahit na ang ilang software ay pinahaba ang header (pagkatapos ng byte 35), ginagawang mas mahirap hanapin ang lokasyon ng laki ng data.

Upang mabasa ang header gumawa kami ng isang buffer at kopyahin ang pagsisimula ng file.

Ang dalas ay nakaimbak sa 4 bytes na nagsisimula sa 24 bytes sa file.

// basahin ang dalas na tinukoy sa wav file header

byte headbuf [60]

tempfile.seek (0);

tempfile.read (headbuf, 60);

retval = headbuf [27];

retval = (retalt << <<) | headbuf [26];

retval = (retalt << <<) | headbuf [25];

retval = (retalt << <<) | headbuf [24];

Serial.print (F ("Frequency ng File"));

Serial.print (retval);

Ang pinakamahusay na paraan upang mahanap ang impormasyon sa laki ng data ay upang maghanap para sa salitang "data" sa header.

Pagkatapos kunin ang 4 bytes na sumusunod dito, na bumubuo sa mahabang halaga

unsigned mahabang retval;

int mypos = 40;

para sa (int i = 36; i <60; i ++) {

kung (headbuf == 'd') {

kung (headbuf [i + 1] == 'a') {

kung (headbuf [i + 2] == 't') {

kung (headbuf [i + 3] == 'a') {

// sa wakas mayroon tayo nito

mypos = i + 4;

i = 60;

}

}

}

}

}

tempfile.seek (mypos);

retval = headbuf [mypos + 3];

retval = (retalt << <<) | headbuf [mypos + 2];

retval = (retalt << <<) | headbuf [mypos + 1];

retval = (retalt << <<) | headbuf [mypos];

OK mayroon kaming haba ng data at dalas!

Sinusundan ng data ng audio ang 4 bytes na bumubuo sa halaga ng haba ng data.

Hakbang 8: Makagambala, Makagambala …

Makagambala, Makagambala …
Makagambala, Makagambala …

Ginagamit namin ang impormasyong dalas upang lumikha ng isang software na makagambala sa, o malapit, sa kinakailangang dalas.

Ang pagkagambala ay hindi maaaring maitakda nang tumpak, ngunit sapat ito. Ang dalas na nabasa mula sa file ay ipinapasa sa setintrupt subroutine.

void setintrupt (float freq) {float bitval = 8; // 8 para sa 8 bit timer 0 at 2, 1024 para sa timer 1 byte

setocroa = (16000000 / (freq * bitval)) - 0.5;

// Ang halaga ng setocroa ay nangangailangan ng isang pagbabawas ng -1. Gayunpaman pagdaragdag ng 0.5 na pag-ikot sa pinakamalapit na 0.5

// Limitado ang resolusyon ng timer

// Huling natukoy ng lakas ng bitval

Tala (); // disable interrupts // set timer2 makagambala

TCCR2A = 0; // itakda ang buong rehistro ng TCCR2A sa 0

TCCR2B = 0; // pareho para sa TCCR2B

TCNT2 = 0; // ipasimula ang halaga ng counter sa 0

// set kumpara sa rehistro ng tugma para sa mga pagtaas ng dalas (hz)

OCR2A = setocroa; // = (16 * 10 ^ 6) / (dalas * 8) - 1 (dapat ay <256)

// i-on ang CTC mode

TCCR2A | = (1 << WGM21); // Itakda ang CS21 bit para sa 8 prescaler

TCCR2B | = (1 << CS21); // paganahin ang timer ihambing ang abala

// TIMSK2 | = (1 << OCIE2A); // gagana ito, tulad ng sumusunod na linya

sbi (TIMSK2, OCIE2A); // paganahin ang makagambala sa timer 2

sei (); // paganahin ang mga pagkagambala

Ang mga mambabasa na nakilala ay may batikang sbi (TIMSK2, OCIE2A)

Nag-set up ako ng ilang mga function na (nakuha sa internet) para sa pagtatakda at pag-clear ng mga bit ng rehistro:

// Tinutukoy para sa pag-clear ng mga register bit # ifndef cbi

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

#tapusin kung

// Tinutukoy para sa pagtatakda ng mga bit ng rehistro

#ifndef sbi

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

#tapusin kung

Ang mga pagpapaandar na ito ay nagbibigay ng isang madaling tawag upang maitakda o i-clear ang makagambala.

Kaya't tumatakbo ang abala, ano ang maaari nating gawin?

Hakbang 9: Nakagambala at Double Buffering

Nakagambala at Double Buffering
Nakagambala at Double Buffering
Nakagambala at Double Buffering
Nakagambala at Double Buffering

Sa 22 Khz isang byte ng audio data ay na-output bawat 0.045 ms

512 bytes (ang laki ng buffer) ay nababasa sa 2.08 ms.

Kaya't ang buffer ay hindi maaaring mabasa mula sa SDCard sa isang pagsulat ng ikot.

Gayunpaman 512 bytes ay nakasulat sa port sa 23.22ms.

Kaya ang kailangan lang nating gawin ay ang pag-set up ng isang bagong file na basahin tuwing ang buffer ay nawala at mayroon kaming sapat na oras upang makuha ang data bago kinakailangan ng isang bagong bloke ng data … Ipagpalagay na gumagamit kami ng dalawang mga buffer, tinatanggal ang isa habang pinupunan namin ang isa pa.

Double buffering ito.

Ang pagbasa ng file ay mabagal ng paulit-ulit na nakakagambala, ngunit makatapos ito.

Mayroon akong pag-set up ng dalawang 512 byte buffer na tinatawag na bufa at bufb.

Kung ang flag aready ay totoo binabasa namin mula sa porta kung hindi man basahin namin mula sa portb

Kapag ang posisyon ng buffer (bufcount) ay umabot sa laki ng buffer (BUF_SIZE 512) nagtakda kami ng isang flag na tinatawag na readit to true.

Ang gawain ng void loop ay naghahanap para sa watawat na ito at nagsisimula sa isang pagbabasa ng block:

kung (readit) {kung (! aready) {

// simulan ang SDCard block na basahin sa bufa

tempfile.read (bufa, BUF_SIZE);

} iba pa {

// simulan ang SDCard block na basahin sa bufb

tempfile.read (bufb, BUF_SIZE);

}

readit = false;

}

Kapag natapos na ang nakagawiang mga watawat readit = false.

Sa loob ng gumagambala na gawain dapat nating suriin na ang void loop ay natapos sa pamamagitan ng pag-check kung readit == false.

Ito ang kaso na hudyat namin na kinakailangan ng isa pang pagbabasa at i-toggle ang aready flag upang lumipat ng mga buffer.

Kung nagbabasa pa rin ang SDcard kailangan nating subaybayan ang isang pagbabasa (counter--; bufcount--;) at lumabas sa makagambala upang subukang muli sa ibang pagkakataon. (Ang mga pag-click sa signal ng output ng audio ay nagpapahiwatig na nangyari ito.)

Kapag nabasa na ang lahat ng data ang pagkagambala ay nakansela, ang port ay muling itinakda sa halaga ng kalagitnaan ng boltahe na 128 at ang audio file ay sarado.

Bago patakbuhin ang dac2.ino script sa unang pagkakataon, itakda ang iyong dami sa 50%. Ito ay magiging masyadong malakas, ngunit ito ay mas mahusay kaysa sa 100%!

Kung ang iyong kontrol sa dami ay gumagana sa reverse swap ang mga lead sa kabaligtaran na mga dulo ng 10K potentiometer.

Ipaalam sa akin kung paano ito tunog.

Inirerekumendang: