Orodha ya maudhui:

Kucheza Faili za Sauti za Sauti (Wav) Na Arduino na DAC: Hatua 9
Kucheza Faili za Sauti za Sauti (Wav) Na Arduino na DAC: Hatua 9

Video: Kucheza Faili za Sauti za Sauti (Wav) Na Arduino na DAC: Hatua 9

Video: Kucheza Faili za Sauti za Sauti (Wav) Na Arduino na DAC: Hatua 9
Video: Darassa ft Ben Pol - Muziki ( Official Music Video ) 2024, Novemba
Anonim
Kucheza Faili za Sauti za Sauti (Wav) Na Arduino na DAC
Kucheza Faili za Sauti za Sauti (Wav) Na Arduino na DAC
Kucheza Faili za Sauti za Sauti (Wav) Na Arduino na DAC
Kucheza Faili za Sauti za Sauti (Wav) Na Arduino na DAC
Inacheza Faili za Sauti za Sauti (Wav) Na Arduino na DAC
Inacheza Faili za Sauti za Sauti (Wav) Na Arduino na DAC

Cheza faili ya wav Sauti kutoka kwa kadi yako ya Audino SD. Agizo hili litaonyesha jinsi faili ya wav kwenye SdCard yako inaweza kuchezwa kupitia mzunguko rahisi kwa spika.

Faili ya wav lazima iwe mono kidogo 8. Sikuwa na shida kucheza faili 44 KHz.

Wakati sio uaminifu wa hi, ubora wa sauti unaridhisha sana.

Mfuatiliaji wa serial hutumiwa kuchagua faili. Faili lazima ziwe kwenye folda inayoitwa adlog.

Hii inaweza kufundishwa kutoka kwa mradi wa mapema ambapo nilihifadhi rekodi za wav kwa SdCard: https://www.instructables.com/id/Arduino-Mega-Audio ……

Mzunguko hutumia dijiti ya bei rahisi ya 8 kwa kibadilishaji cha analog (DAC) na kipaza sauti kimoja cha sauti.

Sehemu muhimu za kuanzisha usumbufu zilichukuliwa kutoka kwa nakala bora na Amanda Ghassaei:

Hatua ya 1: Mahitaji

Mahitaji
Mahitaji
Mahitaji
Mahitaji

Arduino- ninatumia Mega, hata hivyo hakuna sababu kwa nini Uno haipaswi kufanya kazi.

Msomaji wa SdCard- mpango umeundwa kwa: Bodi ya Kuzuka ya MicroSD Inayodhibitiwa na Logic Conversion V2 https://www.hobbytronics.co.uk/microsd-card-regula ……..

Tazama hii inayoweza kufundishwa kwa maelezo ya usanidi wa SdCard: https://www.instructables.com/id/Arduino-Mega-Audio ……

DAC0832 LCN - bora zaidi ya 8 kwa dijiti kwa kibadilishaji cha analog- Paundi chache.

LM386 N-1 Op amp- nafuu kama chips

Njia 20 ya tundu la chip

Njia 8 ya tundu la chip

Ugavi wa volt 9 - betri itafanya.

LM336 2.5 V kumbukumbu ya voltage

10uF Capacitor * 3 (voltage yoyote zaidi ya 9V)

Kuzuia 10 ohm

50nF capacitor- (Au mahali pengine karibu-47nF, 56nf, 68nf- itafanya)

Msimamizi wa 220uF

Spika ya 64 ohm

Potentiometer yenye urefu wa 10K

Cable kuunganisha laini za data 8 kati ya Arduino na mzunguko-

Kwenye Uno unganisho 8 ziko kwenye mstari, kwenye Mega ziko kwenye jozi.

Kwenye Mega nilitumia njia 10 ya Ribbon na kichwa cha njia 10 cha IDC. (Waya 2 ni za ziada)

Viunganisho vya tundu kwa 0V, 9V na DAC nje

Bodi ya shaba ya shaba, solder, waya, wakataji nk

Hatua ya 2: Maelezo

Ufafanuzi
Ufafanuzi

Seti iliyowekwa kwa baud ya 115200.

Msaada umewekwa kwa Bodi ya Kuzuka ya MicroSD ya Hobbytronics inayotumia Mega. Chagua chip na bandari zingine zitabadilika kati ya Mega na Uno.

Faili za Wav lazima ziwepo kwenye saraka inayoitwa adlog- Jisikie huru kuiita kitu kingine na upange upya usimbuaji unaohitajika.

Faili ya wav lazima iwe mono kidogo 8. Nimejaribu hadi 44KHz.

Mfuatiliaji wa serial huonyesha faili za wav kwenye folda ya adlog. Majina ya faili yametumwa kutoka kwa laini ya pato la ufuatiliaji.

Ukubwa wa faili umepunguzwa tu na saizi ya SdCard.

Hatua ya 3: Kuanza

Kuanza
Kuanza

Unganisha msomaji wa kadi ya SD. Hizi ni viunganisho vya Mega.

0, 5V

CLK kubandika 52

D0 kubandika 50

D1 kubandika 51

CS kubandika 53

(Tazama wauzaji wa waunganisho wa unganisho la bandari la Uno)

Utataka kujaribu kuwa kadi yako inafanya kazi katika hatua hii- tumia maandishi yaliyotolewa na muuzaji.

Tunahitaji kufanya mzunguko mdogo

Tutatuma mtiririko wa ka za sauti kutoka Arduino.

Nambari hizi ni kati ya 0 na 255. Zinawakilisha voltage.

Ukimya ni 127-128.

255 ni koni ya spika kwa njia moja.

0 ni koni ya spika ngumu kwa njia nyingine.

Kwa hivyo sauti inarekodiwa kama nambari zilizohifadhiwa, ambazo huunda voltages tofauti, ambazo huunda koni za spika zinazohamia.

Tunaweza kutuma nambari kutoka kwa mistari 8 kwenye Arduino, wakati huo huo, kwa kutumia "bandari".

Ikiwa tunalisha mistari 8 ndani ya dijiti kwa kibadilishaji cha analog, inafanya kile inachosema kwenye bati na inazalisha voltage ya analog ambayo ni sawa na nambari ya dijiti.

Tunachohitaji kufanya basi ni kupakia voliti kwenye kifaa kidogo cha kuongeza nguvu na kisha kwa spika.

Hatua ya 4: Mzunguko Mdogo

Mzunguko Mdogo
Mzunguko Mdogo
Mzunguko Mdogo
Mzunguko Mdogo
Mzunguko Mdogo
Mzunguko Mdogo
Mzunguko Mdogo
Mzunguko Mdogo

DAC0832 LCN

Hii ni ya hali ya juu, ya bei rahisi ya 8 bit kwa ubadilishaji wa analog. (DAC)

Inaweza kudhibitiwa kikamilifu na safu ya kushikilia data, mistari ya sampuli za data.

Au inaweza kusanidiwa kuifanya yote kiatomati katika "Flow through operation".

Kunukuu mwongozo:

Kutuliza tu CS, WR1, WR2, na XFER na kufunga ILE juu huruhusu sajili zote za ndani kufuata pembejeo za dijiti (mtiririko) na kuathiri moja kwa moja pato la analog ya DAC.

Sawa hiyo ni unganisho nne kwa chip iliyowekwa chini na moja imewekwa kwa 9V - rahisi.

Hatutaki voltages hasi nje kwa hivyo mwongozo unasema tunapaswa kutumia "hali ya kubadili voltage" na wanatoa mchoro.

Tunachohitaji kufanya ni kubadilisha sauti ndogo ya sauti badala ya ile wanayopendekeza.

LM386-N Sauti ya Sauti

Mwongozo wa Amp hutoa mchoro wa sehemu ya chini- kutoa faida ya 20 (Njia nyingi sana kwetu - lakini ina udhibiti wa sauti).

