Audio Waveform Visualization[Solved]

Hallo,

kennt von euch jemand eine Möglichkeit wie man ein Lied das gerade über einen MP3-Player Module für den Arduino abgespielt wird vollgendermassen auf einem TFT Display dazustellen ?
Als Audio Waveform Visualization !

Mit Arduino? Allerhöchstens über Abgreifen des Audiosignales per ADC und Darstellung auf TFT oder LED-Matrix. Die direkte Verarbeitung von Daten aus dem MP3-File ist mit den Resourcen eines Arduino nicht zu machen.

qualidat:
... Abgreifen des Audiosignales per ADC ...

Wie müsste eine Schaltung aussehen, die das Signal von den Boxen für den Arduino aufbereitet? Wenn ich mich nicht irre, liegen an Lautsprechern höchstens 2 Volt an (?). Genügt es, Masse mit Masse zu verbinden und den Pluspol des Lautsprecherkabels (über einen Widerstand?) an die Basis eines Transistors zu führen?

Testweise würde ich etwas Entsprechendes mal aufbauen. Wozu hat man Steckbretter ...

Gruß

Gregor

PS: Ich habe mal eben die LS-Kabel direkt an meinen Boxen abgegriffen und mit meinem Oszi verbunden. Bei geringer Lautstärke beträgt die Spannung von kurzen Spitzen abgesehen etwa bis 1 Volt und bei 10 kS/s (5 ms je Teilstrich) ist ein hübsches Zappeln zu sehen.

Google ist dein Freund:
das
https://www.google.com/search?q=spectrum+analyzer+arduino&client=firefox-b&source=lnms&tbm=isch&sa=X&ved=0ahUKEwih9pG_2s7bAhWxx6YKHdVcDTUQ_AUICigB&biw=1366&bih=650

führte mich zu

gregorss:
Wie müsste eine Schaltung aussehen, die das Signal von den Boxen für den Arduino aufbereitet? Wenn ich mich nicht irre, liegen an Lautsprechern höchstens 2 Volt an (?). Genügt es, Masse mit Masse zu verbinden und den Pluspol des Lautsprecherkabels (über einen Widerstand?) an die Basis eines Transistors zu führen?

Das Audiosignal ist Wechselspannung. Außerdem ist zu schauen ob der Verstärker Klasse D ist (PWM Simulation des Analogsignals) oder ein Analogverstärker.

Außerdem sehe ich Probleme im update des Displays da dieses kontinuirlich neu beschrieben wird.

Grüße Uwe

gregorss:
Wie müsste eine Schaltung aussehen, die das Signal von den Boxen für den Arduino aufbereitet? Wenn ich mich nicht irre, liegen an Lautsprechern höchstens 2 Volt an (?). Genügt es, Masse mit Masse zu verbinden und den Pluspol des Lautsprecherkabels (über einen Widerstand?) an die Basis eines Transistors zu führen?

Testweise würde ich etwas Entsprechendes mal aufbauen. Wozu hat man Steckbretter ...

Ich weiß jetzt nicht, an was für einem Verstärker du es getestet hast, aber sei froh, dass du den Verstärker nicht gekillt hast.

Die meisten Verstärker haben einen Brückenausgang und dürfen nicht mit GND in Verbindung kommen.
Also lieber einen Kondensator auf beiden Leitungen zwischen schalten.

HotSystems:
Ich weiß jetzt nicht, an was für einem Verstärker du es getestet hast, aber sei froh, dass du den Verstärker nicht gekillt hast.

Das Einzige, was ich hätte killen können, ist das Ding, das ich mir gebastelt habe, um einen Kopfhörer anschließen zu können. Der Verstärker „sieht“ an seinen LS-Ausgängen lediglich die Primärseiten zweier Übertrager. Und an den Sekundärseiten ist ein aktiver Subwoofer angeschlossen, der in „konventioneller“ Bauweise aufgebaut ist.

Also keine Panik deswegen ... :slight_smile:

Gruß

Gregor

gregorss:
....
Also keine Panik deswegen ... :slight_smile:

Ich sowieso nicht, ist ja nicht meiner. :wink:

Um kein Potenzial-Problem zu bekommen würde ich zunächst mit zwei Kondensatoren (hinter Reihen-Widerständen von ca. 100 Ohm) auf einen Brückengleichrichter gehen. Von dem kannst du dann Minus auf Masse vom Arduino legen und Plus an einen ADC-Eingang, den du mit einer parallel geschalteten Z-Diode mit 5V Grenzspannung schützt.

Da für die grafische Darstellung ohnehin keine besonders hohe Auflösung (vlt. 3..4 Bit?) notwendig ist, kannst du die erforderliche Verstärkung über die Referenzspannung des ADC simulieren ... diese wiederum könnte man per PWM mit guter Glättung über einen anderen Pin des Arduino bereitstellen - als Regelkreis sozusagen ...

Wenn nun noch Samplingrate des ADC und der Takt zum horizontalen Weiterschieben der Grafik auf den Display aus der selben Quelle kommen, dürfte sich die Schaltung bzw. die Software weiter vereinfachen ...

Nochmal hallo!

Unter http://test.szaktilla.de/imgp4549.avi ist jetzt ein schneller Test zu sehen. Das Audiosignal hängt an A0, den Trimmer rechts habe ich eingebaut, damit ich einen Offset/Grundwert einstellen kann.

Alle Beteiligten leben noch :slight_smile:

Gruß

Gregor

PS: Ach ja, der Sketch dazu:

#include <gSSD1306.h>
gSSD1306 displ;

#include <Piezo.h>
Piezo audio(4);

void setup()
{
  audio.beep(READY);
  displ.init();
  displ.clearBuffer();
}

void loop()
{
  displ.clearBuffer();
  for(byte i=0; i<128; i++)
  {
    displ.line(i, 32, i, 32-analogRead(A0)/4);
  }
  displ.update();
}

Wenn man die Linien beidseitig zeichnet, sieht es evtl. noch effektvoller aus:

int analog = analogRead(A0)/4;
displ.line(i, 32+analog, i, 32-analog);

Gruß Tommy

Tommy56:
Wenn man die Linien beidseitig zeichnet, sieht es evtl. noch effektvoller aus:

Gute Idee. Ich hab's nur leider schon wieder „aufgeräumt“. Aber in den nächsten Tagen probiere ich das nochmal. Ist ja nicht so irre aufwendig.

Gruß

Gregor

Hallo gregorss,

vielen Dank für deinen Sketch, ich finde deine Idee und Arbeit wirklich sehr gut.

Werde mein Projekt darauf aufbauen.

Megaionstorm:
Werde mein Projekt darauf aufbauen.

Falls Du die von mir benutzten Bibliotheken nutzen möchtest: Das sind beides „Eigenkreationen“. Die Piezo-Bibliothek findest Du hier. Die Bibliothek für das Display kann ich bei Interesse auch zur Verfügung stellen, gib einfach kurz Bescheid.

Gruß

Gregor

Ich werde für mein Projekt ein TFT-Display benutzen !

Welches und mir welcher Auflösung?

themanfrommoon:
Welches [Display] und mir welcher Auflösung?

Das ist eine gute Frage.

Je nachdem, wie viele Daten auf welche Art zur Aktualisierung übertragen werden müssen, kann es knapp werden. Mein Display ist ein monochromes 0,96"-OLED-Display mit 128 x 64 Pixeln. Dessen Inhalt wird im RAM gehalten und in einem Rutsch übertragen. 128 x 64 Pixel sind 1 kB, die per I²C reichlich schnell zum Display übertragen werden.

Gruß

Gregor

3.2" TFT Display

Arduino Due