Digitales Audio VU Meter mit WS2812 Smart-Pixel-LED und RP2040 Mikrocontroller


Low-Cost und dennoch professionell. Dies ist möglich dank dem Dual-Core Arm Cortex-M0+, welcher im RP2040 verbaut ist. Der RP2040 ist auch bekannt als Raspberry-PI Pico und es gibt ihn mittlerweile in diversen Varianten und Ausführungen. Den hier Verwendeten RP2040-Zero Gibt's bereits unter  €3.00 / Stk.


Hardware

Die Analogeingänge verwenden 3.3V als Referenz. Das heisst, die Signale müssen auf 1Vrms gebracht werden. Das entspricht 2.828V (Up-p = Ueff ·2·√2) und ist somit ~86% des AD Bereichs. Damit kann immer noch zuverlässig eine Übersteuerung angezeigt werden.

Der hier verwendete Vorverstärker hat eine Verstärkung von 5:1 und hebt das Eingangssignal von 200mVeff auf die benötigten 1Veff an. Je nach Anwendung geht es auch ohne Vorverstärker, oder mit einem beliebigen anderen Vorverstärker.

Die vier 100kΩ Widerstände R1...R4 stellen die Ruhespannung auf 1.65V ein (3.3V / 2) so dass der volle 3.3V Bereich ausgeschöpft werden kann. Zur Ankopplung werden je 1µF seriell in die Signalquelle eingebaut.


Das Din-Signal der RGB Smart LED-Streifen wird an GPIO_14 angeschlossen. Die LED bzw. ganze Streifen können kaskadiert werden, also jeweils Dout der vorherigen LED wird an den Din der nächsten LED angeschlossen. So sind auch die Streifen aufgebaut. Die Software hier unterstützt bis 99 LED pro Kanal, also total 198 LED.

Die 5V-Speisung der Smart-LED-Streifen muss genügend Strom liefern können. Bei voller Helligkeit aller 3 Farben in der RGB-LED benötigt diese bis 40mA. Das sind bei 198 LED doch satte 8A. In diesem Fall müsste sogar jeweils nach rund 40 LED eine weitere Einspeisung erfolgen, da die Streifen nicht soviel Strom transportieren können. Allerdings leuchtet meist nur eine einzelne LED, z.B. die Grüne. Damit reduziert sich der Strom auf ein Drittel. Stellt man zusätzlich die Helligkeit auf 50% ein, was völlig ausreichend ist, bleibt man so im Bereich von 1A und muss nichts weiter unternehmen.

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 je 48kSPS gemessen. Der AD-Wandler ist also auf 96kSPS eingestellt (= 96000 Messungen pro Sekunde). Die Signale werden dann entsprechend aufbereitet für die Peak-Peak und RMS Werte. Diese Werte werden jeweils nach 50ms (einstellbar) zurückgesetzt und danach entsprechend die Lineare oder Logarithmische anzahl LED bestimmt. 50ms entspricht 20Hz. Damit wird der Frequenzbereich ab 20Hz mit eingeschlossen. Man kann via Konfiguration diese Messfrequenz einstellen um das VU-Meter schneller zu machen. Allerdings werden damit tiefe Frequenzen weniger präzise erfasst.

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 SW mit der Beschreibung und Version sowie dem Hilfetext wie in diesem Beispiel:
WS2818 LED Strip VU Meter binary for RP2040, (c) 2022 by Ludescher
0.0.0-Prototype-1
? =  Help
A =  Print actual settings.
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 Normale Helligkeit auf Stufe 5 und F=8↵ die Helligkeit mit dem Bright-Schalter eingeschaltet auf Stufe 8.

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

Mit den Werten E und F wird die Reihenfolge der LEDs eingestellt. Da die LED-Streifen seriell verdrahtet sind, macht es Sinn den zweiten Kanal Kopfüber zu befestigen da damit die Kabel kürzer bleiben so wie es im ersten Bild dargestellt ist.

Mit B, Y, R, stellt man ein wieviele LEDs Blau, Gelb oder Rot leuchten sollen. Der Rest bis zur eingestellten Anzahl mit N leuchtet dann Grün.

Mit T stellt man die Messfrequenz für die RMS und p-p Werte ein. 20 bedeutet 20 Hz. Dieser Wert schliesst die entsprechende Signalfrequenz mit ein, also z.B. 20 Hz. Wählt man eine höhere Zahl, wir die Anzeige schneller, die Messung der entsprechenden Frequenz wird damit aber ungenauer.

Mit P stellt man die Geschwindigkeit der Max.-LED ein. Diese leuchtet Weiss und bleibt an der maximalen LED stehen. Danach reduziert sie sich langsem mit der eingestellten Geschwindigkeit.

Mit C stellt man einen Offset für die lineare Anzeige ein. Wenn man z.B. pro Kanal 50 LEDs hat, würde jede LED 2% Signal anzeigen. Je nach Vorverstärker und Aufbau kann da die erste LED vom Rauschen schon mal ohne Signal etwas flackern. Dieser Wert wird vom Signal subtrahiert, womit man das verhindern kann.

Mit L stellt man den Logarithmischen Bereich ein. 30 bedeutet dass die unterste LED bei -30db zu leuchten beginnt. Hat man z.B. 16 LED und stellt 30 ein, zeigt jede LED 2db Signal an (die Oberste zeigt 0). Stellt man 45 ein, zeigt jede LED 3db Signal. Bei 45db kann wird wiederum das Rauschen eine Rolle spielen und die ersten LEDs zum Flackern bringen. Einen rauscharmen Vorverstärker und gute Abschirmungen sind bei einer solchen Konfiguration Pflicht.

Mit I kann man der Signalbereich einstellen. I=999↵ bedeutet 999mVeff bzw. das spezifizierte 1Veff . Reduziert man den Wert, kann man es zwar mit weniger Signal betreiben, das Rauschen wird dadurch aber nicht verringert und kann so mehr stören.

Etwas speziell ist der Wert von H. Es ist ein digitales Filter, welches im Bereich von 10kHz eine einstellbare Anhebung vornimmt. Dies kompensiert den Hochpassfilter des Vorverstärkers, welcher nötig ist um keine verfälschte Alias-Signale der hohen Frequenzen durch das Nyquist-Shannon-Abtasttheorem zu erhalten. H=0 schaltet das Filter komplett aus. In den meisten Fällen dürfte das gut sein. Zum abgleichen L=x gleich der Anzahl LED-1 einstellen so dass jede LED ein db anzeigt. Dann mittels Frequenzgenerator den Bereich 5kHz...15kHz durchfahren und den Signalabfall beobachten bzw. mit H=n korrigieren, wobei H=10 +1db anhebt und H=30 +3d (Maximum).

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 vumeter.uf2 im build Verzeichnis. 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 "vumeter.uf2" aus dem build Verzeichnis 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 "vumeter.uf2" vom PC auf den "RPI-RP2" kopieren.
• Der Mikro startet automatisch und das Speichergerät verschwindet wieder.

Demo Video

Dieses Demo-Video findet man auch auf YouTube.



© 2023-2024 by Stefan Ludescher