Geben Sie den Ton über die Mikrofonbuchse in Arduino ein

Ich entwerfe ein Gadget, das LEDs mit einem Mikrocontroller zum Leuchten bringt. Ich möchte, dass es auf ein Audiosignal reagiert, also dachte ich, dass es viele Möglichkeiten gibt, wie ich es tun könnte: Wenn ich die Spannung von einem Mikrofon oder einem analogen Signal (Mikrofonausgang) schnell genug genau abtasten kann, kann ich das Führen Sie einen FFT-Algorithmus auf dem Mikrocontroller aus und finden Sie die Verstärkung bei jeder beliebigen hörbaren Frequenz heraus, und blinken Sie die Lichter im Einklang oder andere ausgefallene lustige Sachen.

Wenn es nicht mit 44 kHz abtasten kann, kann ich immer noch einige aussagekräftige Daten erhalten, die Aliasing unterliegen. Ich muss in diesem Fall ein paar Lehrbücher durchblättern ...

Wenn mein Mikrocontroller zu langsam ist, um eine Fourier-Transformation durchzuführen, dachte ich, ich könnte immer noch einen AC-Bandpassfilter erstellen (kann es mit zwei Kondensatoren und zwei Widerständen tun) und ihn verstärken, damit ich meinem Mikrocontroller immer noch ein paar analoge Eingänge geben könnte bestimmte Frequenzintensitäten darstellen.

Ich bin mir also ziemlich sicher, wie dieser Plan im Großen und Ganzen funktioniert, aber ich bin mir nicht sicher, wo ich anfangen soll, um herauszufinden, wie ich meine Komponenten miteinander verkabeln soll. Ich habe ein paar verschiedene Operationsverstärker, ein paar BJTs, einige verschiedene Widerstände. Meine sortierten Kondensatoren sind noch in der Post. Ich habe ein paar Arduinos, die hoffentlich für das Prototyping ausreichen werden. Ich habe auch die erforderlichen Materialien zum Drucken meiner eigenen Leiterplatten (verkupfertes Laminat, Ätzsäure, Laserdrucker, Bügeleisen) und Material zum Löten. Allerdings habe ich kein Oszilloskop oder Funktionsgenerator, nur ein DMM und ein strom- und spannungsgesteuertes DC-Netzteil.

Ein Audiosignal wird also über zwei Drähte übertragen. Der Potentialunterschied zwischen den Drähten (und vielleicht bis zu einem gewissen Grad der Strom??) stellt eine Funktion der Luftdruckverdrängung aufgrund von Schall an dem vom Mikrofon eingenommenen Raumpunkt dar. Dies liegt an den gemeinsamen Designaspekten fast aller Lautsprecher und Mikrofone. Dies würde bedeuten, dass diese Spannung sowohl positiv als auch negativ wird (keine DC-Vorspannung, wie ich es verstehe) und daher einen Offset erfordern würde, damit der analoge Eingangswert nicht die Hälfte der Wellenform abschneidet. Wie viele Volt würde die Amplitude des Signals betragen, beispielsweise vom Kopfhörerausgang einer Soundkarte? Was ist mit einem iPod? Könnte ich eine mp3 einer Sinuswelle auf meinem Computer abspielen, und die Wechselspannung an der Audiobuchse mit meinem DMM prüfen? Woher weiß ich, in welchem ​​Frequenzbereich das DMM genaue AC-Spannungsmessungen durchführt?

Antworten (2)

Wenn der Arduino so etwas wie ein PIC µC ist, haben Sie keine Hoffnung, mit 44 kHz abzutasten. Die meisten einfachen µC haben eine ziemlich langsame Abtastrate (wie Hunderte von Abtastungen pro Sekunde).

Wenn Sie schneller wollen, sollten Sie so etwas wie einen dsPIC verwenden, der einen tatsächlichen Audio-ADC enthält, oder einen externen Audio-ADC verwenden, der I²S-Daten an einen µC senden kann, der schnell genug ist, um darauf zu reagieren.

