Isi kandungan:

Memainkan Fail Suara Audio (Wav) Dengan Arduino dan DAC: 9 Langkah
Memainkan Fail Suara Audio (Wav) Dengan Arduino dan DAC: 9 Langkah

Video: Memainkan Fail Suara Audio (Wav) Dengan Arduino dan DAC: 9 Langkah

Video: Memainkan Fail Suara Audio (Wav) Dengan Arduino dan DAC: 9 Langkah
Video: MP3 module dengan Arduino, isi dan play suara MP3 module dengan arduino 2024, Julai
Anonim
Memainkan Fail Suara Audio (Wav) Dengan Arduino dan DAC
Memainkan Fail Suara Audio (Wav) Dengan Arduino dan DAC
Memainkan Fail Suara Audio (Wav) Dengan Arduino dan DAC
Memainkan Fail Suara Audio (Wav) Dengan Arduino dan DAC
Memainkan Fail Suara Audio (Wav) Dengan Arduino dan DAC
Memainkan Fail Suara Audio (Wav) Dengan Arduino dan DAC

Mainkan fail wav Audio dari kad SD Audino anda. Instructable ini akan menunjukkan kepada anda bagaimana fail wav pada SdCard anda dapat dimainkan melalui litar sederhana ke pembesar suara.

Fail wav mestilah mono 8 bit. Saya tidak menghadapi masalah untuk memainkan fail 44 KHz.

Walaupun tidak kesetiaan, kualiti suaranya sangat memuaskan.

Monitor bersiri digunakan untuk memilih fail. Fail mesti ada dalam folder bernama adlog.

Ini boleh dipelajari berikut dari projek sebelumnya di mana saya menyimpan rakaman wav ke SdCard:

Litar ini menggunakan penukar digital ke analog 8 bit (DAC) dan penguat audio cip tunggal yang murah.

Bahagian utama untuk mengatur gangguan diambil dari artikel yang sangat baik oleh Amanda Ghassaei:

Langkah 1: Keperluan

Keperluan
Keperluan
Keperluan
Keperluan

Arduino- Saya menggunakan Mega, namun tidak ada sebab mengapa Uno tidak boleh berfungsi.

Pembaca SdCard- program dikonfigurasikan untuk: MicroSD Breakout Board yang diatur dengan Logic Conversion V2

Lihat arahan ini untuk maklumat persediaan SdCard:

DAC0832 LCN- penukar 8 bit digital ke analog yang sangat baik- Beberapa paun.

LM386 N-1 Op - murah seperti kerepek

Soket cip 20 hala

Soket cip 8 hala

Bekalan kuasa 9 volt - bateri akan berfungsi.

Rujukan voltan LM336 2.5 V

Kapasitor 10uF * 3 (sebarang voltan lebih daripada 9V)

Perintang 10 ohm

Kapasitor 50nF- (Atau di tempat berhampiran-47nF, 56nf, 68nf- akan dilakukan)

Kapasitor 220uF

Pembesar suara 64 ohm

Potensiometer linear 10K

Kabel untuk menghubungkan 8 baris data antara Arduino dan litar-

Di Uno 8 sambungan berada dalam talian, di Mega mereka berpasangan.

Pada Mega saya menggunakan kabel riben 10 arah dengan header IDC 10 arah. (2 wayar ada)

Penyambung soket untuk keluar 0V, 9V dan DAC

Papan jalur tembaga, solder, wayar, pemotong dll

Langkah 2: Spesifikasi

Spesifikasi
Spesifikasi

Serial ditetapkan pada 115200 baud.

Sokongan disediakan untuk Hobbytronics MicroSD Breakout Board menggunakan Mega. Cip pilih dan port lain akan bertukar antara Mega dan Uno.

Fail Wav mesti ada dalam direktori yang disebut adlog - Jangan ragu untuk menyebutnya sesuatu yang lain dan menyusun semula pengekodan yang diperlukan.

Fail wav mestilah mono 8 bit. Saya telah menguji sehingga 44KHz.

Monitor Serial memaparkan fail wav dalam folder adlog. Nama fail dihantar dari barisan output monitor.

Ukuran fail hanya dibatasi oleh saiz SdCard.

Langkah 3: Bermula

Bermula
Bermula

Sambungkan pembaca kad SD. Ini adalah sambungan untuk Mega.

0, 5V

CLK ke pin 52

D0 hingga pin 50

D1 hingga pin 51

CS ke pin 53

(Lihat laman web pembekal untuk sambungan port Uno)

Anda ingin menguji kad anda berfungsi pada tahap ini - gunakan skrip yang diberikan oleh vendor.

Kita perlu membuat litar kecil

Kami akan menghantar aliran byte audio dari Arduino.

Nombor-nombor ini adalah antara 0 dan 255. Mereka mewakili voltan.

Diam adalah 127-128.

255 adalah kerucut pembesar suara sehala.

0 adalah kerucut pembesar suara dengan cara lain.

Jadi audio dirakam sebagai nombor yang disimpan, yang menghasilkan voltan yang berbeza-beza, yang membuat kerucut pembesar suara bergerak.

Kami dapat menghantar nombor dari 8 baris di Arduino, secara serentak, dengan menggunakan "port".

Sekiranya kita memasukkan 8 baris ke dalam penukar digital ke analog, ia melakukan apa yang tertulis di timah dan menghasilkan voltan analog yang sebanding dengan nombor digital.

Yang perlu kita lakukan ialah memasang voltan ke penguat operasi kecil dan kemudian ke pembesar suara.

Langkah 4: Litar Kecil

Litar Kecil
Litar Kecil
Litar Kecil
Litar Kecil
Litar Kecil
Litar Kecil
Litar Kecil
Litar Kecil

DAC0832 LCN

Ini adalah penukar Digital ke analog 8 bit yang hebat dan murah. (DAC)

Ia dapat dikendalikan sepenuhnya dengan susunan penahan data, garis sampel data.

Atau boleh disiapkan untuk melakukan semuanya secara automatik dalam "Aliran melalui operasi".

Untuk memetik manual:

Dengan hanya membumikan CS, WR1, WR2, dan XFER dan mengikat ILE tinggi membolehkan kedua-dua register dalaman mengikuti input digital yang diaplikasikan (aliran melalui) dan secara langsung mempengaruhi output analog DAC.

OK iaitu empat sambungan ke set cip rendah dan satu set ke 9V - mudah.

Kami tidak mahu voltan negatif keluar sehingga manual mengatakan kami harus menggunakan "mod beralih voltan" dan mereka memberikan gambarajah.

Yang perlu kita lakukan hanyalah mengganti amp Audio kecil daripada yang mereka cadangkan.

Amp Audio LM386-N

Manual Amp memberikan gambarajah bahagian minimum- memberikan keuntungan 20 (Terlalu banyak untuk kita-tetapi ia mempunyai kawalan kelantangan).

Yang perlu kita buat hanyalah menambahkan kapasitor antara DAC dan amp supaya kita hanya menguatkan isyarat AC.

Kita juga mesti menambah beberapa kapasitor dekat dengan pin bekalan setiap cip kita jika tidak, kita akan mendapat hum dari bekalan 9V kita.

Langkah 5: Keluar dari Soldering Iron

Keluar dari Soldering Iron
Keluar dari Soldering Iron
Keluar dari Soldering Iron
Keluar dari Soldering Iron
Keluar dari Soldering Iron
Keluar dari Soldering Iron

Oleh kerana litarnya mudah, saya tidak berhasrat memberikan akaun pukulan demi tamparan.

Berikut adalah beberapa petunjuk:

  • Sediakan sekeping papan jalur Tembaga sekurang-kurangnya 28 hingga 28 lubang. (Ya saya tahu pakar bedah otak dapat menjadikannya lebih kecil)
  • Sekiranya anda berhasrat memasangnya dengan skru, biarkan pada awalnya!
  • Pasang kerepek pada soket. Masukkan kerepek hanya apabila semuanya telah diperiksa.
  • Jauhkan wayar input dari output.
  • Perhatikan kekutuban yang betul untuk kapasitor.
  • Rujuk rajah untuk paparan dasar rujukan voltan LM336. Kaki penyesuaian tidak digunakan dan boleh dipotong.
  • Perhatikan sambungan langsung ke pin 8 DAC- Ia sangat berguna untuk ujian.
  • Saya menyambung ke Audino dengan kabel reben dan penyambung IDC 10 arah.
  • Pada Uno, sambungan berada dalam garis lurus - anda mungkin mendapati bahawa mengatur 8 sambungan input dalam satu garis lurus membolehkan anda membuat pautan ke Arduino dengan penyambung 8 hala yang sudah siap dan dibeli,

Apabila selesai - periksa pematerian dan periksa jurang antara jejak tembaga.

Saya dapati pisau gergaji junior 36 tpi sangat berguna untuk membersihkan serpihan. Saya mengeluarkan pin penempatan pisau dan meluncurkan hujung pisau ke trek- Jelas pisau tidak berada dalam bingkai.

Langkah 6: Menguji DAC

Menguji DAC
Menguji DAC

Biarkan Sambungan antara Litar dan Arduino dimatikan.

Tetapkan kawalan kelantangan pada litar anda ke pertengahan.

Hidupkan Kuasa DC 9V ke litar baru anda.

Periksa sama ada litar itu baik - saya tidak boleh bertanggungjawab ke atas litar anda!

Matikan

Sambungkan litar anda ke Arduino.

Pada Mega gunakan pin 22-29. (PORTA) Jangan salah dua pin 5V di atas!

Pada Uno gunakan pin 0-7. Ini adalah PORTD

Sambungkan 0V bekalan kuasa anda ke 0V di Arduino.

Kuasa.

Buka program ujian ini DAC_TEST

Untuk UNO, ganti semua rujukan PORTA ke PORTD

Gantikan DDRA dengan DDRD - arahan ini menetapkan semua 8 baris untuk dihasilkan dalam satu masa. Ini adalah daftar arah data.

Tetapkan monitor bersiri anda pada 115200.

Sambungkan voltmeter antara DAC out dan OV

Program ini akan menetapkan output ke 255- semua talian aktif - voltan maksimum.

Keluaran voltan maksimum 128- setengah.

Keluaran 0- voltan sifar (Atau mungkin hampir sifar).

Ia kemudian akan melangkah sedikit demi sedikit: 1, 2, 4, 8, 16, 32, 64, 128

Voltan harus meningkat dengan stabil.

Sekiranya voltan turun kembali semasa bilangannya meningkat, anda mungkin mempunyai dua wayar yang saling berkaitan terbalik.

Anda juga harus mendengar pembesar suara mengeklik secara senyap ketika voltan berubah

Langkah 7: Membaca Wav Header

Membaca Wav Header
Membaca Wav Header

Fail Wav disimpan dengan frekuensi dan ukuran data yang ditentukan.

Maklumat ini terdapat dalam header 44 bait pada permulaan fail wav.

Walaupun beberapa perisian memperluas tajuk (setelah byte 35), menjadikan lokasi ukuran data lebih sukar dicari.

Untuk membaca tajuk kami membuat penyangga dan menyalin permulaan fail.

Kekerapan disimpan dalam 4 bait bermula 24 bait ke dalam fail.

// frekuensi baca yang ditentukan dalam header fail wav

bait 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 ("Frekuensi Fail"));

Serial.print (retval);

Cara terbaik untuk mencari maklumat ukuran data adalah dengan mencari perkataan "data" di tajuk.

Kemudian ekstrak 4 bait mengikutinya, yang membentuk nilai panjang

panjang panjang yang tidak ditandatangani;

int mypos = 40;

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

