Pixelpuff: Difference between revisions

From CCC Basel Wiki
Jump to navigation Jump to search
(Created page with "== Übersicht == '''Pixelpuff''' ist eine LED-Matrix mit 128x96 Pixeln, angesteuert von einem BeagleBone Black. <gallery> File:Pixelpuff01.jpg|thumb|Vorderseite, 128x96 LED...")
 
No edit summary
 
(5 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>


== Betriebsmodus ==
== Hardware ==


* 12 einzelne LED-Panel, je 4 in Serie
=== Videoanzeige ===
* 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
* USB-Stick mit Demo-Videos im BeagleBone
Line 21: 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
** 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 ====

Folgenden Helper kompilieren (<code.gcc -o pixelpuff-convert pixelpuff-convert.c</code>):

<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 ==


* LEDscape auf dem Beaglebone startet erst mit dem network-online.target, der Ethernet-Link sollte daher up sein, wenn Videos angezeigt werden sollen.
{{Todo|Wir haben noch nicht herausgefunden, wie das funktioniert...}}
* Gemäss LEDscape-README sollten die Anschlusskabel der LED-Panel nicht im laufenden Betrieb ein- oder ausgesteckt werden.


[[Category:Projekt]]
* Super Mario
[[Category:Projekt:Abgeschlossen]]
* Doom

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.