Съдържание:

Възпроизвеждане на аудио звукови файлове (Wav) с Arduino и DAC: 9 стъпки
Възпроизвеждане на аудио звукови файлове (Wav) с Arduino и DAC: 9 стъпки

Видео: Възпроизвеждане на аудио звукови файлове (Wav) с Arduino и DAC: 9 стъпки

Видео: Възпроизвеждане на аудио звукови файлове (Wav) с Arduino и DAC: 9 стъпки
Видео: Воспроизведение WAV файла на Arduino 2024, Декември
Anonim
Възпроизвеждане на аудио звукови файлове (Wav) с Arduino и DAC
Възпроизвеждане на аудио звукови файлове (Wav) с Arduino и DAC
Възпроизвеждане на аудио звукови файлове (Wav) с Arduino и DAC
Възпроизвеждане на аудио звукови файлове (Wav) с Arduino и DAC
Възпроизвеждане на аудио звукови файлове (Wav) с Arduino и DAC
Възпроизвеждане на аудио звукови файлове (Wav) с Arduino и DAC

Възпроизвеждане на wav файл Аудио от вашата SD карта Audino. Тази инструкция ще ви покаже как wav файл на вашата SdCard може да се възпроизвежда чрез проста схема към високоговорител.

Wav файлът трябва да бъде 8 битов моно. Не съм имал проблем с възпроизвеждането на 44 KHz файлове.

Въпреки че не е висококачествен, качеството на звука е много задоволително.

Серийният монитор се използва за избор на файл. Файловете трябва да са в папка, наречена adlog.

Тази инструкция следва от по-ранен проект, в който запазвах wav записи в SdCard:

Схемата използва евтин 8 -битов цифрово -аналогов преобразувател (DAC) и аудио чип с един чип.

Ключовите раздели за създаване на прекъсвания са взети от отличната статия на Аманда Гасаей:

Стъпка 1: Изисквания

Изисквания
Изисквания
Изисквания
Изисквания

Arduino- Използвам Mega, но няма причина Uno да не работи.

SdCard четец-програмата е конфигурирана за: MicroSD Breakout Board, регулиран с Logic Conversion V2

Вижте тази инструкция за подробности за настройката на SdCard:

DAC0832 LCN- отличен 8-битов цифров към аналогов преобразувател- Няколко килограма.

LM386 N-1 Op усилвател- евтин като чипове

20 гнездо за чип

8 -пътен гнездо за чип

9-волтово захранване- една батерия ще свърши работа.

LM336 2,5 V справочно напрежение

10uF кондензатор * 3 (всяко напрежение над 9V)

Резистор 10 ома

50nF кондензатор- (или някъде близо до 47nF, 56nf, 68nf- ще стане)

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

64 ома високоговорител

10K линеен потенциометър

Кабел за свързване на 8-те линии за данни между Arduino и веригата-

На Uno 8 -те връзки са на линия, на Mega са по двойки.

На Mega използвах 10 -пътен лентов кабел с 10 -пътен IDC заглавие. (2 жици са резервни)

Гнездови конектори за 0V, 9V и DAC изход

Медна лента, спойка, тел, фрези и др

Стъпка 2: Спецификациите

Спецификациите
Спецификациите

Сериен набор от 115200 бода.

Съществува поддръжка за Hobbytronics MicroSD Breakout Board, използващ Mega. Изборът на чип и други портове ще се променят между Mega и Uno.

Wav файловете трябва да съществуват в директория, наречена adlog.

Wav файлът трябва да бъде 8 битов моно. Тествал съм до 44KHz.

Серийният монитор показва wav файловете в папката adlog. Имената на файловете се изпращат от изходния ред на монитора.

Размерът на файла е ограничен само от размера на SdCard.

Стъпка 3: Първи стъпки

Приготвяме се да започнем
Приготвяме се да започнем

Свържете четеца на SD карти. Това са връзките за Mega.

0, 5V

CLK към пин 52

D0 към пин 50

D1 към щифт 51

CS към пин 53

(Вижте уебсайта на доставчика за връзка с порт Uno)

Ще искате да проверите дали вашата карта работи на този етап- използвайте скриптовете, предоставени от доставчика.

Трябва да направим малка верига

Ще изпратим поток от аудио байтове от Arduino.

Тези числа са между 0 и 255. Те представляват напрежението.

Мълчанието е 127-128.

255 е конус на високоговорителите твърд еднопосочен.

0 е конусът на високоговорителя по друг начин.

Така че аудиото се записва като записани числа, които създават различни напрежения, които създават движещи се конуси на високоговорителите.

Можем да изпращаме числата от 8 реда на Arduino едновременно, като използваме „порт“.

Ако подадем 8 -те линии в цифрово -аналогов преобразувател, той прави това, което пише на калай и произвежда аналогово напрежение, което е пропорционално на цифровото число.

Всичко, което трябва да направим, е да включим напрежението към малък операционен усилвател и след това към високоговорител.

Стъпка 4: Малката верига

Малката верига
Малката верига
Малката верига
Малката верига
Малката верига
Малката верига
Малката верига
Малката верига

DAC0832 LCN

Това е превъзходен, евтин 8 -битов цифров към аналогов конвертор. (DAC)

Тя може да бъде напълно контролирана с масив от данни, линии за извадка на данни.

Или може да бъде настроен да прави всичко автоматично в „Поток през операция“.

За да цитирам ръководството:

Простото заземяване на CS, WR1, WR2 и XFER и обвързването на ILE високо позволява и на двата вътрешни регистъра да следват приложените цифрови входове (поток) и да влияят директно на аналоговия изход на DAC.

Добре, това са четири връзки към чипа с ниска стойност и една към 9V - лесно.

Не искаме никакви отрицателни напрежения, така че ръководството казва, че трябва да използваме „режим на превключване на напрежението“и те предоставят диаграмата.

Всичко, което трябва да направим, е да заменим малък аудио усилвател вместо този, който предлагат.

Аудио усилвателят LM386-N

Ръководството на усилвателя дава диаграма с минимални части- осигуряваща печалба от 20 (твърде много за нас, но има контрол на силата на звука).

Всичко, което трябва да направим, е да добавим кондензатор между DAC и усилвателя, така че да усилваме само AC сигнали.

Трябва също така да добавим няколко кондензатора близо до захранващия щифт на всеки от нашите чипове, в противен случай ще получим шум от нашето 9V захранване.

Стъпка 5: Извадете поялника

Извадете поялника
Извадете поялника
Извадете поялника
Извадете поялника
Извадете поялника
Извадете поялника

Тъй като схемата е проста, нямам намерение да нанасям удар с удар.

Ето някои насоки:

  • Подгответе парче медна ивична дъска поне 28 на 28 дупки. (Да, знам, че мозъчните хирурзи могат да го направят по -малък)
  • Ако възнамерявате да го монтирате с винтове, позволете ги в началото!
  • Монтирайте чиповете върху гнездата. Поставете чиповете само когато всичко е проверено.
  • Дръжте входните проводници далеч от изхода.
  • Спазвайте правилната полярност на кондензаторите.
  • Вижте диаграмата за базовия изглед на еталонното напрежение на LM336. Регулиращият крак не се използва и може да се реже.
  • Обърнете внимание на директната връзка към пин 8 на DAC- Това е много полезно за тестване.
  • Свързах се с Audino с лентов кабел и 10 -пътен IDC конектор.
  • На Uno връзките са в права линия - може да откриете, че подреждането на 8 -те входни връзки в една права линия ви позволява да се свържете с Arduino с закупен, готов 8 -посочен конектор,

Когато приключи- проверете запояването и проверете празнините между медните релси.

Намирам, че 36 tpi младши трион за трион е много полезен за почистване на отломки. Изваждам фиксиращите щифтове на острието и плъзгам върха на острието в пистата- Очевидно острието не е в рамка.

Стъпка 6: Тестване на DAC

Тестване на DAC
Тестване на DAC

Оставете връзката между веригата и Arduino изключена.

Задайте контрола на силата на звука на вашата верига на средата.

Включете 9V DC захранването към новата си верига.

Проверете дали веригата е наред- не мога да поема никаква отговорност за вашата верига!

Изключване

Свържете вашата верига към Arduino.

На Mega използвайте щифтове 22-29. (PORTA) Не бъркайте двата 5V пина по -горе!

На Uno използвайте щифтове 0-7. Това е PORTD

Свържете 0V на вашето захранване към 0V на Arduino.

Захранване.

Отворете тази тестова програма DAC_TEST

За UNO заменете всички позовавания на PORTA на PORTD

Заменете DDRA с DDRD- тази инструкция настройва всички 8 реда да се извеждат наведнъж. Това е регистърът на посоката на данните.

Настройте серийния монитор на 115200.

Свържете волтметър между DAC изхода и OV

Програмата ще настрои изхода на 255 - всички линии са включени - максимално напрежение.

Изход 128- наполовина максимално напрежение.

Изход 0- нула напрежение (Или вероятно почти нула).

След това ще стъпва побитово: 1, 2, 4, 8, 16, 32, 64, 128

Напрежението трябва да се увеличава постоянно.

Ако напрежението спадне, докато броят се увеличава, вероятно имате обърнати два от свързващите проводници.

Също така трябва да чуете тихия щракване на високоговорителя при промяна на напрежението

Стъпка 7: Четене на заглавката на Wav

Четене на заглавката на Wav
Четене на заглавката на Wav

Wav файловете се записват с определена честота и размер на данните.

Тази информация се съдържа в 44 -байтова заглавка в началото на wav файл.

Въпреки че някои програми разширяват заглавката (след байт 35), което прави местоположението на размера на данните по -трудно за намиране.

За да прочетем заглавката, създаваме буфер и копираме началото на файла.

Честотата се съхранява в 4 байта, започвайки от 24 байта във файла.

// четене на честота, посочена в заглавката на wav файл

байт headbuf [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;

for (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) | глава [mypos+2];

retval = (retval << 8) | глава [mypos+1];

retval = (retval << 8) | глава [mypos];

Добре, имаме дължината и честотата на данните!

Аудио данните следват 4 байта, съставляващи стойността на дължината на данните.

Стъпка 8: Прекъсване, прекъсване…

Прекъсване, прекъсване …
Прекъсване, прекъсване …

Използваме информацията за честотата, за да създадем софтуерно прекъсване на или близо до необходимата честота.

Прекъсването не винаги може да бъде зададено точно, но е достатъчно. Честотата, прочетена от файла, се предава на подпрограмата setintrupt.

void setintrupt (float freq) {float bitval = 8; // 8 за 8 -битови таймери 0 и 2, 1024 за таймер 1 байт

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

// Стойността на setocroa изисква изваждане на -1. Въпреки това добавянето на 0,5 кръга до най -близкото 0,5

// Резолюцията на таймера е ограничена

// В крайна сметка се определя от величината на бит

cli (); // деактивиране на прекъсвания // задаване на прекъсване на timer2

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 предсказващо устройство

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

#дефинирайте sbi (sfr, бит) (_SFR_BYTE (sfr) | = _BV (бит))

#endif

Тези функции осигуряват лесно повикване за задаване или изчистване на прекъсването.

Така че прекъсването работи, какво можем да го накараме да направи?

Стъпка 9: Прекъсвания и двойно буфериране

Прекъсвания и двойно буфериране
Прекъсвания и двойно буфериране
Прекъсвания и двойно буфериране
Прекъсвания и двойно буфериране

При 22 Khz байт аудио данни се извежда на всеки 0,045 ms

512 байта (размерът на буфера) се чете за 2.08 ms.

Така че буферът не може да се отчете от SDCard в един цикъл на запис.

Въпреки това 512 байта се записват в порта за 23,22 ms.

Така че всичко, което трябва да направим, е да настроим нов файл за четене всеки път, когато буферът се изпразни и имаме достатъчно време да получим данните, преди да е необходим нов блок от данни … Ако приемем, че използваме два буфера, изпразвайки един, докато попълваме друг.

Това е двойно буфериране.

Четенето на файла ще се забави от повтарящото се прекъсване, но ще бъде направено.

Имам настройка на два 512 байтови буфера, наречени bufa и bufb.

Ако знамето aready е вярно, четем от porta, в противен случай четем от portb

Когато позицията на буфера (bufcount) достигне размера на буфера (BUF_SIZE 512), ние задаваме флаг, наречен readit на true.

Програмата за цикъл void търси този флаг и стартира четене на блок:

if (readit) {if (! aready) {

// инициира четене на SDCard блок в bufa

tempfile.read (bufa, BUF_SIZE);

} else {

// инициира четене на SDCard блок в bufb

tempfile.read (bufb, BUF_SIZE);

}

readit = false;

}

Когато приключи флаговете на рутината readit = false.

В рамките на рутината за прекъсване трябва да проверим дали цикълът на void е завършил, като проверим дали readit == false.

В този случай ние сигнализираме, че е необходимо друго четене и превключваме флага aready за превключване на буфери.

Ако SD картата все още чете, трябва да върнем едно проследяване (брояч-; bufcount-;) и да излезем от прекъсването, за да опитаме отново по-късно. (Щракванията в изходния аудио сигнал означават, че това е станало.)

Когато всички данни бъдат прочетени, прекъсването се анулира, портът се настройва отново на средно напрежение 128 и аудио файлът се затваря.

Преди да стартирате скрипта dac2.ino за първи път, задайте силата на звука на 50%. Това ще бъде твърде силно, но е по -добре от 100%!

Ако вашият контрол на силата на звука работи обратно, сменете проводниците в противоположните краища на 10K потенциометъра.

Кажете ми как звучи.

Препоръчано: