Агуулгын хүснэгт:

Аудио дууны файлуудыг (Wav) Arduino болон DAC ашиглан тоглуулах: 9 алхам
Аудио дууны файлуудыг (Wav) Arduino болон DAC ашиглан тоглуулах: 9 алхам
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 дээр хадгалж байсан өмнөх төслөөс үүдэлтэй:

Уг хэлхээнд хямд 8 битийн тооноос аналог хөрвүүлэгч (DAC) болон нэг чип аудио өсгөгч ашигладаг.

Тасалдлыг тохируулах гол хэсгүүдийг Аманда Гассайигийн маш сайн нийтлэлээс авсан болно:

Алхам 1: Шаардлага

Шаардлага
Шаардлага
Шаардлага
Шаардлага

Arduino- Би Мега ашигладаг боловч Юно ажиллахгүй байх шалтгаан байхгүй.

SdCard уншигч- програм нь дараах зориулалтаар тохируулагдсан болно: MicroSD Breakout Board for Logic 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 ом чанга яригч

10К шугаман потенциометр

Arduino болон хэлхээний хоорондох 8 өгөгдлийн шугамыг холбох кабель

Uno дээр 8 холболт дараалсан, Мега дээр хосоороо байрладаг.

Мега дээр би 10 талын IDC толгойтой 10 талын тууз кабель ашигласан. (2 утас нөөцтэй)

0V, 9V ба DAC -ийн залгуур холбогч

Зэс туузан хавтан, гагнуур, утас, таслагч гэх мэт

Алхам 2: Техникийн үзүүлэлтүүд

Үзүүлэлтүүд
Үзүүлэлтүүд

Цуврал нь 115200 baud байна.

Mega ашиглан Hobbytronics MicroSD Breakout Board -ийг дэмжих боломжтой. Чип сонгох болон бусад портууд нь Мега ба Юно хоёрын хооронд өөрчлөгдөх болно.

Wav файлууд нь adlog гэсэн лавлах санд байх ёстой. Үүнийг өөр нэрээр нэрлэж, шаардлагатай кодчилолоо дахин цэгцлэх боломжтой.

Wav файл нь 8 бит моно байх ёстой. Би 44 кГц хүртэл туршиж үзсэн.

Цуваа дэлгэц нь adlog фолдер дахь wav файлуудыг харуулдаг. Файлын нэрийг дэлгэцийн гаралтын шугамаас илгээдэг.

Файлын хэмжээ нь зөвхөн SdCard -ийн хэмжээгээр хязгаарлагддаг.

Алхам 3: Эхлэх

Эхлэх
Эхлэх

SD карт уншигч холбоно уу. Эдгээр нь Mega -ийн холболтууд юм.

0, 5В

52 товчлуурыг дарна уу

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 аналог гаралтанд шууд нөлөөлдөг.

Чиптэй дөрвөн холболт багатай, нэг багц нь 9V байна.

Бид сөрөг хүчдэл гарахыг хүсэхгүй байгаа тул гарын авлагад "хүчдэл солих горим" ашиглах ёстой гэж заасан бөгөөд тэд диаграмыг өгдөг.

Бидний хийх ёстой зүйл бол тэдний санал болгож буй дууны оронд жижиг аудио өсгөгчийг орлуулах явдал юм.

LM386-N аудио өсгөгч

Amp-ийн гарын авлага нь хамгийн бага хэсгүүдийн диаграммыг өгдөг бөгөөд 20-ийн ашиг өгдөг (бидний хувьд хэтэрхий их, гэхдээ энэ нь дууны хяналттай байдаг).

Бидний хийх ёстой зүйл бол DAC ба өсгөгчийн хооронд конденсатор нэмэх бөгөөд ингэснээр бид зөвхөн AC дохиог олшруулдаг.

Бид чип тус бүрийн тэжээлийн зүүтэй ойролцоо хэд хэдэн конденсатор нэмэх ёстой, эс тэгвээс бид 9V тэжээлээс тэжээл авах болно.

Алхам 5: Гагнуурын төмрөөс гар

Гагнуурын төмрөөс гар
Гагнуурын төмрөөс гар
Гагнуурын төмрөөс гар
Гагнуурын төмрөөс гар
Гагнуурын төмрөөс гар
Гагнуурын төмрөөс гар

Хэлхээ нь энгийн тул би цохилтын дансаар цохилт өгөх бодолгүй байна.

Энд хэдэн заагч байна:

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

Үүнийг дуусгасны дараа гагнуурыг шалгаж, зэсийн зам хоорондын зайг шалгана уу.

Би хог хаягдлыг цэвэрлэхэд 36 tpi -ийн бага хэмжээтэй харсан хутганы ир маш ашигтай гэж бодож байна. Би ирний бэхэлгээний тээглүүрийг аваад ирний үзүүрийг зам руу шургуулна. Ир нь хүрээ дотор биш байгаа нь ойлгомжтой.

Алхам 6: DAC тест хийх

DAC -ийг шалгаж байна
DAC -ийг шалгаж байна

Circuit ба Arduino хоорондох холболтыг унтраана уу.

Цахилгаан хэлхээнийхээ дууны хяналтыг дунд хүртэл тохируулна уу.

9V DC хүчийг шинэ хэлхээ рүүгээ асаана уу.

Хэлхээ хэвийн байгаа эсэхийг шалгаарай- Би таны хэлхээний төлөө хариуцлага хүлээхгүй!

Унтраах

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 толгойг унших

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

Цуваа.хэвлэх (retval);

Өгөгдлийн хэмжээний мэдээллийг олох хамгийн сайн арга бол толгой дээрх "өгөгдөл" гэсэн үгийг хайх явдал юм.

Дараа нь урт утгыг бүрдүүлдэг 4 байтыг гаргаж аваарай

гарын үсэг зураагүй урт хугацаа;

int mypos = 40;

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

хэрэв (headbuf == 'd') {

хэрэв (headbuf [i+1] == 'a') {

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

хэрэв (headbuf [i+3] == 'a') {

// эцэст нь бидэнд байна

mypos = i+4;

би = 60;

}

}

}

}

}

tempfile.seek (mypos);

retval = headbuf [mypos+3];

retval = (retval << 8) | толгойны цохилт [mypos+2];

retval = (retval << 8) | headfuff [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 болгож нэмнэ

// Таймерын нарийвчлал хязгаарлагдмал

// Эцсийн эцэст bitval -ийн хэмжээгээр тодорхойлогдоно

cli (); // тасалдлыг идэвхгүй болгох // таймер2 тасалдлыг тохируулах

TCCR2A = 0; // TCCR2A бүртгэлийг бүхэлд нь 0 болгож тохируулна уу

TCCR2B = 0; // TCCR2B -ийн хувьд мөн адил

TCNT2 = 0; // тоолуурын утгыг 0 болгож эхлүүлнэ

// давтамжийн (hz) өсөлтийн харьцуулах тоглолтын бүртгэлийг тохируулна уу

OCR2A = сетокроа; // = (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, bit) (_SFR_BYTE (sfr) & = ~ _BV (бит))

#endif

// Бүртгэлийн битүүдийг тохируулахыг тодорхойлдог

#ifndef sbi

#тодорхойлох sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (бит))

#endif

Эдгээр функцууд нь тасалдлыг тохируулах эсвэл арилгахад хялбар дуудлага өгдөг.

Тиймээс тасалдал ажиллаж байна, бид үүнийг юу хийж чадах вэ?

Алхам 9: Тасалдал ба давхар буфер

Тасалдал ба давхар буфер
Тасалдал ба давхар буфер
Тасалдал ба давхар буфер
Тасалдал ба давхар буфер

22 Гц давтамжтайгаар 0.045 мс тутамд нэг байт аудио өгөгдөл гаргадаг

512 байт (буферийн хэмжээ) 2.08 ms дотор уншдаг.

Тиймээс буферийг SDCard -аас нэг бичих мөчлөгт унших боломжгүй.

Гэсэн хэдий ч 5.2 байтыг 23.22ms дотор порт руу бичдэг.

Тиймээс бидний хийх ёстой зүйл бол буфер хоослох бүрт унших шинэ файлыг тохируулах явдал бөгөөд бидэнд шинэ өгөгдлийн блок шаардлагатай болохоос өмнө өгөгдлийг авах хангалттай хугацаа байна … Бид хоёр буфер ашигладаг гэж үзээд нэг бөглөхдөө нэгийг нь хоослоно.

Энэ бол давхар буфер юм.

Дахин тасалдахад файлыг унших явц удаашрах боловч үүнийг хийх болно.

Надад bufa, bufb гэж нэрлэгддэг 512 байтын хоёр буфер бий.

Хэрэв туг нь үнэн бол бид портаас уншдаг, эс тэгвээс бид portb дээрээс уншдаг

Буферийн байрлал (bufcount) буферийн хэмжээтэй (BUF_SIZE 512) хүрэхэд readit нэртэй тугийг үнэн болгож тохируулна.

Void loop давтамж нь энэ тугийг хайж, блок уншиж эхэлдэг:

if (readit) {if (! aready) {

// bufa руу унших SDCard блокыг эхлүүлнэ

tempfile.read (bufa, BUF_SIZE);

} өөр {

// bufb руу унших SDCard блокыг эхлүүлнэ

tempfile.read (bufb, BUF_SIZE);

}

readit = худал;

}

Энэ нь ердийн тугуудыг уншиж дууссаны дараа readit = false.

Тасалдлын горимд бид хоосон орон зай дууссан эсэхийг readit == худал эсэхийг шалгаж шалгах ёстой.

Энэ тохиолдолд бид дахин унших шаардлагатай байгааг дохио өгч, буферуудыг солихын тулд бэлэн тугийг сэлгэнэ.

Хэрэв SDcard уншсаар байгаа бол бид нэг уншилтыг (counter--; bufcount--;) буцааж хянаж, дараа нь дахин оролдохын тулд тасалдалаас гарах ёстой. (Аудио гаралтын дохиог дарах нь ийм зүйл болсон гэсэн үг юм.)

Бүх өгөгдлийг уншихад тасалдал цуцлагдвал портыг дунд хүчдэлийн 128 болгож дахин тохируулж, аудио файлыг хаадаг.

Dac2.ino скриптийг анх удаа ажиллуулахын өмнө өөрийн дууны хэмжээг 50%болгож тохируулна уу. Энэ нь хэт чанга байх болно, гэхдээ энэ нь 100%-с илүү дээр юм!

Хэрэв таны дууны хяналт урвуугаар ажилладаг бол 10К потенциометрийн эсрэг талын үзүүрүүдийг холбоно уу.

Энэ нь хэрхэн сонсогдож байгааг надад хэлээрэй.

Зөвлөмж болгож буй: