Мазмұны:

Дыбыстық файлдарды (Wav) Arduino және DAC көмегімен ойнату: 9 қадам
Дыбыстық файлдарды (Wav) Arduino және DAC көмегімен ойнату: 9 қадам

Бейне: Дыбыстық файлдарды (Wav) Arduino және DAC көмегімен ойнату: 9 қадам

Бейне: Дыбыстық файлдарды (Wav) Arduino және DAC көмегімен ойнату: 9 қадам
Бейне: BTT - Manta E3EZ - CB1 with EMMc install 2024, Шілде
Anonim
Дыбыстық файлдарды (Wav) Arduino және DAC көмегімен ойнату
Дыбыстық файлдарды (Wav) Arduino және DAC көмегімен ойнату
Дыбыстық файлдарды (Wav) Arduino және DAC көмегімен ойнату
Дыбыстық файлдарды (Wav) Arduino және DAC көмегімен ойнату
Дыбыстық файлдарды (Wav) Arduino және DAC көмегімен ойнату
Дыбыстық файлдарды (Wav) Arduino және DAC көмегімен ойнату

Audino SD картасынан wav файл аудио ойнатыңыз. Бұл нұсқаулық сізге SdCard картасындағы wav файлын динамикке қарапайым схема арқылы қалай ойнатуға болатынын көрсетеді.

Wav файлы 8 бит моно болуы керек. 44 кГц файлдарды ойнату менде қиындық тудырмады.

Дәлдігі жоғары болмаса да, дыбыс сапасы өте қанағаттанарлық.

Сериялық монитор файлды таңдау үшін қолданылады. Файлдар adlog деп аталатын қалтада болуы керек.

Бұл нұсқаулық Wav жазбаларын SdCard картасына сақтаған бұрынғы жобадан туындайды:

Схемада аналогты түрлендіргіш (DAC) мен 8 биттік арзан цифрлық дыбыс күшейткіші қолданылады.

Үзілістерді орнатудың негізгі бөлімдері Аманда Гассаидің тамаша мақаласынан алынды:

1 -қадам: талаптар

Талаптар
Талаптар
Талаптар
Талаптар

Arduino- Мен Mega қолданамын, бірақ Uno жұмыс істемеуіне ешқандай себеп жоқ.

SdCard оқу құралы-бағдарлама келесіге теңшелген: MicroSD Breakout Board Logo Conversion V2

Бұл нұсқаулықты SdCard орнату мәліметтері үшін қараңыз:

DAC0832 LCN- аналогты түрлендіргішке арналған 8 биттік цифрлық- бірнеше фунт.

LM386 N-1 Op амп- фишкалар сияқты арзан

20 жолды чипті розетка

8 жолды чипті розетка

9 вольтты қуат көзі- батарея жасайды.

LM336 2,5 В кернеуге сілтеме

10uF конденсаторы * 3 (кез келген кернеу 9В -тан жоғары)

10 Ом резисторы

50nF конденсатор- (немесе 47nF, 56nf, 68nf- жақын жерде болады)

220uF конденсатор

64 Ом динамик

10K сызықтық потенциометр

Arduino мен схема арасындағы 8 деректер желісін байланыстыратын кабель

Uno -да 8 байланыс кезекте тұр, Мегада олар жұпта.

Mega -де мен 10 жақты IDC тақырыбы бар 10 жақты таспалы кабельді қолдандым. (2 сым қосалқы)

0V, 9V және DAC шығыс розеткалары

Мыс жолақ тақтасы, дәнекерлеу, сым, кескіштер және т

2 -қадам: Техникалық сипаттамалар

Ерекшеліктер
Ерекшеліктер

Сериялық жиынтығы 115200 bod.

Mega көмегімен Hobbytronics MicroSD Breakout тақтасына қолдау бар. Чипті таңдау және басқа порттар Mega мен Uno арасында өзгереді.

