Isi kandungan:
- Langkah 1: Keperluan
- Langkah 2: Spesifikasi
- Langkah 3: Bermula
- Langkah 4: Litar Kecil
- Langkah 5: Keluar dari Soldering Iron
- Langkah 6: Menguji DAC
- Langkah 7: Membaca Wav Header
- Langkah 8: Ganggu, Ganggu…
- Langkah 9: Gangguan dan Penyangga Berganda
Video: Memainkan Fail Suara Audio (Wav) Dengan Arduino dan DAC: 9 Langkah
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:11
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
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
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
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
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
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
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
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…
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
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:
Sabre Cahaya 3D yang Dicetak Dengan Suara Bertenaga Arduino (Termasuk fail): 6 Langkah
3D Printed Light Sabre With Arduino Powered Sound (Termasuk fail): Saya tidak pernah dapat mencari tutorial yang baik ketika saya mengerjakan projek ini, jadi saya fikir saya akan membuatnya. Tutorial ini akan menggunakan beberapa fail dari 3DPRINTINGWORLD dan beberapa bahagian kod berasal dari JakeS0ft Perkara yang anda perlukan: 1. Pencetak 3D
Bercakap Arduino - Memainkan MP3 Dengan Arduino Tanpa Modul - Memainkan Fail Mp3 Dari Arduino Menggunakan PCM: 6 Langkah
Bercakap Arduino | Memainkan MP3 Dengan Arduino Tanpa Modul | Memainkan Fail Mp3 Dari Arduino Menggunakan PCM: Dalam instruksional ini kita akan belajar cara memainkan fail mp3 dengan arduino tanpa menggunakan modul audio, di sini kita akan menggunakan perpustakaan PCM untuk Arduino yang memainkan 16 bit frekuensi 8kHZ 16M jadi mari kita lakukan ini
Tukar (hanya Tentang) Mana-mana Fail Media ke (hanya Tentang) Mana-mana Fail Media Lain Secara Percuma !: 4 Langkah
Tukar (Hanya Tentang) Mana-mana Fail Media ke (hanya Tentang) Mana-mana Fail Media Lain Secara Percuma! lebih universal, seperti. wmv atau.mov. Saya mencari banyak forum dan laman web dan kemudian menemui program yang dipanggil
Cara Memampatkan Fail ISO Sandaran Psp Anda Ke Fail CSO untuk Menjimatkan Ruang .: 4 Langkah
Bagaimana Memampatkan Fail ISO Backup Psp Anda Ke Fail CSO untuk Menjimatkan Ruang: Dalam Instruksional ini, saya akan menunjukkan kepada anda cara memampatkan sandaran psps anda dari ISO ke CSO untuk menjimatkan ruang pada memory stick anda, hanya menggunakan satu perisian yang boleh digunakan dengan Wine In Ubuntu. Anda juga memerlukan psp CFW (Cusstom Firm-Ware) untuk
Cara Memperbaiki Fail Data yang Tidak Disokong, dan Muat turun Fail Video Kegemaran Anda untuk Portable PSP Anda: 7 Langkah
Cara Memperbaiki Fail Data yang Tidak Disokong, dan Muat turun Fail Video Kegemaran Anda untuk Portable PSP Anda: Saya menggunakan Media Go, dan melakukan beberapa trik untuk mendapatkan fail video yang tidak disokong untuk berfungsi di PSP saya. Ini adalah semua langkah saya yang saya lakukan , ketika saya mula-mula mendapatkan fail video saya yang tidak disokong untuk berfungsi di PSP saya. Ia berfungsi 100% dengan semua fail video saya ke PSP Po saya