-
-
Projekt LED
Cube
-
LED CUBE 4 x 4 x 4
Inspiriert von : http://www.instructables.com/id/Led-Cube-8x8x8/
Der englische Text ist mit Google Translate Uebersetzt worden
und an die Anderungen die wir vorgenommen haben angepasst.
Warum haben wir nicht gleich einen 8 x 8 8
x 8 Cube gebaut?
Für einen Lötanfänger ist ein
4 x4 x4 schon schwierig genug.
Wenn das geklappt hat und man wirklich Spass
daran hat, ist ein grösserer Würfel auch schnell
gebaut.
Was haben wir anders gemacht?
Der Hauptunterschied in der Hardware ist das wir keine einzelnen
Transistoren verwenden.
Sondern einen Chip (ULN2803) der dasselbe macht aber einfacher
zu verbauen ist.
Die Organisation der LEDs im Würfel ist auch unterschiedlich.
Softwareseitig, verwenden wir das Bascom Basic für Atmel AVR Prozessoren.
Falls möglich werden wir das Ganze auch noch mit Free Pascal (Lazarus) realisieren.
Generelle Funktion :
Für den Würfel brauchen wir 64 LEDs die wir
mit einem Microkontroller mehr oder weniger kunstvoll ein und
ausschalten wollen.
Am einfachsten würde man einen Kontroller
nehmen der soviele Anschlüsse hat. Da würde dann
jeder Anschluss eine LED steuern.
Die meisten Kontroller verfügen aber nicht über so
viele Anschlüsse, also erstellt man eine Matrix die sich
Datenleitungen (Anschlüsse) teilt.
Mit acht Anschlüssen kann man eine Tabelle (Matrix) realisieren
die 4 x 4 = 16 Anschlüsse ergibt. Also bereits eine Verdoppelung.
Mit (2x8) sechzehn Anschlüssen kann man eine Matrix realisieren
die 8 x 8 = 64 Anschlüsse ergibt. Also eine Vervierfachung.
Da wir uns ein paar Anschlüsse sparen und sich deshalb
jeweils ein paar LEDs eine Leitung teilen,
dürfen diese niemals miteinander leuchten. Dieses LEDs
die sich eine Leitung teilen leuchten stets nacheinander.
Bei einem 4x4x4 Würfel wird dadurch die maximale Leuchtzeit
durch vier geteilt. Bei einem 8x8x8 Würfel duch 8.
Damit man die LED intensiv genug leuchten sieht,
muss der Strom durch die LED erhöht werden, um die fehlende
Leuchtzeit dem empfinden nach auszugleichen.
Diese Umschaltung muss schnell erfolgen, damit das menschliche
Auge das nicht mehr merkt.
Ab ca. 20 mal pro Sekunde erscheint erscheint das fast flüssig,
es sollte aber einiges schneller sein damit der Würfel
nicht flackert (mehr als 100Hz).
Dieses Multiplexen hat auch nichts zu tun mit den Mustern (Bildern)
die wir darstellen, und deren Darstellungszeit.
Das Bild mag vielleicht einmal pro Sekunde
wechseln, die LEDs blinken aber effektiv in ihrem eigenem
Umschaltakt.
Gut das wir da einen Mikrocontroller verbauen der das übernimmt.
Dieser ist doof aber sehr schnell.
Die Softwarefunktion die das macht ist die ISR Routine. Dazu
später mehr.
Der Schaltplan :