Tunachohitaji kufanya ni kuongeza capacitor kati ya DAC na amp ili tu tuongeze ishara za AC.

Lazima pia tuongeze capacitors kadhaa karibu na pini ya usambazaji wa kila chips zetu vinginevyo tutapata hum kutoka kwa usambazaji wetu wa 9V.

Hatua ya 5: Toka nje ya Chuma cha Kufundisha

Toka nje ya chuma cha chuma
Toka nje ya chuma cha chuma
Toka nje ya chuma cha chuma
Toka nje ya chuma cha chuma
Toka nje ya chuma cha chuma
Toka nje ya chuma cha chuma

Kwa kuwa mzunguko ni rahisi sikusudii kutoa pigo kwa akaunti ya pigo.

Hapa kuna vidokezo kadhaa:

  • Andaa kipande cha bodi ya Shaba ya Shaba angalau mashimo 28 na 28. (Ndio najua waganga wa ubongo wanaweza kuifanya ndogo)
  • Ikiwa unakusudia kuiweka na vis, uiruhusu mwanzoni!
  • Panda chips kwenye soketi. Ingiza chips tu wakati kila kitu kimekaguliwa.
  • Weka waya wa pembejeo mbali na pato.
  • Angalia polarity sahihi kwa capacitors.
  • Rejea mchoro kwa mtazamo wa msingi wa kumbukumbu ya voltage ya LM336. Mguu wa kurekebisha hautumiwi na unaweza kukatwa.
  • Kumbuka unganisho la moja kwa moja kwa kubandika 8 ya DAC- Ni muhimu sana kwa upimaji.
  • Niliunganisha Audino na kebo ya Ribbon na kiunganishi cha IDC cha njia 10.
  • Kwenye Uno unganisho liko sawa - unaweza kupata kuwa kupanga viunganisho 8 vya pembejeo kwenye laini moja moja hukuruhusu kuunganisha kwa Arduino na kiunganishi kilichonunuliwa, kilichotengenezwa tayari cha njia 8,

Wakati umekwisha - angalia soldering na uangalie mapungufu kati ya nyimbo za shaba.

Ninaona blade ndogo ya tpi ya 36 tpi muhimu sana kwa kusafisha uchafu. Ninaondoa pini za kutafuta blade na kutelezesha ncha ya blade kwenye wimbo- Ni wazi kwamba blade haiko kwenye fremu.

Hatua ya 6: Kupima DAC

Kupima DAC
Kupima DAC

Acha Uunganisho kati ya Mzunguko na Arduino imezimwa.

Weka udhibiti wa sauti kwenye mzunguko wako hadi katikati.

Washa umeme wa 9V DC kwenye mzunguko wako mpya.

Angalia kuwa mzunguko uko sawa - siwezi kukubali dhima yoyote kwa mzunguko wako!

Zima umeme

Unganisha mzunguko wako na Arduino.

Kwenye pini za matumizi ya Mega 22-29. (PORTA) Usikosee pini mbili za 5V hapo juu!

Kwenye pini za Uno tumia 0-7. Hii ni PORTD

Unganisha 0V ya usambazaji wako wa umeme kwa 0V kwenye Arduino.

Anzisha.

Fungua mpango huu wa jaribio DAC_TEST

Kwa UNO, badilisha marejeleo yote kwa PORTA kwa PORTD

Badilisha DDRA na DDRD- maagizo haya huweka mistari yote 8 ili kutoa kwa njia moja. Hii ndio rejista ya mwelekeo wa data.

Weka mfuatiliaji wako wa serial saa 115200.

Unganisha voltmeter kati ya DAC nje na OV

Programu itaweka pato kwa 255- mistari yote juu - kiwango cha juu cha voltage.

Pato 128- nusu ya kiwango cha juu cha voltage.

Pato 0- zero voltage (Au labda karibu sifuri).

Kisha itaenda kidogo: 1, 2, 4, 8, 16, 32, 64, 128

Voltage inapaswa kuongezeka kwa kasi.

Ikiwa voltage inashuka nyuma wakati idadi inaongezeka labda una waya mbili zinazounganisha zimebadilishwa.

Unapaswa pia kusikia mzungumzaji akibofya kimya kimya wakati voltage inabadilika

Hatua ya 7: Kusoma Kichwa cha Wav

Kusoma Kichwa cha Wav
Kusoma Kichwa cha Wav

Faili za Wav zinahifadhiwa na masafa na saizi maalum ya data.

Habari hii iko katika kichwa cha baiti 44 mwanzoni mwa faili ya wav.

Ingawa programu zingine hupanua kichwa (baada ya baiti 35), na kufanya eneo la saizi ya data kuwa ngumu kupata.

Kusoma kichwa tunaunda bafa na kunakili mwanzo wa faili.

Masafa huhifadhiwa kwa ka 4 kuanzia baiti 24 kwenye faili.

// kusoma masafa yaliyotajwa katika kichwa cha faili ya wav

kichwa cha kichwa [60]

tafuta.tafuta (0);

faili ya kusoma (kichwa cha kichwa, 60);

retval = kichwa cha kichwa [27];

retval = (kumbukumbu << 8) | kichwa [26];

retval = (kumbukumbu << 8) | kichwa [25];

retval = (kumbukumbu << 8) | kichwa cha kichwa [24];

Serial.print (F ("Faili Frequency"));

Serial.print (kumbukumbu);

Njia bora ya kupata habari ya saizi ya data ni kutafuta neno "data" kwenye kichwa.

Kisha toa ka 4 zifuatazo, ambazo hufanya thamani ndefu

kumbukumbu ya muda mrefu isiyosainiwa;

int mypos = 40;

kwa (int i = 36; i <60; i ++) {

ikiwa (headbuf == 'd') {

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

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

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

// mwishowe tunayo

mypos = i + 4;

i = 60;

}

}

}

}

}

tempfile.seek (mypos);

retval = kichwa cha kichwa [mypos + 3];

retval = (kumbukumbu << 8) | kichwa cha kichwa [mypos + 2];

retval = (kumbukumbu << 8) | kichwa cha kichwa [mypos + 1];

retval = (kumbukumbu << 8) | kichwa cha kichwa [mypos];

Sawa tuna urefu wa data na masafa!

Takwimu za sauti hufuata ka 4 zinazounda thamani ya urefu wa data.

Hatua ya 8: Kukatisha, Kukatisha…

Kukatisha, Kukatisha…
Kukatisha, Kukatisha…

Tunatumia habari ya masafa kuunda programu kukatiza, au karibu, masafa yanayotakiwa.

Usumbufu hauwezi kuwekwa kila wakati haswa, lakini inatosha. Masafa yaliyosomwa kutoka kwa faili hupitishwa kwa subroutine iliyosababishwa.

batili setintrupt (kuelea freq) {kuelea bitval = 8; // 8 kwa vipima muda 8 0 na 2, 1024 kwa kipima muda 1 byte

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

// Thamani ya setocroa inahitaji uondoaji wa -1. Walakini kuongeza raundi 0.5 kwa karibu 0.5

// Azimio la kipima muda ni mdogo

// Hatimaye imedhamiriwa na ukubwa wa bitval

cli (); //lemaza kukatiza // kuweka timer2 kukatiza

TCCR2A = 0; // weka rejista yote ya TCCR2A hadi 0

TCCR2B = 0; // sawa kwa TCCR2B

TCNT2 = 0; // anzisha thamani ya kaunta hadi 0

// kuweka kulinganisha rejista ya mechi ya nyongeza za masafa (hz)

OCR2A = setocroa; // = (16 * 10 ^ 6) / (masafa * 8) - 1 (lazima iwe <256)

// washa hali ya CTC

TCCR2A | = (1 << WGM21); // Weka CS21 kidogo kwa daktari 8

TCCR2B | = (1 << CS21); // kuwezesha kipima muda kulinganisha kukatiza

// TIMSK2 | = (1 << OCIE2A); // hii inafanya kazi, kama vile mstari unaofuata

sbi (TIMSK2, OCIE2A); // kuwezesha kukatiza kwenye kipima saa 2

jinsi (); // kuwezesha usumbufu

Wasomaji wenye utambuzi watakuwa wameona sbi (TIMSK2, OCIE2A)

Ninaweka kazi kadhaa za (mtandao zilizopatikana) kwa kuweka na kusafisha bits:

// Inafafanua kwa kusafisha bits # ifndef cbi

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

# mwisho

// Inafafanua kwa kuweka bits

#fndef sbi

#fafanua sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (kidogo))

# mwisho

Kazi hizi hutoa simu rahisi kuweka au kusafisha usumbufu.

Kwa hivyo usumbufu unaendelea, tunaweza kufanya nini?

Hatua ya 9: Usumbufu na Bajaji Mbili

Usumbufu na Bajaji Mbili
Usumbufu na Bajaji Mbili
Usumbufu na Bajaji Mbili
Usumbufu na Bajaji Mbili

Saa 22 Khz baiti ya data ya sauti hutolewa kila ms 0.045

Baiti 512 (saizi ya bafa) inasomwa kwa msamba 2.08.

Kwa hivyo bafa haiwezi kusomwa kutoka kwa SDCard katika mzunguko mmoja wa kuandika.

Walakini baiti 512 zimeandikwa kwa bandari kwa milimita 23.22.

Kwa hivyo tunachohitajika kufanya ni kusanidi faili mpya iliyosomwa kila wakati bafa inapomaliza na tuna muda wa kutosha kupata data kabla ya kizuizi kipya cha data kinahitajika… Kwa kudhani tunatumia viboreshaji viwili, tukitupa moja tunapojaza nyingine.

Hii ni kubatiza mara mbili.

Faili iliyosomwa itapunguzwa na usumbufu unaorudiwa, lakini utamaliza.

Nina usanidi wa bafa mbili 512 zilizoitwa bufa na bufb.

Ikiwa bendera ya bendera ni kweli tunasoma kutoka porta vinginevyo tunasoma kutoka portb

Wakati nafasi ya bafa (bufcount) inafikia saizi ya bafa (BUF_SIZE 512) tunaweka bendera inayoitwa readit kuwa kweli.

Utaratibu wa kitanzi batili hutafuta bendera hii na kuanza kusoma kusoma:

ikiwa (soma) {ikiwa (! aready) {

// kuanzisha kizuizi cha SDCard kusoma kwa bufa

jifunze faili (bufa, BUF_SIZE);

} mwingine {

// kuanzisha kizuizi cha SDCard kusoma kwa bufb

soma faili (bufb, BUF_SIZE);

}

kusoma = uwongo;

}

Wakati imemaliza bendera za kawaida kusoma = uwongo.

Ndani ya utaratibu wa usumbufu lazima tuangalie kwamba kitanzi batili kimemaliza kwa kuangalia ikiwa kusoma == uwongo.

Kwa hali hii tunaashiria kwamba kusoma tena kunahitajika na kugeuza bendera ya uwanja ili kubadili bafa.

Ikiwa SDCard bado inasoma tunapaswa kufuata usomaji mmoja (counter--; bufcount--;) na uondoke kukatiza kujaribu tena baadaye. (Bonyeza kwenye ishara ya pato la sauti inamaanisha kuwa hii imetokea.)

Wakati data yote inasomwa ukatishaji umeghairiwa, bandari imewekwa tena kwa thamani ya katikati ya 128 na faili ya sauti imefungwa.

Kabla ya kuendesha hati ya dac2.ino kwa mara ya kwanza, weka sauti yako hadi 50%. Hii itakuwa kubwa sana, lakini ni bora kuliko 100%!

Ikiwa udhibiti wako wa sauti unafanya kazi kwa kubadilisha ubadilishaji unaongoza kwenye ncha tofauti za potentiometer ya 10K.

Napenda kujua jinsi inasikika.

Ilipendekeza: