Projekt: Auf dem Weg zur RGB-Matrix

  • Hey,
    meine Matrix befindet sich im Aufbau:


    Es handelt sich hierbei um eine 16 x 16 Matrix mit Pixelraster, jedes "Pixel" wird 30mm*30mm groß und hat eine Höhe von 35mm - 40mm.
    Die einzelnen Zellen/Pixel enthalten je zwei RGB-LED's. Die LED's werden mit 60mA PWM betrieben, wobei jeweils 16Zeilen und 4Spalten einen "Block" bilden.



    Bis jetzt Organisiert/Bestellt:


    - 1k LED's bestellt (PLCC6 aus China) Ankunft wegen Neujahr ~April :S
    - MDF Platten: 2 Stück 481,1mm x 481,1mm Grundfläche, 6mm stark, zwischen die Platten werden die Kabel verlegt
    - 2 mal 70cm*100cm Bristol Pappe (1mm Dick) für das Pixelraster
    - Plexiglas: fertige "Haube" aus Satin-Ice 3mm, bin noch im Gespräch mit dem Händler



    Mechanisch:
    Aus der Bristol Pappe werden 30 Streifen je 40mm*482mm geschnitten, diese werden alle 30mm bis zur hälfte eingeschnitten und anschließend ein Gittermuster/Pixelraster daraus zusammengesteckt und mit Epoxy verklebt.
    In die erste MDF Platte wird mit einer Oberflächenfräse/CNC-Fräse ein Gitter geschnitten. Dieses soll von der vorm genau dem Pixelraster entsprechen, so das ich dieses dort hineinstecken und anschließend befestigen kann. Vorher werde ich eine Seite weiß färben und Löcher für die LED's hineinbohren.


    Die zweite MDF Platte kriegt Nuten (genauer 48 Stück) für die Spalten Ansteuerung. Dort werde ich Schweißdraht/Kupferadern hineinlegen und anschließend mit Holzleim/Epoxy vergießen.
    Anschließend wird die erste MDF Platte oben drauf geklebt und das Grundgerüst steht.



    Elektrisch:
    Schaltplan Konzept bisher (verbessert):




    Erklärung:
    Die Matrix wird per USB und selber entwickelten (Usermode-) Treiber angesprochen, desweiteren sollen einige "kleine" Programme direkt auf dem ATmega laufen (z.B. Uhr).
    Insgesamt hab ich versucht möglichst alles auszulagern was nicht unbedingt berechnet werden muss.


    Jede LED soll mit ~500Hz (sind etwas weniger) laufen, genauer sind es
    Block-Frequenz: 8Mhz / (4096+x) = ~1950 Hz
    LED - Frequenz: 1950Hz / 4 = ~487 Hz
    Das ist eine Konstante von grob 10. Grund ist das ich nicht unmittelbar nach Abschluss des PWM-Zykluses das Blank Signal aufrufe (siehe Software).


    Mein µC gibt konstant einen Takt von 8MHz aus [Port 17], dieser geht direkt in das Clock Signal der TLC5940.
    Zusätzlich speist dieser auch das Binärzählwerk 4020N, welches alle 1024 Ticks ein Signal an den µC sendet. Dieses sorgt nun für einen Interrupt (weiteres hierzu siehe Software).


    Die BLANK-Lines resetten den jeweiligen TLC-Block und schieben das mit "0111" Initialisierte zyklische Schieberegister ein Bit weiter. Das Signal der Register (GND/VCC) schaltet die IRF7314 P-Kanal Mosfets.
    Diese sind an die Spalten der Matrix angeschlossen sind.


    Die Serielen Daten werden über USART im SPI-Modus geschickt. (Vorteil: gepuffert -> schneller)



    Software:


    Nach der initialisierung der internen und externen Bausteine arbeitet der µC vorallem im Interrupt Betrieb. Alle 1024 PWM Takte wird dieser ausgelöst und sorgt für das Setzen der neuen Daten für einen "Block".
    Dabei müssen (3x96Bit DC + 3*192Bit PWM=) 864Bit Daten geschrieben werden. Da ich genau 2048 CPU Takte Zeit habe wird das eine knappe angelegenheit.
    Inwieweit Datenempfang mit USB noch möglich ist muss ich ausprobieren.


    Laufzeitanalyse Interrupt:
    Senden - 1728 Takte
    Bits kopieren - 108 Takte
    Interrupt - ~15 Takte (stimmt das?)
    BusyWaiting - 108 Takte (hoffentlich... im schlechtesten Fall 216, weiß einer mehr?)
    --------------------------------
    Macht im worstcase 2067 :S




    Die etwas ausgefallenere Ansteuerung der TLC's sorgt hoffentlich dafür das ich auch DotCorrection nutzen kann ohne das dabei etwas flackert.
    Die Spannungsversorgung stammt aus einem 7,5V/20A Schaltnetzteil und sollte mehr als ausreichen.



    Gibt es noch fragen/Fehler/Verbesserungen?


    Besteht überhaupt Interesse das ich den Bau dokumentiere,
    oder gibt es inzwischen genug?



    Beste Grüße
    Matyr



    Ps. Bilder kommen wenn es ich die ersten Sachen habe.



    Edit (07.02.2013 20:00) - genauere Beschreibung, Fehler berichtigt
    Edit (08.02.2013 14:30) - FlowGraph + Erklärung hinzugefügt
    Edit (23.02.2013 15:00) - Update

  • Hallo,


    also das Multiplexen habe ich mir jetzt nicht durchgeschaut. Aber das System sieht schon etwas merkwürdig aus... Die DOT Korrektion macht man doch im Grunde nur einmal. Ist dann dieser Aufwand gerechtfertigt?


    USB ist falsch angeschlossen, steht auf Wikipedia wie es richtig ist.


    Im Ganzen ist das aber durch die etwas andere Ansteuerung schon wieder interessant und darf von mir aus, gern Dokumentiert werden ;)


    Grüße


    Basti

  • Also ich habe da schon noch ein paar Fragen. Erstmal zum mechanischen Aufbau.


    Sind die MDF Platten wirklich 4811mm x 4811mm gross? Das waeren knapp 5m x 5m. ;)


    Du moechtest SMD LEDs einsetzen, aber ich verstehe nicht, wie das mit den MDF-Platten zusammenpasst. (Ok, Du koenntest digitale LED-Stripes auf die MDF-Platten kleben. Dann brauchst Du aber wohl keine Matrixansteuerung, die Du jedoch hast.)


    Was genau machst Du mit der Bristol-Pappe?


    Welche Aufloesung soll Deine Matrix eigentlich haben? So richtig werde ich nicht schlau aus Deiner Schaltung und den anderen Angaben (1k LEDs, 2 LEDs pro Pixel)


    Na zur Schaltung/Programmierung sollen lieber Leute mit mehr Erfahrung was sagen. Aber mein Bauchgefuehl sagt mir, Du hast die verfuegbare Rechenleistung ueberschaetzt. (Jede Spalte 500 mal pro Sekunde ansprechen und so. Dafuer musst Du ja auch die Zeilendaten rauspumpen.)


    In jedem Fall wuensche ich Dir viel Erfolg.


    Gruesse,


    AH

  • Die Ansteuerung der FETs sieht mir komisch aus.


    Es sind P-Channel FETs, d.h. die muss man zum Durchsteuern auf Masse ziehen, zum Sperren aber möglichst auf Drain Potential anheben. D.h. bei Deiner Beschaltung werden die nur gerade eben so sperren, wenn überhaupt (Die steuern lt. DB schon bei Vgs= -2.bisslewas V fast voll durch!). Hier würde ich zur Sicherheit noch eine Treiberstufe zwischenhängen, was in Anbetracht der angestrebten Schaltgeschwindigkeit vermutlich eh nicht verkehrt wäre.


    Und bitte erklär uns nochmal genau wie die Spaltenansteuerung funktionieren soll. Mir erschliesst sich nicht so recht, wer da nun wann die 74HC164 steuert/taktet: der µC oder der 4020N?
    Und was soll in die 74HC164 geschoben werden? Eine 1 die durchwandert oder eine 0 die durchwandert?


    Und zu den 500Hz: Du brauchst pro TLC 192Bit an Daten, macht bei Dir dann 192Bit x 12 = 2304 Bit pro Spalte. Davon hast Du 16 Stück, macht also 36864Bit pro Frame.
    Das reicht bei 16MHz rechnerisch grad mal für 434 FPS, aber der Wert ist auch noch viel zu hoch weil das SPI-Interface vom Mega8 nicht mit vollem sondern maximal halben CPU-Takt läuft. Dazu kommt noch, dass man noch ein paar Zyklen zum Laden des neuen Werts in die Register braucht und schon bleibt von den 434Hz nicht mehr wirklich viel übrig, selbst wenn Du Interrupts verwendest.
    Und wir reden hier nur von der Datenübertragung! Da ist noch kein Bild/Grafikeffekt/Uhrzeit berechnet...


    Mit effizienter Programmierung müsste das Ganze noch zu bewerkstelligen sein, aber es ist schon ziemlich eng.
    Ich denke, man kann unterm Strich eine für's menschliche Auge flimmerfreie Anzeige hinbekommen, rein von den grundsätzlichen Möglichkeiten der Hardware gesehen.

  • Also das Konzept ist mir auch nicht ganz klar, aber mir scheint auch, dass du (Matyr) es selbst möglicherweise auch nicht bis zum Ende durchdacht hast.


    Die Matrix sieht mir nach einem 64 Zeilen x 16 Spalten RGB-System aus (wobei hier die Spalten gemultiplext werden). Ob du's dann organisatorisch und vom Layout her als 32 x 32, 2 x 32 x 16 oder auch als 4 x 16 x 16 aufbaust, spielt im Grunde für die Ansteuerung keine grosse Rolle. Du fütterst ja die PWM mit 8 MHz, was bei 12 Bit (also 4096 Clocks) und einem vollständigen PWM-Zyklus pro Spalte dann eine Spaltenumschaltfrequenz von 1953 Hz ergibt. Bei 16 Spalten ergibt das eine Bildwiederholrate von gerade mal 122 Hz. Wie du da auf 500 Hz gekommen bist, ist mir schleierhaft.
    Wenn du allerdings 'nur' eine 16 x 16 RGB-Matrix aufbauen willst und diese eben organisatorisch in 4 x 4 Spalten x 16 Zeilen aufteilst, wobei jeweils immer 4 Spalten parallel durchgeschaltet werden und jeweils 16 Zeilen pro 4 Spalten verwendet werden (also insgesamt die 64 Zeilen), dann dürfte das mit den 500 Hz (genauer: 488 Hz) hinkommen. Du musst dann allerdings deine beiden Spalten-Schieberegister mit 0001000100010001 vorladen (vor dem automatischen Zyklisch-Schieben).


    Das Problem bzw. die Performance-Problematik wird aber aber sowieso nicht die Spaltenumschaltung sein (der du so viel Hardware gewidmet hast), das bekommt der µC problemlos hin. Die Zeilen-Daten für jede Spalte zeitig rauszuschieben und die Synchronisation mit der PWM-Clock bzw. den PWM-Zyklen und damit der Spaltenumschaltung ist die eigentliche Herausforderung. Wie willst du zum Bsp. die Synchronisation der Zeilen-Daten-Einschiebung mit der Spaltenumschaltung bewerkstelligen, wenn du schon die Spaltenumschaltung vollautomatisch (abgekoppelt vom µC) durchführen willst? Davon sehe ich nichts im Schaltplan.
    Wie mein Vorredner bereits geschrieben hat, musst du pro Spalte mindestens 192 x 12 = 2304 Bit rausschieben (wenn du noch Dot Correction für jeden Pixel machen willst, dann sogar 288 x 12 = 3456 Bit). Bei 4096 Clocks bei 8 MHz pro Spalte Zeit muss dein Daten Rausschieben mit mindestens wohl 6 MHz erfolgen, besser noch mit 8 MHz. Wie ich gesehen habe, hast du Serial In und Serial Clock mit einfachen Portpins am AVR verbunden. Bei den Geschwindigkeiten kannst du es eigentlich gleich vergessen, das mit Bitbanging machen zu wollen. Du solltest unbedingt die Hardware-SPI nutzen, und selbst dann wird's schwierig.


    Und da ist dann noch nicht einmal von den sonstigen Dingen die Rede, die dein µC 'parallel' machen muss. Und die Implementation von Doppel-Bildpuffern (Stichwort: PingPong) im RAM lasse ich auch mal beiseite, solange nicht klar ist, was du eigentlich wirklich erreichen willst.


    Gruss
    Neni

  • So, ich habe den Post oben mal editiert und einige Infos hinzugefügt bzw. fehler korrigiert.


    Eine Treiberstufe für die Mosfets ist wahrscheinlich sinvoll... werde ich nachher mal einzeichnen.
    Aber erstmal der Flowgraph für die Software, damit ich/ihr einen groben Überblick bekommt :P


    Grüße
    Matyr

  • Flowgraph hinzugefügt,
    weiß einer von euch wieviel Ticks der Atmega für einzelne Operation benötigt?


    Grüße
    Matyr


    Edit: Hat sich erledigt "Instruction Set" im Datenblatt gefunden!


    Edit 2: Bin gerade am Platinen Layout update kommt demnächst

  • Hey, mal wieder ein kleines Update von mir :thumbup:


    Aufgund der Klausuren und den Vorbereitungen für meine Bachelorarbeiten geht es etwas langsamer voran.


    Heute sind die PLCC6 gekommen, schon die ersten zum Leuchten gebracht :)
    Rot ist etwas dunkel aber noch im Rahmen.
    Überleben die 50mA in 1/4 Taktung?



    Ich hab desweiteren mal meinen neuen Schaltplan und mein Layout hochgeladen. Befestigungslöcher kommen noch. Gibt es hier noch irgendwelche fehler? (bild siehe ersten Beitrag)
    Wenn nicht werde ich diese wahrscheinlich so in Auftrag geben.



    Im laufe der Woche werde ich wahrscheinlich Mini-LED-Platinen selber Ätzen um die PLCC6 darauf zu befestigen.


    Gibt es Ideen wie ich die schneiden kann? Immerhin brauche ich 256 Stück...
    Ich wollte bisher eine Nass-Fliesenschneidmaschine nutzen, mit Diamant Blatt.


    Grüße
    Matyr

  • Hm, die Abstände der Platinen sind irgendwie zu klein... Oder wie dick soll dieses Diamantblatt sein? Gerade die Anschlüsse untern werden zum Problem... triffst du die, ist die wahrscheinlichkeit von MiniBrücken groß...


    Hm, dir ist aber bewusst, dass es auch PLCC6 LEDs aus China für wenige Cent gibt, die haben schon den Controller drin... Also Spanung dran und Datenleitungen in Reihe und ab gehts...
    Finde den zusätzlichen Hardwareaufwand für Hobbyisten zum Multiplexen nicht mehr so prikelnd... Die 20 € die man an Geld spart, holen die zusätzlichen Arbeitstunden sehr schnell ein :-/
    Bei der Sammelbestellung auf uC kamen die zum Schluss auf 13 cent die LED mit allem drum und dran...


    Grüße Basti

  • Sehe ich auch so - gespart hat man auch unter'm Strich nix bei solchen Pixel-Preisen...


    das einzige Argument hier ist halt, dass er mit dem TLC 12 Bit Auflösung macht - die ganzen fertig-LEDs (APA101, WS2811) haben nur 8 Bit...


    aber spätestens wenn's mal gute PLCC6-LEDs mit 12/16-Bit-Chip direkt drin (MY9221 o.ä.) zu nem guten Preis gibt, dann hat sich das Thema multiplexen oder irgendwie LEDs an nen extra Chip klemmen für sowas komplett erledigt...

    It's only light - but we like it!


    Da es sich in letzter Zeit häuft: Ich beantworte keine PNs mit Fragen, die sich auch im Forum beantworten lassen!
    Insbesondere solche von Mitgliedern mit 0 Beiträgen, die dann meist auch noch Sachen fragen, die bereits im entsprechenden Thread beantwortet wurden.
    Ich bin keine private Bastler-Hotline, technische Tipps etc. sollen möglichst vielen Lesern im Forum helfen!

  • Stahl:

    Zitat

    Welche Platinen willst du nehmen epoxy oder hartpapier?

    Epoxy Platinen für die LED-Module, die kriege ich für den gleichen Preis wir Hartpapier. Die andere Platine lasse ich fertigen, daher wahrscheinlich auch Epoxy.


    Counterfeiter:

    Zitat

    Hm, die Abstände der Platinen sind irgendwie zu klein... Oder wie dick
    soll dieses Diamantblatt sein? Gerade die Anschlüsse untern werden zum
    Problem... triffst du die, ist die wahrscheinlichkeit von MiniBrücken
    groß...

    Stimmt, das Blatt hat eine Dicke von 1.9mm, die sollte ich auch beachten... war noch gedanklich bei Cutter-Messer.

    Zitat

    Bei der Sammelbestellung auf µC kamen die zum Schluss auf 13 Cent die LED mit allem drum und dran...

    Ich hab für meine LED's 3.3ct das Stück bezahlt :P
    Mir geht es eigentlich hauptsächlich um das Basteln und Programmieren bzw. daraus zu lernen, daher der Ansatz. Mehraufwand stört also garnicht
    Hoffe das ganze funktioniert auch hinterher :D, obwohl es etwas unkonventionell ist.

  • Mittlerweile muss man nicht mal mehr bei Sammelbestellungen mitmachen, um WS2811-PLCC6-RGB-LEDs für um die 0.13 - 0.14 $ pro Stück zu bekommen, schon ab 50er oder 100er Mengen, beim Chinesen seiner Wahl. Ich habe mir auch schon welche bestellt, einfach um sie mal bei relativ unkritischen Spielerei-Projekten einsetzen zu können.


    Allerdings sehe ich den Einsatz solcher LEDs etwas differenzierter als meine Vorposter.


    Für Matrix-Anwendungen mit geringem bis sehr geringem Pixel-Pitch würde ich auf jeden Fall eine echte Matrix-Verschaltung vorziehen, da man dadurch schon mal sehr viel Strom einsparen kann. Gängige, hochwertige RGB-LEDs namhafter Hersteller benötigen bei entsprechend enger Platzierung gerade mal 1 - 2 mA pro Pixel und Farbe im Schnitt (je nach Multiplexing um die 15 - 30 mA pro LED und Farbe in einer Zeile), um bei Weiss Leuchdichten von 1500 - 2500 Cd / m^2 zu erreichen, was auch in tageslicht-hellen Räumen gute Sichtbarkeit und Kontraste ermöglicht. Für Outdoor-Anwendungen braucht es ca. 4000 - 5000 Cd / m^2 oder mehr, da müsste man dann höher bestromen.


    Leider kann man bei den mir bisher bekannten 'Digital-LEDs' den Strom nicht einstellen, da er fest auf um die 20 mA pro Farbe eingestellt ist. Damit kommen diese LEDs bei eng bestückten Matrix-Anwendungen eigentlich kaum in Frage. Ein grosser Nachteil ist diesbezüglich auch, dass man keinen Weissabgleich via Stromeinstellung für die drei Farben machen kann, sondern dafür u.U. PWM-Bittiefe opfern muss.


    Ausserdem ist bei mir auch immer die Frage der Selektion der LEDs eine entscheidende. Für den 0-8-15-Hobbyisten und je nach Anwendung mag das nicht so eine Rolle spielen, aber ich bin gerne bereit, mehr zu bezahlen, wenn ich dadurch z.Bsp. pro Reel selektierte LEDs mit einer garantierten Variantionsbreite von 'nur' ca. +/- 11 % (Lichtintensitätswerte) bekomme. Und sowas gibt's eben praktisch immer noch nur bei Markenware, leider.


    Gruss
    Neni


    EDIT: Ich muss mich korrigieren. Die APA-101-LEDs haben eine globale Stromeinstellung von 5 Bit, d.h. 32 Stufen. Damit wären sie auch für niedrigere Bestromungen verwendbar, bieten aber für den Weissabgleich keinen Vorteil, da es eben eine globale Einstellung ist.