jika (headbuf == 'd') {

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

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

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

// akhirnya kita memilikinya

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

OK kita mempunyai panjang dan frekuensi data!

Data audio mengikuti 4 bait membentuk nilai panjang data.

Langkah 8: Ganggu, Ganggu…

Ganggu, Ganggu…
Ganggu, Ganggu…

Kami menggunakan maklumat frekuensi untuk membuat perisian mengganggu pada, atau dekat, frekuensi yang diperlukan.

Selang selalunya tidak dapat diatur dengan tepat, tetapi sudah memadai. Kekerapan yang dibaca dari fail diteruskan ke subrutin yang ditetapkan.

void setintrupt (float freq) {float bitval = 8; // 8 untuk pemasa 8 bit 0 dan 2, 1024 untuk pemasa 1 bait

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

// Nilai setocroa memerlukan pengurangan -1. Namun menambah 0.5 pusingan ke 0.5 terdekat

// Resolusi pemasa adalah terhad

// Akhirnya ditentukan oleh besarnya bitval

cli (); // lumpuhkan gangguan // tetapkan pemasa2 gangguan

TCCR2A = 0; // tetapkan keseluruhan daftar TCCR2A ke 0

TCCR2B = 0; // sama untuk TCCR2B

TCNT2 = 0; // mulakan nilai pembilang ke 0

// set bandingkan daftar perlawanan untuk kenaikan frekuensi (hz)

OCR2A = setocroa; // = (16 * 10 ^ 6) / (frekuensi * 8) - 1 (mestilah <256)

// hidupkan mod CTC

TCCR2A | = (1 << WGM21); // Tetapkan bit CS21 untuk 8 prescaler

TCCR2B | = (1 << CS21); // aktifkan pemasa membandingkan gangguan

// TIMSK2 | = (1 << OCIE2A); // ini berfungsi, seperti baris berikut

sbi (TIMSK2, OCIE2A); // aktifkan gangguan pada pemasa 2

sei (); // aktifkan gangguan

Pembaca yang arif akan melihat sbi (TIMSK2, OCIE2A)

Saya menyediakan beberapa fungsi (diperoleh internet) untuk menetapkan dan membersihkan bit daftar:

// Mentakrifkan untuk membersihkan bit daftar # ifndef cbi

#define cbi (sfr, bit) (_SFR_BYTE (sfr) & = ~ _BV (bit))

#endif

// Mentakrifkan untuk menetapkan bit register

#ifndef sbi

#define sbi (sfr, bit) (_SFR_BYTE (sfr) | = _BV (bit))

#endif

Fungsi-fungsi ini memberikan panggilan mudah untuk mengatur atau menghapus gangguan.

Oleh itu, gangguan itu berjalan, apa yang dapat kita lakukan?

Langkah 9: Gangguan dan Penyangga Berganda

Gangguan dan Penyangga Berganda
Gangguan dan Penyangga Berganda
Gangguan dan Penyangga Berganda
Gangguan dan Penyangga Berganda

Pada 22 Khz, byte data audio dikeluarkan setiap 0.045 ms

512 bait (ukuran penyangga) dibaca dalam 2.08 ms.

Jadi penyangga tidak dapat dibaca dari SDCard dalam satu kitaran tulis.

Walau bagaimanapun, 512 bait ditulis ke port dalam jarak 23.22ms.

Jadi yang harus kita lakukan adalah menyiapkan fail baru yang dibaca setiap kali penyangga mengosongkan dan kita mempunyai cukup waktu untuk mendapatkan data sebelum blok data baru diperlukan… Dengan andaian kita menggunakan dua penyangga, mengosongkan satu ketika kita mengisi yang lain.

Ini adalah penyangga berganda.

Pembacaan fail akan diperlahankan oleh gangguan berulang, tetapi akan selesai.

Saya telah menyediakan dua penyangga 512 bait yang disebut bufa dan bufb.

Sekiranya bendera aready benar kita membaca dari porta sebaliknya kita membaca dari portb

Apabila kedudukan penyangga (bufcount) mencapai ukuran penyangga (BUF_SIZE 512) kita menetapkan bendera yang disebut readit ke true.

Rutin gelung void mencari bendera ini dan memulakan pembacaan blok:

jika (baca) {if (! aready) {

// mulakan pembacaan blok SDCard ke bufa

tempfile.read (bufa, BUF_SIZE);

} lain {

// mulakan pembacaan blok SDCard ke bufb

tempfile.read (bufb, BUF_SIZE);

}

readit = palsu;

}

Apabila sudah selesai bendera rutin readit = false.

Dalam rutin gangguan, kita mesti memastikan bahawa gelung kekosongan telah selesai dengan memeriksa apakah readit == false.

Oleh itu, kami memberi isyarat bahawa diperlukan pembacaan lain dan menukar bendera aready untuk menukar penyangga.

Sekiranya SDcard masih membaca, kita harus mengesan satu bacaan (counter--; bufcount--;) dan keluar dari gangguan untuk mencuba lagi nanti. (Klik pada isyarat output audio menunjukkan bahawa ini telah berlaku.)

Apabila semua data dibaca, gangguan dibatalkan, port diset semula ke nilai voltan pertengahan 128 dan fail audio ditutup.

Sebelum menjalankan skrip dac2.ino untuk pertama kalinya, tetapkan kelantangan anda ke 50%. Ini akan terlalu kuat, tetapi lebih baik daripada 100%!

Sekiranya kawalan kelantangan anda berfungsi dengan pertukaran terbalik, petunjuk di hujung potensiometer 10K bertentangan.

Beritahu saya bagaimana bunyinya.

Disyorkan: