Verwenden eines Mikrofons mit einem Arduino

EDIT : Ich habe dieses Problem schon seit geraumer Zeit untersucht. Es stellt sich als ein viel schwierigeres Projekt heraus, als ich dachte, und nichts für Anfänger. Dies erfordert teure Hardware (Mikrofon und Verstärker) und einige ausgefeilte Audioanalysen auf dem Mikrocontroller. Auch ein komplettes Mikrofon mit Verstärkerschaltung liefert nicht die gewünschten Ergebnisse (laut Kommentar zu diesem Produkt)


Ich bin völlig neu im Arduino (aber ich bin mit der Programmierung 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 verwende jetzt die von Oli Glaser in seiner Antwort vorgeschlagene Schaltung)

Die Werte auf dem seriellen Monitor ändern sich nicht in Abhängigkeit von der Musiklautstärke.

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 .

Bearbeiten: 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 überprüfen, ob das Mikrofon überhaupt funktioniert? Ist es richtungsweisend?

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

Die serielle Ausgabe liegt jetzt bei etwa 57.

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

Haben Sie mit einem Oszilloskop überprüft, dass Sie eine Audiowellenform am Ausgang Ihrer Schaltung sehen können?
Whoa, warum sind die 3V3- und 5V-Pins im Schaltplan kurzgeschlossen? Das könnte ein Problem sein.
Nein, ich habe nur den Schaltplan nicht richtig gezeichnet.

Antworten (3)

Der "einfachste" Weg ist einfach das Signal anzulegen und mit dem ADC abzutasten. Speichern Sie die Ergebnisse in einem Puffer und zeigen Sie sie dann wie gewünscht an (in Ihrem Fall über RS232 an den PC senden).
Wenn Sie den RMS-Pegel des Signals wünschen, müssen Sie diesen irgendwann berechnen, entweder vor dem Senden an den PC oder danach.

Ihre Verstärkerschaltung wie gezeigt ist nicht ideal, sollte aber für ein einfaches VU-Meter vernünftig funktionieren. BEARBEITEN - Ich habe gerade C2 bemerkt. Entfernen Sie dies, da es die Gleichstromvorspannung des Transistors blockiert und das Signal unter der Erde schwingt.

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

Elektret-Verstärker

Dies sollte sich nicht zu sehr um den verwendeten Transistor kümmern, die Ausgangsvorspannung sollte etwa 2,5 V betragen.
Die genauen Werte für den Eingangsteiler (R3 und R4) sind nicht so wichtig, eher das Verhältnis von 1:4. Sie können also zB 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 sein.
Alles, was Sie brauchen, ist das Elektret mit seinem Vorspannungswiderstand (R1 in Ihrem Schaltplan)

Ein Punkt, der Anlass zur Sorge gibt, ist, dass die 3,3-V- und 5-V-Leitungen von Arduino miteinander verbunden zu sein scheinen - 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) zu lokalisieren, wäre es hilfreich, Ihren Code und das, was Sie auf der PC-Seite sehen, zu sehen. Und welchen Transistor verwendest du?

Wenn Sie ein Oszilloskop haben, können Sie überprüfen, ob Ihr Mikrofon/Transistor richtig funktioniert. Wenn nicht, kann ein Multimeter verwendet werden, um einige grundlegendere Tests durchzuführen (z. B. bestätigen, dass +5 V vorhanden sind, bestätigen, dass die Basis des Transistors bei ~ 0,6 V liegt, den Kollektor testen, 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 die RS232 ordnungsgemäß funktioniert, daher wäre es eine gute Idee, einen einfachen Code zu schreiben, um einige Testwerte zu senden.

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

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

Peak-Erkennung

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

Die Diode kann so ziemlich jede Diode sein. Die Kappen- und Widerstandswerte sind nur eine Richtlinie, sie 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 beträgt die RC-Konstante 1e-6 * 10e3 = 10 ms. Die Spannung benötigt etwa 2,3 Zeitkonstanten, um auf 90 % ihres ursprünglichen Werts abzufallen Wenn im obigen Beispiel die Spannung bei 1 V beginnt und Sie das Signal entfernen, ist es etwa 23 ms später auf 0,1 V gefallen.

EDIT - okay, ich glaube, ich habe ein großes Problem gefunden. Ihr S9012- Transistor ist ein PNP-Transistor (wie auch der S9015), Sie benötigen für diese Schaltung einen NPN-Transistor. Der S9014 ist ein NPN-Transistor, also 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 2 Zahlen, gefolgt von einer Anzahl von Nullen, die durch die letzte Zahl festgelegt werden. Für 104 ist der Wert also 10 + 4 Nullen oder 100.000 pF. 100.000 pF sind 100 nF oder 0,1 uF.

BEARBEITEN - Kein Oszilloskop oder Multimeter zu haben, macht das Leben hier sehr schwierig (Sie sollten sich so schnell wie mö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 recht gutes Beispiel:

Visueller Analysator

Wenn Sie C2 ersetzen (nicht unbedingt erforderlich, aber eine gute Idee), sollten Sie das Signal direkt in den PC einspeisen und in der Software beobachten können, ob das Mikrofon und die Verstärkung korrekt funktionieren. Wenn Ihr PC Line-In hat, verwenden Sie das, aber der Mikrofoneingang ist normalerweise gut für bis zu 2 V IIRC. Sie können das 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.
Beachten Sie, dass diese Methode nicht die DC-Pegel testet, sondern nur den AC (aufgrund einer DC-Sperrkappe im Soundkarteneingang), aber das AC-Signal (Audio) ist das, was Sie hier interessiert.

Wenn Sie dies versuchen, posten Sie die Screenshots, damit wir uns ein Bild davon machen können, was passiert.

3,3 V und 5 V sind nicht miteinander verbunden. Es ist das erste Mal, dass ich diese Software verwende - sorry. Ich werde meinen Code in die Frage einfügen, aber es gibt nichts, was damit schief gehen könnte. Außerdem habe ich heute ein Projekt gemacht, das einen Fotowiderstand verwendet und den Wert auf sechs LEDs anzeigt, wie ich möchte, dass mein VU-Meter aussieht, und ich habe die serielle Verbindung damit getestet. Ich habe weder ein Oszilloskop noch ein Multimeter. Der Transistor hat die Beschriftung "S9012 H 331" Ich habe auch "S9014 C 331" und S9015.
@Toast - siehe Bearbeiten von C2, entfernen Sie dies und verbinden Sie sich direkt.
Ich habe C2 entfernt und die Teile hinzugefügt, wie Kristoffon es in seiner Antwort beschrieben hat. Immer noch die gleichen Ergebnisse.
@Toast - es ist sehr schwierig, dies ohne Oszilloskop oder Multimeter zu debuggen. Ihre Werte von 1024 zeigen, dass die Spannung an der Versorgungsspannung geklemmt ist. Dies kann daran liegen, dass der Transistor falsch vorgespannt ist - überprüfen Sie die Widerstandswerte (Farbbänder) sorgfältig. Sie möchten, dass der Ausgang bei 1/2 der Versorgungsspannung liegt, ohne dass ein Signal vorhanden ist. Beim Peak-Detektor sollte die Spannung zwischen der halben und der Versorgungsspannung und der vollen Spannung schwanken, wenn das Signal aufgedreht wird.
Nachdem der Transistor durch einen anderen ersetzt wurde, beträgt der Wert 54. Ich habe den Kreis wie im Bild beschrieben hinzugefügt. Sie können die Widerstände sehen, die ich auf dem Foto verwendet habe, das ich hochgeladen habe. Ich bin mir ziemlich sicher, dass sie richtig sind. Außerdem habe ich noch nicht herausgefunden, wie man die Kapazität eines Kondensators bestimmt. Die beiden, die ich gerade verwende, haben die Beschriftung 104.
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 Ihrer Eingangsschaltung 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 vorhersagbare, aber variable Eingabe bereitzustellen, um Ihren Code zu validieren.
@DeanB - gute Idee, hier ein paar Schritte zurückzusetzen und jeden Teil einzeln zu bestätigen, würde wahrscheinlich sehr helfen. Der Topf ist ein einfacher/einfacher Test, der bestätigen kann, dass der ADC korrekt funktioniert.
@Toast - der von Ihnen verwendete Transistor ist falsch, siehe Bearbeiten, um zu antworten.
Ich habe den Transistor gewechselt und sichergestellt, dass die serielle Verbindung und der Code funktionieren. Aber ich weiß nicht, ob das Mikrofon funktioniert.
Ich habe auch ein anderes Mikrofon ausprobiert, mit dem gleichen Ergebnis. Aber beide mit beiden Mikrofonen bekomme ich kein Signal, wenn ich sie mit einem Computer teste, obwohl ich nicht weiß, ob ich das richtig gemacht habe.
@Toast - versuchen Sie, R3 auf 1k zu ändern.
Ich habe mir ein Multimeter gekauft. Wo soll ich messen?
Messen Sie zunächst die Gleichspannung am Kollektor des Transistors (ohne signifikanten Eingang am Mikrofon). Sie soll etwa die Hälfte der Versorgungsspannung betragen, also +2,5 V für eine 5-V-Versorgung.
@Toast - siehe bearbeitete Antwort für alternative Schaltung. Versuchen Sie dies, wenn Sie immer noch Probleme haben.
Muss ich die Spannung zwischen Masse und Kollektor messen? (das ist 0)
Ja, zwischen Erde und Kollektor. Wenn es 0 V ist, ist Ihr Transistor voll eingeschaltet, oder Sie haben ein anderes Problem. Welche Schaltung verwendest du? Trennen Sie den ADC-Eingang während des Tests, nur für den Fall, dass Sie den Pin versehentlich auf Low-Ausgang gesetzt haben.
Ich habe es mit der Schaltung in der Frage mit den von Ihnen und Kristoffon vorgeschlagenen Änderungen getestet. Ich werde jetzt die Schaltung in Ihrer Antwort zusammenbauen und dann die Ergebnisse melden.
Der andere Pin des Mikrofons geht auf Masse, richtig?
Ich habe keine Kondensatoren höher als 104 (0,1 uF). Ich habe sie in Ihrer Schaltung verwendet und es funktioniert nicht. Die Kollektorspannung (und der Analog0-Pin) beträgt 5 V und das Arduino liest 1023.
0,1-uF-Kappen sollten kein Bias-Problem verursachen, sie rollen nur die niedrigere Frequenzverstärkung ab. Die Schaltung sollte wie gezeigt funktionieren (wie auch die andere), also muss es ein Fehler sein, den Sie irgendwo gemacht haben. Könnten Sie Ihre Frage aktualisieren, um genau zu zeigen, welche Schaltung und Komponenten (Transistor-Teilenummer, Kondensator- / Widerstandswerte usw.) Sie derzeit verwenden? Messen Sie auch alle Spannungen relativ zur Erde und markieren Sie sie auf dem Schaltplan (z. B. Basis zu Erde, Kollektor zu Erde, Emitter zu Erde usw.). Wenn wir dies methodisch durcharbeiten, werden wir das Problem eher finden.
Das ist mein Ergebnis: Link Die Widerstandswerte sind die gleichen wie in der Schaltung, die Kondensatorwerte sind beide 0,1 uF ("104"), der Transistor ist ein "S9014" (NPN) Transistor. Die Teile sind von hier . Ich habe zwei Mikrofone zur Verfügung, eines aus der Demontage eines Spielzeugs, eines aus einem Headset (ich bin mir ziemlich sicher, dass dieses funktioniert, aber ich würde mich freuen, einen Weg zu finden, sie zu testen)
Okay, es gibt ein Problem an der Basis des NPN. R3 und R4 sollten mit der Basis verbunden werden. Die Spannung sollte an der Basis etwa 0,7 V betragen. Die Tatsache, dass es 0 V ist, sagt uns, dass es eine schlechte (oder falsche) Verbindung gibt oder dass möglicherweise der Transistor defekt ist. Ohne angeschlossenen Transistor sollte die Spannung zwischen R3 und R4 etwa 1 V betragen. Prüfen Sie sorgfältig und lassen Sie mich wissen, wie es geht.
Okay, ich habe einen Fehler gefunden. R3 war "fehlend" (Schande über mich). Hier sind die neuen Werte .
Okay kein Problem. Das sieht etwas besser aus, aber irgendetwas stimmt immer noch nicht. Die Spannung an der Basis sollte etwa 950 mV betragen und die Spannung an der Spitze von R2 sollte etwa 250 mV betragen. Mein Verdacht ist, dass einer oder mehrere der Widerstandswerte falsch sind - können Sie sie alle mit dem Multimeter überprüfen? (Fügen Sie die Werte dem Schaltplan hinzu, wenn Sie können)
Ich habe die Widerstandswerte mit dem Multimeter überprüft und sie sind die gleichen wie auf dem Schaltplan. Für R3 verwende ich eine Reihe von 4 10k-Widerständen.
Hmmm, ich bin ein bisschen verwirrt, denn wenn Ihr Transistor nicht sehr wenig Verstärkung hat, sollte er funktionieren. Sie könnten vielleicht versuchen, es durch ein anderes des gleichen Typs (NPN) zu ersetzen und zu sehen, ob es besser ist. Sie möchten eine Kollektorspannung von etwa 2,5 V (Sie verwenden 5 V - wenn nicht, sollten Sie für diese Werte sein). Eine Sache, die Sie versuchen können, ist, anstelle von R3 ein 50k- oder 100k-Potentiometer zu verwenden und es zu variieren, während Sie die Kollektorspannung beobachten - wenn Sie können es auf 2,5 V einstellen und den Widerstand darüber messen. Wenn Sie beispielsweise nur einen 10k-Pot haben, verwenden Sie ihn anstelle eines der 4 10k-Widerstände.
R3 ist jetzt ein 50-kΩ-Potmeter. Bei Einstellung auf 4200 Ω beträgt die Kollektorspannung 2,5 V (512 am A0-Pin). Reagiert immer noch nicht auf Musik. Wie kann ich überprüfen, ob das Mikrofon funktioniert?
Klingt so, als hätten Sie dann einen 1k-Widerstand für R4. Dies wird wahrscheinlich noch einigermaßen funktionieren, aber eine etwas zu niedrige Impedanz für das Elektretsignal darstellen. Verwenden Sie besser 10k (oder höher) für R4. Stellen Sie sicher, dass Sie immer noch den 2k-Widerstand auf der Elektretseite haben (in meinem Schema nicht gezeigt), um zu überprüfen, ob das Mikrofon so schnell wie möglich abtastet (z. B. mindestens alle 1 ms abtastet, vorzugsweise schneller) und laut in das Elektret spricht. Sie sollten eine gewisse Variation sehen. Sie können das Kollektorsignal auch mit Ihrem Multimeter an der AC-Sonde (niedriger Bereich) vom Kollektor zur Masse überwachen.
R4 ist eigentlich ein 10k-Widerstand. Wo kommt der 2k-Widerstand hin? Ich nahm an, dass der andere Mikrofonstift nur auf Masse geht?
Etwas sehr Seltsames - sind Sie sicher, dass Sie den Transistor richtig herum haben? Entschuldigung, ich meinte den 10k-Widerstand (R1 in Ihrem Schaltplan) für das Elektret. Der andere Elektretstift geht auf Masse - er muss jedoch richtig herum sein, um richtig zu funktionieren, also stellen Sie sicher, dass es so ist. Es könnte für Sie hilfreich sein, Ihre Frage zu aktualisieren und ein weiteres Bild Ihres aktuellen Setups zu posten.
@OliGlaser Ich bin verwirrt von der Schaltung. Das "Elektret" ist ein Mikrofon? Wohin geht das andere Kabel des Mikrofons, GND oder VCC? Schließe ich 5 oder 3,3 V an diesen Stromkreis an? Könnten Sie die Blöcke bitte irgendwie entfernen EDITund 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 von Ihnen gepostete Schaltung so verwenden kann, wie sie ist.

Angenommen, Ihre Schaltung funktioniert, liegt das Audiosignal im kHz-Bereich, während der Arduino über einen ADC verfügt, der für DC-Pegel geeignet ist. Die DC-Komponente Ihres Signals ist Null, was bedeutet, dass sie über einer festen Spannung schwebt. Es ist diese feste Spannung, die Ihr ADC liest.

Um dies zu beheben, würden Sie eine Diode in Reihe mit Ihrem Ausgang schalten, der mit dem ADC und einem Kondensator und Widerstand verbunden ist.

Die Kappe lädt sich auf den empfangenen Spitzenwert auf, während der Widerstand die Kappe entlädt, wenn das Signal abklingt.

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

Bearbeiten: Der ADC-Eingang schwebt tatsächlich, da er aufgrund des Serienkondensators keinerlei Vorspannung hat. 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).
Ich habe den Transistor von "S9012 H 331" auf "S9014 C 331" getauscht und der Wert ist 56.
Der Arduino ADC kann schnell genug für Audio abtasten. Ich verwende sie nicht, aber ich denke, 10 ksps (also bis zu 5 kHz Bandbreite) sind mit den Bibliotheksfunktionen möglich, was für Lo-Fi-Sachen in Ordnung ist (ich bin mir ziemlich sicher, dass der eigentliche ATMega bei normaler Verwendung schneller abtasten kann).
@Toast - wie schnell proben Sie? Wenn es sehr langsam ist, dann ist der Peak-Detektor eine gute Idee. Sie können dies jedoch in der Software tun.
Ich habe eine Verzögerung von 300 ms gemacht. Aber ich habe es ohne Verzögerung oder mit kurzer Verzögerung getestet, aber das Signal ändert sich nicht wesentlich.
@OliGlaser klar, Sie haben das damals nie versucht, oder Sie würden wissen, dass diese Spezifikationen unrealistisch sind, denn obwohl Sie möglicherweise tatsächlich 10 ksps erhalten, erhalten Sie Müllmesswerte, und wenn Sie diesen billigen Adc wollen, stopfen sie ihn in den Mikrocontroller, um Ihnen mehr zu geben Daten im Wert von mehr als 4 Bit werden Sie nie mehr als 1 ksps machen.
@Kristoffon - Nicht mit einem Arduino, nein, aber ich habe viele Male ähnliche 8-Bit-Mikros (z. B. PIC16F, 18F usw.) zum Abtasten und Abspielen 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.
Wenn Sie auch das ATmega328-Datenblatt überprüfen , können Sie dieselben Spezifikationen sehen, die im ADC-Abschnitt (Seite 323) aufgeführt sind. Es erwähnt eine absolute Genauigkeit von 2LSB bei 200kHz (~15kHz Abtastrate)

Ihre Messwerte von 1022, 1023 sind im Grunde auf dem ADC des Arduino im vollen Maßstab. Angenommen, Sie haben einen nicht fehlerhaften Serienkondensator wie in Ihrem Diagramm gezeigt installiert, kann dieser Pegel nicht von der von Ihnen gebauten Mikrofonschaltung stammen, da diese nur wechselnde Spannungen (dh Wechselstrom) koppeln kann.

Infolgedessen vermute ich, dass Sie Leckströme im ATMEGA selbst lesen - Sie würden wahrscheinlich das gleiche Ergebnis an jedem 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önnten 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 vorgespannt haben, können Sie mit der Arbeit beginnen und versuchen zu sehen, ob Sie dadurch Variationen erhalten. Möglicherweise unterabtasten Sie Ihre Bandbreite etwas, was bedeutet, dass Sie Aliasing von Hochfrequenzkomponenten erhalten, aber wenn Sie nur versuchen, die Gesamtlautstärke zu schätzen, sollte dies kein allzu großes Problem darstellen.

Das klingt richtig, ich denke, es ist überlastet. OP haben Sie daran gedacht, einen kleinen Lautsprecher anzuschließen, um diese analoge Leitung zu debuggen, die Sie lesen. Als ich ein Vu-Meter erstellte, nahm ich die Leitungen von einer Kopfhörerbuchse, im Grunde direkt in das AnalogRead und ordnete das Ergebnis zu.