Raspberry Pi Pico Lightcontroller, 3-Kanal Lichtorgel und Beat Lauflicht

  Home     Übersicht     Hardware     Software     Filtertechnik  

Softwarebeschreibung

Ziel war, eine Lichtorgel vollständig mit Software mit C zu entwickeln für den Raspberry Pi Pico. Das heisst, auch Audio-Frequenzfilter, Peakmessungen, Levelanpassungen usw.

Da der Raspberry Pi Pico zwei Prozessor-Kerne besitzt, wurde die gesamte Lightcontroller Software im Core_1 implementiert. Der Core_0 übernimmt das "User Interface".

Dieses behandelt eine 2-Tasten Bedienung, mit welcher man die Helligkeit der Lampen einstellen kann (beschrieben bei der Hardware).

Auch vom User Interface gesteuert wird die Onboard-LED, welche den Pegel des Eingangssignals anzeigt.
  • Kurz blinken = zuwenig Signal
  • Regelmässig blinken = gutes Signal
  • Leuchtet mit kurzen unterbrüchen = übersteuert

Eine Übersicht zur Software zeigt dieses Blockschema:

Damit die Filter eine einigermaßen stabile Qualität liefern, wurde eine Abtastrate von 48'000 Messungen pro Sekunde gewählt (48kSPS). Damit lässt sich ein Frequenzfilter mit einer Grenzfrequenz von 5kHz und tiefer ziemlich gut realisieren.

Die ganzen Signale, Filter, Peakmessungen, Levelmessungen und Anpassungen wurden Ausschließlich mit Integer-Mathematik aufgebaut. Integer-Mathematik läuft ein vielfaches schneller als Fließkomma-Mathematik. Dies spürt man insbesondere bei kleinen Prozessoren wie z.B. der 8051 mit seiner 8-Bit Mathematik. Aber auch der Cortex-M0+ wie im Raspberry Pi Pico verbaut, rechnet da einiges schneller, obwohl er ein 32-Bit Rechner eingebaut hat und Multiplikationen in wenigen Taktzyklen ausführt. Dafür kann man mehr Luxus einbauen wie die doppelte Filterung, z.B. für eine bessere Trennung zwischen den Frequenzbänder. (Vergleiche dazu das Blockdiagramm der 8051 Lichtorgel

Der AD Wandler und der Fifo laufen beim Cortex-M0+ in der Hardware. Die Levelanpassung ist so limitiert, dass der Level nicht unendlich angehoben wird wenn kein Signal vorhanden ist. Sonst würden die Lampen schon vom Rauschen leuchten. Die Onboard-LED zeigt an, wenn der Eingangspegel optimal ist.

Die Level Messungen sind einfache Peak-Messungen: if(peak < abs(signal)) peak = abs(signal); Die Levelsignale werden danach innerhalb von ca. 150ms auf null heruntergezählt, so dass die Lampen aus gehen.

Die PWM Frequenz beträgt 1kHz, die Aussteuerung erfolgt quadratisch zum Level. Dies gibt optisch ein dynamischeres Bild. Zudem schaltet die Lampe erst ab einem Level von 25% ein so dass sie zwischen den Tönen auch aus geht.

Das Tiefton Level Signal geht nochmal durch ein separates Filter um den Beat (Takt) herauszufiltern. Das Differenzsignal davon wird von einem Peak Detektor erfasst. Dabei wird der Signalpegel nach dem Differentiator gemessen, Die Signale, welche den Pegel überschreiten, lösen den Trigger aus, welcher einigermaßen dem Beat entspricht. Der Trigger wird wieder zurückgesetzt, wenn der negative Signalpegel unterschritten wird, was dann einer Hysterese in der Größe des mittleren Signalpegels entspricht. In einem Sequenzer wird dann je nach Konfiguration ein Lauflicht, Mix-Lauflicht oder Levelmeter getriggert wie bei der Hardware beschrieben.

Die vom Benutzer einstellbare Helligkeit der einzelnen Lampen greift in der Level-Messung als Multiplikator ein so dass je nach Signalquelle die Lampen auf eine ausgewogene Helligkeit angepasst werden können.

Ebenfalls vom Benutzer kann die gesamte Helligkeit eingestellt werden. Diese greift im Autolevel ein stellt den Ziel-Level ein der Level-Regelung ein. Dadurch gelangt mehr oder weniger Signal in die Filter.

Dadurch wird auch klar, dass die Einstellung der Gesamthelligkeit sowie der Low-Lampe (Rot) einen Einfluss auf die Beat-Erkennung hat.

USB Schnittstelle

Es gibt eine Benutzerschnittstelle via USB. Damit kann man nebst der Helligkeit der Lampen auch die Filter Grenzfrequenzen einstellen und Daten zum debuggen und optimieren ausgeben. Steckt man den USB an einem Linux Rechner ein, erhält man ein Device mit dem Namen ttyACM0. Dieses kann man z.B. mit dem Tool "minicom" mit folgendem Befehl verbinden "minicom -b 115200 -o -D /dev/ttyACM0".
Bei Windows erhält man eine COM Schnittstelle, welche man z.B. mit dem Terminalprogramm PuTTY ansteuern kann. Beispiele findet man im Netz (suche nach Raspberry Pi Pico PuTTY).

Es geht aber auch ganz ohne Tools via Kommandozeile. Im Linux öffnet man 2 Shells, im einen gibt man ein: "cat /dev/ttyACM0", da sieht man dann die Antworten. Im anderen gibt man ein: "cat /dev/stdin > /dev/ttyACM0". Danach gibt man die Befehle ein, am Ende jeweils die Enter taste drücken (↵). z.B. "? ↵" gibt den Hilfetext aus, welcher alles nötige erklärt. Mit "A ↵" werden alle aktuellen Parameter angezeigt. Möchte man z.B. den Bassfilter von 150Hz auf 100Hz ändern, gibt man ein "L=100 ↵". Zum Speichern der Werte im Flash "S ↵" eingeben, alles zurücksetzen mit "D ↵".

Filtertechnik

Für die Filter Technik gibt es diese separate Seite über die Filtertechnik.

Software Sourcecode

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 lightcontrol.uf2 im build Verzeichnis. Dies ist der binäre Code, welcher in die Zielhardware geladen wird.

Der Sourcecode (lightcontrol.c) ist in einer einzige Datei geschrieben. Das macht das verteilen, compilieren und debuggen unkompliziert, ist aber vielleicht nicht so übersichtlich. Das relativiert sich allerdings bei nicht mal 1000 Zeilen. Als Profi würde man vielleicht die Filter und Flash Funktionen in separate Dateien auslagern und so umschreiben, dass sie wiederverwendet werden können.

Zielhardware programmieren

Dazu wird folgendermassen vorgegangen:
  • Diese Zip-Datei herunterladen und daraus die Datei "lightcontrol.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 "lightcontrol.uf2" vom PC auf den "RPI-RP2" kopieren.
  • Der RPI-RP2 startet automatisch und die onboard LED beginnt zu blinken.



© 2023-2024 by Stefan Ludescher