Inhaltsverzeichnis
LED-Matrix
Die LED-Matrix basiert auf LED-Strips mit dem dem kombinierten LED- und Treiberchip WS2812 (Datenblatt). Die LEDs hängen hintereinander auf derselben Datenleitung und wirken als langes Schieberegister. Jeder Chip speichert drei Bytes für die Einstellung der frei Farben RGB mit je 255 Helligkeitsstufen.
Unsere Matrix besteht aus 16×16 Pixeln, entsprechend müssen für die Darstellung eines Bildes 786 Bytes in das Matrixregister geladen werden. Die Daten werden mit 800 kBit/s übertragen und sind über die Pulsbreite kodiert. Der Arduino schafft die Geschwindigkeit nicht ohne weiteres. Auf Assembler-Ebene ist es jedoch möglich durch Abzählen der Prozessortakte das Timing korrekt hinzubekommen. Glücklicherweise existiert mit der "Adafruit NeoPixel"-Bibliothek bereits der notwendige Code. Alternativ wurde für die Realisierung auch eine Lösung mit FPGA diskutiert.
Die LEDs brauchen bei maximaler Helligkeit sehr viel Strom. Die Stromversorgung über die ganze Länge von 256 Pixeln nur durch die Strips selbst erwies sich als nicht ausreichend - es war ein starker Helligkeitsabfall vom Einspeisepunkt zum Ende zu beobachten. Daher wird jede Zeile von beiden Seiten mit ausreichend dimensionierten Kabeln versorgt. Die maximale Stromaufnahme der Matrix kann bis zu 10 Ampere bei 5 Volt Versorgungsspannung betragen! Entsprechend ist für die Versorgung der Matrix ein PC-Netzteil mit ausreichender Leistung vorgesehen.
Die LEDs-Strips stellten sich als sehr empfindlich gegenüber elektrostatischen Entladungen am Dateneingang, Spannungsspitzen und zuviel Hitze beim Löten heraus. Einige LEDs (und zwar immer die erste in der Reihe) sind bei den ersten Experimenten bereits kaputt gegangen. Zwischen Dateneingang und +5V bzw. GND wurden daher Dioden geschaltet, die Überspannungen auf der Datenleitung in die Stromversorgung ableiten sollen. Allerdings konnten diese zuletzt nicht den Ausfall einer weiteren LED verhindern.
Unter Umständen kann auch das Netzteil zumindest beim Ein- oder Ausschalten Quelle von Spannungsspitzen sein. Dies muss weiter untersucht werden - als erste Maßnahme wurden zwischen +5V und GND zwei Kondensatoren (1x Elko mit 100uF und 1x Keramikkondensator mit 100 nF) geschaltet, die etwaige Spannungsspitzen aufnehmen sollen. Mit den Schaltimpulsen auf der Datenleitung wird ein Transistor geschaltet, der seinerseits die Datenleitung der Diodencontroller aus der Diodenversorgunsspannung High oder Low schaltet. Dadurch wird verhindert, dass Spannungspitzen oder zu hohe Spannungspegel von der Mikrocontrollerschaltung auf den Dateneingang der Dioden durchschlagen. Diese Schutzschaltung hat bisher ganz gut funktioniert.
Datentransfer
Der Arduino wurde zusätzlich mit einem Ethernet-Shield ausgestattet, um Daten entweder über das Netzwerk oder über den integrierten microSD-Kartenslot zu bekommen. Derzeit ist nur die Netzwerkvariante implementiert.
Um Bilder auf die Matrix zu bringen, muss an den Arduino (172.22.239.182:8888 im LAN des Krautspace) ein UDP-Paket geschickt werden, das als Payload die 786 Bytes enthält, die die RGB-Werte jedes Pixels enthalten. Derzeit erfolgt der Bildaufbau zeilenweise von links unten nach rechts oben. Damit lassen sich theoretisch sogar geeignet umgerechnete Videos streamen - die erreichbare Framerate muss noch getestet werden.
Um den Datentransfer oder das Aussehen von Bildern auf der Matrix zu testen, ohne die Matrix vor Ort haben zu müssen, existiert inzwischen ein Matrix-Simulator in Python. Das Programm hört auf UDP 127.0.0.1:8888 und stellt empfangene Daten in einem pygame-Fenster dar.
Der Screenshot zeigt in der oberen Shell das Senden letzten 768 Bytes einer BMP-Datei (die eigentlichen Bilddaten) mit:
tail -c 768 krautspace.bmp | nc -u -q0 127.0.0.1 8888
In der Shell unten läuft der Simulator und gibt die empfangenen Daten als RGB-Triplets aus. Daneben stellt pygame das ganze grafisch in einem Fenster dar. Praktischerweise erfolgt der Bildaufbau in einer BMP-Datei wie bei der LED-Matrix von unten. Zu beachten ist aber, dass in BMP-Dateien das niederwertigste Byte eines Triplets den Blaukanal enthält, die Reihenfolge also BGR ist.
Nächste Schritte
- Lösung für das Streamen von Bildern/Videos über UDP komplettieren
- Wiedergabe von Bildern über microSD implementieren
Bilder und Videos
Hardware
- 2x5m LED-Band im Silikonschlauch
- LEDs einzeln ansteuerbar
- Chip: WS2812 (http://www.ccc-mannheim.de/wiki/LED-Strip)
- 10m x 30 LEDs/m = 300 LEDs
- Auflösung: 16×16 = 256 Pixel
- Format: 52cm x 52cm
- Farbtiefe: 24Bit
- Montierung auf Plexiglasplatte 55cm x 55cm
- Fixierung: breites transparentes Klebeband
- Installation im Erkerfenster 66,5cm x 72,5cm
- Ansteuerung: Arduino
- Stromverbrauch: ca. 4,5A/128 LEDs bei 5V in Weiß
Software
- Die NeoPixel-Bibliothek von Adafruit erlaubt die einfache Ansteuerung der LEDs mit einem Arduino. Diese wurde bereits erfolgreich getestet.
- Unter https://github.com/HackspaceJena/rgb_led_matrix findet sich der Arduino-Code für das Streaming über UDP mit dem Ethernet-Shield, sowie der Simulator für die Vorbereitung von Streams ohne die Matrix.
Kosten
- LED-Bänder einschließlich Versandkosten: 74,42€
- Zollgebühr: 21,76€
- Plexiglasplatte 1m x 1m: 25,99€
- Klebeband: 6,25€
- Arduino: Spende von ks
- Ethernet-Shield: Leihgabe von ulip
- RaspberryPi: ~35€ +/-3€
- Trafo 5V/10A: ??
Finanzierung
- ks: Vorschuss
- ul: 20€
- jh
- jojo
- f.k: 20€
bisherige Kosten: LED-Streifen + Plexiglasplatte + Klebeband = 128,42€
Schutzdioden
Hier wird eine Platine zum Ueberspannungsschutz beschrieben. Die Platine enthält einen Widerstand 270 Ohm SMD08/05 am Daten Eingang, zwei Dioden 1N4148 SMD zwischen GND und Daten bzw. Daten und VCC, und eine Diode P6KE zwischen VCC und GND.