PDF
Download
Das benötigte Material :
Anzahl |
Material |
Bezeichnung |
Preis |
Total |
Lieferant |
1 |
Platine (für Prototypen |
|
|
|
Reichelt |
1 |
Prozessor Atmel |
Atmega32 |
|
|
|
2 |
Latches |
74HC574 |
|
|
|
1 |
Adresss Selector |
74HC138 |
|
|
|
1 |
Darlington Array (Transistoren) |
ULN2803 |
|
|
|
1 |
Elektrolytkondensator |
3300uF |
|
|
|
6 |
Glättungskondensator |
100nF |
|
|
|
1 |
Status LED (5mm, Rot) |
|
|
|
|
1 |
Widerstand für Status LED |
330 Ohm 1/8 W |
|
|
|
16 |
Wiederstand für Anodenreihen |
100 Ohm 1/8 W |
|
|
|
1 |
Quarz |
|
|
|
|
2 |
Kondensator für Quarz |
|
|
|
|
1 |
Wannenstecker 10 Pol |
|
|
|
|
1 |
IC Sockel 40pol (Prozessor) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Das benötigte Werkzeug :
Die Hardware :
Die LEDs :
Prinzipiell eignen sich alle LEDs.
Wichtig ist das sie nicht zu gross sind. Wir haben uns für
3mm Leds entschieden da 5mm LEDs die Sicht durch
den Würfel erschweren würden.
Es ist zu empfehlen diffuse (getrübte) LEDs zu verwenden,
klare LEDs strahlen das Licht hauptsächlich nach
oben ab.
Wir möchten aber das der Würfel auf
alle Seiten möglichst gleichmässig leuchtet, da sind
diffuse LEDs besser geeignet.

Bild : 1000 LED's direkt in China gekauft (via
Ebay).
Die Stromversorgung.
Wir haben es uns ein wenig einfach gemacht mit der Stromversorgung
und verwenden einfach ein Steckernetzteil das direkt die benötigten
5V DC (Gleichspannung) liefert.
Wichtig ist nur das das Netzteil auch genug Strom liefern kann.
So ca 1.0 bis 2.0 A sollten reichen.
Wir haben sowas verwendet :
Netzadapter 5V 4A - 4000mA
Ist das Netzteil schwächer als 1.0A könnte es sein,
das die Helligkeit des Würfels insgesammt geringer wird,
wenn viele LEDs gleichzeitig leuchten sollen.
Der Microprozessor :
Für den 4x4 Würfel verwenden wir vorerst einen Atmel
AVR Atmega32 Mikrocontroller
Dies ist ein 8-Bit-Mikrocontroller mit 32 KB Programmspeicher
und 2 KB RAM.

Der ATmega32 verfügt im Prinzip über 32 in Gruppen
geordnete GPIO-Pins (General Purpose IO)
Eine Gruppe von 8 GPIO (8 Bit, ein Byte) wird als Port bezeichnet.
Der ATmega32 hat 4 Ports. PORTA, PORTB, PORTC und PORTD.
Drei IO-Pins werden für ISP (In-Circuit
Serial Programming) verwendet (Pin 6-8).
Be PORTD werden die Pins für 14 &
15 für die Serielle Kommunikation verwendet.
Damit verbleiben 27 GPIOs für den LED-Würfel,
die Tasten und die Status-LEDs.
Bei PORTA und PORTB sind alle Pins verfügbar.
PORTA ist als Datenbus mit dem Latch-Array verbunden.
PORTC ist mit dem ULN2803 Chip verbunden der wiederum die Kathodenschichten
(Lagen) am Würfel nach Masse (0VDC) schaltet.
Für unseren 4x4x4 Würfel verwenden
wir aber nur Layer0 - Layer 3 !
Die Ausgangsfreigabe für das Latch Array
(OE) ist mit dem PORTD-Bit 6 verbunden.
Der Takt.
Wir verwenden ebenfalls einen externen Quarz von 14,7456 MHz,
um die ATmega-Systemuhr zu betreiben,
und wir in der Lage sein würden, den LED-Würfel
von einem Computer mit RS232 zu steuern.
Hat man nicht vor dies zu tun, könnte
man den Quarz und die beiden 22pF Kondensatoren natürlich
auch weglassen.
Die Fuse Bits im Programm müssen dann
aber geändert werden !
Der Adressenselektor :

Der Adressenselektor auf dem Latch-Array (74HC138, Adr0-Adr2)
ist mit dem Mikroprozessor an PORTB (Bit 0-2) verbunden.
Der 74HC138 ist für das steuern der Clock-Pins an den
beiden 74HC574-Latch-ICs verantwortlich.
Wir nennen dies einen Adressenselektor, weil
er auswählt, welches der Latch-Arrays wir Daten schreiben.
Für den 4 x 4 Würfel würde der 74HC138 eigentlich
nicht benötigt.
Im Gegenteil, wir brauchen die drei Adressleitungen (A0,A2
+ A2) am AVR Chip und nutzen nachher nur zwei Chip Select Leitungen
(CLK) für die beiden Latch Arrays..
Wir verbauen ihn aber trotzdem, damit das Programm nicht umgeschrieben
werden muss, sollten wir noch einen grösseren (8x8x8)
Würfel bauen.
Das Latch Array :

Das Latch Array speichert die Daten die am
Mikroprozessor an Port A ausgegeben werden.
Der Chipselect wird wie beschrieben vom 74HCT138
gesteuert.
Der OE (Output Enable) wird direkt vom Mikroprozessor Port
D6 gesteuert.
Für den 4x4x4 Würfel brauchen wir
nur zwei dieser Latches. Für den 8x8x8 Würfel würden
wir acht Stück benötigen.
Die Ausgänge schalten +5V an die Anoden
Reihen am Würfel.
Die 100 Ohm Widerstände begrenzen den
Strom durch die LED's.
Der Kathoden Schichten Treiber :

Der ULN2803 ersetzt die Transistoren die bei
Instructables verwendet wurden.
Das ist weit schneller verbaut, macht aber
dasselbe.
Er hat den Zweck die einzelnen Kathodenschichten
im Würfel nach Masse zu schalten.
Beim programmieren der ISR ist zu beachen,
das er das Signal invertiert!
Funktionstasten :

Nach belieben könnte man noch ein paar
Tasten verbauen um den Würfel zu steuern.
Diese sollten einfach gegen Masse schalten.
Status LED's :

Um zu sehen ob die Schaltung überhaupt
Spannung hat, haben wir eine rote LED (D2) direkt nach dem
Hauptschalter über einen Widerstand mit VCC verbunden.
Auch wenn sonst nichts geht, diese LED sollte leuchten und
anzeigen das die Spannungsversorgung in Ordnung ist.
Die anderen kann man installieren oder nicht.
Spannungsversorgung & Kondensatoren
:

Der LED-Würfel wird mehrere hundert Mal pro Sekunde ein-
und ausschaltet.
In dem Moment, in dem die 500mA-Last eingeschaltet wird, wird
die Spannung über die gesamte Schaltung abfallen.
Durch Hinzufügen von Kondensatoren erzeugen Sie einen
Puffer zwischen der Schaltung und der Stromversorgung.
Wenn die maximale Last eingeschaltet wird,
kann der erforderliche Strom kurzfristig von den Kondensatoren
kommen.
Ist das Netzteil generell etwas zu schwach
hat es in den Zeiten in denen nicht viele LEDs leuchten
die Möglichkeit die gewünschte Spannung wieder zu
erreichen.
Wir haben einen 3000uF-Kondensator direkt hinter dem Hauptschalter
platziert (Viel hilft viel).
Dies funktioniert als Hauptpuffer. Ein 1000uF
Kondensator würde aber bestimmt auch reichen.
Für jeden Chip gibt es einen Keramikkondensator mit 100
nF (0,1 uF). Dies sind Rauschunterdrückungs- oder Glättungskondensatoren.
Wenn der Strom an den Ausgangsanschlüssen
ein- und ausgeschaltet wird, kann dies dazu führen, dass
die Spannung für den Bruchteil einer Sekunde so weit abfällt,
dass die Arbeit der ICs gestört wird.
Beim ausschalten eines Stromes können auch Spannungsspitzen
entstehen.
Diese Effekte stören mitunter sehr, besonders
wenn man schnell schalten will was beim Würfel auch der
Fall ist.
Es können sogar Signale von einem Kabel
in ein anderes streuen (über die Luft). Was dann zu einem
unstabilen Verhalten des Würfels führt.
Das Debuggen einer Schaltung mit solchen Rauschproblemen
kann sehr frustrierend sein.
Auf beiden Seiten des ATmega befindet sich ein 100 nF Filterkondensator.
Einen für GND / VCC und einen für
AVCC / GND, das ist der einzige Chip der zwei von diesen Entstörkondensatoren
braucht.
Die 100nF-Kondensatoren müssen direkt beim entsprechenden
Chip platziert werden.
Das ist gängige Praxis für digitale Schaltungen.
ISP Programmiersnittstelle :

Dieses ist die Schnittstelle über die
wir den Mikroprozessor programmieren können.
Die Signale RXD, TxD und Sense-232 verwenden
wir in diesem Projekt nicht.
Das Board :

Im Bild sehen wir das AVR-Prozessor Board mit der Bestückungsseite
nach oben.
Der große 40 Pin PDIP (Plastic Dual Inline Package) -Chip
links unten ist der Atmega32 (Das Gehirn der Schaltung).
Links neben dem ATmega sehen wir den Quarzoszillator
(Q3) und zwei Kondensatoren (C1&C2) für die Takterzeugung.
Der kleine 10-Pin-Anschluss (Wannenstecker) auf der linken
Seite ist ein Standard AVR ISP-Programmier Anschluss.
Es hat die Signale GND, VCC, RESET, SCK, MISO
und MOSI, die für die Programmierung verwendet werden.
Oben sind die Anodentreiberlatches (IC2 & IC3).
Der Kathodenlagen Treiber (IC11) und der Address
Selektor (IC1) sind unten rechts.
Die Power LED (D2) und das Widerstandsnetzwerk
(R9) in der Mitte.
Verwendet man nur eine Status LED kann statt
dem Widerstandsnetzwerk ein einfacher 330 Ohm Widerstand verwendet
werden.
Der Aufbau :
Wir beginnen die Bestückung (der Platine) mit den kleineren
Bauteilen.

Also zuerst die Widerstande, IC Sockel, kleine Kondensatoren.

Das LED Array mit der Montagehilfe
Ist alles bestückt und ein Messgerät ist vorhanden
kann man jetzt die Platine mit dem Steckernetzteil verbinden.
Zumindest die rote LED sollte leuchten.
Falls das funktioniert ist ist zumindest kein grösserer
Kurzschluss auf der Platine (in der Stromversorgung).
Nachdem man die Stromversorgung wieder getrennt hat kann man
dann die ICs in die entsprechenden Sockel stecken.
Ist das gemacht und die rote LED leuchtet wieder wenn Spannung
anliegt, dann müsste alles (oder das meiste) in Ordnung
sein,
und wir können versuchen den Microkontroller
zu programmieren.
Zu diesem Zeitpunkt kann das AVR-Board an einen ISP-Programmierer
angeschlossen und der ATmega erkannt werden. Siehe : Programmierung
des Microcontrollers
Die Software :
Bildpunkte einer Fläche nennt man Pixel
(das ist ein bekannter Begriff).
Unser Würfel ist aber dreidimensional. Deshalb heissen
die Bildpunkte Voxel (was vieleicht weniger bekannt ist).

