Мазмуну:

Аудио үн файлдарын ойнотуу (Wav) Arduino жана DAC менен: 9 кадам
Аудио үн файлдарын ойнотуу (Wav) Arduino жана DAC менен: 9 кадам

Video: Аудио үн файлдарын ойнотуу (Wav) Arduino жана DAC менен: 9 кадам

Video: Аудио үн файлдарын ойнотуу (Wav) Arduino жана DAC менен: 9 кадам
Video: Как Из Видео Сделать Аудио (mp3) онлайн ЗА 1 МИНУТУ! 2024, Ноябрь
Anonim
Аудио үн файлдарын (Wav) Arduino жана DAC менен ойнотуу
Аудио үн файлдарын (Wav) Arduino жана DAC менен ойнотуу
Аудио үн файлдарын (Wav) Arduino жана DAC менен ойнотуу
Аудио үн файлдарын (Wav) Arduino жана DAC менен ойнотуу
Аудио үн файлдарын (Wav) Arduino жана DAC менен ойнотуу
Аудио үн файлдарын (Wav) Arduino жана DAC менен ойнотуу

Audino SD картаңыздан wav файлынын аудиосун ойнотуңуз. Бул Instructable сизге SdCardдагы wav файлын динамикке жөнөкөй схема аркылуу ойнотууну көрсөтөт.

Wav файлы 8 бит моно болушу керек. 44 КГц файлдарды ойнотууда менде эч кандай кыйынчылык болгон жок.

Жогорку сапатта болбосо да, үн сапаты абдан канааттандырарлык.

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

Бул көрсөтмө Wav жаздырууларын SdCardга сактап койгон мурунку долбоордон келип чыгат:

Райондо аналогдук конвертерге (DAC) жана бир чиптүү аудио күчөткүчкө арзан 8 биттик санарип колдонулат.

Үзгүлтүктөрдү орнотуу үчүн негизги бөлүмдөр Аманда Гассайинин мыкты макаласынан алынды:

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

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

Arduino- Мен Mega колдоном, бирок Uno иштебеши үчүн эч кандай себеп жок.

SdCard reader-программа төмөнкү үчүн конфигурацияланган: MicroSD Breakout Board Logo Conversion V2 менен жөнгө салынат

SdCard орнотуу чоо-жайын билүү үчүн бул көрсөтмөнү караңыз:

DAC0832 LCN- аналогдук конвертерге эң сонун 8 бит санарип- Бир нече фунт.

LM386 N-1 Op amp- микросхемалардан арзан

20 тараптуу чип розеткасы

8 тараптуу чип розеткасы

9 вольттуу электр энергиясы- батарейка.

LM336 2,5 В чыңалуусуна шилтеме

10uF Конденсатор * 3 (9Вдан ашык ар кандай чыңалуу)

10 Ом каршылыгы

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

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

64 Ом динамик

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

Ардуино менен схеманын ортосундагы 8 маалымат линиясын байланыштыруучу кабель

Uno боюнча 8 байланыш кезекте турат, Мегада алар жупта.

Мегада мен 10 тараптуу IDC башы бар 10 тараптуу лента кабелин колдондум. (2 зым запастык)

0V, 9V жана DAC үчүн розетка туташтыргычтары

Жез тилке тактасы, ширетүү, зым, кескичтер ж

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

Specification
Specification

Сериал 115200 bodга коюлган.

Mega колдонгон Hobbytronics MicroSD Breakout Board үчүн колдоо бар. Чип тандоо жана башка порттор Mega менен Uno ортосунда өзгөрөт.

Wav файлдары adlog деп аталган каталогдо болушу керек- ага башка нерсе деп атоону жана керектүү кодду кайра иреттөөнү каалабаңыз.

Wav файлы 8 бит моно болушу керек. Мен 44 кГцке чейин сынап көрдүм.

Сериялык монитор wav файлдарын adlog папкасында көрсөтөт. Файлдын аттары монитордун линиясынан жөнөтүлөт.

Файлдын өлчөмү SdCard өлчөмү менен гана чектелет.

3 -кадам: Баштоо

Баштоо
Баштоо

SD карта окугучту туташтырыңыз. Бул Mega үчүн байланыштар.

0, 5V

52 -пинге CLK

D0 50гө чейин

D1 51ге чейин

CS 53 -пин

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

Сиз бул этапта картаңыздын иштээрин текшергиңиз келет- сатуучу берген скрипттерди колдонуңуз.

Биз кичинекей схеманы түзүшүбүз керек

Биз Arduinoдон аудио байт агымын жөнөтөбүз.

Бул сандар 0 менен 255тин ортосунда. Алар чыңалууну билдирет.

Унчукпоо 127-128.

255 спикери конус бир жол менен кыйын.

0 спикер конусу башка жол менен кыйын.

Ошентип, аудио ар кандай чыңалуу жараткан, кыймылдуу спикерлердин конусун түзгөн сакталган сандар катары жазылат.

Биз "портту" колдонуу менен бир эле убакта Arduinoдогу 8 саптан номерлерди жөнөтө алабыз.

Эгерде биз 8 линияны санариптен аналогго айландыргычка берсек, ал калайда айткандай кылат жана санариптик санга пропорционалдуу аналогдук чыңалууну чыгарат.

Андан кийин биз кылышыбыз керек болгон нерсе - чыңалууну кичинекей оперативдүү күчөткүчкө, андан кийин динамикке топтоо.

4 -кадам: Small Circuit

Small Circuit
Small Circuit
Small Circuit
Small Circuit
Small Circuit
Small Circuit
Small Circuit
Small Circuit

DAC0832 LCN

Бул сонун, арзан 8 биттик Digital аналогдук конвертер. (DAC)

Бул толугу менен маалыматтарды кармоо, маалымат үлгүлөрү линиялары менен көзөмөлдөнүшү мүмкүн.

Же муну автоматтык түрдө "Иштин агымы" бөлүмүндө жасоого болот.

Колдонмого цитата келтирүү үчүн:

Жөн эле CS, WR1, WR2 жана XFERди негиздөө жана ILEди байлап коюу ички реестрлерге санариптик кириштерди (агым аркылуу) ээрчүүгө жана DAC аналогдук чыгарылышына түздөн-түз таасир этүүгө мүмкүнчүлүк берет.

Жарайт, бул чиптин төрт туташуусу төмөн жана бирөөсү 9В - оңой.

Биз эч кандай терс чыңалууну каалабайбыз, андыктан колдонмодо "чыңалуу которуштуруу режимин" колдонуу керек деп айтылат жана алар диаграмманы беришет.

Болгону, алар сунуштаган ордуна кичинекей Аудио ампти алмаштыруу керек.

LM386-N аудио күчөткүч

Amp колдонмосу минималдуу бөлүктөрдүн диаграммасын камсыздайт- 20дан ашык киреше (Биз үчүн өтө эле көп, бирок анын көлөмүн көзөмөлдөөчү).

Биз эмне кылышыбыз керек, биз AC сигналдарын күчөтүү үчүн DAC менен амптин ортосуна конденсатор кошуубуз керек.

Биз ошондой эле ар бир чипибиздин түйүнүнө жакын бир нече конденсаторлорду кошушубуз керек, антпесе биз 9В камсыздообуздан күрүлдөп алабыз.

5 -кадам: Лампочкадан чыгыңыз

Лампочкадан чыгыңыз
Лампочкадан чыгыңыз
Лампочкадан чыгыңыз
Лампочкадан чыгыңыз
Лампочкадан чыгыңыз
Лампочкадан чыгыңыз

Район жөнөкөй болгондуктан, сокку эсебинен сокку берүү ниетим жок.

Бул жерде кээ бир көрсөткүчтөр бар:

  • Кеминде 28 28 тешиктен турган жез тилкесинин бир бөлүгүн даярдаңыз. (Ооба, мээ хирургдары аны кичирейте аларын билем)
  • Эгерде сиз аны бурамалар менен орнотууну көздөп жатсаңыз, аларга башында уруксат бериңиз!
  • Чиптерди розеткага орнотуңуз. Чиптерди баары текшерилгенден кийин гана салыңыз.
  • Кирүүчү зымдарды чыгуудан алыс кармаңыз.
  • Конденсаторлор үчүн туура полярдыкты байкаңыз.
  • LM336 чыңалуу шилтемесинин базалык көрүнүшү үчүн диаграмманы караңыз. Түзөөчү бут колдонулбайт жана аны кесүүгө болот.
  • DACдин 8-пинге түз туташуусуна көңүл буруңуз- Бул тестирлөө үчүн абдан пайдалуу.
  • Мен Audino менен лента кабели жана 10 тараптуу IDC туташтыргычы аркылуу туташтым.
  • Unoдо туташуулар түз сызыкта болот - сиз 8 түз кирүүнү бир түз сызыкка жайгаштыруу, Arduino менен 8 тараптуу сатып алынган, даяр 8 туташтыргычы менен байланыштырууга мүмкүндүк берет деп ойлошуңуз мүмкүн.

Качан ал бүткөндө- ширетүүнү жана жез тректердин ортосундагы боштуктарды текшериңиз.

