Digitaler Audio Spectrum Analyzer mit WS2812 Smart-Pixel-LED und RP2040 Mikrocontroller

Dieser schicke Audio Spectrum Analyzer ist mit sehr wenig Hardware Aufwand realisiert. Er basiert auf dem RP2040 und ist auch bekannt als Raspberry-PI Pico. Mittlerweile gibt es den in diversen Varianten und Ausführungen. Den hier Verwendeten RP2040-Zero gibt es bereits unter €3.00 / Stk.

Mechanischer Aufbau

Stückliste und Aufbau der Teile gemäß dieser Zeichnung:

Die schwarze Plexiglas Grundplatte wird gemäß dieser Zeichnung gefertigt.

In der 250x100mm großen Rückplatte müssen längsseitig 3 x M3 Löcher gebohrt werden mit den selben Massen wie die 3mm Löcher der Grundplatte so dass diese wie oben gezeichnet montiert werden kann. Die M3 Gewindelöcher sollten entsprechend den verwendeten M3 Senkschrauben mindestens 15mm tief sein. Die 3mm Löcher in der Grundplatte sollten angesenkt werden so dass die Schrauben bündig sind. Auch sollte man beachten dass die M3 Löcher in der Mitte der Plexiglas Platte sind, da die Dicke etwas ungenau sein kann.

Smart LED Streifen

Die LED Streifen erhält man meist auf einer Rolle mit 0.5m oder 1m Länge, oder auch ein vielfaches davon (z.B. bei Aliexpress). Die Abstände der LEDs muss beachtet werden da es verschiedene Modelle gibt. Die hier verwendeten haben einen Abstand von LED zu LED von 6.9mm.
Nun werden Streifen mit je 12 LED zugeschnitten. Es gibt Linien zwischen den LEDs wo genau geschnitten werden soll so dass man sie noch anschließen kann.
Die einzelnen Smart LED Streifen können Linear oder jede 2. kopfüber angeschlossen werden. Letzteres vereinfacht die Verdrahtung wie hier gezeigt. Entsprechend muss es in der Konfiguration in der Software gewählt werden.
Diese können wie hier gezeigt vorgefertigt werden. Die Speisung wird dabei mit Drähten quer zwischen den LEDs verkabelt. Dies erspart für jeden Streifen Löcher mit Kabeln bohren zu müssen und Kabel einzuziehen. Verwendet man isolierte Kupferdrähte und lötet sie im richtigen Abstand an, bekommen die Streifen eine mechanische Festigkeit und können genau ausgerichtet werden. Das erleichtert später die genaue Ausrichtung beim festkleben auf der Rückplatte.

Dann werden 3 kurze Kabel angelötet und durch die Grundplatte gezogen.

Dann wird die Rückwand montiert.

Vor dem Aufkleben der LEDs auf die Rückplatte sollte nur ein kleines Stück von der selbstklebenden Schutzfolie entfernt werden. Das ermöglicht die Streifen nochmal zu entfernen und genau auszurichten.

Rückplatte fest auf die Grundplatte schrauben und jeden einzelnen LED Streifen auf die genaue Höhe der Zwischenscheibe bringen so dass sie am Ende präzise in die Plexiglas Scheibe leuchtet. Dann die Streifen an einem Punkt fixieren.

Nun kann die Rückplatte wieder gelöst werden. Dann die restlichen Schutzfolien entfernen und die Streifen definitiv ankleben. Eine Korrektur ist nachträglich kaum mehr möglich ohne die Streifen zu beschädigen.

Danach wird die Rückplatte wieder befestigt. Nun werden die Sicherungsmuttern unten an den Gewindestangen befestigt und diese  von Unten eingesetzt.

Bei jedem der kleinen 20x20x4mm Plexiglasscheiben muss die Vorderseite matt geschliffen werden. Am Besten sucht man sich die Seite, welche am meisten glänzt und richtet diese später zur LED aus. Entsprechend wird die gegenüberliegende Seite matt geschliffen.

Danach werden die Plexiglasscheiben bestückt.

Da diese, sowie auch die Zwischenscheiben nicht sehr genau sind, sollten diese alle ausgemessen und sortiert werden. Dann entsprechende Paare aussuchen und mit Verstärkungsringen aus der Papeterie ausgeglichen.

Immer wieder die Scheiben herunterdrücken und überprüfen, ob die Höhe stimmt und falls nötig korrigieren. An den Enden der ersten und letzten Gewindestange werden halbierte Nylonscheiben eingesetzt so dass die anderen Scheiben gerade bleiben und die Plexiglasscheiben halten.

Am Ende noch eine Scheibe und dann die Hutmutter. Mit dem Festziehen, kann man noch etwas die Höhe korrigieren, so dass das oberste Plexiglasscheibe auch die oberste LED deckt.

Die Plexiglasscheiben sowie die Gewindestangen können nachträglich ausgerichtet werden da die Plexiglasscheiben zwischen den Kunststoffscheiben verschoben werden können. Am Einfachsten das Ganze an eine glatte Oberfläche legen so dass die Plexiglasscheiben frontal auf der Fläche liegen (z.B. Tischkante). Danach mit einem geraden Metallprofil oder ähnliches die Hutmuttern auf eine Linie drücken und die Plexiglasscheiben gleichzeitig gegen die Rückwand bzw. die LEDs drücken. Es braucht vielleicht ein paar Nachkorrekturen, geht aber ganz gut so.

Elektronik Hardware

Die Teile werden gemäß diesem Schema verkabelt. Die folgenden Bilder zeigen den Aufbau.

Das "DIN"-Signal der RGB Smart LED-Streifen wird an GPIO_8 angeschlossen. Die LEDs bzw. ganze Streifen können kaskadiert werden, also jeweils "DOUT" der vorherigen LED wird mit dem "DIN" der nächsten LED verbunden. Die Software unterstützt bis 24 LED pro Kanal und max. 12 Kanäle, also total 288 LED. In diesem Fall müsste ein Strom von mindestens 3A zur Verfügung stehen und am Ende der Kette nochmal parallel eingespeist werden da die Leiterbahnen auf den Streifen bei so viel Strom beschädigt werden können. Für total 96 LEDs wie hier gezeigt ist das aber kein Problem.

Der RP2040-Zero und der MAX4466 Vorverstärker (alles erhältlich bei Aliexpress) sind mit isolierten Kupferdrähten verbunden, welche auch eine mechanische Festigkeit ergeben. Der Vorverstärker ist ein Arduino Mikrofon Modul (erhältlich für ca. €0.50), bei welchem das Mikrofon sowie deren Speisewiderstand entfernt wurde. Anstelle des Mikrofons wurde ein Chinch-Audio Kabelstecker angelötet. Mit dem Trimmpoti kann man die Signalempfindlichkeit einstellen.
Zusammen werden sie mit Montageband unter der Grundplatte aufgeklebt. Zusätzlich werden Gummifüsse oder Filzgleiter aufgeklebt um den Abstand für die Schrauben und die Elektronik zu erhalten. Damit man das weisse Montageband von vorne nicht sehen kann, sollte es mit schwarzem Isolierband abgeklebt werden. Die Einspeisung erfolgt via USB Anschluss am RP2040. Das Netzteil sollte 5V und mindestens 1A liefern.

Natürlich kann man das Original Mikrofon verwenden. Das bedeutet aber, dass man dieses zur Audioquelle ausrichten muss. Dazu könnte man das Mikrofonmodul auch an der Rückseite befestigen. Nötig wäre dann auch eine Anpassungen der Aussteuerung der einzelnen Kanäle, also eine Kalibrierung zusammen mit dem Lautsprecher. Das ist mit der Parametrierung weiter Unten möglich.

Software

Die Software ist auf die 2 Cores aufgeteilt, einer für die Signalverarbeitung und einer zur Ansteuerung der Smart-LED und das USB User Interface.

