Led Board: Unterschied zwischen den Versionen
Krisha (Diskussion | Beiträge) (TI pain in ass) |
|||
(8 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 2: | Zeile 2: | ||
|name = Ledboard | |name = Ledboard | ||
|kategorie = Software | |kategorie = Software | ||
− | |status = | + | |status = beta |
− | |autor = krisha | + | |autor = [[User:krisha|krisha]] [[User:architekt|architekt]] [[User:schinken|schinken]] |
|beschreibung = LED-Board mit 1536 roten LEDs | |beschreibung = LED-Board mit 1536 roten LEDs | ||
|image = Projekt img ledboard.jpg | |image = Projekt img ledboard.jpg | ||
Zeile 11: | Zeile 11: | ||
[[Category:Hardware]] | [[Category:Hardware]] | ||
[[Category:Software]] | [[Category:Software]] | ||
− | |||
− | |||
− | |||
− | |||
== Idee == | == Idee == | ||
Zeile 32: | 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 | ||
− | == | + | == 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: |
− | + | {| 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 == | == Erweiterungen == | ||
− | Für das LED Board existieren verschiedene Tools, um eine Ausgabe auf das LED Board zu ermöglichen. Als Master fungiert der | + | 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 === | === Game of Life === | ||
Zeile 103: | Zeile 146: | ||
* Libraries: pygame | * Libraries: pygame | ||
* Code [https://github.com/Schinken/py-ledclock/tree/ledboard GitHub] | * 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. | 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
Ledboard Status: beta | |
---|---|
Beschreibung | LED-Board mit 1536 roten LEDs |
Autor: | krisha architekt schinken |
Version | 0.8 |
PayPal |
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:
- 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 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
- Sprache: Python
- Code: 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: 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
- Sprache: Python
- Code: GitHub
Sucht auf Twitter nach HashTags und gibt neue Tweets über die text2led-Library am LED-Board aus.
ledclock
- Sprache: Python
- Libraries: pygame
- Code GitHub
- Video Google I/O Countdown Clock on LED Board
Eine Nachbildung der Google I/O Countdown Clock. Zur realisierung wurde pygame verwendet.