Arduino ile mikrofon kullanma


18

EDIT : Ben uzun süredir bu sorunu araştırıyorum. Yeni başlayanlar için bir şey değil, düşündüğümden çok daha zor bir proje olduğu ortaya çıktı. Bu, pahalı donanım (mikrofon ve amplifikatör) ve mikrodenetleyici üzerinde bazı gelişmiş ses analizi gerektirir. Amplifikatör devresine sahip eksiksiz bir mikrofon bile istenen sonuçları sağlamaz (bu üründeki yorumlara göre)


Tamamen Arduino için yeniyim (ama programlamaya aşinayım). Bir VU ölçer oluşturmak için, Arduino'nun analog 0 pinine bir mikrofon koymak ve değeri seri bağlantı yoluyla görüntülemek istiyorum.

Google'ı aradım ve şu devreyi buldum:

Basit Ses Ön Amplifikatörü

... ve bu sonuçla inşa etmeye çalıştım:

(Şimdi Oli Glaser'in önerdiği devreyi kullanıyorum)

Seri monitördeki değerler müzik ses seviyesine bağlı olarak değişmez.

Arduino'nun analog girişindeki ses seviyesini ölçmenin en kolay yolu nedir?

Ayrıca, bir TDA2822M var , ama bu proje için yararlı olup olmadığını bilmiyorum. Mikrofondaki başlık XF-18D'yi okur .

Düzenleme: Arduino kodum:

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

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

Seri çıkış: 1023 1022 1022 1022 1022 1023 1022 vb.

Mikrofonun çalışıp çalışmadığını nasıl kontrol edebilirim? Yönlü mü?

Düzenleme: Şimdi bir S9014 transistör kullanıyorum. ADC ve seri bağlantı çalışır (Bir potansiyometre ile test ettim).

Seri çıkış artık 57 civarında.

Ayrıca, bir multimetre veya osiloskopum yok. Şimdi bir multimetrem var.


Devrenizin çıkışında bir ses dalga formu görebileceğiniz bir kapsamla doğruladınız mı?
HikeOnPast

Vay, 3V3 ve 5V pimi şematikte neden kısa devre yapıyor? Bu bir sorun olabilir.
Connor Wolf

Hayır, şematiği doğru şekilde çizmedim.
Tost

Yanıtlar:


14

"En kolay" yol sadece sinyali ve örneği ADC ile uygulamaktır. Sonuçları bir tamponda saklayın ve istediğiniz gibi görüntüleyin (sizin durumunuzda RS232 üzerinden PC'ye gönderin)
Sinyalin RMS seviyesini istiyorsanız, PC'ye göndermeden önce veya daha sonra bunu bir noktada hesaplamanız gerekecektir.

Gösterildiği gibi amplifikatör devreniz ideal değildir, ancak temel bir VU ölçer için makul şekilde çalışmalıdır. DÜZENLEME - C2'yi yeni fark ettim, transistörden DC öngerilimini engelleyeceği ve sinyal toprağın altında sallanacağı için bunu kaldırın.

EDIT - amplifikatör transistörü için daha iyi bir devre:

Elektret amfi

Bu, kullanılan transistör hakkında çok fazla umursamamalı, çıkış eğilimi yaklaşık 2.5V olmalıdır.
Giriş bölücü (R3 ve R4) için kesin değerler çok önemli değildir, bu daha çok 1: 4 oranıdır. Böylece 400k ve 100k veya 40k ve 10k vb. Kullanabilirsiniz (bu ilgili değerlerin üstüne veya altına gitmemeye çalışın). C2> 10 uF olmalıdır. C1> 1 uF olmalıdır (şemanızdaki C1 yerine geçer)
R1 ve R2'nin bu değerler olması gerekir.
İhtiyacınız olan tek şey, öngerilim direnci ile elektrettir (şemanızdaki R1)

Endişe duyulan bir nokta, Arduino 3.3V ve 5V hatlarının birbirine bağlı gibi görünmesidir - bunun şematik bir hata olduğunu varsayıyorum, ancak bu gerçek devrede durum buysa işe yaramaz ve bir şeye zarar verebilir.
Sorun (ları) belirlemek için kodunuzu ve PC tarafında gördüklerinizi görmeniz yardımcı olacaktır. Ayrıca hangi transistörü kullanıyorsunuz?

Bir osiloskopunuz varsa, mikrofonunuzun / transistörünüzün düzgün çalışıp çalışmadığını kontrol edebilirsiniz. Aksi takdirde, daha temel bazı testler yapmak için bir multimetre kullanılabilir (örn. + 5V mevcut olduğunu onaylayın, transistörün tabanının ~ 0.6V'da olduğunu, test toplayıcısının + 5V'ye sabitlenmediğinden emin olun veya sinyal yokken topraklayın)

Ayrıca RS232'nin düzgün çalıştığından emin olmanız gerekir, bu nedenle bazı test değerleri göndermek için bazı basit kodlar yazmak iyi bir fikir olacaktır.

İstenilen bilgileri sağlayabilir ve hangi araçlara sahip olduğunuzu bize bildirirseniz daha spesifik yardım verilebilir.

EDIT - çok yavaş örnekleme yapıyorsanız, bunun gibi bir tepe algılama devresine ihtiyacınız olacaktır:

Tepe Algılama

Bu devreyi transistör ve Arduino pimi arasına koyabilirsiniz (eksi C2)

Diyot hemen hemen herhangi bir diyot olabilir. Kapak ve direnç değerleri sadece bir kılavuzdur, biraz değiştirilebilir. Değerleri, voltajın sinyal seviyesiyle değişmesinin ne kadar süreceğini belirler. RC sabitini kullanarak bunu hesaplayabilirsiniz (yani R * C - yukarıdaki örnekte, RC sabiti 1e-6 * 10e3 = 10ms'dir.Verilim, orijinal değerinin% 90'ı kadar düşmek için yaklaşık 2.3 zaman sabiti alacaktır, bu nedenle yukarıdaki örnekte voltaj 1V'den başlar ve sinyali kaldırırsanız, 23ms sonra 0.1V'a düşecektir.

EDIT - tamam, büyük bir sorun bulduğumu düşünüyorum. Sizin S9012 transistör bir olan PNP transistörü (S9015 olduğu gibi), bu devre için NPN transistörü gerekir. S9014 bu birini kullanmak zorunda kalacak, böylece bir NPN transistör olduğunu.

"104" işaretli kapasitörler neredeyse kesinlikle 0.1 uF seramik kapasitörlerdir. Değer (pF cinsinden), ilk 2 sayı ve ardından son sayı tarafından ayarlanan sıfır sayısıdır. 104 için, değer 10 + 4 sıfır veya 100.000pF'dir. 100.000pF, 100nF veya 0.1uF'dir.

DÜZENLEME - Bir kapsam veya multimetre olmaması burada hayatı çok zorlaştırır (mümkün olan en kısa sürede bir veya her ikisini de almalısınız)
Ancak, elektret / transistör devrenizi test etmek için kullanılabilecek bazı temel PC ses kartı osiloskopları vardır. Görsel Çözümleyici oldukça iyi bir örnektir:

Görsel Analiz

C2'yi değiştirirseniz (kesinlikle gerekli değildir, ancak iyi bir fikirdir), sinyali doğrudan PC'ye besleyebilmeli ve mikrofon ve amplifikasyonun doğru çalışıp çalışmadığını görmek için yazılımda gözlemleyebilmelisiniz. PC'nizde bu hat kullanılıyorsa, ancak mikrofon girişi genellikle 2V IIRC'ye kadar iyidir. Elektreti doğrudan test edebilirsiniz - sadece transistör ucunu çıkarın ve R1 ve C1'i tutun, C1'in diğer tarafından sinyal alın.
Not Bu yöntem olacağı değil DC seviyeleri test fakat AC (ses) sinyali (nedeniyle souncard girişteki kapağı kapatan bir DC) sadece AC burada ilgilenen budur.

Bunu denerseniz, neler olduğunu anlayabilmemiz için ekran görüntülerini gönderin.


3.3V ve 5V birbirine bağlı değildir. Bu yazılımı ilk kez kullanıyorum - üzgünüm. Kodumu soruya koyacağım ama yanlış gidebilecek bir şey yok. Ayrıca, bugün bir fotodirenç kullanan ve vu metrenizin benzemesini istediğim gibi altı led üzerinde değeri gösteren bir proje yaptım ve bununla seri bağlantıyı test ettim. Ne osiloskopum ne de multimetrem var. Transistör "S9012 H 331" başlığına sahiptir. Ayrıca "S9014 C 331" ve S9015 olanlarına da sahibim.
Tost

@Toast - C2 ile ilgili düzenlemeye bakın, bunu kaldırın ve doğrudan bağlanın.
Oli Glaser

C2'yi kaldırdım ve Kristoffon'un cevabında tarif ettiği gibi parçaları ekledim. Yine de aynı sonuçlar.
Tost

1
Bir potansiyometreniz veya değişken bir voltaj kaynağınız varsa, kodunuzu test etmek için giriş devrenizden bağımsız olarak ADC'nin girişine 0-5V giriş uygulayabilirsiniz. Bir kerede iki şeyi ayıklamaya çalışıyorsunuz - devreyi yalıtın ve osiloskop kullanarak davranışını doğrulayın ve / veya kodunuzu izole edin ve kodunuzu doğrulamak için öngörülebilir ancak değişken bir girdi sağlayın.
HikeOnPast

1
@OliGlaser Devre karıştı. "Elektret" bir mikrofon mu? Mikrofonun diğer kablosu nereye gidiyor, GND veya VCC? Bu devreye 5 veya 3.3V bağlayabilir miyim? Lütfen bir şekilde EDITblokları kaldırır ve yorum dizisini okumadan anlaşılabilmesi için düzenler misiniz? Ben de bir acemiyim ve sorunun nasıl çözüldüğünü ve yayınladığınız devreyi kullanıp kullanamayacağımı anlamıyorum.
Tomáš Zato - Monica

4

Devrenizin çalıştığını varsayarsak, Arduino'nun DC seviyeleri için uygun bir ADC'si varken ses sinyali kHz aralığındadır. Sinyalinizdeki DC bileşeni sıfırdır, yani sabit bir voltaj üzerinde yüzer. ADC'nizin okuduğu sabit voltajdır.

Bunu düzeltmek için, çıkışınız ADC'ye ve bir kapasitöre ve dirence bağlanan bir diyot seri olarak yerleştirilir.

Direnç sinyal düştüğünde kapağı boşaltırken kapak alınan en yüksek değere kadar şarj olur.

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

Düzenleme: ADC girişi aslında seri kapasitör nedeniyle herhangi bir önyargı olmadığı için yüzer. Çözümümü deneyecekseniz C2'yi silin.


Tamam, bunu devreye ekledim ve seri monitördeki sinyal şimdi 458 (ancak gürültü olduğunda hala değişmiyor).
Tost

Transistörü "S9012 H 331" den "S9014 C 331" e değiştirdim ve değer 56.
Toast

1
Arduino ADC ses için yeterince hızlı örnekleme yapabilir. Onları kullanmıyorum, ancak loks fi şeyler için iyi olan kütüphane fonksiyonları ile 10ksps (yani 5kHz bant genişliğine kadar) mümkün olduğunu düşünüyorum (normal ATMega'nın normal kullanıldığında daha hızlı örnekleyebileceğinden eminim)
Oli Glaser

@Toast - ne kadar hızlı numune alıyorsunuz? Çok yavaşsa, tepe dedektörü iyi bir fikirdir. Bunu yazılımda da yapabilirsiniz.
Oli Glaser

2
@Kristoffon - Arduino no ile değil, sesi örneklemek ve birçok kez çalmak için benzer 8 bitlik mikrolar (örn. PIC16F, 18F, vb.) Kullandım. 10ksps kolayca yapılabilir. Bu AVR ADC belgesini alıntılamak için :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

1022, 1023 okumalarınız temel olarak Arduino'nun ADC'sinde tam ölçeklidir. Diyagramınızda gösterildiği gibi arızalı olmayan bir seri kapasitör taktığınızı varsayarsak, bu seviye yaptığınız mikrofon devresinden gelemez, çünkü bu sadece değişen voltajları (yani AC) birleştirebilir.

Sonuç olarak, ATMEGA'nın kendisinde kaçak akım okuduğunuzdan şüpheleniyorum - muhtemelen aynı sonucu diğer (bağlı olmayan) analog pimlerden elde edersiniz.

Bazı yüksek değerli dirençlerle (10K ile 100K arasında) çok "hafif" bir voltaj bölücü oluşturmayı deneyin ve bunu analog girişi referans voltajın yarısına doğru saptırmak için kullanın (ayrıca size bazı ekstra test yeteneği sağlayan bir potansiyometre de kullanabilirsiniz). O zaman hiçbir girdi olmadan okuma 512 mahallesinde olmalıdır.

ADC girişine uygun şekilde taraflı olduktan sonra, varyasyon alıp almadığınızı görmek için çalışmaya başlayabilirsiniz. Bant genişliğinizden bazılarını örneklemiş olabilirsiniz, bu da yüksek frekanslı bileşenlerin takma adını alacağınız anlamına gelir, ancak yapmaya çalıştığınız tek şey çok fazla sorun olmaması gereken genel hacmi tahmin etmekse.


Kulağa doğru geliyor, sanırım aşırı yüklenmiş. OP, okuduğunuz analog hatta hata ayıklamak için küçük bir hoparlör bağlamayı düşündünüz. Bir vu metre yaptığımda, hatları bir kulaklık jakından aldım, temelde doğrudan AnalogRead'e ve sonuçtan eşleştirdim.
Hellonearthis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.