Ich habe kürzlich ähnliche Arbeiten durchgeführt, als ich einen digital gesteuerten Verstärker entwarf.

Ich hatte den Ausgang der ersten Stufe des Verstärkers, der in einen analogen Eingang auf dem steuernden PIC ging, um dann ein Balkendiagramm von LEDs für ein einfaches VU-Meter zu steuern.

Für eine Ausgabe von einer PC-Soundkarte sehen Sie wahrscheinlich einen Spannungshub von etwa 1 bis 2 Volt. Bei meinem System habe ich mich nicht allzu sehr um Frequenz und dergleichen gekümmert - nur um die reine Spitzenamplitude -, also habe ich das Signal zuerst durch eine kleine Shottky-Diode geleitet, um die negativen Spannungen abzuschneiden. Dies vereinfachte mein Design eine ganze Menge.

Ich entwerfe im Moment auch einen kleinen Frequenzanalysator und suche nach auswählbaren op-amp-basierten Bandpassfiltern, die auf diesem Design basieren: http://www.wa4dsy.net/robot/bandpass-filter-calc was so far hat recht gute Ergebnisse geliefert. Ich variiere einige der Widerstandswerte durch eine Kombination aus digitalen Töpfen und analogen Multiplexern.

Ich würde auf jeden Fall empfehlen, zumindest Ihre analogen Eingänge mit Operationsverstärkern zu schützen, um die maximale Spannung zu begrenzen, die sie erhalten - nur für den Fall. Du willst doch nicht, dass eine Spannungsspitze deinen Arduino in die Luft jagt, oder? Einfacher, einen durchgebrannten Operationsverstärker zu ersetzen.

Und wie für ein Signal zum Testen? Es gibt viele kostenlose Signalgeneratoren für den PC zum Download, wenn Sie ein wenig danach googlen. Mit ihnen können Sie Wellenform, Frequenz, Amplitude, Phase usw. auswählen. Wenn Sie Glück haben, können Sie sogar Wellenformen summieren, um neue Wellenformen zu erhalten.

Mit der richtigen Software und einer kleinen selbstgebauten Sonde können Sie sogar Ihre PC-Soundkarte als rudimentäres Oszilloskop verwenden. Auch dafür gibt es Software und Designs im Netz.

Oh, und denken Sie daran, verschiedene Stufen / Spannungspegel mit Kondensatoren im Audiosignal zu isolieren. Als Faustregel gilt: Wenn ich die Spannungspegel des Netzteils ändere, füge ich immer einen Kondensator ein, um die Stufen zu isolieren. Ich hatte also einen am Eingangssignal, einen an Stufe 1 -> Stufe 2 (+/-5V bis +/-12V Stromversorgung), einen an Stufe 1 -> Analogeingang und wieder einen am Ausgang. Es zahlt sich aus, kein Risiko einzugehen, wenn streunende DC-Offsets in den falschen Teil der Schaltung wandern.

Laut Atmels Website wird der ATmega168 mit seinem ADC eine Abtastrate von etwa 15 kHz erreichen.
Nett - aber immer noch nicht annähernd 44KHz ;)

Wenn Sie keinen Spektrumanalysator für das gesamte Audiospektrum bauen möchten, würde ich mit einem Tiefpassfilter beginnen. Wenn Ihre Lichteffekte beispielsweise Bassschläge visualisieren sollen, reicht eine Bandbreite von einigen hundert Hz aus. Und die FFT wird auch schneller rechnen. Beruht auf deiner μ Aufgrund der Verarbeitungsleistung und Taktfrequenz von C kann es schnell genug sein, um die FFTs durchzuführen. Ein DSP (mit einem Bitumkehrbefehl ) kann eine Lösung sein.
Selbst wenn Sie die FFT über das gesamte Spektrum durchführen, müssen Sie dies nicht mit 44,1 kHz tun (eine FFT pro Abtastung), da Ihr Auge viel zu langsam ist, um ihr zu folgen. Sie könnten beispielsweise mit 44,1 kHz abtasten, aber alle 50 ms eine FFT berechnen.