Talk geschrieben (zusammen mit flop)

main
Christian Seiler 3 weeks ago
parent bf4a2d003f
commit a6412647b6
  1. BIN
      IMG_20251226_173113.jpg
  2. BIN
      IMG_20260309_214103.jpg
  3. BIN
      abfahrt3.jpeg
  4. BIN
      alte_platine.jpeg
  5. BIN
      assets/IMG_20251226_173113.jpg
  6. BIN
      case1.jpeg
  7. BIN
      case_closed.jpeg
  8. BIN
      erste_funktion.jpeg
  9. BIN
      erstes_logo1.jpeg
  10. 240
      main.typ
  11. BIN
      neue_platine.jpeg
  12. BIN
      neue_platinen.jpeg
  13. BIN
      new_pcb.jpeg
  14. BIN
      saal_bool.jpeg
  15. BIN
      signal-2026-01-25-180621.png
  16. BIN
      signal-2026-01-25-180701.png
  17. BIN
      webeditor.png
  18. BIN
      wifi.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 725 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 823 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 995 KiB

@ -1,20 +1,24 @@
#import "@preview/diatypst:0.9.0": *
#import sym: arrow
#set text(font: "TeX Gyre Adventor")
#show heading.where(level: 3): it =>[
#block(it.body)
]
#show: slides.with(
title: "SITREP Busanzeiger",
subtitle: "Aktueller Stand und Zukunftsausblick",
date: "25.01.2026",
authors: ("Christian & Pascal"),
title: "Abfahrtsanzeiger Hacken 2.0",
date: "17.05.2026",
authors: ("Christian Seiler, flop"),
// Optional (for more see docs at https://mdwm.org/diatypst/)
ratio: 16/9,
layout: "medium",
title-color: blue.darken(30%),
toc: true,
toc: false,
)
= Recap
= Was bisher geschah
== Erstkontakt mit den Stadtwerken (Februar 2023)
#figure(
@ -69,69 +73,211 @@
image("a05077ee7e192d99.jpg", width: auto),
)
)
== Weiterentwicklung {vor/für} de{m/n} 39c3
= Erste Weiterentwicklung Hardware & Firmware
== Datenformat 1.0
Binärformat, das aus einer Liste von Elementen besteht, die gezeichnet werden sollen.
=== Features
- Bilder
- Animationen
- Scrollende Bilder (vorgerenderter Lauftext)
=== Bilddaten
- Koordinaten fangen bei (0, 0) an
- 1 bit pro Pixel
- Pixel Index: $n(x, y) = y * W + x$
- Byte Index: $B(x, y) = floor(n(x, y) / 8)$
- Bit Index: $b(x, y) = n(x, y) mod 8$
== Spaß am 39C3 (Dezember 2025)
#grid(
columns: 2,
gutter: 15mm,
"\n- weiterhin ESP32\n- weiterhin embedded Rust\n- Rewrite der Anzeigelogik\n- Neues Datenformat (Bitmap basiert)\n- Binary Blob wird von Server geladen",
image("signal-2026-01-23-233504_002.jpeg", width: auto),
image("IMG_20251226_173113.jpg", width: auto),
[
- Mikrocontroller + Firmware
- Basierend auf Entropia-Arbeit (Rust, ESP32)
- Modifikationen zum Rendering des Datenformats
- Busanzeiger Paint (Webinterface)
- Zeichnen mit verschiedenen Pixelgrößen
- Rudimentäres Textrendering
- Importieren von Bildern/GIFs
- Erstellung von Animationen
- "Vibe-Coding for the win"
- Round-Robin Bilder / Animationen vom Server
- CLI-Tool zur Vorschau (#arrow.r Demo)
]
)
= Entwicklung Hardware & Firmware
== Datenformat für Busanzeiger
Das Datenformat ist ein Binaerformat, das sequenziell abgelaufen wird. Alle
indivduellen Eintraege sind auf 1 Byte ausgerichtet, notfalls wird mit 0-Bits
aufgefuellt.
== Custom PCB 1.0
#grid(
columns: 2,
gutter: 15mm,
image("IMG_20260309_214103.jpg", width: auto),
[
- LVDS-Transceiver auf Platine (#arrow.r altes Mainboard nicht mehr benötigt)
- Anschluss per 8p8c ("RJ45") Stecker (#arrow.r kein Custom Lötjub)
- Eigene Spannungsversorgung für Mikrocontroller
- Alternativer Anschluss für Seeed ESP32-S3 (kleineres Format)
- Funktioniert ohne Firmware-Änderung auf bestehendem Mikrocontroller #emoji.face
]
)
Alle Koordinaten fangen links oben bei (0, 0) an.
#align(center)[
#image("erste_funktion.jpeg", width: 60%)
]
Eine Bitmap ist ein mapping eines binaeren 2D-Bildes auf eine Byte-Sequenz.
Um auf das Pixel (x, y) zuzugreifen muss man erst den Pixel-Index n bestimmen
ueber
#align(center)[
#image("erstes_logo1.jpeg", width: auto)
]
n = y \* width + x
#grid(
columns: 2,
gutter: 15mm,
image("alte_platine.jpeg", width: auto),
[
=== Not Everything is Perfect #emoji.face.sad
Ein Bitmap der Breite `width` und Hoehe `height` benoetigt
- PIN-Reihe für alte Mikros nicht korrekt
- Stromversorgung für Seeed ESP32S3 nicht korrekt
- Bohrlöcher falsch platziert
- Falsche LVDS-Polarität
N = (breite \* hoehe + 7) / 8
=== Learnings
Bytes an Speicher.
- Prototyp-Platine war gute Testing-Platform
- Aber: konzentrieren auf einen Mikrocontroller (#arrow.r Seeed ESP32-S3, da 8 MiB SRAM und sehr klein und günstig)
- Kleinere Platine wäre besser, v.a. wenn mehr produziert werden sollen
]
)
$ & nabla integral_x^4 laplace x = 1 + 2 + EE phi Phi phi.alt 1/(1/4) sum_a^n \
& 1+2 $
= Let's Do it All Again
== Custom PCB
#grid(
columns: 2,
gutter: 5mm,
image("neue_platinen.jpeg", width: 8cm),
[
- Kleiner Formfaktor (5 cm x 5 cm)
- Separate Spannungsversorgungs-Platine (DC-DC)
- Hardware-Bugs gefixed (Polarität, Spannungsversorgung)
- Nur noch ESP32-S3
- Selbst bestückt
- Montage separat per 3D-Druck-Gehäuse
- Spannungsversorgung für Displays integriert (optional)
]
)
#align(center)[
#image("new_pcb.jpeg", width: auto)
]
== Datenformat 2.0
=== Neue Features
- Auswahl, ob auf Vorder- oder Rückseite angezeigt
- Support für Text und Fonts
- Support, die aktuelle Uhrzeit anzuzeigen
- Zeitspezifische Anzeigen
- Animation kurz einblenden
- Vorabauslieferung, falls WLAN ausfällt
== Firmware (WiP)
- Rewrite in C++
- ESP32-Rust-Ökosystem noch zu sehr im Fluss, mehrfach darüber geflucht, dass wir ständig refactorn mussten
- ESP32-S3 noch nicht 100% gut supported in Rust
- Unfähigkeit von uns, UART0 nicht für Debug-Ausgaben von Rust verwenden zu lassen
- Für später: A/B OTA Updates gehen mit ESP-Rust aktuell nicht
- Web-Konfiguration
- Deckel bleibt zu
- Temporärer AP und Web-UI beim ersten Start #arrow.r Web-Konfiguration
- Uhrzeit via SNTP
== Web-Konfiguration (WiP, vibes)
#align(center)[
#image("signal-2026-01-25-180621.png", width: auto)
#image("wifi.png", width: 70%)
]
== Web-Editor (WiP, vibes)
#align(center)[
#image("signal-2026-01-25-180701.png", width: auto)
#image("webeditor.png", width: auto)
]
= Entwicklung Webinterface
== Busanzeiger Paint
== Montage
#grid(
columns: 2,
gutter: 15mm,
"\n- Zeichnen mit verschiedenen Brushsizes\n- Rudimentäres Textrendering\n- Radieren\n- Importieren von Bildern / GIFs\n- Erstellung von Animationen\n- Erstellung von Binary Blob in JS oder PHP",
image("paint_start.PNG", width: auto),
)
== Logo import
#align(center)[
#image("paint_logo.PNG")
#image("case1.jpeg", width: auto)
]
#align(center)[
#image("neue_platine.jpeg", width: 100%)
]
= Einsätze
== Lichti-Maskenball
#align(center)[
#image("abfahrt3.jpeg", width: 90%)
]
== TDF5 2026
#align(center)[
#image("saal_bool.jpeg", width: 90%)
]
= Ausblick
== Ausblick
- System zur Verwaltung
- Zeitpläne
- Bestehende Slides Bearbeiten
- Mehreren Displays Slides zuweisen
- Idee: Zeichnen von Bildern auf dem TDF5
- Bild / eine Animation erstellen und absenden übers Webinterface
- Einreichungen werden moderiert
- Anstößige Inhalte werden entfernt, andernfalls wird es für eine gewisse Zeit angezeigt
- 23.05. AfD-Verbot jetzt! Demo (Tübingen)
- 04.06. GPN 2026 (Karlsruhe)
- 04.07. Tübix 2026 (Tübingen)
- "First Stable Release"
- Automatische pretalx-Integration (serverseitig)
- ICS-Integration (serverseitig)
- Mehr Busanzeiger flott machen
= Danksagung
== Danksagung
- Stadtwerke Tübingen für die Anzeiger
- We stand on the shoulders of giants
- Menschen, die das initiale Reverse Engineering gemacht haben
- Entropia e.V.
- Auslesen des Flash des Original-Mainboards: CC 86 e.V. Heilbronn
- Pascal (\@cal) für den Anfang der Slides
- Rüdiger für 39c3 Busanzeiger Paint
#grid(
columns: 2,
gutter: 25mm,
image("case_closed.jpeg", width: 5cm),
[
\
\
\
*Case Closed*
]
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 693 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Loading…
Cancel
Save