Pixelpuff: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 18: | Line 18: | ||
== Betriebsmodi == |
== Betriebsmodi == |
||
=== Videoanzeige === |
=== Unabhängige Videoanzeige === |
||
* USB-Stick mit Demo-Videos im BeagleBone |
* USB-Stick mit Demo-Videos im BeagleBone |
||
Line 27: | Line 27: | ||
** mplayer zum Videos abspielen innerhalb des Xvfb |
** mplayer zum Videos abspielen innerhalb des Xvfb |
||
=== |
=== Externe Videoquellen === |
||
* Man kann an den LEDscape-Server auch von "aussen" Daten schicken |
|||
{{Todo|Wir haben noch nicht herausgefunden, wie das funktioniert und bedient wird...}} |
|||
** Dazu muss erst auf dem Beaglebone der <code>getfb</code> Prozess (z.B. mit <code>pkill getfb</code>) beendet werden. |
|||
* TCP Port 7890, Frame-Format: |
|||
*# 32bit Big Endian Frame Size (bei diesem Display immer <code>0x00009000</code>) |
|||
*# 24bit-GRB-Pixel, Row-major order (= Zeile für Zeile, von links nach rechts, von oben nach unten) |
|||
==== Beispiel: ffmpeg X11 Stream ==== |
|||
* Games |
|||
** Super Mario |
|||
Folgenden Helper kompilieren (<code.gcc -o pixelpuff-convert pixelpuff-convert.c</code>): |
|||
** Doom |
|||
* Steuerung mit einem Gamepad |
|||
<pre> |
|||
#include <stdio.h> |
|||
#include <unistd.h> |
|||
#include <stdint.h> |
|||
#include <stdlib.h> |
|||
#include <string.h> |
|||
uint8_t frame[0x9004]; |
|||
int main() { |
|||
frame[0] = 0; |
|||
frame[1] = 0; |
|||
frame[2] = 0x90; |
|||
frame[3] = 0; |
|||
int i = 0; |
|||
ssize_t to_read, r; |
|||
while (!feof(stdin)) { |
|||
to_read = 0x9000; |
|||
while (to_read > 0) { |
|||
r = read(0, frame+0x9004-to_read, to_read); |
|||
if (r > 0) { |
|||
to_read -= r; |
|||
} else if (r < 0) { |
|||
perror("read"); |
|||
exit(1); |
|||
} |
|||
} |
|||
write(1, frame, 0x9004); |
|||
fflush(stdout); |
|||
} |
|||
memset(frame+4, 0, 0x9000); |
|||
write(1, frame, 0x9004); |
|||
fflush(stdout); |
|||
} |
|||
</pre> |
|||
Und dann mit folgenden Befehl den Stream starten: |
|||
<pre> |
|||
ffmpeg -re -f x11grab -i :0.0 -map 0:0 -vf scale=128:96,eq=brightness=0.01:contrast=1.1 -c:v rawvideo -pix_fmt bgr24 -f rawvideo - | ./pixelpuff-convert | nc 10.20.0.85 7890 |
|||
</pre> |
|||
== Notizen == |
== Notizen == |
Revision as of 21:24, 15 September 2020
Übersicht
Pixelpuff ist eine LED-Matrix mit 128x96 Pixeln, angesteuert von einem BeagleBone Black.
Hardware
- 12 einzelne LED-Panel, je 4 in Serie
- 2 PSUs, je 5V 40A DC
- BeagleBone Black mit aufgestecktem µC zur Ansteuerung der 3 Panel-Serien
Betriebsmodi
Unabhängige Videoanzeige
- USB-Stick mit Demo-Videos im BeagleBone
- Auf dem BeagleBone laufen:
- Xvfb: X11 Virtual Frame Buffer, ein virtueller X11-Server mit in-memory Framebuffer
- LEDscape: Treiber für die LED-Matrix, nimmt Frames via TCP-Port 7890 entgegen
- getfb: Nimmt den Xvfb-Framebuffer und sendet den Inhalt an LEDscape
- mplayer zum Videos abspielen innerhalb des Xvfb
Externe Videoquellen
- Man kann an den LEDscape-Server auch von "aussen" Daten schicken
- Dazu muss erst auf dem Beaglebone der
getfb
Prozess (z.B. mitpkill getfb
) beendet werden.
- Dazu muss erst auf dem Beaglebone der
- TCP Port 7890, Frame-Format:
- 32bit Big Endian Frame Size (bei diesem Display immer
0x00009000
) - 24bit-GRB-Pixel, Row-major order (= Zeile für Zeile, von links nach rechts, von oben nach unten)
- 32bit Big Endian Frame Size (bei diesem Display immer
Beispiel: ffmpeg X11 Stream
Folgenden Helper kompilieren (<code.gcc -o pixelpuff-convert pixelpuff-convert.c):
#include <stdio.h> #include <unistd.h> #include <stdint.h> #include <stdlib.h> #include <string.h> uint8_t frame[0x9004]; int main() { frame[0] = 0; frame[1] = 0; frame[2] = 0x90; frame[3] = 0; int i = 0; ssize_t to_read, r; while (!feof(stdin)) { to_read = 0x9000; while (to_read > 0) { r = read(0, frame+0x9004-to_read, to_read); if (r > 0) { to_read -= r; } else if (r < 0) { perror("read"); exit(1); } } write(1, frame, 0x9004); fflush(stdout); } memset(frame+4, 0, 0x9000); write(1, frame, 0x9004); fflush(stdout); }
Und dann mit folgenden Befehl den Stream starten:
ffmpeg -re -f x11grab -i :0.0 -map 0:0 -vf scale=128:96,eq=brightness=0.01:contrast=1.1 -c:v rawvideo -pix_fmt bgr24 -f rawvideo - | ./pixelpuff-convert | nc 10.20.0.85 7890
Notizen
- LEDscape auf dem Beaglebone startet erst mit dem network-online.target, der Ethernet-Link sollte daher up sein, wenn Videos angezeigt werden sollen.
- Gemäss LEDscape-README sollten die Anschlusskabel der LED-Panel nicht im laufenden Betrieb ein- oder ausgesteckt werden.