diff --git a/README.md b/README.md index f2dae69..32dfcaf 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,28 @@ +# Zutaten + +- LED-Matrix-Panel(s) von Joy-IT mit Hat für den Raspi +- Raspberry Pi 4 +- https://github.com/hzeller/rpi-rgb-led-matrix + # Benutzung - als **root** ausführen -- ./main.py +- gunicorn -w 1 -k gthread main:app +# Dateien -verschiedene threads zur auswahl, die vom flask gestartet/gestoppt werden können. +- main.py (das Hauptprogramm und der Flask-Webserver) +- lib/display.py (LED-Matrix konfigurieren und ansteuern) +- scenes/ (verschiede Darstellungsmodi) -- statisches bild anzeigen und sich beenden -- +# Architektur -ein task, der die ganze zeit im hintergrund läuft. -- statisches bild anzeigen -- eine Routine +Die "main.py" beinhaltet eine Flask-Web-Anwendung. Darüber lässt sich das +Programm mit HTTP-Anfragen steuern. -ein globales bild. (locking?) -die einzelnen - -https://github.com/hzeller/rpi-rgb-led-matrix +Beim Starten werden alle Dateien aus dem _scenes_-Verzeichnis geladen. +Eine Szene lässt sich über http://raspi:8000/start/NAME-DER-SZENE starten. +Die Szene läuft dann als Thread parallel zur Web-Anwendung. ./main.py curl http://localhost:6000/start/helloworld @@ -30,114 +36,6 @@ Für deutsche Ausgabe (z.B. den Monatsnamen): - als root: `dpkg-reconfigure locales` - **de_DE.UTF-8** aktivieren -# Flackern - -## Erkenntnisse - -"Hardware pulsing" macht zwar ein ruhiges Bild aber viele Artefakte. -Wenn man "hardware pulsing" abschaltet, muss die Software die Ansteuerung der -Panels machen. Das ist für den Raspi stressiger. - -Am besten startet man den Webserver mit: - - chrt -f 20 ./main.py - -Dann werden Hintergrundprozesse unterdrückt und Artefakte vermieden. - -Interessante Optionen: - -- `options.gpio_slowdown`: Mehr=mehr Flackern. Weniger=Artifakte/Rauschen im linken Bereich. -- `options.pwm_bits`: Mehr=mehr Flackern. Weniger=weniger Helligkeitsabstufungen - -## Einstellung 1 - -- kaum sichtbare Artefakte -- ca. 10 Hz Bildwiederholrate -- 4 Panels - -```py -options = RGBMatrixOptions() -options.rows = MATRIX_HEIGHT -options.cols = MATRIX_WIDTH -options.chain_length = NUMBER_OF_PANELS -options.parallel = 1 -options.hardware_mapping = 'regular' # change if using Adafruit HAT, e.g. 'adafruit-hat' -options.gpio_slowdown = 10 # try 2, 4, or even 5 -options.drop_privileges = False -options.pwm_bits = 10 # default 11–12; lower = faster refresh -``` - -## Einstellung 2 - -- leichte Artifakte, hält 10 Minuten durch -- ca. 30 Hz Bildwiederholrate -- 3 Panels - -```py -options.hardware_mapping = 'regular' # change if using Adafruit HAT, e.g. 'adafruit-hat' -options.gpio_slowdown = 6 # try 2, 4, or even 5 -options.disable_hardware_pulsing = True -#options.show_refresh_rate = True -options.drop_privileges = False -``` - -## Einstellung 3 - -- kaum Artefakte -- ca. 30 Hz -- 3 Panels - -```py -options.hardware_mapping = 'regular' # change if using Adafruit HAT, e.g. 'adafruit-hat' -options.gpio_slowdown = 7 # try 2, 4, or even 5 -options.disable_hardware_pulsing = True -options.drop_privileges = False -options.pwm_bits = 10 # default 11–12; lower = faster refresh -``` - -## Einstellung 4 - -- 20-30 Hz -- 3 Panels -- keine Artefakte - -```py -options.hardware_mapping = 'regular' # change if using Adafruit HAT, e.g. 'adafruit-hat' -options.gpio_slowdown = 8 # try 2, 4, or even 5 -options.disable_hardware_pulsing = True -options.drop_privileges = False - -## Einstellung 5 - -- 50 Hz -- 4 Panels -- keine Artefakte -- hält es langfristig damit durch? - -options.hardware_mapping = 'regular' # change if using Adafruit HAT, e.g. 'adafruit-hat' -options.gpio_slowdown = 4 # try 2, 4, or even 5 -options.disable_hardware_pulsing = True -options.drop_privileges = False -options.pwm_bits = 5 # default 11–12; lower = faster refresh - - -# Links - -- https://github.com/hzeller/rpi-rgb-led-matrix - -# TODO - -Das ganze als minimalen Case ohne Multithreading und Klassen. -Ist das Geflacker dann weg? - -# 2026-01-16 - -- git pull -- spannung auf 5,01 Volt reduziert (von 5,2 Volt) -- gpio-slowdown auf 4 -- nach dem stop (ctrl-c) und start 10 sekunden warten -- mit "gunicorn -w 1 -k gthread main:app" laufen lassen - # Szenen curl "http://localhost:8000/start/color?red=255&green=255&blue=255" @@ -150,7 +48,10 @@ curl http://localhost:8000/reset # Entwicklung ohne Matrix-Display -lib/display.py -> dev = True -./main.py -feh --auto-reload image.png +Falls man Szenen entwickeln möchte, aber das Matrix-Display nicht zur +Hand hat, kann man die Bild-Ausgabe auch in eine Datei schreiben: + +- lib/display.py -> dev = True +- ./main.py +- feh --auto-reload image.png