Die Signale werden mit 48kSPS gemessen und nach der Anpassung durch den Auto-Level entsprechend mit Bandpassfiltern aufbereitet. Die Filter können nicht einzeln eingestellt werden. Aber man kann das tiefste und höchste Filter einstellen. Mit der Anzahl der Kanäle bzw. LED Streifen errechnet dann die Software die logarithmischen Schritte zwischen allen Filtern. Im Beispiel hier ist der Tiefste Filter auf 50Hz eingestellt, der höchste auf 6400Hz. Mit 8 Kanälen ergibt das 50, 100, 200, 400, 800, 1600, 3200, 6400Hz. Verwendet man ein Mikrofon, kann es sein, dass man andere Frequenzbereiche einstellen muss und die einzelnen Kanäle kalibrieren muss um ein ausgewogenes Bild zu erhalten.



Dokumentation über die Implementierung der digitalen Filter sind auf der Seite "Filtertechnik" im Projekt "Raspberry Pi Pico Lightcontroller" zu finden.

Status LED

Die letzte LED des ersten Kanals ist gleichzeitig eine Status-LED.
Leuchtet sie gelb, ist das Eingangssignal übersteuert. Sie blinkt nicht gleich bei jedem einzelnen zu hohen Wert auf, sondern erst wenn mehrere Übersteuerungen in einer kurzen Zeit erfolgen.
Leuchtet sie rot, wurde ein FIFO-Überlauf festgestellt. Ein Grund dafür ist die Kommunikation via USB, also während der Parametrierung. Ein weiterer Grund kann sein, wenn alle 12 Kanäle verwendet werden und viele hohe Frequenzen berechnet werden müssen, also z.B. der höchste Filter >6400Hz eingestellt wird. In diesem Fall reicht einfach die Rechenzeit nicht aus. Abhilfe könnte eine höhere Taktfrequenz bringen. Im Source-Code sieht man beim initialisieren in der main() Funktion, dass diese auf das spezifizierte Maximum von 133MHz eingestellt wird. Eine Übertaktung bis 150MHz wäre aber problemlos möglich, bedeutet aber dass man den Code neu kompilieren muss.

Konfiguration

Die Konfiguration erfolgt via USB Schnittstelle. Nach dem Einstecken am PC erscheint ein serielles Gerät (COMx bei Windows, ttyACMx bei Linux). Mit einem Terminalprogramm wie z.B. PuTTY verbindet man zu dieser Schnittstelle und kann dann Konfigurations-Einstellungen Einsehen und verändern. PuTTY ist für alle gängigen Betriebssysteme frei erhältlich.

Man kann dafür aber auch das Smart Phone benutzen wie hier beschrieben.

Hier im Beispiel unter Linux mit der Schnittstelle /dev/ttyACM0:


Nach dem Öffnen, erscheint ein schwarzes Fenster mit dem Terminal-Inhalt. Nach der Eingabe von ? und drücken der Enter-Taste (↵), antwortet die Software mit der Beschreibung und Version sowie dem Hilfetext wie in diesem Beispiel:
WS2818 LED Strip 8-Band Spectrum Analyter binary for RP2040, (c) 2023 by Ludescher
0.0.0-Prototype-1
? =  Help
A =  List actual settings.
C =  List all band corrections.
D =  set all to default.
S =  Store actual settings to flash.
X=n  Set parameter X to value n.

Der Text ist selbsterklärend. So kann man mit A↵ alle Einstellungen ansehen (wie oben Dargestellt) und mit X=n eine Einstellung verändern. Zum Beispiel E=5↵ verändert die Helligkeit auf Stufe 5.

Sind alle Einstellungen wie gewünscht, tippt man S↵. Damit werden diese im Flash-Speicher gespeichert und bleiben auch nach dem Ausschalten erhalten.

Mit dem Wert N stellt man die Anzahl LED pro Kanal bzw. LED Streifen ein (12).

Mit dem Wert B stellt man die Anzahl LED Kanäle (Band) ein (8).

Mit dem Wert T stellt man die Geschwindigkeit ein, wie schnell die LEDs im Kanal reduziert werden.

Mit dem Wert P stellt man die Geschwindigkeit ein, wie schnell die Peak LEDs im Kanal reduziert werden.

Mit dem Wert V stellt man ein, ob die LED Streifen Linear verkabelt sind, oder ob jede Zweite kopfüber (reverse) verkabelt ist.

Mit dem Wert E stellt man die Helligkeit in 10 Stufen ein.

Mit dem Wert M stellt man den Farb-Modus ein, höhere Zahl = mehr Farbunterschiede zwischen den einzelnen Streifen.

Mit dem Wert I stellt man die Empfindlichkeit des Signaleingangs in mVrms ein (I=200 sind 200mVrms).

Mit dem Wert R=0 wählt man, dass die LEDs in den Kanälen Linear angesteuert werden, also erste LED > 0%, letzte LED = 100%, bei 10 LEDs also je 10%.
Mit dem Wert R>0 wählt man, dass die LEDs in den Kanälen Logarithmisch angesteuert werden. Z.B. R=30 heißt 30db für die tiefste LED und 0db für die höchste, bei 10 LEDs also je 3db pro LED.

Mit dem Wert H stellt man die Frequenz des höchsten Bandpassfilters ein. Nach der Eingabe werden alle Filter neu berechnet und die einzelnen Frequenzen angezeigt.

Mit dem Wert L stellt man die Frequenz des tiefsten Bandpassfilters ein. Nach der Eingabe werden alle Filter neu berechnet und die einzelnen Frequenzen angezeigt.

Mit dem Wert F stellt man die Messfrequenz der Pegel ein. F=20 sind 20 Hz. Das heißt, die Pegelmessung aller Kanäle wird 20 mal pro Sekunde auf Null gestellt. Soll eine Audio-Frequenz von 20Hz eingeschlossen werden, sollte hier 20 oder weniger eingestellt werden. Ein tieferer Wert macht die Anzeige der Kanäle aber auch träger.

Mit C↵ (ohne Wert) werden die Korrekturwerte aller Kanäle in % angezeigt. Die obersten Kanäle müssen ggf > 100% sein da die Filter mit weniger Messungen und damit weniger präzise berechnet werden können.

Mit Y wählt man, welchen Kanal man einstellen möchte. Z.B. Y=2↵ wählt Kanal 2, C=120↵ stellt Kanal 2 auf 120% ein.
Um die Pegelkorrektur der Kanäle einzustellen, kann man einen Frequenzgenerator verwenden, die entsprechende Frequenz einstellen und den Pegel entsprechend anpassen.
Verwendet man ein Mikrofon welches das Audiosignal via Lautsprecher aufnimmt, muss man bedenken, dass Resonanzen der Lautsprecher und die Akustik des Raums die Pegel beeinflussen können. So kann z.B. beim 800Hz Filter 800Hz weniger anzeigen als 810Hz oder 790Hz. Da kann es hilfreich sein, die Frequenz etwas zu variieren.

Source-Code

Die Software wurde auf einem Raspberry Pi 400 (technisch identisch mit dem Pi 4B) entwickelt.

Der Sourcecode sowie weitere wichtige Dateien, welche zum Compilieren benötigt werden, können hier von einer Zip-Datei heruntergeladen werden. Ebenfalls enthalten ist die Datei spectrum.uf2. Dies ist der binäre Code, welcher in die Zielhardware geladen wird.

Zielhardware programmieren

Dazu wird folgendermassen vorgegangen:
• Diese Zip-Datei herunterladen und daraus die Datei "spectrum.uf2" extrahieren.
• Boot-Taste am Raspberry Pi Pico drücken und gedrückt halten.
• Raspberry Pi Pico via USB Kabel mit dem PC verbinden
• Am PC erscheint ein USB Speicher mit dem Namen "RPI-RP2". Diesen öffnen bzw. anklicken.
• Die Datei "spectrum.uf2" vom PC auf den "RPI-RP2" kopieren.
• Der Mikro startet automatisch und das Speichergerät verschwindet wieder.



© 2023-2024 by Stefan Ludescher