Wav файлдары adlog деп аталатын каталогта болуы керек- оған басқаша атау беріңіз және қажетті кодтауды қайта реттеңіз.

Wav файлы 8 бит моно болуы керек. Мен 44 кГц жиілікке дейін тексердім.

Сериялық монитор adlog қалтасындағы wav файлдарын көрсетеді. Файл атаулары монитордың шығыс жолынан жіберіледі.

Файл өлшемі тек SdCard өлшемімен шектеледі.

3 -қадам: Жұмысты бастау

Бастау
Бастау

SD картасын оқу құралын қосыңыз. Бұл Mega үшін қосылыстар.

0, 5В

52 түйрегіне CLK басыңыз

D0 50 -ге дейін

D1 51 -ге дейін

CS 53 -ге бекітіңіз

(Uno портына қосылу үшін жеткізушілер веб -сайтын қараңыз)

Сіз картаңыздың осы кезеңде жұмыс істейтінін тексергіңіз келеді- жеткізуші берген сценарийлерді қолданыңыз.

Біз шағын тізбек жасауымыз керек

Біз Arduino -дан аудио байт ағынын жібереміз.

Бұл сандар 0 мен 255 аралығында. Олар кернеуді білдіреді.

Үнсіздік-127-128.

255 - динамик конусы бір жолмен.

0 - динамик конусы, керісінше.

Осылайша, дыбыс сақталатын сандар ретінде жазылады, олар әр түрлі кернеуді тудырады, олар қозғалатын динамик конустарын жасайды.

Біз сандарды Arduino -дағы 8 жолдан бір уақытта «порт» арқылы жібере аламыз.

Егер біз 8 жолды цифрлық -аналогты түрлендіргішке берсек, ол қаңылтырда айтылғанды істейді және цифрлық санға пропорционалды аналогты кернеуді шығарады.

Содан кейін бізге кернеуді шағын жұмыс күшейткішіне, содан кейін динамикке жинау керек.

4 -қадам: Кіші тізбек

Кіші тізбек
Кіші тізбек
Кіші тізбек
Кіші тізбек
Кіші тізбек
Кіші тізбек
Кіші тізбек
Кіші тізбек

DAC0832 LCN

Бұл керемет, арзан 8 биттік аналогты түрлендіргіш. (DAC)

Деректерді жинау, деректер үлгісі сызықтарымен толық басқаруға болады.

Немесе мұның бәрін автоматты түрде «Ағынмен жұмыс» бөлімінде жасауға болады.

Нұсқаулыққа сілтеме жасау үшін:

CS, WR1, WR2 және XFER-ді жерге тұйықтау және ILE-ді жоғары байланыстыру ішкі регистрлердің екеуіне де цифрлық кірістерді (ағынды) орындауға және DAC аналогтық шығысына тікелей әсер етуге мүмкіндік береді.

Жақсы - бұл микросхеманың төрт қосылымы төмен, ал біреуі 9В - оңай.

Біз теріс кернеулерді қаламаймыз, сондықтан нұсқаулықта «кернеуді ауыстыру режимін» қолдану керектігін айтады және олар диаграмманы береді.

Бізге тек олар ұсынатын дыбыс күшейткішті ауыстыру қажет.

LM386-N дыбыс күшейткіші

Amp нұсқаулығы бөлшектердің ең аз диаграммасын қамтамасыз етеді- 20 пайда әкеледі (біз үшін тым көп, бірақ оның дыбыс деңгейін басқару мүмкіндігі бар).

Бізге тек айнымалы ток сигналдарын күшейтетін етіп DAC пен күшейткіш арасындағы конденсаторды қосу қажет.

Біз сондай -ақ әр чиптің қорапшасына жақын орналасқан бірнеше конденсаторды қосуымыз керек, әйтпесе біз 9В қуат көзінен шу аламыз.

5 -қадам: Дәнекерлеу үтігінен шығыңыз

Пісіру үтігінен шығыңыз
Пісіру үтігінен шығыңыз
Пісіру үтігінен шығыңыз
Пісіру үтігінен шығыңыз
Пісіру үтігінен шығыңыз
Пісіру үтігінен шығыңыз

Схема қарапайым болғандықтан, соққы есебімен соққы бергім келмейді.

Міне, кейбір көрсеткіштер:

  • Мыстан жасалған таспаның бір бөлігін кемінде 28 -ден 28 тесікке дайындаңыз. (Иә, мен ми хирургтары оны кішірейте алатынын білемін)
  • Егер сіз оны бұрандалармен орнатқыңыз келсе, оларды бастауға рұқсат етіңіз!
  • Чиптерді розеткаға орнатыңыз. Чиптерді барлығы тексерілгеннен кейін ғана салыңыз.
  • Кіріс сымдарын шығудан алыс ұстаңыз.
  • Конденсаторлардың дұрыс полярлығын қадағалаңыз.
  • LM336 кернеу анықтамасының негізгі көрінісін диаграммадан қараңыз. Реттеу аяғы қолданылмайды және оны кесуге болады.
  • DAC 8-ші пинге тікелей қосылуға назар аударыңыз- бұл тестілеу үшін өте пайдалы.
  • Мен Audino -ға таспалы кабельмен және 10 -жолды IDC қосқышымен қосылдым.
  • Uno -да қосылымдар түзу сызықта - сіз 8 кіріс қосылымын бір түзу сызықпен реттеу сізге Arduino -ға сатып алынған, дайын 8 -жолды коннектормен байланыстыруға мүмкіндік беретінін білесіз.

Аяқтаған кезде- дәнекерлеуді және мыс жолдар арасындағы бос орындарды тексеріңіз.

Мен қоқысты тазарту үшін өте пайдалы 36 дюймдік кіші аралау дискісін табамын. Мен пышақтың бекіткіш түйреуіштерін алып тастап, пышақтың ұшын жолға қарай сырғытамын- Пышақ жақтауда емес екені анық.

6 -қадам: DAC тестілеу

DAC тестілеу
DAC тестілеу

Схема мен Arduino арасындағы байланысты өшіріңіз.

Электр тізбегіндегі дыбыс деңгейін реттегішті орта жолға орнатыңыз.

9 В тұрақты ток қуатын жаңа схемаға қосыңыз.

Схеманың дұрыс екенін тексеріңіз- мен сіздің схемаңыз үшін ешқандай жауапкершілікті қабылдай алмаймын!

Қуат көзін өшіру

Электр тізбегін Arduino -ға қосыңыз.

Mega-де 22-29 түйреуіштерін қолданыңыз. (ПОРТА) Жоғарыдағы 5В екі істікті қателеспеңіз!

Uno-да 0-7 түйреуіштерді қолданыңыз. Бұл PORTD

0V қуат көзін Arduino -дегі 0В -ге қосыңыз.

Күшейту.

DAC_TEST сынақ бағдарламасын ашыңыз

БҰҰ үшін PORTA сілтемелерінің барлығын PORTD дегенге ауыстырыңыз

DDRA-ны DDRD-мен ауыстырыңыз- бұл нұсқаулық барлық 8 жолды бір уақытта шығаруға орнатады. Бұл деректер бағыты регистрі.

Сериялық мониторды 115200 деп орнатыңыз.

DAC шығысы мен OV арасындағы вольтметрді қосыңыз

Бағдарлама шығуды 255 - барлық желілер қосылады - максималды кернеу.

Шығу максималды кернеудің 128 жартысы.

Шығу 0- нөлдік кернеу (немесе, мүмкін, нөлге жуық).

Содан кейін ол бит бойынша жүреді: 1, 2, 4, 8, 16, 32, 64, 128

Кернеу тұрақты түрде өсуі керек.

Егер кернеу саны артқан кезде төмендесе, сізде бір -бірімен байланысқан сымдардың екеуі де өзгеруі мүмкін.

Сондай -ақ, кернеу өзгерген кезде динамиктің ақырын басқанын есту керек

7 -қадам: Wav тақырыбын оқу

Wav тақырыбын оқу
Wav тақырыбын оқу

Wav файлдары белгіленген жиілікпен және деректер өлшемімен сақталады.

Бұл ақпарат wav файлының басында 44 байтты тақырыпта бар.

Кейбір бағдарламалық қамтамасыз ету тақырыпты кеңейтеді (35 байттан кейін), бұл деректер өлшемінің орнын табуды қиындатады.

Тақырыпты оқу үшін біз буфер құрамыз және файлдың басын көшіреміз.

Жиілік файлда 24 байттан бастап 4 байтта сақталады.

// wav файлының тақырыбында көрсетілген оқу жиілігі

байт басы [60]

tempfile.seek (0);

tempfile.read (headbuf, 60);

retval = headbuf [27];

retval = (retval << 8) | бас киімі [26];

retval = (retval << 8) | бас киімі [25];

retval = (retval << 8) | бас киімі [24];

Serial.print (F («Файл жиілігі»));

Serial.print (retval);

Деректер өлшемі туралы ақпаратты табудың ең жақсы жолы - тақырыптағы «деректер» сөзін іздеу.

Содан кейін ұзын мәнді құрайтын 4 байтты шығарыңыз

қол қойылмаған ұзақ мерзімді бақылау;

int mypos = 40;

үшін (int i = 36; i <60; i ++) {

егер (headbuf == 'd') {

егер (headbuf [i+1] == 'a') {

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

егер (headbuf [i+3] == 'a') {

// соңында бізде бар

mypos = i+4;

i = 60;

}

}

}

}

}

tempfile.seek (mypos);

retval = headbuf [mypos+3];

retval = (retval << 8) | хуф [mypos+2];

retval = (retval << 8) | хуф [mypos+1];

retval = (retval << 8) | басы [mypos];

Жарайды, бізде деректер ұзындығы мен жиілігі бар!

Дыбыстық деректер 4 байтты құрайды, ол деректер ұзындығының мәнін құрайды.

8 -қадам: үзу, үзу …

Үзіліс, үзіліс …
Үзіліс, үзіліс …

Біз жиілік туралы ақпаратты қажетті жиілікте немесе жақын жерде бағдарламалық қамтамасыз етуді үзу үшін қолданамыз.

Үзілісті әрқашан дәл орнату мүмкін емес, бірақ бұл жеткілікті. Файлдан оқылатын жиілік setintrupt қосалқы бағдарламасына беріледі.

void setintrupt (float freq) {float bitval = 8; // 8 биттік таймер үшін 0 және 2, 1024 таймер үшін 1 байт

setocroa = (16000000/(freq*bitval)) - 0,5;

// Setocroa мәні -1 шегеруді талап етеді. Дегенмен, 0,5 раундты 0,5 -ке жақын қосады

// Таймердің ажыратымдылығы шектеулі

// Ақырында битвалдың шамасымен анықталады

cli (); // үзілістерді өшіру // таймер2 үзілісін орнату

TCCR2A = 0; // бүкіл TCCR2A регистрін 0 -ге орнатыңыз

TCCR2B = 0; // TCCR2B үшін бірдей

TCNT2 = 0; // санауыш мәнін 0 -ге инициализациялау

// жиілік (гц) ұлғаюы үшін салыстыру сәйкестік регистрін орнатыңыз

OCR2A = сетокроа; // = (16*10^6) / (жиілігі*8) - 1 (<256 болуы керек)

// CTC режимін қосыңыз

TCCR2A | = (1 << WGM21); // CS21 битін 8 алдын ала есептегішке орнатыңыз

TCCR2B | = (1 << CS21); // таймер салыстыруды үзуді қосыңыз

// TIMSK2 | = (1 << OCIE2A); // бұл келесі жол сияқты жұмыс істейді

sbi (TIMSK2, OCIE2A); // таймердегі үзілісті қосу 2

sei (); // үзілістерді қосу

Ақылды оқырмандарда sbi (TIMSK2, OCIE2A) болады.

Мен регистрлік биттерді орнатуға және тазартуға арналған бірнеше (интернет арқылы алынған) функцияларды орнатамын:

// регистр биттерін тазалауды анықтайды#ifndef cbi

#debine cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (бит))

#endif

// Регистр биттерін орнатуды анықтайды

#ifndef sbi

#debine sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (бит))

#endif

Бұл функциялар үзілісті орнатуға немесе жоюға оңай қоңырау шалуды қамтамасыз етеді.

Сонымен үзіліс жүріп жатыр, біз оны не істей аламыз?

9 -қадам: Үзілістер және қос буферлеу

Үзілістер және қос буферлеу
Үзілістер және қос буферлеу
Үзілістер және қос буферлеу
Үзілістер және қос буферлеу

22 Гц жиілігінде әр 0,045 мс дыбыстық деректер байт шығарылады

512 байт (буфер өлшемі) 2,08 мс оқылады.

Сонымен, буферді SDCard картасынан бір жазу циклінде оқу мүмкін емес.

Алайда портқа 23.22 мс ішінде 512 байт жазылады.

Біз тек буфер босатылған сайын оқылатын жаңа файлды орнатуымыз керек және бізге жаңа деректер блогы қажет болғанға дейін деректерді алуға жеткілікті уақыт бар … Біз екі буферді қолданамыз деп есептесек, екіншісін толтырған кезде оны босатамыз.

Бұл қос буферлеу.

Қайталанатын үзіліс файлды оқуды баяулатады, бірақ ол орындалады.

Менде bufa және bufb деп аталатын 512 байтты екі буфер бар.

Егер жалауша шын болса, біз портадан оқимыз, әйтпесе біз portb -дан оқимыз

Буферлік позиция (bufcount) буферлік өлшемге жеткенде (BUF_SIZE 512) readit деп аталатын жалаушаны ақиқатқа орнатамыз.

Void циклінің процедурасы осы жалаушаны іздейді және блокты оқиды:

if (readit) {if (! aready) {

// bufa -ға SDCard блогын оқуды бастаңыз

tempfile.read (bufa, BUF_SIZE);

} басқа {

// SDCard блогын bufb -ге оқуды бастаңыз

tempfile.read (bufb, BUF_SIZE);

}

readit = жалған;

}

Ол аяқталғаннан кейін readit = false жалаушалары шығады.

Үзіліс тәртібінде біз readit == false екенін тексеру арқылы бос орындар циклінің аяқталғанын тексеруіміз керек.

Бұл жағдайда біз буферлерді ауыстыру үшін тағы бір оқу қажет және сигналдық жалаушаны ауыстырамыз деп сигнал береміз.

Егер SDcard әлі де оқылып жатса, біз бір оқуды қадағалауымыз керек (counter--; bufcount--;) және кейінірек қайталау үшін үзілістен шығу керек. (Аудио шығыс сигналына шертулер бұл орын алғанын білдіреді.)

Барлық деректер оқылған кезде үзіліс жойылады, порт орташа кернеудің 128 мәніне қайта орнатылады және аудио файл жабылады.

Dac2.ino сценарийін бірінші рет іске қоспас бұрын, дыбыс деңгейін 50%етіп орнатыңыз. Бұл тым қатты болады, бірақ бұл 100%жақсы!

Егер сіздің дыбыс реттегіші кері бағытта жұмыс жасаса, 10К потенциометрдің қарама -қарсы ұштарындағы сымдарды ауыстырыңыз.

Маған бұл қалай естілетінін айтыңыз.

Ұсынылған: