Der RGB Cube mit 8x8x8 LEDs


Beim Surfen im Netz stieß ich auf dieses Projekt: RGB-Cube auf Youtube.
Sofort war klar, ich brauche auch so ein Teil. Trotz intensiver Suche im Internet fand ich leider keinen fertigen Plan zum schnellen Nachbau.
Also hieß es selbermachen - deshalb entsteht hier ein open-Source Projekt für eben so einen LED-Würfel.

Am Anfang waren die LEDs ...

In Deutschland sind RGB-LEDs kaum unter einen Euro pro Stück zu bekommen.
512 LEDs * 1€ = auweiha!!! Das ging auf keinen Fall, also nahm ich Kontakt mit einem Hersteller aus Fernost auf.
Dort bestellte ich gleich 600 Stück für einen Bruchteil von dem was ich hier bezahlt hätte.
Also konnte es weitergehen...

600 Leds

Ich habe diffuse LEDs ausgewählt, um eine bessere seitliche Lichtausbeute zu erreichen.
Die LEDs haben eine gemeinsame Kathode und je eine Anode für rot, grün und blau.


Testschaltung

Bedenkt man die nötigen IO-Pins, bei 512 Leds mit je vier Anschlüssen, kommt nur eine Multiplexansteuerung in Frage. Bei der Betrachtung der Stromaufnahme erstrecht (512 LEDs * 3 Farben * 20mA = 30,72 Ampere!!!). Beim Multiplexing ist jede LED nur für eine bestimmte Zeit (x) eingeschaltet und dann eine längere Zeit (n*x) abgeschaltet. Um zu testen wie lang die Zeit n*x dauern darf, wurde eine Testschaltung aufgebaut. Außerdem ist es beim Multiplexing üblich, die LEDs mit einem höheren Strom als 20mA zu betreiben. Laut Hersteller darf der Impulsstrom max. 120mA betragen, wenn die LED danach etwas Zeit zum "Ausruhen" bekommt. Um die LEDs nicht an der oberen Grenze zu betreiben, setzte ich zunächst 100mA als Limit an.

Testschaltung

Der zum Testen verwendete Controller ist natürlich völlig überdimensioniert, aber den hatte ich halt noch in der Schublade. Der Controller kann nicht die geforderten 100mA pro Ausgang liefern, deshalb kommt ein so genannter Source Driver (UDN2981) zum Einsatz. Die drei FETs (IRLZ34N) sind die, die auch später verwendet werden sollen. So kann der Spannungsfall der einzelnen Komponenten gleich mit gemessen werden. Als erstes stellte ich fest, dass die Betriebsspannung von 5Volt für einen Strom von 100mA pro LED nur sehr knapp ausreicht. Es fällt einfach zu viel Spannung im UDN2981 und über dem Transistor ab - jedenfalls bei der blauen LED. Der nötige Vorwiderstand für die blauen LEDs würde sehr klein werden. Dies führt wiederum dazu, dass eine nur kleine Schwankung der Betriebsspannung eine große Stromänderung in den blauen LEDs hervorrufen würde. So beschloss ich die Betriebsspannung für die Source Driver und somit für die LEDs auf 7,5Volt zu erhöhen.

Ergebnisse:
Bei den Multiplextests kam ich zu dem Ergebnis, dass die LEDs bei einer PWM von 1/16 noch als recht hell wahrgenommen werden. Ein weiteres eher unerwartetes Ergebnis war, dass die grünen LEDs einen deutlich geringeren Strom benötigen, um subjektiv die gleiche Leuchtstärke wie die anderen Farben zu entwickeln. Da man den Maximalstrom bei einer PWM nicht einfach mit einem Multimeter messen kann, wurde er mit einem Oszilloskop ermittelt (Spannung über dem Vorwiderstand messen durch den aufgedruckten Widerstandswert teilen).
Vorwiderstände mit UDN2981, IRLZ34N und UB=7,5Volt:

FarbeWiderstandIV Peak (ca.)PVR Peak (ca.)
rot39Ω94 mA344 mW
grün150Ω18 mA49 mW
blau18Ω94 mA159 mW



Stromkalkulation für den worst case:

Bei dem 1 aus 16 Multiplexing sind maximal 32 LEDs einer Farbe zeitgleich eingeschaltet.
So kommt man zu folgenden Strömen:

IR = 32 * 94mA = 3,008A
IG = 32 * 18mA = 0,576A
IB = 32 * 94mA = 3,008A
IRGB = 6,592A


Schaltungsentwicklung:

Bei dem ermittelten Multiplexing von 1 aus 16 ergibt sich folgende Matrix für die Ansteuerung des Cubes:
- 16 gemeinsame Massen für jeweils 32 LEDs oder eben 96 Farben
- 96 Pins für die Anoden welche gleichzeitig aktiv sein können

Um die IO-Pins des Controllers zu erweitern, kommen oft seriell beschreibbare Schieberegister zum Einsatz. Bei dieser Methode braucht man im Prinzip nur zwei IO-Pins (Clock und Data) und kann theoretisch unbegrenzt erweitern. So braucht man aber mindestens 3 Takte pro IO-Pin (Data setzen, Clock high, Clock low). Bei 96 benötigten Pins ist das selbst bei Verteilung auf mehrere IOs nicht schnell genug. Deshalb kommen hier parallel beschreibbare Speicherbausteine (8-Bit Latches CY74FCT573) zum Einsatz. Es muss nicht unbedingt die FCT Variante sein, 74HC573 oder 74HCT573 sollten auch genügen. Ich hatte die FCTs gekauft, weil ich Anfangs auf die Source Driver verzichten wollte. Die 96 benötigten IOs werden also über 12 * 8Bit Latches bereitgestellt, die wiederum als Matrix am Controller angeschlossen werden. Für die Speicherbausteine werden 3 IO-Ports a 8Bit benötigt (1 Reihe im Cube = 8LEDs*3Farben). Die Datenleitungen von je 4 Latches liegen nun parallel. Über die Enable Leitung wird bestimmt welche Latches die Daten des Controllers übernehmen sollen.

Teilschaltung
Teilschaltung der Latches inkl. der Source Driver


Für die Ansteuerung der 16 FETs währen 16 IOs reine Verschwendung, da ja immer nur einer der Transistoren durchgeschaltet sein darf. Hier verwende ich zwei GAL16V8 die zusammen als 1 aus 16 Decoder arbeiten. Für sich betrachtet, arbeitet jeder als 1 aus 8 Decoder (3 Bit). Das erste Bit gibt vor, welches der beiden GALs ausgewählt wird. Jetzt würden 4 IOs genügen, um zu bestimmen welcher FET durchgeschaltet wird. Bei nur vier Steuerleitungen würde aber immer einer der Transistoren durchgeschaltet sein. Um die Abschaltung aller FETs zu ermöglichen, wird die 5. Datenleitung benötigt.

Teilschaltung
Teilschaltung des 1 aus 16 Dekoders inkl. der FETs


Die Abrechnung

3 Ports a 8Bit für die Latches
4 Pins = 1/2 Port für die Enable Pins der Lachtes (hier würde eine 1 aus 4 Decoderschaltung nicht funtionieren!!!)
4 Pins = 1/2 Port für die GALs/FETs
1 Pin = 1/8 Port für GAL Enable

Summe: 4 Ports + einen IO.
So fiel die Wahl auf einen ATmega128.

Teilschaltung
Teilschaltung des Controllers mit FTDI-Modul MM232


Layout

Die Gesamtschaltung wurde auf drei doppelseitigen Platinen in Sandwichbauweise verteilt. Auf der ersten Platine sind nur die LED-Matrix und deren Vorwiderstände untergebracht. Mit Steckverbindern werden die Signale mit der darunter befindlichen Latch- und Treiberplatine verbunden. Die wiederum mit der Controllerplatine verbunden wird. Die Abmessungen der beiden oberen Platinen sind mit ca. 286mmx286mm identisch. Aus Kostengründen wurde die μC-Platine etwas kleiner gestaltet.

LED-Platine ohne Kupferfläche LED-Platine mit Kupferfläche
LED-PCB LED-PCB


Latch-Platine ohne Kupferfläche Latch-Platine mit Kupferfläche
Latch-PCB Latch-PCB

μC-Platine ohne Kupferfläche μC-Platine mit Kupferfläche
μC-PCB μC-PCB



Platinen

Das Selberätzen war für mich aus folgenden Gründen nicht möglich:
- Rohmaterial in der entsprechenden Größe nicht verfügbar (Latch und LED Board ca. 290mm x 290mm)
- sehr geringer Leiterbahnabstand (auf μC Board 9mil !!!)
- 1476 Durchkontaktierungen (habe ich nicht nachgezählt - dafür gibt es eine automatische Funktion in Eagle)

So habe ich die Platinen anfertigen lassen, die Qualität ist hervorragend der Preis war es allerdings auch. Das Bestücken ging relativ schnell von der Hand. Die vorverzinnten Platinen ließen sich sehr gut löten.


Fotos der μC-Platine

μC-Platine μC-Platine Detail
μC-Platine Detail



Fotos der Latch-Platine

Latchplatine Latchplatine Detail
Latchplatine Detail



Fotos der LED-Platine

Ledplatine Ledplatine Detail
Ledplatine Detail



Herstellung der LED Matrix

Das ist wohl mit Abstand der aufwändigste Teil des ganzen Projektes. Es müssen insgesamt 512 Leds mit je vier Anschlusspins miteinander verlötet werden. Ein Bekannter hat mir dafür nach meinen Wünschen eine Löthilfe auf einer CNC-Anlage gefertigt. So werden die Abstände zwischen den LEDs später sehr genau eingehalten.

Löthilfe Löthilfe Detail
Gitter löten Schritt 1 Gitter löten Schritt 2
Gitter löten Schritt 3 Gitter löten Schritt 4



Es sind immer acht LEDs übereinander angeordnet, die Anoden einer Säule sind alle senkrecht miteinander verbunden. Die Kathoden werden zeilenweise also horizontal verbunden. Auf dem Bild unten sind die 8 Säulen der ersten Reihe zu sehen. Da die Reihen nicht untereinander verbunden sind, reicht das auch aus um zu zeigen wie die Matrix aufgebaut ist. Die Verbindungen bestehen aus 0,8mm Silberdraht.

Matrixaufbau fix und fertig



!!! Achtung Hardwareänderung !!!

Ursprünglich war geplant alle Platinen einfach mittels Stapelleisten miteinander zu verbinden. Beim Erstellen des Programms zeigte sich jedoch, dass eine kleine Hardwareänderung den Programmieraufwand und die damit benötigten Takte deutlich senken würde. Die drei davon betroffenen Stapelleisten sind auf dem Bild unten dargestellt. Der erste Pin der linken und der letzte Pin der rechten Stapelleiste bleiben erhalten (auch zur Stabilisierung).
Alle anderen Verbindungen müssen entsprechend der Nummerierung verkabelt werden.

Hardwareänderung
zum Vergrößern auf das Bild klicken




Programmierung der GALs

Wie bereits oben beschrieben, waren zwei GAL-"Programme" zu entwickeln.
Wobei "Programm" eigentlich nicht der richtige Ausdruck ist, da in einem GAL ja keine CPU enthalten ist.
Also können GALs programmiert werden, aber nicht mit einem Programm.smile
Es werden Verknüpfungen oder Zuweisungen physikalisch in das GAL gebrannt, wobei brennen auch wieder nicht wörtlich zu nehmen ist.

Die "Programme" wurden mit dem Programm WinCupl erstellt und mit dem darin enthaltenen Tool WinSim getestet.

Zuweisungsliste1:
Ihr Browser kann das Objekt leider nicht anzeigen!

Signaldiagramm GAL1:
Signalverlauf GAL1


Zuweisungsliste2:
Ihr Browser kann das Objekt leider nicht anzeigen!

Signaldiagramm GAL2:
Signalverlauf GAL2



Programmierung des ATMega128

Bis jetzt gibt es nur zwei Testprogramme.

Testprogramm Testprogramm 2
1. Testprogramm 2. Testprogramm