Led Board: Unterschied zwischen den Versionen

K
(TI pain in ass)
 
(13 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{TOCright}}
+
{{Infobox Projekt
 
+
|name            = Ledboard
Status: Infrastruktur aufgesetzt
+
|kategorie      = Software
 +
|status          = beta
 +
|autor          = [[User:krisha|krisha]] [[User:architekt|architekt]] [[User:schinken|schinken]]
 +
|beschreibung    = LED-Board mit 1536 roten LEDs
 +
|image          = Projekt img ledboard.jpg
 +
|imagesize      = 300
 +
|version        = 0.8
 +
}}
 +
[[Category:Hardware]]
 +
[[Category:Software]]
  
 
== Idee ==
 
== Idee ==
Zeile 19: Zeile 28:
 
Grafiken auf PC generieren, dadurch keine Probleme mit Codegröße und mehr Möglichkeiten
 
Grafiken auf PC generieren, dadurch keine Probleme mit Codegröße und mehr Möglichkeiten
  
== Kommunikation ==
+
== Hardware ==
Seriell mit USB2CMOS Wandler
+
Das Ledboard entspringt einem kommerziellem Produkt bei welchem die Ansteuerung entfernt und durch eine eigene Platine ersetzt wurde. Dadurch war es uns möglich eine eigene Firmware nach unseren Wünschen zu schreiben.
 +
 
 +
Das Ledboard besteht aus 1536 LEDs, die zu 16 Zeilen mit jeweils 96 Spalten angeordnet sind. Der Controller wird über einen Wannenstecker angeschlossen. Es lassen sich weitere Ledboards über Wannenstecker seriell verbinden. Die Hardware kann jeweils nur eine Zeile anzeigen, was bedeutet, dass wir die 16 Zeilen zeitlich multiplexen mussten. Die Bits werden mit Shiftregistern durch eine Zeile geschoben, per Signal gespeichert und per Signal ausgegeben
 +
 
 +
Folgende Signale zur Ansteuerung sind vorhanden:
 +
{| class="wikitable" border="1"
 +
|-
 +
! Bezeichnung kurz
 +
! Bezeichnung lang
 +
! Funktion
 +
|-
 +
| R0
 +
| Red
 +
| aktuelles rotes Bit
 +
|-
 +
| G0
 +
| Green
 +
| Unused (missing bondwires)
 +
|-
 +
| HE
 +
| FET enable
 +
| FETs einschalten (komplettes Board an/aus)
 +
|-
 +
| STO
 +
| Store
 +
| Speichersignal (Speichern der Bits im Schieberegister)
 +
|-
 +
| STR
 +
| Strobe
 +
| Anzeigesignal (LEDs an)
 +
|-
 +
| CLK
 +
| Clock
 +
| Bitrate (Bei jedem Clocksignal wird R0 übernommen und weitergeschoben)
 +
|-
 +
| H0-H3
 +
| Lines
 +
| Zeilenmultiplexing
 +
|-
 +
 
 +
|}
 +
 
 +
=== Gehäuse/Kabel ===
 +
Die gelöteten Verbindungen auf der PCB sorgen immer mal wieder für Probleme. Das Board wurde auf eine MDF-Platte geschraubt, um Verwindungen zu verhindern, die diese Probleme verursachen können. Die MDF-Platte konnte dann auch ohne Probleme an der Wand befestigt werden. Die Steckleisten zum Flashen und für die serielle Kommunikation wurden mit Heißkleber am Board befestigt. Auch hier hatten sich die Drähte immer mal gelöst.
 +
 
 +
== Software ==
 +
Um einen teilweisen Bildaufbau zu vermeiden wurde ein Double Buffering verwendet. Geschrieben wird in den Backbuffer, während der Frontbuffer angezeigt wird.
 +
 
 +
Grundlegend funktioniert der Code so:
 +
# Zeile auswählen
 +
# 12*8 Bits shiften (mit Clock)
 +
# Anzeige aktivieren
 +
# Delay
 +
# Anzeige deaktivieren
 +
# goto 1
 +
 
 +
== Ansteuerung V1 ==
 +
In der ersten Version wurde das Ledboard mit einem Atmega168 inkl. 18MHz Quarz betrieben. Der Prozessor ermöglichte uns in der Konfiguration 4 verschiedene Farben. Die Kommunikation mit den Clients erfolgte über UART und es wurde ein Linuxserver geschrieben, der mehrere Nutzer mit unterschiedlichen Prioritäten multiplexte.
 +
 
 +
== Ansteuerung V2 ==
 +
Um mehr Graustufen und eine stabilere Kommunikation zu ermöglichen, haben wir uns entschieden eine neue Ansteuerung zu kreieren.
 +
 
 +
Im ersten Versuch haben wir den SPI Anschluss des Raspberry Pis verwendet. Die Software war schnell geschrieben, aber da das eingesetzte Linux kein Echtzeitbetriebssystem ist, sah das Ergebnis nicht gut aus. Wurden die Daten nur minimal zeitversetzt (vermutlich < 5ms) an das Ledboard übergeben, sah man sofort eine Zeile heller leuchten.
 +
 
 +
Als nächstes wurde ein Texas Instruments [http://processors.wiki.ti.com/index.php/Getting_Started_with_the_Stellaris_EK-LM4F120XL_LaunchPad_Workshop Stellaris EK-LM4F120XL LaunchPad] genutzt. Das Launchpad hat einen ARM Prozessor und lässt sich mit bis zu 80 MHz betreiben. Flash und Arbeitsspeicher sind auch mehr als genügend vorhanden.
 +
 
 +
Leider erfordert das Launchpad eine recht umfangreiche und chaotische Entwicklungsumgebung. Von [http://www.coocox.org/ Coocox] wird der Prozessor leider nicht unterstützt. Die Dokumentation seitens TI für den Chip und den TI CodeComposer ist sehr spärlich und undurchsichtig. Man kann davon ausgehen, dass sich der Prozessor während der Entwicklung ziemlich oft im Failstate befindet. Ohne ein Step-by-Step Debugging mit dem CodeComposer lässt sich ein solcher Fehler nur schwer finden und selbst mit sollte man hier einige Zeit einkalkulieren :-) Zudem hat die Toolchain einige ernsthafte Probleme mit zu großen Arrays auf dem Stack. Große Arrays (ab ca. 1KB) müssen global angelegt werden, sonst kommt es zu unvorhersagbaren Fehlern.
 +
 
 +
Da der Betrieb des SPI Moduls oft mit dem erwähnten Failstate endete, haben wir versucht die seriellen Daten für das Leadboard über einen GPIO zu schreiben. Mit den Standardfunktionen für den IO Zugriff haben wir allerdings nur einen sehr langsamen Bitstream geschafft. Durch direktes Ansprechen waren immerhin bis zu 40 MHz möglich.
 +
 
 +
Irgendwann funktionierte auch die Ansteuerung per SPI und 32 Graustufen. Allerdings sieht man deutlich, sobald Daten über die USB Schnittstelle per Interrupt eintrudeln. Aufgrund der 32 Graustufen sind das auch mehr Daten als in V1 nötig waren.
 +
 
 +
Um dieses erneute Flackern zu verhindern, kann man versuchen die Datenrate zu limitieren, die Übertragungsgeschwindigkeit zu erhöhen und mehr Daten per IRQ in den Puffer zu schreiben. Zudem kann man auch die Interrupts während eines Frames abschalten. Dann hat man allerdings das Problem, das Daten eventuell nicht mehr schnell genug eintreffen bzw. das die Zeit nach dem Aufbau eines kompletten Bildes nicht mehr ausreicht, um alle Daten zu empfangen. Ein riesiges Gefrickel :-)
 +
 
 +
Weitere Ideen zur Lösung des Problems sind entweder die Ansteuerung der Zeilen per Timer Interrupt oder das Hinzuziehen weiterer Hardware. Wird der Timer IRQ verwendet, muss man eventuell zusätzlich auch die Interrupts priorisieren bzw. ein nested Interrupting betreiben. Der Aufwand zum Synchronisieren der Puffer wird auch erheblich mehr und senkt somit wiederum die erreichbaren FPS/Graustufen. Die andere Idee ist die Nutzung eines CPLD mit Dual Port RAM oder ein FPGA.
 +
 
 +
 
 +
== Erweiterungen ==
 +
 
 +
Für das LED Board existieren verschiedene Tools, um eine Ausgabe auf das LED Board zu ermöglichen. Als Master fungiert der LedLoard, der die darzustellenden Daten per Socket annimmt. Hier existieren auch verschiedene Prioritäten, um z.B. Darstellungen für wichtigere Nachrichten zu unterbrechen.
 +
 
 +
 
 +
=== Game of Life ===
 +
* Sprache: Python
 +
* Code: [https://github.com/Schinken/tinyProjects/blob/master/gameoflife/gameoflife.py GitHub]
 +
 
 +
Implementierung von Conway's Game of Life für das LED Board. Die Kanten des LED-Boards bilden eine Ellipse.
 +
Wikipedia: http://de.wikipedia.org/wiki/Game_of_Life
 +
 
 +
=== gif2led ===
 +
* Sprache: Python
 +
* Libraries: PIL (python image library)
 +
* Code: [https://github.com/Schinken/tinyProjects/blob/master/gif2ledboard/gif2ledboard.py GitHub]
 +
 
 +
Darstellung von GIF-Animationen auf dem LED-Board. Das Script verwendet zum umrechnen der GIFs die PIL - Python Imaging Library. Die Animationen werden für die Darstellung skaliert und gecroppt, wobei die Ratio immer beibehalten wird.
  
=== serielles Protokoll ===
+
Beispiel:
* Setzen/Löschen/Invert von Bits und Bitarrays
 
  
=== API ===
+
  python gif2ledboard.py ~/Pictures/gifs/NyanCat.gif
* was ist gewünscht?
 
* wer macht mit?
 
  
== Technik ==
+
=== text2led ===
* Double Buffering
+
* Sprache: Python
* Atmega
+
* Libraries: PIL
* Zeilenansteuerung per Timer
+
* Code: [https://github.com/Schinken/tinyProjects/blob/master/gif2ledboard/text2ledboard.py GitHub]
* 1536 rote LEDs (16*96)
 
  
=== Funktionsweise ===
+
Ermöglicht die Darstellung von scrollenden Text auf dem LED-Board anhand einer TrueType-Schriftart.
(step-by-step)
 
* Zeile auswählen
 
* 12*8 Bits shiften (mit Clock)
 
* Anzeige aktivieren
 
* Delay
 
* Anzeige deaktivieren
 
* goto 1
 
  
Buffer Wechsel nur nachdem alle Zeilen angezeigt worden sind -> sonst hässliche Effekte
+
=== twitter2led ===
 +
* Sprache: Python
 +
* Code: [https://github.com/Schinken/tinyProjects/blob/master/gif2ledboard/twitter2ledboard.py GitHub]
  
== Gehäuse/Kabel ==
+
Sucht auf Twitter nach HashTags und gibt neue Tweets über die text2led-Library am LED-Board aus.
* Ideen willkommen, bei jedem mal anfassen löst sich ein Kabel^^
 
  
[[Kategorie:Projekt]]
+
=== ledclock ===
 +
* Sprache: Python
 +
* Libraries: pygame
 +
* Code [https://github.com/Schinken/py-ledclock/tree/ledboard GitHub]
 +
* Video [http://www.youtube.com/watch?v=9aNpc-ScDTc Google I/O Countdown Clock on LED Board]
 +
Eine Nachbildung der [http://myskrachpad.appspot.com/ Google I/O Countdown Clock]. Zur realisierung wurde pygame verwendet.

Aktuelle Version vom 16. März 2014, 14:22 Uhr

Crystal Clear action run.png
Ledboard

Status: beta

Projekt img ledboard.jpg
Beschreibung LED-Board mit 1536 roten LEDs
Autor: krisha architekt schinken
Version 0.8
PayPal Spenden für Led Board

Idee

  • API zum Ansteuern
  • IRC Ansteuerung
    • Letzte Nachrichten wiedergeben
    • Befehle zur direkten Steuerung
  • Games
    • Quiz
    • Hangman
    • Ping-Pong
    • Snake
    • Pacman
  • Blinkenlights
  • Micro-Qr-Codes

Grafiken auf PC generieren, dadurch keine Probleme mit Codegröße und mehr Möglichkeiten

Hardware

Das Ledboard entspringt einem kommerziellem Produkt bei welchem die Ansteuerung entfernt und durch eine eigene Platine ersetzt wurde. Dadurch war es uns möglich eine eigene Firmware nach unseren Wünschen zu schreiben.

Das Ledboard besteht aus 1536 LEDs, die zu 16 Zeilen mit jeweils 96 Spalten angeordnet sind. Der Controller wird über einen Wannenstecker angeschlossen. Es lassen sich weitere Ledboards über Wannenstecker seriell verbinden. Die Hardware kann jeweils nur eine Zeile anzeigen, was bedeutet, dass wir die 16 Zeilen zeitlich multiplexen mussten. Die Bits werden mit Shiftregistern durch eine Zeile geschoben, per Signal gespeichert und per Signal ausgegeben

Folgende Signale zur Ansteuerung sind vorhanden:

Bezeichnung kurz Bezeichnung lang Funktion
R0 Red aktuelles rotes Bit
G0 Green Unused (missing bondwires)
HE FET enable FETs einschalten (komplettes Board an/aus)
STO Store Speichersignal (Speichern der Bits im Schieberegister)
STR Strobe Anzeigesignal (LEDs an)
CLK Clock Bitrate (Bei jedem Clocksignal wird R0 übernommen und weitergeschoben)
H0-H3 Lines Zeilenmultiplexing

Gehäuse/Kabel

Die gelöteten Verbindungen auf der PCB sorgen immer mal wieder für Probleme. Das Board wurde auf eine MDF-Platte geschraubt, um Verwindungen zu verhindern, die diese Probleme verursachen können. Die MDF-Platte konnte dann auch ohne Probleme an der Wand befestigt werden. Die Steckleisten zum Flashen und für die serielle Kommunikation wurden mit Heißkleber am Board befestigt. Auch hier hatten sich die Drähte immer mal gelöst.

Software

Um einen teilweisen Bildaufbau zu vermeiden wurde ein Double Buffering verwendet. Geschrieben wird in den Backbuffer, während der Frontbuffer angezeigt wird.

Grundlegend funktioniert der Code so:

  1. Zeile auswählen
  2. 12*8 Bits shiften (mit Clock)
  3. Anzeige aktivieren
  4. Delay
  5. Anzeige deaktivieren
  6. goto 1

Ansteuerung V1

In der ersten Version wurde das Ledboard mit einem Atmega168 inkl. 18MHz Quarz betrieben. Der Prozessor ermöglichte uns in der Konfiguration 4 verschiedene Farben. Die Kommunikation mit den Clients erfolgte über UART und es wurde ein Linuxserver geschrieben, der mehrere Nutzer mit unterschiedlichen Prioritäten multiplexte.

Ansteuerung V2

Um mehr Graustufen und eine stabilere Kommunikation zu ermöglichen, haben wir uns entschieden eine neue Ansteuerung zu kreieren.

Im ersten Versuch haben wir den SPI Anschluss des Raspberry Pis verwendet. Die Software war schnell geschrieben, aber da das eingesetzte Linux kein Echtzeitbetriebssystem ist, sah das Ergebnis nicht gut aus. Wurden die Daten nur minimal zeitversetzt (vermutlich < 5ms) an das Ledboard übergeben, sah man sofort eine Zeile heller leuchten.

Als nächstes wurde ein Texas Instruments Stellaris EK-LM4F120XL LaunchPad genutzt. Das Launchpad hat einen ARM Prozessor und lässt sich mit bis zu 80 MHz betreiben. Flash und Arbeitsspeicher sind auch mehr als genügend vorhanden.

Leider erfordert das Launchpad eine recht umfangreiche und chaotische Entwicklungsumgebung. Von Coocox wird der Prozessor leider nicht unterstützt. Die Dokumentation seitens TI für den Chip und den TI CodeComposer ist sehr spärlich und undurchsichtig. Man kann davon ausgehen, dass sich der Prozessor während der Entwicklung ziemlich oft im Failstate befindet. Ohne ein Step-by-Step Debugging mit dem CodeComposer lässt sich ein solcher Fehler nur schwer finden und selbst mit sollte man hier einige Zeit einkalkulieren :-) Zudem hat die Toolchain einige ernsthafte Probleme mit zu großen Arrays auf dem Stack. Große Arrays (ab ca. 1KB) müssen global angelegt werden, sonst kommt es zu unvorhersagbaren Fehlern.

Da der Betrieb des SPI Moduls oft mit dem erwähnten Failstate endete, haben wir versucht die seriellen Daten für das Leadboard über einen GPIO zu schreiben. Mit den Standardfunktionen für den IO Zugriff haben wir allerdings nur einen sehr langsamen Bitstream geschafft. Durch direktes Ansprechen waren immerhin bis zu 40 MHz möglich.

Irgendwann funktionierte auch die Ansteuerung per SPI und 32 Graustufen. Allerdings sieht man deutlich, sobald Daten über die USB Schnittstelle per Interrupt eintrudeln. Aufgrund der 32 Graustufen sind das auch mehr Daten als in V1 nötig waren.

Um dieses erneute Flackern zu verhindern, kann man versuchen die Datenrate zu limitieren, die Übertragungsgeschwindigkeit zu erhöhen und mehr Daten per IRQ in den Puffer zu schreiben. Zudem kann man auch die Interrupts während eines Frames abschalten. Dann hat man allerdings das Problem, das Daten eventuell nicht mehr schnell genug eintreffen bzw. das die Zeit nach dem Aufbau eines kompletten Bildes nicht mehr ausreicht, um alle Daten zu empfangen. Ein riesiges Gefrickel :-)

Weitere Ideen zur Lösung des Problems sind entweder die Ansteuerung der Zeilen per Timer Interrupt oder das Hinzuziehen weiterer Hardware. Wird der Timer IRQ verwendet, muss man eventuell zusätzlich auch die Interrupts priorisieren bzw. ein nested Interrupting betreiben. Der Aufwand zum Synchronisieren der Puffer wird auch erheblich mehr und senkt somit wiederum die erreichbaren FPS/Graustufen. Die andere Idee ist die Nutzung eines CPLD mit Dual Port RAM oder ein FPGA.


Erweiterungen

Für das LED Board existieren verschiedene Tools, um eine Ausgabe auf das LED Board zu ermöglichen. Als Master fungiert der LedLoard, der die darzustellenden Daten per Socket annimmt. Hier existieren auch verschiedene Prioritäten, um z.B. Darstellungen für wichtigere Nachrichten zu unterbrechen.


Game of Life

Implementierung von Conway's Game of Life für das LED Board. Die Kanten des LED-Boards bilden eine Ellipse. Wikipedia: http://de.wikipedia.org/wiki/Game_of_Life

gif2led

  • Sprache: Python
  • Libraries: PIL (python image library)
  • Code: GitHub

Darstellung von GIF-Animationen auf dem LED-Board. Das Script verwendet zum umrechnen der GIFs die PIL - Python Imaging Library. Die Animationen werden für die Darstellung skaliert und gecroppt, wobei die Ratio immer beibehalten wird.

Beispiel:

  python gif2ledboard.py ~/Pictures/gifs/NyanCat.gif

text2led

  • Sprache: Python
  • Libraries: PIL
  • Code: GitHub

Ermöglicht die Darstellung von scrollenden Text auf dem LED-Board anhand einer TrueType-Schriftart.

twitter2led

Sucht auf Twitter nach HashTags und gibt neue Tweets über die text2led-Library am LED-Board aus.

ledclock

Eine Nachbildung der Google I/O Countdown Clock. Zur realisierung wurde pygame verwendet.