Menggunakan mikrofon dengan Arduino

18

EDIT : Saya telah menyelidiki masalah ini selama beberapa waktu. Ternyata itu menjadi proyek yang jauh lebih sulit daripada yang saya pikirkan dan bukan sesuatu untuk pemula. Ini membutuhkan perangkat keras yang mahal (mikrofon & amplifier) ​​dan beberapa analisis audio yang canggih pada mikrokontroler. Bahkan mikrofon lengkap dengan sirkuit amplyfier tidak memberikan hasil yang diinginkan (sesuai dengan komentar pada produk ini)


Saya sepenuhnya baru di Arduino (tapi saya akrab dengan pemrograman). Untuk membangun VU meter , saya ingin meletakkan mikrofon ke pin 0 analog Arduino dan menampilkan nilai melalui koneksi serial.

Saya mencari di Google dan menemukan sirkuit ini:

Pre-Amplifier Audio Sederhana

... dan saya mencoba membangunnya dengan hasil ini:

(Saya sekarang menggunakan sirkuit yang disarankan oleh Oli Glaser dalam jawabannya)

Nilai pada monitor serial tidak berubah tergantung pada volume musik.

Apa cara termudah untuk mengukur volume pada input analog Arduino?

Juga, saya punya TDA2822M , tapi saya tidak tahu apakah ini berguna untuk proyek ini. Keterangan pada mikrofon bertuliskan XF-18D .

Sunting: Kode Arduino saya:

void setup() {
  Serial.begin(9600); 
}

void loop() {
  Serial.println(analogRead(0));
  delay(300);
}

Output serial: 1023 1022 1022 1022 1022 1023 1022 dan seterusnya

Bagaimana saya bisa mengecek apakah mikrofon berfungsi sama sekali? Apakah itu directional?

Sunting: Saya sekarang menggunakan transistor S9014. ADC dan kerja koneksi serial (saya mengujinya dengan potensiometer).

Output serial sekarang sekitar 57.

Juga, saya tidak punya multimeter atau osiloskop. Saya memiliki multimeter sekarang.

Roti panggang
sumber
Sudahkah Anda memverifikasi dengan lingkup yang Anda dapat melihat bentuk gelombang audio pada output sirkuit Anda?
HikeOnPast
Wah, mengapa pin 3V3 dan 5V korsleting dalam skema? Itu bisa menjadi masalah.
Connor Wolf
Tidak, saya hanya tidak menggambar skematis dengan benar.
Roti panggang

Jawaban:

14

Cara "termudah" adalah dengan menerapkan sinyal dan sampel dengan ADC. Simpan hasil dalam buffer kemudian tampilkan sesuai keinginan (dalam kasus Anda kirim ke PC melalui RS232)
Jika Anda ingin tingkat sinyal RMS maka Anda perlu menghitung ini di beberapa titik, baik sebelum mengirim ke PC atau sesudahnya.

Sirkuit penguatan Anda seperti yang ditunjukkan tidak ideal, tetapi harus bekerja secara wajar untuk VU meter dasar. EDIT - Saya baru saja melihat C2, hapus ini karena akan memblokir bias DC dari transistor, dan sinyal akan berayun di bawah tanah.

EDIT - inilah rangkaian yang lebih baik untuk transistor yang memperkuat:

Electret amp

Ini seharusnya tidak terlalu peduli dengan transistor yang digunakan, bias output harus sekitar 2.5V.
Nilai tepat untuk pembagi input (R3 dan R4) tidak terlalu penting, rasio 1: 4 yang lebih penting. Jadi, Anda dapat menggunakan misalnya 400k dan 100k, atau 40k dan 10k, dll (cobalah untuk tidak pergi di atas atau di bawah nilai-nilai ini masing-masing). C2 harus> 10uF. C1 harus> 1uF (menggantikan C1 dalam skema Anda)
R1 dan R2 memang perlu nilai-nilai ini.
Yang Anda butuhkan adalah electret dengan resistor bias itu (R1 dalam skema Anda)

Satu hal yang menjadi perhatian adalah garis Arduino 3.3V dan 5V tampaknya saling terkait - Saya berasumsi ini adalah kesalahan skematik, tetapi jika ini yang terjadi pada rangkaian aktual, ia tidak akan berfungsi, dan dapat merusak sesuatu.
Untuk menunjukkan masalah, akan membantu untuk melihat kode Anda, dan apa yang Anda lihat di sisi PC. Transistor apa yang Anda gunakan?

Jika Anda memiliki osiloskop, maka Anda dapat memeriksa untuk melihat apakah mic / transistor Anda berfungsi dengan benar. Jika tidak, maka multimeter dapat digunakan untuk melakukan beberapa tes yang lebih mendasar (mis. Konfirmasi + 5V hadir, konfirmasi basis transistor berada pada ~ 0,6V, uji pengumpul untuk memastikan itu tidak disematkan ke + 5V atau ground tanpa ada sinyal)

Anda juga perlu memastikan RS232 bekerja dengan benar, jadi menulis beberapa kode sederhana untuk mengirim beberapa nilai tes akan menjadi ide yang bagus.

Jika Anda dapat memberikan info yang diminta, dan beri tahu kami alat apa yang tersedia, bantuan lebih spesifik dapat diberikan.

EDIT - jika Anda mengambil sampel dengan sangat lambat, maka Anda akan memerlukan rangkaian pendeteksi puncak seperti ini:

Deteksi Puncak

Anda akan meletakkan sirkuit ini di antara transistor dan pin Arduino (minus C2)

Dioda dapat berupa hampir semua dioda. Nilai cap dan resistor hanyalah panduan, mereka dapat diubah sedikit. Nilai mereka menentukan berapa lama tegangan akan berubah dengan tingkat sinyal. Anda dapat menghitung ini menggunakan konstanta RC (yaitu R * C - dalam contoh di atas, konstanta RC adalah 1e-6 * 10e3 = 10ms. Tegangan akan memakan waktu sekitar 2,3 konstanta waktu untuk turun hingga 90% dari nilai aslinya, jadi dalam contoh di atas jika tegangan dimulai pada 1V dan Anda menghapus sinyal, itu akan turun menjadi 0,1V sekitar 23 ms nanti.

EDIT - oke, saya pikir saya menemukan masalah besar. Transistor S9012 Anda adalah transistor PNP (seperti halnya S9015), Anda memerlukan transistor NPN untuk sirkuit ini. The S9014 adalah transistor NPN, sehingga Anda akan harus menggunakan yang satu ini.

Kapasitor bertanda "104" hampir pasti 0,1uF kapasitor keramik. Nilai (dalam pF) adalah 2 angka pertama diikuti oleh angka nol yang ditetapkan oleh angka terakhir. Jadi untuk 104, nilainya 10 + 4 nol, atau 100.000pF. 100.000pF adalah 100nF atau 0,1 uF.

EDIT - Tidak memiliki ruang lingkup atau multimeter membuat hidup sangat sulit di sini (Anda harus mendapatkan satu atau keduanya sesegera mungkin)
Namun, ada beberapa osiloskop kartu suara PC dasar yang dapat digunakan untuk menguji rangkaian electret / transistor Anda. Visual Analyzer adalah contoh yang cukup bagus:

Analisis Visual

Jika Anda mengganti C2 (tidak sepenuhnya diperlukan tetapi ide yang baik), Anda harus dapat memberi makan sinyal ke PC secara langsung dan mengamati dalam perangkat lunak untuk melihat apakah mikrofon dan amplifikasi berfungsi dengan benar. Jika PC Anda menggunakan saluran itu, tetapi input mikrofon biasanya baik untuk 2V IIRC. Anda juga dapat menguji electret secara langsung - cukup lepaskan bit transistor dan simpan R1 dan C1, ambil sinyal dari sisi lain C1.
Perhatikan bahwa metode ini tidak akan menguji level DC, hanya AC (karena tutup pemblokiran DC pada input souncard) tetapi sinyal AC (audio) adalah yang Anda minati di sini.

Jika Anda mencoba ini, poskan tangkapan layar agar kami dapat mengetahui apa yang terjadi.

Oli Glaser
sumber
3.3V dan 5V tidak terikat bersama. Ini pertama kalinya saya menggunakan perangkat lunak ini - maaf. Saya akan memasukkan kode saya dalam pertanyaan tetapi tidak ada yang salah dengan itu. Juga, saya membuat proyek hari ini yang menggunakan photoresistor dan menampilkan nilai pada enam leds seperti saya ingin vu meter saya terlihat seperti dan saya menguji koneksi serial dengan itu. Saya tidak memiliki osiloskop atau multimeter. Transistor memiliki judul "S9012 H 331" Saya juga memiliki "S9014 C 331" dan S9015.
Roti panggang
@Toast - lihat edit tentang C2, hapus ini dan sambungkan langsung.
Oli Glaser
Saya menghapus C2 dan menambahkan bagian-bagian seperti yang dijelaskan Kristoffon dalam jawabannya. Masih hasilnya sama.
Roti panggang
1
Jika Anda memiliki potensiometer atau sumber tegangan variabel, Anda dapat menerapkan input 0-5V ke input ADC untuk menguji kode Anda, terlepas dari rangkaian input Anda. Anda mencoba men-debug dua hal sekaligus - mengisolasi sirkuit dan memverifikasi perilakunya menggunakan osiloskop dan / atau mengisolasi kode Anda dan memberikan input yang dapat diprediksi tetapi variabel untuk memvalidasi kode Anda.
HikeOnPast
1
@ OliGlaser Saya bingung dengan sirkuit. "Electret" adalah mikrofon? Di mana kabel mikrofon lain pergi, GND atau VCC? Apakah saya menghubungkan 5 atau 3.3V ke sirkuit itu? Bisakah Anda dengan senang hati menghapus EDITblok dan mengeditnya sehingga dapat dipahami tanpa membaca utas komentar? Saya juga seorang pemula dan saya tidak mengerti bagaimana masalah itu diselesaikan dan apakah saya dapat menggunakan sirkuit yang Anda pasang apa adanya.
Tomáš Zato - Reinstate Monica
4

Dengan asumsi sirkuit Anda berfungsi, sinyal audio berada dalam kisaran kHz sedangkan Arduino memiliki ADC yang cocok untuk level DC. Komponen DC pada sinyal Anda adalah nol yang artinya mengapung di atas tegangan tetap. Adalah tegangan tetap yang dibaca ADC Anda.

Untuk memperbaikinya Anda akan meletakkan dioda secara seri dengan output Anda menghubungkan ke ADC dan ke kapasitor dan resistor.

Tutup akan mengisi ke nilai puncak yang diterima sementara resistor akan melepaskan tutup ketika sinyal mati.

--|>|---*---- adc
        *---- resistor -----*----ground
        \----- capacitor ---/

Sunting: Input ADC sebenarnya mengambang karena tidak memiliki bias apa pun karena kapasitor seri. Jika Anda akan mencoba solusi saya hapus C2.

Kristoffon
sumber
Oke, saya menambahkan ini ke sirkuit dan sinyal pada monitor serial sekarang adalah 458 (tapi masih tidak berubah ketika ada suara).
Roti panggang
Saya menukar transistor dari "S9012 H 331" ke "S9014 C 331" dan nilainya 56.
Roti panggang
1
Arduino ADC mampu mengambil sampel dengan cukup cepat untuk audio. Saya tidak menggunakannya, tapi saya pikir 10ksps (jadi bandwidth 5kHz) dimungkinkan dengan fungsi perpustakaan, yang baik untuk hal-hal lo-fi (Saya cukup yakin ATMega yang sebenarnya dapat sampel lebih cepat jika digunakan secara normal)
Oli Glaser
@Toast - seberapa cepat pengambilan sampel Anda? Jika sangat lambat maka pendeteksi puncak adalah ide yang bagus. Anda dapat melakukan ini dalam perangkat lunak.
Oli Glaser
2
@ Kristoffon - Tidak dengan no Arduino, tapi saya telah menggunakan mik 8-bit yang serupa (misalnya PIC16F, 18F, dll) untuk pengambilan sampel dan memutar audio berkali-kali. 10ksps mudah dilakukan. Mengutip dokumen AVR ADC ini :When using single-ended mode, the ADC bandwidth is limited by the ADC clock speed. Since one conversion takes 13 ADC clock cycles, a maximum ADC clock of 1 MHz means approximately 77k samples per second. This limits the bandwidth in single-ended mode to 38.5 kHz, according to the Nyquist sampling theorem.
Oli Glaser
4

Bacaan Anda 1022, 1023 pada dasarnya skala penuh pada ADC Arduino. Dengan asumsi Anda memasang kapasitor seri non-salah seperti yang ditunjukkan pada diagram Anda, level ini tidak dapat berasal dari rangkaian mikrofon yang Anda buat, karena itu hanya dapat mengubah tegangan beberapa (yaitu, AC).

Akibatnya, saya menduga Anda membaca arus bocor di dalam ATMEGA itu sendiri - Anda mungkin akan mendapatkan hasil yang sama pada pin analog (tidak terhubung) lainnya.

Coba buat pembagi tegangan yang sangat "ringan" dengan beberapa resistor bernilai tinggi (antara 10K dan 100K) dan gunakan ini untuk membuat bias input analog menjadi setengah dari tegangan referensi (Anda juga bisa menggunakan potensiometer, yang memberi Anda beberapa kemampuan pengujian tambahan). Maka bacaan Anda tanpa input harus berada di lingkungan 512.

Setelah Anda memiliki input ADC yang bias, Anda dapat mulai mencoba melihat apakah Anda mendapatkan variasi melalui itu. Anda mungkin menggarisbawahi bandwidth Anda beberapa, yang berarti Anda akan mendapatkan alias komponen frekuensi tinggi, tetapi jika semua yang Anda coba lakukan adalah memperkirakan volume keseluruhan yang seharusnya tidak terlalu banyak masalah.

Chris Stratton
sumber
Kedengarannya benar, saya kira itu kelebihan beban. OP sudahkah Anda berpikir untuk menghubungkan speaker kecil ke debug analog yang membaca garis Anda. Ketika saya membuat vu meter saya mengambil garis-garis dari jack headphone, pada dasarnya langsung ke AnalogRead dan memetakan hasilnya.
Hellonearthis