Das LED Array
Die Kommunikation zwischen diesen beiden Softwareteilen geschieht
über ein Voxel Puffer.
Dieser Puffer verwendet ein Bit für jedes
LED im LED-Würfel. Wir werden dies fortan als Voxel Puffer
oder Voxel Array bezeichnen.
Der Voxel Puffer ist 4 Voxel breit, 4 Voxels hoch und 4 Voxel
tief.
Die Software aus zwei Teilen, dem Effektcode und der Interruptroutine
(ISR).
Der Effektcode bestimmt was angezeigt wird,
und kann beliebig verändert werden.
Die Effektcode schreibt die gewünschten LED-Status in
diesen Voxel Puffer.
Die Interruptroutine (ISR) liest in bestimmten
Intervallen vom Voxel Puffer und zeigt die Informationen auf
dem LED-Würfel an.
Die Interruptroutine sollte eher nicht verändert
werden, sie übernimmt lediglich die Darstellung.
---------
Realisierung
in Bascom Basic (Funktioniert)
Relaisierung
in Free Pascal (in Bearbeitung)
---------------------------
Serielle Verbindung :
Die serielle Kommunikation erfordert ein präzises Timing.
Wir werden keine Fehlerkorrekturalgorithmen für die serielle
Kommunikation verwenden, so dass jeder Fehler über die
Leitung im LED-Würfel als ein Voxel dargestellt wird,
der an der falschen Stelle ein- oder ausgeschaltet ist.
Um eine einwandfreie serielle Kommunikation zu erhalten, müssen
Sie eine Taktfrequenz verwenden, die durch die serielle Frequenz
geteilt werden kann, die Sie verwenden möchten.
14,7456 MHz ist durch alle gängigen RS232-Baudraten teilbar.
(14.7456 MHz * 1000 * 1000) / 9600 Baud = 1536.0
(14.7456MHz * 1000 * 1000) / 19200 Baud = 768.0
(14.7456 MHz * 1000 * 1000) / 38400 Baud = 384,0
(14.7456 MHz * 1000 * 1000) / 115200 Baud = 128,0
Die Formel in den Klammern konvertiert von MHz in Hz. First
* 1000 gibt Ihnen KHz, das nächste Hz.
Wie Sie sehen, können alle diese RS232-Baudraten sauber
durch unsere Taktrate dividiert werden. Die serielle Kommunikation
ist fehlerfrei!
Um die wirklich erstaunlichen Animationen zu erhalten, müssen
wir den LED-Würfel an einen PC anschließen. Der
PC kann Gleitkommaberechnungen durchführen, bei denen
der AVR in Zeitlupe arbeitet.
Der ATmega verfügt über eine integrierte serielle
Schnittstelle namens USART (Universal Synchronous und Asynchronous
Serial Receiver and Transmitter).
Der USART kommuniziert über TTL-Pegel (0/5 Volt). Der
Computer spricht seriell über RS232. Die Signalpegel für
RS232 liegen irgendwo zwischen +/- 5 Volt und +/- 15 Volt.
Um die seriellen Signale vom Mikrocontroller in etwas umzuwandeln,
das der RS232-Anschluss eines PCs verstehen kann, und umgekehrt,
verwenden wir den Maxim MAX232 IC. Eigentlich ist der Chip,
den wir verwenden, nicht von Maxim, sondern ein pin-kompatibler
Klon.
Es gibt einige 100nF Keramikkondensatoren, die den MAX232 umgeben.
Der MAX232 verwendet interne Ladungspumpen und die externen
Kondensatoren, um die Spannung auf geeignete RS232-Pegel zu
erhöhen. Einer der 100nF-Kondensatoren ist ein Filterkondensator.
Der RS232-Anschluss befindet sich in einem 90-Grad-Winkel für
einen einfachen Zugriff, wenn die Latch-Array-Platine auf der
Oberseite der AVR-Platine montiert ist. Wir verwendeten einen
4-poligen Stecker und schnitten einen der Pins heraus, um einen
polarisierten Stecker herzustellen. Dies beseitigt jegliche
Verwirrung darüber, wie das RS232-Kabel angeschlossen
werden soll.
Im zweiten Bild sehen Sie zwei gelbe Drähte, die vom ATmega
zum MAX232 verlaufen. Dies sind die TX- und RX-Leitungen auf
TTL-Ebene.
1) Verbinden Sie die GND- und VCC-Pins mit einer Lötspur
oder einem Draht. Platzieren Sie einen 100nF-Kondensator in
der Nähe der GND- und VCC-Pins.
2) Löten Sie den Rest der 100nF-Kondensatoren ein. Sie
können diese mit Lötspuren löten, also tun Sie
dies am besten, bevor Sie die tx / rx-Drähte anschließen.
3) Löten Sie einen 4-poligen 0,1 "-Header an der
Stelle, an dem ein Pin entfernt ist. Verbinden Sie den Pin
neben dem entfernten mit GND.
4) Verbinden Sie die tx / rx-Eingangsleitungen mit dem Mikrocontroller
und die tx / rx-Ausgangsleitungen mit dem 4-poligen Header.
Die Drähte, die zum 4-Pin-Header führen, sind gekreuzt,
weil das erste serielle Kabel, das wir verwendet haben, diese
Pinbelegung hatte.
-
M.Weber & M.Eccer 30.11.2017
|