Daftar Isi:

Memutar File Suara Audio (Wav) Dengan Arduino dan DAC: 9 Langkah
Memutar File Suara Audio (Wav) Dengan Arduino dan DAC: 9 Langkah

Video: Memutar File Suara Audio (Wav) Dengan Arduino dan DAC: 9 Langkah

Video: Memutar File Suara Audio (Wav) Dengan Arduino dan DAC: 9 Langkah
Video: Cara buat audio 8bit untuk arduino/cara buat file audio wav 8bit untuk modul kick drum 2024, Juli
Anonim
Memutar File Suara Audio (Wav) Dengan Arduino dan DAC
Memutar File Suara Audio (Wav) Dengan Arduino dan DAC
Memutar File Suara Audio (Wav) Dengan Arduino dan DAC
Memutar File Suara Audio (Wav) Dengan Arduino dan DAC
Memutar File Suara Audio (Wav) Dengan Arduino dan DAC
Memutar File Suara Audio (Wav) Dengan Arduino dan DAC

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

Persyaratan
Persyaratan
Persyaratan
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

Spesifikasi
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

Mulai
Mulai

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

Sirkuit Kecil
Sirkuit Kecil
Sirkuit Kecil
Sirkuit Kecil
Sirkuit Kecil
Sirkuit Kecil
Sirkuit Kecil
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

Keluarkan Besi Solder
Keluarkan Besi Solder
Keluarkan Besi Solder
Keluarkan Besi Solder
Keluarkan Besi Solder
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

Menguji DAC
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

Membaca Header Wav
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…

Interupsi, Interupsi…
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

Interupsi dan Penyangga Ganda
Interupsi dan Penyangga Ganda
Interupsi dan Penyangga Ganda
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: