Daftar Isi:
- Langkah 1: Persyaratan
- Langkah 2: Spesifikasi
- Langkah 3: Memulai
- Langkah 4: Sirkuit Kecil
- Langkah 5: Keluarkan Besi Solder
- Langkah 6: Menguji DAC
- Langkah 7: Membaca Header Wav
- Langkah 8: Interupsi, Interupsi…
- Langkah 9: Interupsi dan Penyangga Ganda
Video: Memutar File Suara Audio (Wav) Dengan Arduino dan DAC: 9 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:57
Putar Audio file wav dari kartu SD Audino Anda. Instruksi ini akan menunjukkan kepada Anda bagaimana file wav di SdCard Anda dapat diputar melalui sirkuit sederhana ke speaker.
File wav harus 8 bit mono. Saya tidak punya masalah memainkan file 44 KHz.
Meskipun tidak hi-fidelity, kualitas suaranya sangat memuaskan.
Monitor serial digunakan untuk memilih file. File harus dalam folder bernama adlog.
Instruksi ini mengikuti dari proyek sebelumnya di mana saya menyimpan rekaman wav ke SdCard:
Rangkaian ini menggunakan konverter digital ke analog (DAC) 8 bit murah dan penguat audio chip tunggal.
Bagian kunci untuk mengatur interupsi diambil dari artikel luar biasa oleh Amanda Ghassaei:
Langkah 1: Persyaratan
Arduino- Saya menggunakan Mega, namun tidak ada alasan mengapa Uno tidak berfungsi.
Pembaca SdCard- program dikonfigurasi untuk: MicroSD Breakout Board Diatur dengan Konversi Logika V2
Lihat instruksi ini untuk detail pengaturan SdCard:
DAC0832 LCN- konverter digital ke analog 8 bit yang sangat baik- Beberapa pon.
LM386 N-1 Op amp- semurah chip
Soket chip 20 arah
Soket chip 8 arah
Catu daya 9 volt- baterai akan berfungsi.
Referensi tegangan LM336 2.5 V
10uF Kapasitor * 3 (tegangan lebih dari 9V)
resistor 10 ohm
Kapasitor 50nF- (Atau di suatu tempat dekat-47nF, 56nf, 68nf- bisa digunakan)
Kapasitor 220uF
pengeras suara 64 ohm
Potensiometer linier 10K
Kabel untuk menghubungkan 8 jalur data antara Arduino dan sirkuit-
Di Uno 8 koneksi sejalan, di Mega mereka berpasangan.
Di Mega saya menggunakan kabel pita 10 arah dengan header IDC 10 arah. (2 kabel cadangan)
Konektor soket untuk keluaran 0V, 9V, dan DAC
Papan strip tembaga, solder, kawat, pemotong dll
Langkah 2: Spesifikasi
Serial diatur pada 115200 baud.
Dukungan tersedia untuk Hobbytronics MicroSD Breakout Board menggunakan Mega. Pilihan chip dan port lain akan berubah antara Mega dan Uno.
File Wav harus ada di direktori bernama adlog- Jangan ragu untuk memberi nama lain dan mengatur ulang pengkodean yang diperlukan.
File wav harus mono 8 bit. Saya telah menguji hingga 44KHz.
Monitor Serial menampilkan file wav di folder adlog. Nama file dikirim dari jalur keluaran monitor.
Ukuran file hanya dibatasi oleh ukuran SdCard.
Langkah 3: Memulai
Hubungkan pembaca kartu SD. Ini adalah koneksi untuk Mega.
0, 5V
CLK ke pin 52
D0 ke pin 50
D1 ke pin 51
CS ke pin 53
(Lihat situs web pemasok untuk koneksi port Uno)
Anda akan ingin menguji apakah kartu Anda berfungsi pada tahap ini- gunakan skrip yang disediakan oleh vendor.
Kita perlu membuat sirkuit kecil
Kami akan mengirim aliran byte audio dari Arduino.
Angka-angka ini antara 0 dan 255. Mereka mewakili tegangan.
Diam adalah 127-128.
255 adalah speaker kerucut keras satu arah.
0 adalah kerucut speaker keras sebaliknya.
Jadi audio direkam sebagai nomor yang disimpan, yang menciptakan voltase yang bervariasi, yang membuat kerucut speaker bergerak.
Kami dapat mengirim nomor dari 8 baris di Arduino, secara bersamaan, dengan menggunakan "port".
Jika kita memasukkan 8 baris ke dalam konverter digital ke analog, ia melakukan apa yang tertulis di kaleng dan menghasilkan tegangan analog yang sebanding dengan nomor digital.
Yang perlu kita lakukan adalah mengemas tegangan ke penguat operasional kecil dan kemudian ke speaker.
Langkah 4: Sirkuit Kecil
DAC0832 LCN
Ini adalah konverter Digital ke analog 8 bit yang luar biasa dan murah. (DAC)
Ini dapat dikontrol sepenuhnya dengan array penyimpanan data, jalur sampel data.
Atau dapat diatur untuk melakukan semuanya secara otomatis di "Aliran melalui operasi".
Mengutip manual:
Cukup membumikan CS, WR1, WR2, dan XFER dan mengikat ILE tinggi memungkinkan kedua register internal mengikuti input digital yang diterapkan (flow-through) dan secara langsung memengaruhi output analog DAC.
OK itu adalah empat koneksi ke set chip rendah dan satu set ke 9V - mudah.
Kami tidak ingin tegangan negatif keluar sehingga manual mengatakan kami harus menggunakan "mode switching tegangan" dan mereka menyediakan diagram.
Yang perlu kita lakukan adalah mengganti ampli Audio kecil, bukan yang mereka sarankan.
Amplifier Audio LM386-N
Manual Amp menyediakan diagram suku cadang minimum - memberikan keuntungan 20 (Terlalu banyak bagi kami - tetapi memiliki kontrol volume).
Yang perlu kita lakukan adalah menambahkan kapasitor antara DAC dan amp sehingga kita hanya memperkuat sinyal AC.
Kita juga harus menambahkan beberapa kapasitor dekat dengan pin suplai masing-masing chip kita jika tidak, kita akan mendapatkan dengungan dari suplai 9V kita.
Langkah 5: Keluarkan Besi Solder
Karena rangkaiannya sederhana, saya tidak bermaksud memberikan pukulan demi pukulan.
Berikut adalah beberapa petunjuk:
- Siapkan selembar papan strip Tembaga setidaknya 28 kali 28 lubang. (Ya saya tahu ahli bedah otak bisa membuatnya lebih kecil)
- Jika Anda bermaksud memasangnya dengan sekrup, izinkan dari awal!
- Pasang chip pada soket. Masukkan chip hanya ketika semuanya telah diperiksa.
- Jauhkan kabel input dari output.
- Amati polaritas yang benar untuk kapasitor.
- Lihat diagram untuk tampilan dasar referensi tegangan LM336. Kaki pengatur tidak digunakan dan dapat dipotong.
- Perhatikan koneksi langsung ke pin 8 DAC- Ini sangat berguna untuk pengujian.
- Saya terhubung ke Audino dengan kabel pita dan konektor IDC 10 arah.
- Di Uno koneksi berada dalam garis lurus - Anda mungkin menemukan bahwa mengatur 8 koneksi input dalam satu garis lurus memungkinkan Anda untuk menautkan ke Arduino dengan konektor 8 arah yang dibeli dan siap pakai,
Setelah selesai - periksa penyolderan dan periksa celah di antara trek tembaga.
Saya menemukan mata gergaji hack junior 36 tpi sangat berguna untuk membersihkan puing-puing. Saya melepas pin lokasi bilah dan menggeser ujung bilah ke lintasan- Jelas bilah tidak berada dalam bingkai.
Langkah 6: Menguji DAC
Biarkan Koneksi antara Sirkuit dan Arduino mati.
Atur kontrol volume di sirkuit Anda ke tengah.
Nyalakan 9V DC Power ke sirkuit baru Anda.
Periksa apakah sirkuitnya baik-baik saja - Saya tidak dapat menerima tanggung jawab apa pun atas sirkuit Anda!
Matikan
Hubungkan sirkuit Anda ke Arduino.
Pada Mega gunakan pin 22-29. (PORTA) Jangan salah paham dengan dua pin 5V di atas!
Pada Uno gunakan pin 0-7. Ini adalah PORTD
Hubungkan 0V catu daya Anda ke 0V di Arduino.
Nyalakan.
Buka program uji ini DAC_TEST
Untuk UNO, ganti semua referensi ke PORTA ke PORTD
Ganti DDRA dengan DDRD- instruksi ini mengatur semua 8 baris ke output sekaligus. Ini adalah register arah data.
Atur monitor serial Anda pada 115200.
Hubungkan voltmeter antara DAC out dan OV
Program akan mengatur output ke 255- semua saluran menyala - tegangan maksimum.
Output 128- setengah tegangan maksimum.
Output 0- tegangan nol (Atau mungkin hampir nol).
Kemudian akan melangkah bitwise: 1, 2, 4, 8, 16, 32, 64, 128
Tegangan harus meningkat terus.
Jika tegangan turun kembali sementara jumlahnya meningkat, Anda mungkin memiliki dua kabel interkoneksi yang terbalik.
Anda juga harus mendengar speaker mengeklik pelan saat voltase berubah
Langkah 7: Membaca Header Wav
File wav disimpan dengan frekuensi dan ukuran data tertentu.
Informasi ini terkandung dalam header 44 byte di awal file wav.
Meskipun beberapa perangkat lunak memperluas header (setelah byte 35), membuat lokasi ukuran data lebih sulit ditemukan.
Untuk membaca header kita membuat buffer dan menyalin awal file.
Frekuensi disimpan dalam 4 byte mulai 24 byte ke dalam file.
// membaca frekuensi yang ditentukan dalam file wav header
byte headbuf[60]
tempfile.seek(0);
tempfile.read(headbuf, 60);
retval=headbuf[27];
retval=(retval<<8) | penutup kepala[26];
retval=(retval<<8) | penutup kepala[25];
retval=(retval<<8) | penutup kepala[24];
Serial.print(F("Frekuensi File "));
Serial.print(retval);
Cara terbaik untuk menemukan informasi ukuran data adalah dengan mencari kata "data" di header.
Kemudian ekstrak 4 byte yang mengikutinya, yang membentuk nilai panjang
retval panjang yang tidak ditandatangani;
int mypos=40;
untuk (int i=36; i<60;i++) {
if (headbuf == 'd') {
if(headbuf[i+1]=='a') {
if(headbuf[i+2]=='t') {
if(headbuf[i+3]=='a') {
// akhirnya kita memilikinya
mypos=i+4;
saya=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 kami memiliki data panjang dan frekuensi!
Data audio mengikuti 4 byte yang membentuk nilai panjang data.
Langkah 8: Interupsi, Interupsi…
Kami menggunakan informasi frekuensi untuk membuat interupsi perangkat lunak pada, atau mendekati, frekuensi yang diperlukan.
Interupsi tidak selalu dapat diatur dengan tepat, tetapi cukup. Frekuensi membaca dari file diteruskan ke subrutin setintrupt.
void setintrupt(frekuensi mengambang){float bitval=8; // 8 untuk timer 8 bit 0 dan 2, 1024 untuk timer 1 byte
setocroa=(16000000/(frekuensi*bitval)) - 0,5;
// Nilai setocroa membutuhkan pengurangan -1. Namun menambahkan 0,5 putaran ke 0,5. terdekat
// Resolusi pengatur waktu terbatas
// Akhirnya ditentukan oleh besarnya bitval
kli(); // nonaktifkan interupsi// setel interupsi timer2
TCCR2A = 0; // setel seluruh register TCCR2A ke 0
TCCR2B = 0; // sama untuk TCCR2B
TCNT2 = 0; // inisialisasi nilai penghitung ke 0
// setel bandingkan register kecocokan untuk peningkatan frekuensi (hz)
OCR2A = setokroa; // = (16*10^6) / (frekuensi*8) - 1 (harus <256)
// aktifkan mode CTC
TCCR2A |= (1 << WGM21); // Atur bit CS21 untuk 8 prescaler
TCCR2B |= (1 << CS21); // aktifkan timer bandingkan interupsi
// TIMSK2 |= (1 << OCIE2A); // ini berfungsi, seperti halnya baris berikut
sbi(TIMSK2, OCIE2A); // aktifkan interupsi pada timer 2
sei(); // aktifkan interupsi
Pembaca yang cerdas akan melihat sbi(TIMSK2, OCIE2A)
Saya menyiapkan beberapa fungsi (diperoleh internet) untuk mengatur dan menghapus bit register:
// Mendefinisikan untuk menghapus bit register#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#berakhir jika
// Mendefinisikan untuk mengatur bit register
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#berakhir jika
Fungsi-fungsi ini menyediakan panggilan yang mudah untuk mengatur atau menghapus interupsi.
Jadi interupsi sedang berjalan, apa yang bisa kita lakukan?
Langkah 9: Interupsi dan Penyangga Ganda
Pada 22 Khz, satu byte data audio dikeluarkan setiap 0,045 ms
512 byte (ukuran buffer) dibaca dalam 2,08 ms.
Jadi buffer tidak dapat dibaca dari SDCard dalam satu siklus tulis.
Namun 512 byte ditulis ke port dalam 23,22 ms.
Jadi yang harus kita lakukan adalah menyiapkan file baru yang dibaca setiap kali buffer dikosongkan dan kita memiliki cukup waktu untuk mendapatkan data sebelum blok data baru diperlukan… Dengan asumsi kita menggunakan dua buffer, mengosongkan satu saat kita mengisi yang lain.
Ini adalah buffer ganda.
Pembacaan file akan diperlambat oleh interupsi berulang, tetapi itu akan selesai.
Saya telah menyiapkan dua buffer 512 byte yang disebut bufa dan bufb.
Jika flag aredy benar, kita membaca dari porta jika tidak, kita membaca dari portb
Ketika posisi buffer (bufcount) mencapai ukuran buffer (BUF_SIZE 512) kami menetapkan flag yang disebut readit menjadi true.
Rutin void loop mencari flag ini dan memulai membaca blok:
if(baca){jika (! sudah siap){
// mulai membaca blok SDCard ke bufa
tempfile.read(bufa, BUF_SIZE);
} lain {
// memulai blok SDCard membaca ke bufb
tempfile.read(bufb, BUF_SIZE);
}
baca = salah;
}
Setelah selesai, flag rutin readit=false.
Dalam rutin interupsi kita harus memeriksa apakah loop kosong telah selesai dengan memeriksa apakah readit== false.
Dalam kasus ini, kami memberi sinyal bahwa pembacaan lain diperlukan dan mengaktifkan flag aready untuk mengganti buffer.
Jika SDcard masih membaca, kita harus mundur satu pembacaan (counter--; bufcount--;) dan keluar dari interupsi untuk mencoba lagi nanti. (Klik pada sinyal output audio menyiratkan bahwa ini telah terjadi.)
Ketika semua data dibaca, interupsi dibatalkan, port diatur ulang ke nilai tegangan menengah 128 dan file audio ditutup.
Sebelum menjalankan skrip dac2.ino untuk pertama kalinya, setel volume Anda menjadi 50%. Ini akan terlalu keras, tetapi lebih baik dari 100%!
Jika kontrol volume Anda bekerja secara terbalik, tukar lead di ujung yang berlawanan dari potensiometer 10K.
Beri tahu saya bagaimana kedengarannya.
Direkomendasikan:
Memutar Pohon Natal dan Lampu yang Dapat Diprogram Dengan Arduino: 11 Langkah
Memutar Pohon Natal dan Lampu yang Dapat Diprogram Dengan Arduino: Memutar pohon Natal dan lampu yang dapat diprogram dengan ArduinoProyek ini akan melihat, bagaimana membuat pohon Natal berputar dengan Arduino, pendingin, papan percobaan berlubang, lampu LED dan beberapa elemen elektronik lainnya
Cara Membuat Radio Stereo Ford Audiophile Memutar File Mp3.: 7 Langkah
Cara Membuat Radio Stereo Ford Audiophile Memutar File Mp3.: Instruksi ini akan memberi Anda beberapa detail penting tentang cara memenuhi persyaratan kompatibilitas CD-R MP3 dari Ford Audiophile (dan mungkin Mach 300, Shaker 500, dan Shaker 1000 ) stereo pabrik sehingga Anda dapat membakar dan menikmati file MP3 di CD
Berbicara Arduino - Memutar MP3 Dengan Arduino Tanpa Modul Apa Pun - Memutar File Mp3 Dari Arduino Menggunakan PCM: 6 Langkah
Berbicara Arduino | Memutar MP3 Dengan Arduino Tanpa Modul Apa Pun | Memutar File Mp3 Dari Arduino Menggunakan PCM: Dalam instruksi ini kita akan belajar cara memutar file mp3 dengan arduino tanpa menggunakan modul audio apa pun, di sini kita akan menggunakan perpustakaan PCM untuk Arduino yang memainkan PCM 16 bit frekuensi 8kHZ jadi mari kita lakukan ini
Memutar CD Tanpa Pemutar CD, Menggunakan AI dan YouTube: 10 Langkah (dengan Gambar)
Memutar CD Tanpa Pemutar CD, Menggunakan AI dan YouTube: Ingin memutar CD Anda tetapi tidak memiliki pemutar CD lagi? Tidak punya waktu untuk menyalin CD Anda? Merobeknya tetapi file tidak tersedia saat dibutuhkan? Tidak masalah. Biarkan AI (kecerdasan buatan) mengidentifikasi CD Anda, dan YouTube memainkannya! Saya menulis aplikasi Android melakukan
Cara Memperbaiki File Data yang Tidak Didukung, dan Mengunduh File Video Favorit Anda untuk PSP Portable Anda: 7 Langkah
Cara Memperbaiki File Data yang Tidak Didukung, dan Mengunduh File Video Favorit Anda untuk PSP Portable: Saya menggunakan Media Go, dan melakukan beberapa trik agar file video yang tidak didukung berfungsi di PSP saya. Ini semua langkah yang saya lakukan , ketika saya pertama kali mendapatkan file video saya yang tidak didukung untuk bekerja di PSP saya. Ia bekerja 100% dengan semua file video saya ke PSP Po