Hallo Leute,
heute möchte ich euch meine neue RGB Matrix vorstellen. Es gibt hier ja schon den ein oder anderen sehr guten Matrixthread, jedoch glaube ich, dass hier noch niemand eine Matrix mit WS2811 -Chip/-Protokoll vorgestellt hat. Das will ich nun ändern. Aber erst einmal genug der Worte, hier ein paar Fotos und ein Video:
(Entschuldigt die schlechte Videoqualität aber mein Equipment gibt einfach nicht mehr her)
Und nun zu den Details:
LEDs:
Die Besonderheit an meiner Matrix sind die verwendeten LEDs. Es handelt sich hierbei um RGB- LEDs mit integriertem WS2811- Treiber. Diese habe ich vor ein paar Monaten bei einer Sammelbestellung aus China auf Mikrocontroller.net mitgeordert. Zu meiner Freude konnte ich aber feststellen, dass die LEDs mittlerweile auch ihren Weg in einige Shops von Forenmitgliedern gefunden haben. Zudem werden sie auch schon recht zahlreich in der Bucht angeboten. Der Vorteil dieser LEDs ist, dass quasi keine zusätzliche Hardwarebeschaltung nötig ist um sie zu betreiben. Eine LED verfügt über lediglich je einen Data_In und Out Anschluss sowie 2xVCC und 1x Gnd. Zwischen VCC und Gnd sollte man noch einen 100n Stützkondensator vor jede LED setzen. Den Data_In – Anschluss der nächsten LED wird einfach mit dem Ausgang der vorherigen verbunden usw. , sodass es im Prinzip am Ende eine lange Kette ergibt.
Das Thema Helligkeit ist ja immer sehr subjektiv. Daher kann ich nur sagen, dass ich die Leuchten subjektiv sehr hell finde und sie schon sehr arg blenden wenn man denn direkt reinguckt. Testweise habe ich auf einen LED mal einen Tischtennisball als Diffusor gesetzt um das ganze etwas objektiver betrachten zu können. Als Vergleich diente mir meine andere Matrix bei der folgende Dioden verwendet wurden.
Fazit: Beide gleich hell. Laut Beschreibung* gönnen sich die LEDs voll angesteuert 3x 20mA. Das würde bei meinem jetzigen Aufbau mit 80Px also ca. 5A machen. Leider kann ich das nicht nachprüfen, da mein Multimeter nicht mehr ganz vertrauenswürdig zu seien scheint.
*Das ist bis jetzt das einzig negative, was ich über die Dioden sagen mag: Es gibt scheinbar nirgendwo ein offizielles Datenblatt...
Platinen:
Den Schaltplan und Platinen habe ich mit Eagle gemacht. Ein Modul ist 5x5cm² groß und besitzt 4 Pixel (Pitch = 2cm). Zur späteren Montage verfügt
jedes Modul über eine 3mm Bohrung in der Mitte. Des weiteren verfügt das Modul rechts über eine 4-polige Stiftleiste, links über die entsprechende Buchse, Diese Anschlüsse „transportieren“ die Versorgungsspannung sowie Data_In und _Out. Oben und Unten gibt es nochmal einen 2-polige(n) Stecker/ Buchse für VCC und Gnd. Wie man auf den Fotos sehen kann lassen sich die Platinen so nahtlos zusammenstecken.
Was man auf den Fotos und Videos nicht so gut sehen kann ist, dass man am Ende jeder Zeile einen Jumper setzen muss der das Signal an die untere Zeile weiterreicht. Bei mehr als 2 Zeilen müssen ebenfalls auf der linken Seite das Data_Out eines Moduls mit dem Data_In des darunter liegenden Moduls verbunden werden.
Die Platinen habe ich bei Itead herstellen lassen. 20 Stück für knapp 20€ inkl. Versand, da kann man nicht meckern, zumal ich auch mit der Qualität und Lieferdauer (ca 1 Monat ab Bestellung) sehr zufrieden bin.
Software/ µC:
Die eigentliche Effektgenerierung erfolgt mit Glediator. Die Daten werden im TPM2- Protokoll per USB- UART- Wandler mit 1Mbit an einen ATMega328P
weitergereicht. Für den Moment ist dieser Teil der Schaltung nur auf Lochraster realisiert. Wobei die Schaltung eigentlich nur aus µC, Quarz, 3 Kondensatoren und einem ISP- Anschluss besteht.
Die Software ist in ASM geschrieben und ist zum Download angehängt. Die TPM2- Empfangsroutine stammt von Pesi und wurde ursprünglich für das
SEDU- Board geschrieben (Danke nochmal dafür) . Diese habe ich noch dahingehend modifiziert, dass ich auf die eingehenden Daten eine Gammakorrektur durchführe. Nach einigem Testen sieht diese nun so aus, dass die Helligkeitswerte 0-127 linear umgewandelt werden ( Werte werden mit 0,44 multipliziert), die Werte 128-255 werden mit einer Potenzfunktion[(255* ( X /255) ^ 2,2) + 0,5] umgewandelt.
Da die Umwandlung nur im 8- Bitraumstattfindet, gehen mir dabei ca. ein Viertel der möglichen Stufenverloren. Jedoch konnte ich rein subjektiv betrachtet keinen wirklichen Unterschied zu meinem Nachbau von Pepes Matrixschaltung erkennen, bei der die Umwandlung von 8 Bit auf 12 Bit stattfindet.
Weiter geht’s mit der Ausgaberoutine. Die Art und Weise wie die WS2811Controller ihre Daten bekommen wollen ist gar nicht so trivial und
waren letztendlich auch der Grund warum das ganze in Assembler geschrieben wurde. Es gibt nämlich wie bei anderen LED- Treibern z.B. WS280x, TLC5940 etc. keine Taktleitung. Dies macht jedoch die Ansteuerung komplizierter, da hierbei ein festes Timing
eingehalten werden muss. Kurz erklärt für eine logische „0“muss zuerst ein 250ns Highpegel gefolgt von einem 1µs Lowpegel „gesendet“ werden. Für eine „1“ 600ns High und 650ns Low.Nach diesem Schema müssen nun die (3*8 Bit pro Pixel) *Anz. Px gesendet werden. Ist dies geschehen, so folgt ein min. 50µs langer Lowpulse damit die Daten übernommen werden.
Ausblick:
Als nächstes muss ich mich mit den theoretischen Grenzen, sprich max.Pixelzahl, beschäftigen. Will ich alle Daten puffern, so würde der µC theoretisch ca. 670 Pixel (Anz. Px *3 <=2kB SRAM) zulassen aber ich denke nicht, dass das bei einer Framerate von 21 /s machbar ist. Wie ich das theoretisch ausrechne ist mir, denke ich klar aber falls jemand Ideen hat, wie ich das ganze auch in der Praxis testen könnte, ohne 100*X Pixel anzuschließen (weil soviele habe ich garnicht ) wäre ich darüber sehr dankbar.
Zudem denke ich darüber nach dem µC vielleicht noch das ein oder andere Standaloneprogramm zu spendieren, denn bei bisweilen 2,2% benutztem Flash ist da noch reichlich Platz aber das ist erstmal Zukunftsmusik.
Und nun bin ich auf euer Feedback gespannt!
drs
EDIT: Da ich drum gebeten wurde hier noch ein paar weiterführende Links zu den LEDs:
Link1
Link 2
Link3
Link4