Съдържание:
- Стъпка 1: Изисквания
- Стъпка 2: Спецификациите
- Стъпка 3: Първи стъпки
- Стъпка 4: Малката верига
- Стъпка 5: Извадете поялника
- Стъпка 6: Тестване на DAC
- Стъпка 7: Четене на заглавката на Wav
- Стъпка 8: Прекъсване, прекъсване…
- Стъпка 9: Прекъсвания и двойно буфериране
Видео: Възпроизвеждане на аудио звукови файлове (Wav) с Arduino и DAC: 9 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:53
Възпроизвеждане на 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
Оставете връзката между веригата и 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 файловете се записват с определена честота и размер на данните.
Тази информация се съдържа в 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 потенциометъра.
Кажете ми как звучи.
Препоръчано:
Как да си направим аудио аудио файлове на стерео радио на Ford на Ford, възпроизвеждане на Mp3 файлове .: 7 стъпки
Как да направите аудио аудио файлове на стерео радио във формат на MP3 на MP3: Тази инструкция ще ви даде няколко важни подробности за това как да отговорите на изискванията за съвместимост на MP3 CD-R на Ford Audiophile (и вероятно Mach 300, Shaker 500 и Shaker 1000 ) фабрично стерео, за да можете да записвате и да се наслаждавате на MP3 файлове на CD
Говорещ Arduino - Възпроизвеждане на MP3 с Arduino без никакъв модул - Възпроизвеждане на Mp3 файл от Arduino с помощта на PCM: 6 стъпки
Говорещ Arduino | Възпроизвеждане на MP3 с Arduino без никакъв модул | Възпроизвеждане на Mp3 файл от Arduino с помощта на PCM: В тази инструкция ще се научим как да възпроизвеждаме mp3 файл с arduino, без да използваме аудио модул, тук ще използваме PCM библиотека за Arduino, която възпроизвежда 16 битов PCM с честота 8 kHZ, така че нека направим това
Как да конвертирате истински аудио потоци в MP3 файлове: 7 стъпки
Как да конвертирате истински аудио потоци в MP3 файлове: Здравейте! Вероятно някои от вас слушат аудио съдържание или предавания от уеб радио чрез Real Audio Player или Real Audio Plug-in на уеб браузъра. ПРОБЛЕМА Тези файлове често се излъчват като стрийминг, но обикновено не е възможно да ги изтеглите за
Как да направите потребителските файлове, които копират потребителските файлове тихо и автоматично: 7 стъпки
Как да направим флаш устройство, което потребителите копират файловете тихо и автоматично: ****** ТОЗИ ИНСТРУКЦИЯ Е ЗА ИНФОРМАЦИОННИ ЦЕЛИ САМО НЕЗАКОННО Е КОПИРАНЕ НА НЕКОТОРИ ФАЙЛОВЕ БЕЗ ТЕХНОТО РАЗРЕШЕНИЕ, НЕ ОТГОВОРЯМ ЗА НИЩОТО, КОЕТО МОЖЕ ДА СЕ ИЗПОЛЗВА ИНФОРМАЦИЯТА се ИЗПОЛЗВА НЕПРАВИЛНО **************** Как да се изгради
Как да поправите неподдържани файлове с данни и да изтеглите любимите си видео файлове за вашия PSP Portable: 7 стъпки
Как да поправя неподдържани файлове с данни и да изтегля любимите си видео файлове за вашия PSP портативен: Използвах Media Go и направих някои от трикове, за да накарам неподдържани видео файлове да работят на моя PSP. Това са всичките ми стъпки, които направих , когато за първи път накарах неподдържаните ми видео файлове да работят на моя PSP. Работи 100% с всичките ми видео файлове на моя PSP Po