Мен 36 tpi кенже хек араа бычакты таштандыларды тазалоо үчүн абдан пайдалуу деп эсептейм. Мен пышактын жайгашуучу казыктарын алып салам жана бычактын учун трекке жылдырам- Албетте, пышак алкакта эмес.

6 -кадам: DACти текшерүү

DAC тестирлөө
DAC тестирлөө

Район менен Arduino ортосундагы байланышты өчүрүңүз.

Тизмеңиздеги үндү көзөмөлдөөнү орто жолдо коюңуз.

9V DC Powerти жаңы схемаңызга күйгүзүңүз.

Райондун жакшы экенин текшериңиз- мен сиздин схемаңыз үчүн эч кандай жоопкерчиликти албайм!

Өчүрүү

Районуңузду Arduino менен туташтырыңыз.

Мегада 22-29 казыктарын колдонуңуз. (PORTA) Жогорудагы эки 5V пинди жаңылтпаңыз!

Uno боюнча 0-7 пинтерин колдонуңуз. Бул PORTD

Электр энергияңыздын 0Vну Arduinoдогу 0Vга туташтырыңыз.

Күйгүзүү.

Бул тест программасын DAC_TEST ачыңыз

БУУ үчүн PORTAга болгон бардык шилтемелерди PORTDге алмаштырыңыз

DDRAны DDRD менен алмаштырыңыз- бул көрсөтмө бардык 8 линияны бир эле учурда чыгарууга орнотот. Бул маалымат багыты реестри.

Сериялык мониторду 115200 деп коюңуз.

DAC чыгуу менен OV ортосунда вольтметрди туташтырыңыз

Программа 255- бардык линияларды чыгарат - максималдуу чыңалуу.

Чыгуу 128- жарым максималдуу чыңалуу.

Чыгуу 0- нөл чыңалуу (Же болбосо, дээрлик нөлгө жакын).

Андан кийин ал кичине басат: 1, 2, 4, 8, 16, 32, 64, 128

Чыңалуу акырындык менен өсүшү керек.

Эгерде чыңалуу кайра көбөйсө, кайра артка кетсе, анда бири -бирине туташкан зымдардын экөө тескерисинче болушу мүмкүн.

Ошондой эле, чыңалуу өзгөргөндө спикердин акырын басканын угушуңуз керек

7 -кадам: Wav Header окуу

Wav Header окуу
Wav Header окуу

Wav файлдары белгиленген жыштыкта жана маалыматтын өлчөмүндө сакталат.

Бул маалымат wav файлынын башталышында 44 байт аталышта камтылган.

Кээ бир программалык камсыздоолор башын кеңейтет да (35 -байттан кийин), маалыматтын өлчөмүнүн жайгашуусун табуу кыйыныраак болот.

Башты окуу үчүн биз буфер түзөбүз жана файлдын башталышын көчүрөбүз.

Жыштык файлга 24 байттан баштап 4 байтта сакталат.

// окуу жыштыгы wav файлдын аталышында көрсөтүлгөн

байт 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 ("Файлдын жыштыгы"));

Serial.print (retval);

Маалыматтын өлчөмү боюнча маалыматты табуунун эң жакшы жолу - бул "маалымат" деген сөздү башынан издөө.

Андан кийин узун маанини түзгөн 4 байтты бөлүп алыңыз

узартылбаган кол коюу;

int mypos = 40;

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

if (headbuf == 'd') {

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

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

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

// акыры бизде бар

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];

Макул, бизде маалыматтын узундугу жана жыштыгы бар!

Аудио маалыматтар 4 байттын артынан маалыматтын узундугун түзөт.

8 -кадам: Үзгүлтүккө учуратуу, үзгүлтүккө учуратуу …

Үзгүлтүккө учуратуу, үзүү…
Үзгүлтүккө учуратуу, үзүү…

Биз жыштык маалыматын керектүү жыштыкта же жакын жерде программалык камсыздоону үзгүлтүккө учуратуу үчүн колдонобуз.

Үзгүлтүктү дайыма так коюу мүмкүн эмес, бирок бул жетиштүү. Файлдан окулган жыштык setintrupt программасына өткөрүлүп берилет.

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

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

// Setocroa мааниси -1ден кемитүүнү талап кылат. Бирок 0,5 тегерегин 0,5ке жакын кошуу

// Таймердин чечилиши чектелген

// Акыры bitval чоңдугу менен аныкталат

cli (); // үзгүлтүктөрдү өчүрүү // таймер2 үзүлүүсүн коюу

TCCR2A = 0; // бүт TCCR2A реестрин 0го коюңуз

TCCR2B = 0; // TCCR2B үчүн бирдей

TCNT2 = 0; // эсептегичтин маанисин 0ге баштап

// жыштыкты (hz) көбөйтүү үчүн салыштыруу матч реестрин коюңуз

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

// CTC режимин күйгүзүү

TCCR2A | = (1 << WGM21); // CS21 битти 8 prescaler үчүн коюңуз

TCCR2B | = (1 << CS21); // таймерди салыштыруу үзгүлтүгүн иштетүү

// TIMSK2 | = (1 << OCIE2A); // бул төмөнкү линия сыяктуу иштейт

sbi (TIMSK2, OCIE2A); // таймердеги үзүүнү иштетүү 2

sei (); // үзгүлтүктөрдү иштетүү

Акылдуу окурмандар sbi (TIMSK2, OCIE2A) байкап калышат

Мен регистрдин биттерин орнотуу жана тазалоо үчүн бир нече (интернет аркылуу алынган) функцияларды орноттум:

// Реестрдин биттерин тазалоону аныктайт#ifndef cbi

#аныктоо cbi (sfr, бит) (_SFR_BYTE (sfr) & = ~ _BV (бит))

#endif

// Реестрдин биттерин аныктоону аныктайт

#ifndef sbi

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

#endif

Бул функциялар үзгүлтүктү орнотуу же тазалоо үчүн оңой чалууну камсыз кылат.

Ошентип, үзгүлтүк иштеп жатат, биз аны эмне кыла алабыз?

9 -кадам: Үзгүлтүктөр жана кош буферлөө

Үзгүлтүктөр жана кош буферлөө
Үзгүлтүктөр жана кош буферлөө
Үзгүлтүктөр жана кош буферлөө
Үзгүлтүктөр жана кош буферлөө

22 кГцте ар бир 0,045 мс аудио маалыматтын байт чыгарылат

512 байт (буфердин өлчөмү) 2.08 мс окулат.

Ошентип, буферди SDCardдан бир жазуу циклинде окуу мүмкүн эмес.

Бирок 512 байт портко 23.22ms ичинде жазылган.

Ошентип, биз буфер бошогон сайын окула турган жаңы файлды орнотуубуз керек жана бизде жаңы маалымат блогу талап кылынганга чейин маалыматтарды алууга жетиштүү убакыт бар … Биз эки буферди колдонобуз деп ойлосок, экинчисин толтуруп жатканда бошотобуз.

Бул кош буферлөө.

Кайталанган үзгүлтүк менен файлды окуу жайлайт, бирок ал бүтөт.

Менде була жана bufb деп аталган 512 байттык эки буфер орнотулган.

Эгерде байрак чын болсо, биз порттан окуйбуз, болбосо биз portbдан окуйбуз

Буфер позициясы (bufcount) буфердин өлчөмүнө жеткенде (BUF_SIZE 512) readit аттуу желекти true деп коебуз.

Void loop тартиби бул желекти издейт жана блокту окуй баштайт:

if (readit) {if (! aready) {

// SDCard блогун буфага окууну баштоо

tempfile.read (bufa, BUF_SIZE);

} башка {

// bufbге окуу үчүн SDCard блогун баштоо

tempfile.read (bufb, BUF_SIZE);

}

readit = false;

}

Ал кадимки желектерди бүтүргөндө readit = false.

Үзүү тартибинде биз боштуктун циклинин readit == false экенин текшерүү менен бүткөнүн текшеришибиз керек.

Бул учурда, биз дагы бир окуу керектигин билдирип, буферлерди которуштуруу үчүн желекти алмаштырабыз.

Эгерде SDcard дагы эле окуса, анда биз бир окууну артка кайтарышыбыз керек (counter--; bufcount--;) жана кийинчерээк кайра аракет кылуу үчүн үзгүлтүккө учурашыбыз керек. (Аудио сигналын чыкылдатуу бул болгонун билдирет.)

Бардык маалыматтар окулганда, үзгүлтүк жокко чыгарылат, порттун орто чыңалуусу 128ге кайра орнотулат жана аудио файл жабылат.

Биринчи жолу dac2.ino скриптин иштетүүдөн мурун, көлөмүңүздү 50%га коюңуз. Бул өтө катуу болот, бирок 100%дан жакшы!

Эгерде сиздин көлөмүңүздү көзөмөлдөө тескери иштесе, 10К потенциометрдин карама -каршы учтарындагы коргошундарды алмаштырыңыз.

Мага кандайча угулуп жатканын айтып бериңиз.

Сунушталууда: