Pixelpuff: Difference between revisions

From CCC Basel Wiki
Jump to navigation Jump to search
Content deleted Content added
No edit summary
No edit summary
 
(3 intermediate revisions by the same user not shown)
Line 8: Line 8:
File:Pixelpuff03.jpg|thumb|Detailansicht des Beaglebone, beschriftete Anschlüsse
File:Pixelpuff03.jpg|thumb|Detailansicht des Beaglebone, beschriftete Anschlüsse
File:Pixelpuff04.jpg|thumb|Vorderseite, LED Matrix mit laufendem Demo-Video
File:Pixelpuff04.jpg|thumb|Vorderseite, LED Matrix mit laufendem Demo-Video
File:Pixelpuff05.jpg|thumb|Am 10.09.2021 haben wir einen WiFi-fähigen Strommschalter nachgerüstet
</gallery>
</gallery>


Line 15: Line 16:
* 2 PSUs, je 5V 40A DC
* 2 PSUs, je 5V 40A DC
* BeagleBone Black mit aufgestecktem µC zur Ansteuerung der 3 Panel-Serien
* BeagleBone Black mit aufgestecktem µC zur Ansteuerung der 3 Panel-Serien
* Sonoff Basic R2 zum bequemEin-/Ausschalten


== Betriebsmodi ==
== Betriebsmodi ==


Ein- und Ausschalten:
=== Videoanzeige ===
* Via [[OpenHAB]]
* Direkt am Gerät (einen Stift o.Ä. in das Loch an der Unterseite des Gehäuses einführen)

=== Unabhängige Videoanzeige ===


* USB-Stick mit Demo-Videos im BeagleBone
* USB-Stick mit Demo-Videos im BeagleBone
Line 27: Line 33:
** mplayer zum Videos abspielen innerhalb des Xvfb
** mplayer zum Videos abspielen innerhalb des Xvfb


=== Game-Emulator ===
=== 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 ==
Line 40: Line 91:
* LEDscape auf dem Beaglebone startet erst mit dem network-online.target, der Ethernet-Link sollte daher up sein, wenn Videos angezeigt werden sollen.
* 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.
* Gemäss LEDscape-README sollten die Anschlusskabel der LED-Panel nicht im laufenden Betrieb ein- oder ausgesteckt werden.

[[Category:Projekt]]
[[Category:Projekt:Abgeschlossen]]

Latest revision as of 07:26, 29 June 2022

Ü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
  • Sonoff Basic R2 zum bequemEin-/Ausschalten

Betriebsmodi

Ein- und Ausschalten:

  • Via OpenHAB
  • Direkt am Gerät (einen Stift o.Ä. in das Loch an der Unterseite des Gehäuses einführen)

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. mit pkill getfb) beendet werden.
  • TCP Port 7890, Frame-Format:
    1. 32bit Big Endian Frame Size (bei diesem Display immer 0x00009000)
    2. 24bit-GRB-Pixel, Row-major order (= Zeile für Zeile, von links nach rechts, von oben nach unten)

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.