Verwenden eines Mikrofons mit einem Arduino


18

EDIT : Ich habe in diesem Problem seit geraumer Zeit untersucht. Es ist ein viel schwierigeres Projekt als ich dachte und nichts für Anfänger. Dies erfordert teure Hardware (Mikrofon & Verstärker) und einige ausgefeilte Audioanalysen auf dem Mikrocontroller. Selbst ein komplettes Mikrofon mit stärkerer Schaltung liefert nicht die gewünschten Ergebnisse (laut den Kommentaren zu diesem Produkt)


Ich bin völlig neu im Arduino (aber ich bin mit dem Programmieren vertraut). Um ein VU-Meter zu bauen , möchte ich ein Mikrofon an den analogen 0-Pin des Arduino anschließen und den Wert über die serielle Verbindung anzeigen.

Ich habe gegoogelt und diese Schaltung gefunden:

Einfacher Audio-Vorverstärker

... und ich habe versucht, es mit diesem Ergebnis zu bauen:

(Ich benutze jetzt die von Oli Glaser in seiner Antwort vorgeschlagene Schaltung)

Die Werte auf dem seriellen Monitor ändern sich je nach Musiklautstärke nicht.

Was ist der einfachste Weg, um die Lautstärke am analogen Eingang des Arduino zu messen?

Außerdem habe ich einen TDA2822M , aber ich weiß nicht, ob er für dieses Projekt hilfreich ist. Die Beschriftung auf dem Mikrofon lautet XF-18D .

Edit: Mein Arduino-Code:

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

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

Die serielle Ausgabe: 1023 1022 1022 1022 1022 1023 1022 und so weiter

Wie kann ich prüfen, ob das Mikrofon überhaupt funktioniert? Ist es gerichtet?

Edit: Ich benutze jetzt einen S9014 Transistor. Der ADC und die serielle Verbindung funktionieren (ich habe sie mit einem Potentiometer getestet).

Die serielle Ausgabe liegt jetzt bei 57.

Außerdem habe ich kein Multimeter oder Oszilloskop. Ich habe jetzt ein Multimeter.


Haben Sie mit einem Oszilloskop überprüft, dass Sie eine Audio-Wellenform am Ausgang Ihrer Schaltung sehen können?
HikeOnPast

Whoa, warum ist der 3V3 und 5V Pin im Schaltplan kurzgeschlossen? Das könnte ein Problem sein.
Connor Wolf

Nein, ich habe den Schaltplan einfach nicht richtig gezeichnet.
Toast

Antworten:


14

Am einfachsten ist es, das Signal und den Abtastwert mit dem ADC anzulegen. Speichern Sie die Ergebnisse in einem Puffer und zeigen Sie sie wie gewünscht an (in Ihrem Fall senden Sie sie über RS232 an den PC).
Wenn Sie den RMS-Pegel des Signals möchten, müssen Sie diesen entweder vor dem Senden an den PC oder nach dem Senden berechnen.

Die gezeigte Verstärkerschaltung ist nicht ideal, sollte aber für ein einfaches VU-Messgerät angemessen funktionieren. BEARBEITEN - Ich habe gerade C2 bemerkt. Entfernen Sie dies, da es die DC-Vorspannung des Transistors blockiert und das Signal unter der Erde schwingt.

EDIT - hier ist eine bessere Schaltung für den Verstärkungstransistor:

Elektret Ampere

Hierbei sollte der verwendete Transistor keine Rolle spielen, die Ausgangsspannung sollte bei etwa 2,5 V liegen.
Die genauen Werte für den Eingangsteiler (R3 und R4) sind nicht allzu wichtig, eher das Verhältnis 1: 4. Sie können also z. B. 400k und 100k oder 40k und 10k usw. verwenden (versuchen Sie, diese jeweiligen Werte nicht zu überschreiten oder zu unterschreiten). C2 sollte> 10uF sein. C1 sollte> 1uF sein (ersetzt C1 in Ihrem Schaltplan).
R1 und R2 müssen jedoch diese Werte haben.
Alles was Sie brauchen ist das Elektret mit seinem Vorwiderstand (R1 in Ihrem Schaltplan)

Ein Grund zur Sorge ist, dass die Arduino 3.3V- und 5V-Leitungen anscheinend miteinander verbunden sind - ich gehe davon aus, dass dies ein schematischer Fehler ist, aber wenn dies in der tatsächlichen Schaltung der Fall ist, funktioniert es nicht und kann etwas beschädigen.
Um das / die Problem (e) genau zu bestimmen, ist es hilfreich, Ihren Code und das, was Sie auf der PC-Seite sehen, zu sehen. Welchen Transistor verwendest du auch?

Wenn Sie über ein Oszilloskop verfügen, können Sie überprüfen, ob Ihr Mikrofon / Transistor ordnungsgemäß funktioniert. Wenn nicht, kann ein Multimeter verwendet werden, um weitere grundlegende Tests durchzuführen (z. B. Bestätigen, dass +5 V vorhanden sind, dass die Basis des Transistors bei ~ 0,6 V liegt, Testen Sie den Kollektor, um sicherzustellen, dass er nicht an +5 V oder Masse angeschlossen ist, ohne dass ein Signal vorhanden ist).

Außerdem müssen Sie sicherstellen, dass RS232 ordnungsgemäß funktioniert. Schreiben Sie daher einen einfachen Code, um einige Testwerte zu senden.

Wenn Sie die angeforderten Informationen bereitstellen und uns mitteilen können, welche Tools Ihnen zur Verfügung stehen, können Sie spezifischere Hilfe leisten.

BEARBEITEN - Wenn Sie so langsam abtasten, benötigen Sie eine Spitzenwerterkennungsschaltung wie diese:

Peak Detect

Sie würden diese Schaltung zwischen dem Transistor und dem Arduino-Pin (minus C2) setzen

Die Diode kann nahezu jede Diode sein. Die Werte für Kappe und Widerstand sind nur Richtwerte und können ein wenig geändert werden. Ihre Werte bestimmen, wie lange es dauert, bis sich die Spannung mit dem Signalpegel ändert. Sie können dies mit der RC-Konstante berechnen (dh R * C - im obigen Beispiel ist die RC-Konstante 1e-6 * 10e3 = 10ms. Es dauert ungefähr 2,3 Zeitkonstanten, bis die Spannung um 90% ihres ursprünglichen Werts abfällt Wenn im obigen Beispiel die Spannung bei 1 V beginnt und Sie das Signal entfernen, ist sie nach ca. 23 ms auf 0,1 V gefallen.

EDIT - okay, denke ich habe ein großes Problem gefunden. Ihr S9012- Transistor ist ein PNP-Transistor (wie auch der S9015), für diese Schaltung benötigen Sie einen NPN-Transistor. Der S9014 ist ein NPN-Transistor, daher müssen Sie diesen verwenden.

Die mit "104" gekennzeichneten Kondensatoren sind mit ziemlicher Sicherheit 0,1 uF Keramikkondensatoren. Der Wert (in pF) besteht aus den ersten beiden Zahlen, gefolgt von einer Anzahl von Nullen, die von der letzten Zahl gesetzt werden. Für 104 beträgt der Wert also 10 + 4 Nullen oder 100.000 pF. 100.000 pF sind 100 nF oder 0,1 uF.

BEARBEITEN -
Das Fehlen eines Oszilloskops oder Multimeters erschwert das Leben hier sehr (Sie sollten sich schnellstmöglich eines oder beide besorgen) . Es gibt jedoch einige grundlegende PC-Soundkarten-Oszilloskope, mit denen Sie Ihre Elektret- / Transistorschaltung testen können. Visual Analyzer ist ein gutes Beispiel:

Visual Analyzer

Wenn Sie C2 ersetzen (nicht unbedingt erforderlich, aber eine gute Idee), sollten Sie in der Lage sein, das Signal direkt in den PC einzuspeisen und in der Software zu beobachten, ob das Mikrofon und die Verstärkung ordnungsgemäß funktionieren. Wenn Ihr PC diese Leitung verwendet, der Mikrofoneingang jedoch normalerweise für bis zu 2 V IIRC geeignet ist. Sie können den Elektret auch direkt testen. Entfernen Sie einfach das Transistorbit und behalten Sie R1 und C1 bei. Nehmen Sie das Signal von der anderen Seite von C1 entgegen.
Beachten Sie, dass diese Methode nicht die DC-Pegel testet, sondern nur den AC (aufgrund einer DC-Sperrkappe im Eingang der Soundkarte), sondern das AC (Audio) -Signal, an dem Sie hier interessiert sind.

Wenn Sie dies versuchen, veröffentlichen Sie die Screenshots, damit wir eine Vorstellung davon bekommen, was passiert.


3,3 V und 5 V sind nicht miteinander verbunden. Es ist das erste Mal, dass ich diese Software benutze - sorry. Ich werde meinen Code in die Frage stellen, aber es gibt nichts, was daran schief gehen könnte. Außerdem habe ich heute ein Projekt gemacht, das einen Fotowiderstand verwendet und den Wert auf sechs LEDs anzeigt, so wie ich möchte, dass mein VU-Meter so aussieht, und ich habe die serielle Verbindung damit getestet. Ich habe weder ein Oszilloskop noch ein Multimeter. Der Transistor hat die Bezeichnung "S9012 H 331". Ich habe auch die Bezeichnungen "S9014 C 331" und "S9015".
Toast

@ Toast - siehe bearbeiten über C2, entfernen Sie diese und verbinden Sie sich direkt.
Oli Glaser

Ich entfernte C2 und fügte die Teile hinzu, wie es Kristoffon in seiner Antwort beschrieb. Immer noch die gleichen Ergebnisse.
Toast

1
Wenn Sie ein Potentiometer oder eine variable Spannungsquelle haben, können Sie einen 0-5-V-Eingang an den Eingang des ADC anlegen, um Ihren Code unabhängig von Ihrem Eingangsstromkreis zu testen. Sie versuchen, zwei Dinge gleichzeitig zu debuggen - die Schaltung zu isolieren und ihr Verhalten mit einem Oszilloskop zu überprüfen und / oder Ihren Code zu isolieren und eine vorhersehbare, aber variable Eingabe bereitzustellen, um Ihren Code zu validieren.
HikeOnPast

1
@OliGlaser Ich bin durch die Schaltung verwirrt. Das "Elektret" ist ein Mikrofon? Wohin geht der andere Draht des Mikrofons, GND oder VCC? Schließe ich 5 oder 3,3 V an diesen Stromkreis an? Könntest du bitte irgendwie die EDITBlöcke entfernen und sie so bearbeiten, dass sie verstanden werden können, ohne den Kommentarthread zu lesen? Ich bin auch ein Anfänger und verstehe nicht, wie das Problem gelöst wurde und ob ich die Schaltung verwenden kann, die Sie so gepostet haben.
Tomáš Zato - Wiedereinsetzung von Monica am

4

Vorausgesetzt, Ihre Schaltung funktioniert, liegt das Audiosignal im kHz-Bereich, während der Arduino einen ADC hat, der für Gleichstrompegel geeignet ist. Die Gleichstromkomponente in Ihrem Signal ist Null, dh sie schwebt über einer festen Spannung. Es ist diese feste Spannung, die Ihr ADC liest.

Um dies zu beheben, schalten Sie eine Diode in Reihe, wobei Ihr Ausgang mit dem ADC und einem Kondensator und einem Widerstand verbunden ist.

Die Kappe wird auf den Spitzenwert aufgeladen, der empfangen wird, während der Widerstand die Kappe entlädt, wenn das Signal nachlässt.

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

Edit: Der ADC-Eingang ist tatsächlich potentialfrei, da er aufgrund des Reihenkondensators keinerlei Vorspannung aufweist. Wenn Sie meine Lösung ausprobieren möchten, löschen Sie C2.


Okay, ich habe dies der Schaltung hinzugefügt und das Signal auf dem seriellen Monitor ist jetzt 458 (ändert sich aber immer noch nicht, wenn es Rauschen gibt).
Toast

I ausgetauscht den Transistor von "S9012 H 331" bis "S9014 C 331" , und der Wert ist 56.
Toast

1
Der Arduino ADC ist in der Lage, schnell genug für Audio abzutasten. Ich benutze sie nicht, aber ich denke, dass 10ksps (also bis zu 5kHz Bandbreite) mit den Bibliotheksfunktionen möglich sind, was für Lo-Fi-Sachen in Ordnung ist (ich bin mir ziemlich sicher, dass der eigentliche ATMega bei normaler Verwendung schneller sampeln kann)
Oli Glaser

@ Toast - wie schnell probierst du? Wenn es sehr langsam ist, ist der Spitzendetektor eine gute Idee. Sie können dies jedoch in der Software tun.
Oli Glaser

2
@Kristoffon - Nicht mit einem Arduino, nein, aber ich habe ähnliche 8-Bit-Mikros (z. B. PIC16F, 18F usw.) oft zum Abtasten und Wiedergeben von Audio verwendet. 10ksps ist leicht machbar. Um dieses AVR ADC-Dokument zu zitieren :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

Ihre Messwerte von 1022, 1023 sind auf dem ADC des Arduino im Grunde genommen vollständig. Angenommen, Sie haben einen nicht fehlerhaften Serienkondensator wie in Ihrem Diagramm gezeigt installiert, kann dieser Pegel nicht von der von Ihnen gebauten Mikrofonschaltung kommen, da dies nur wechselnde Spannungen (dh Wechselstrom) koppeln kann.

Infolgedessen vermute ich, dass Sie Leckströme in der ATMEGA selbst ablesen - Sie würden wahrscheinlich das gleiche Ergebnis an einem der anderen (nicht angeschlossenen) analogen Pins erhalten.

Versuchen Sie, einen sehr "leichten" Spannungsteiler mit einigen hochohmigen Widerständen (zwischen 10 K und 100 K) herzustellen, und verwenden Sie diesen, um den Analogeingang auf die Hälfte der Referenzspannung vorzuspannen (Sie können auch ein Potentiometer verwenden, das Ihnen zusätzliche Testmöglichkeiten bietet). Dann sollte Ihr Messwert ohne Eingabe in der Nähe von 512 liegen.

Sobald Sie den ADC-Eingang entsprechend voreingenommen haben, können Sie versuchen, festzustellen, ob Sie durch ihn Variationen bekommen. Möglicherweise ist Ihre Bandbreite etwas zu niedrig bemessen, was bedeutet, dass Sie Aliasing von Hochfrequenzkomponenten erhalten. Wenn Sie jedoch nur versuchen, die Gesamtlautstärke zu schätzen, sollte dies kein allzu großes Problem sein.


Das klingt richtig, ich denke, es ist überladen. OP haben Sie daran gedacht, einen kleinen Lautsprecher anzuschließen, um diese analoge Leitung zu debuggen. Als ich ein VU-Meter gemacht habe, habe ich die Leitungen von einer Kopfhörerbuchse direkt in den AnalogRead gesteckt und das Ergebnis abgebildet.
Hellonearthis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.