Was macht man mit 4 Wochen Winterurlaub, die recht überraschend kommen ?
Natürlich mal wieder was Neues ausprobieren!
Ich habe mir den Asuro-Roboterbausatz besorgt und in wenigen Stunden
zusammengebaut.
Ich war begeistert von der Einfachheit, mit der der verbaute ATMEGA8L-Mikroprozessor
zu programmieren war. Also: Thema vertiefen. Das Netz ist voll von kreativen
Spinnern und Infos über Mikroprozessoren. Am meisten faszinierten mich die 3D-LED Cubes, die in Wort und Video in allen Größen zu finden waren.
Das musste ich auch bauen. Zwar war ich anfangs als Hardware-Neuling komplett
überfordert und habe einiges an Zeit gebraucht, bis ich kapiert hatte, wie die
Ansteuerung der einzelnen LEDs ohne sichtbaren Leitungen überhaupt funktioniert,
aber dann ging es los. 4 Wochen lang wurde jede freie Minute in das Projekt
gesteckt. Pläne gemacht, wieder verworfen, neu gemacht, Bauteile besorgt,
geflucht, gefreut, Infrastruktur (einfaches uraltes Oszilloskop) besorgt und
irgendwann war er fertig (die Ferien allerdings auch :-)
Das Ergebnis könnt ihr im Video
sehen:
Wie funktioniert's?
Auf den ersten Blick kann der Würfel gar nicht funktionieren,
da alle LEDs scheinbar mit einem Drahtwürfel direkt verbunden sind und keine
Leitungen zu den einzelnen LEDs gehen. Bei genauerem Hinschauen sieht man jedoch,
dass alle Kathoden der LEDs auf jeder horizontalen Ebene verbunden sind und jede
dieser Ebene mit einem Draht mit dem Boden einzeln verbunden ist. Somit kann
man jede Ebene einzeln mit Strom versorgen oder nicht.
Würfel mit Logik- und Netzteilplatine im
Sockel
Außerdem sind alle Anoden übereinander verbunden und diese Drähte verschwinden
unten im Boden. Man kann also alle Anoden in einer vertikalen Reihe gleichzeitig
mit Strom versorgen oder nicht.
Aber damit kann man doch nur jeweils die LEDs in allen Ebenen
gleichzeitig ansteuern, oder ? Stimmt. Die Reihen werden einzeln
angesteuert.
Aber ein Mikroprozessor ist schnell! Nun programmiert man die Leitungen der
Ebenen so, dass sie nacheinander einzeln Strom bekommen und danach wieder
ausgeschaltet werden. Bevor eine Ebene Strom bekommt, setzt man die einzelnen
Säulen wie es für die Ebene sinnvoll ist. Somit hat man das Muster für eine
Ebene erzeugt. Danach wiederholt man das Ganze für die nächste Ebene und fängt
am Schluss wieder bei der ersten Ebene an. De facto leuchten also nie alle LEDs im
Würfel gleichzeitig, sondern sie werden gepulst. Bei mir findet pro Sekunde 4000mal
ein Wechsel zwischen den Ebenen statt. Das menschliche Auge nimmt das nicht wahr,
sondern sieht nur, dass eine LED an oder aus ist.
Auch habe ich Graustufeneffekte softwaremäßig realisiert. Ich erreiche dies
einfach indem eine LED, die etwas dunkler sein soll eben nur bei der zweiten
oder dritten Ebenenaktivierung eingeschaltet wird. Das Ganze hat natürlich seine
Grenzen, denn irgendwann nimmt das Auge bei zu seltenem Einschalten ein
Flackern wahr.
Ebene für Ebene...
Leuchtdioden
Ich habe mich aus Kosten- und Aufwandsgründen für einen 5*5*5 LED Cube
entschieden.
Zuerst einmal zu den LEDs. Im Netz bekommt man recht günstig LEDs in allen Farben im Pack. Ich habe 50 LEDs mit (hier nicht
verwendbaren)
Vorwiderständen für 4 Euro bekommen. Kauft sie um bloß nicht einzeln
beim großen C, da werdet ihr arm!
Die meisten LEDs sind aber klar und da wir von dem Material abhängig sind, das
gerade angeboten wird, muss man sich hier etwas einfallen lassen. Klare LEDs erzeugen
meistens einen Spot nach vorne. Von der Seite sieht man das Licht kaum. Im Falle
des Cubes ist das sehr schlecht, denn a) sieht man von der Seite nicht, welche
LEDs brennen und b) werden die LEDs der darüber liegenden Ebenen angestrahlt. Ich
habe viel ausprobiert: Lacke, Haarspray, Kleber, abgesägte Heissklebestücke. Aber
die Lösung ist absolut einfach: Die LEDs werden einfach mit einem 100er
Sandpapier von Hand abgeschmirgelt! Dadurch wird das Spotlicht gebrochen und
tritt in alle Richtungen nahezu gleichzeitig aus. Viel Spaß beim Schmirgeln,
denn ihr braucht 125 Stück davon :-)
Eine geschliffene LED, der Rest wartet schon
LED-Ebene
Betrachten wir zuerst eine einzelne Ebene: Es ist eine Matrix von 5 mal 5 LEDs.
jeweils 5 LEDs in einer Reihe sind einem 8-Bit Wert zugewiesen. Diesen Wert
erzeuge ich durch Schieberegister, wobei jede 5er Reihe ein eigenes
Schieberegister spendiert bekommt. Die restlichen 3 Bits des Schieberegisters
habe ich übrigens genommen, um ein paar farbige LEDs an der Gehäuserückseite
anzusteuern um ein wechselndes ambientes Hintergrundlicht zu erhalten (siehe
Abbildung).
Sicherheitshalber habe ich hinter die 5 Schieberegister noch jeweils einen
Treiber-IC gesteckt, denn ich fahre die LEDs in einem etwas zu hohen
Spannungsbereich. Dies ist zu verantworten, da dadurch die LEDs etwas heller
sind und sie ja nie permanent Strom bekommen, sondern durch die Ebenenansteuerung
immer gepulst werden.
Jede Ebene hängt nun durch einen Draht an einem eigenen Port. Sind mal alle 25
LEDs einer Ebene durch die Schieberegister durchgesteuert, so würde viel zuviel
Strom fließen für einen Port eines Mikroprozessors. Daher wurde ein
Treibertransistor für jede Ebene spendiert.
Eine Maske ist bei 125 LEDs sehr zu empfehlen
Prozessor
Ich habe mich für einen ATMEGA32 entschieden, da er mehr Speicher für die
Effektprogrammierung hat. Durch die Schieberegister hätte auch die Portanzahl
eines kleineren ATMEGA8 gereicht, denn die Schieberegister sind hintereinander
geschaltet, so dass theoretisch schon 8 Ports ausgereicht hätten.
Der Programmierport kam auch gleich mit auf die Lochrasterplatine, denn bei jeder Erweiterung den Prozessor umstecken zu
müssen wäre weitaus aufwendiger.
Rechts unten ist noch ein kleines IC zu sehen. Das ist eine MAX2323, der nur für
die Realisierung eines seriellen RS232-Ports nötig ist um mit dem PC zu
kommunizieren. Der Cube selbst arbeitet vollkommen autark ohne PC, aber in der
Entwicklungsphase sind Debugausgaben an den PC sehr, sehr hilfreich!
Ansonsten erkennt man schön die 5 Gruppen
mit Schieberegister und Treiber ICs für die 5 LED-Reihen, die alle auf
einen Stecker in Richtung Cube enden.
Logikplatine
Software
Die Ansteuerung der Schieberegister
sowie die Umschaltung der Ebenen erfolgt
komplett in einer Interrupt-Routine. Dann muss man sich keine Gedanken mehr um
das Timing machen. In jedem Interrupt wird ein globales dreidimensionales Feld
ausgelesen und die Register entsprechend der eingeschalteten Ebene gesetzt. Beim
nächsten Interrupt wird die Ebene ausgeschaltet und die nächste Ebene berechnet.
Die Animationen selbst erfolgen in der Hauptschleife. Hier habe ich einfach
kleine Programme geschrieben, die die Animationen in das dreidimensionale Feld
schreiben.
Rechts habe ich das Pulsen der LEDs sichtbar gemacht, indem ich die
Kamera schnell während der Belichtung über die Schaltung gezogen habe.
Oben (grüner Strich) sieht man eine normale LED vom Programmer. Die
anderen Punkte kommen schon von der Schaltung. Man sieht schön, die wie
LEDs sehr schnell an- und ausgeschaltet werden.
An der Seite des Gehäuses habe ich noch 4 Taster eingelassen, die im Prozessor
noch 2 Flags setzen. Über diese Taster kann man die Geschwindigkeit verändern,
mit der die Animationen ablaufen sollen. Mit den anderen Tastern kann man kurz
ein "R" oder ein "S" im Würfel darstellen und schaltet damit um von einer
zufälligen Reihenfolge und einer fest vorgegebenen Reihenfolge (sowohl der
Würfelanimation wie auch der Ambient-Light Animation der farbigen LEDs auf der
Rückseite des Gehäuses).
Oben ungepulste, unten gepulste LEDs
Die Animationen
Hier kann man sich wirklich austoben. Seht euch am besten den Film an. Meine
witzigste Idee finde ich die Game of Life-Animation. Die meisten kennen die
2D-Simulation, in der bei jedem Schritt für jeden Punkt einer Matrix berechnet
wird, ob diese (Population=Punkt) überlebt oder nicht. Das wird durch ein
Regelwerk bestimmt wie "Überlebt nur, wenn mindestens zwei Nachbarn vorhanden
sind aber nicht alle 6 Nachbarn." Durch die Wiederholung der Regeln entstehen
Animationen, die immer weiter ablaufen. Teilweise erreichen sie einen stabilen
Zustand, manchmal auch einen Instabilen, bei dem Populationen immer wieder
alternierend leben und sterben.
Ich habe die Idee auf den dreidimensionalen Raum erweitert und als
Cube-Animation realisiert. Schön kann man hier die stabilen und instabilen
Zustände erkennen.
Die LEDs sind Teil des Ambient-Lights auf der Rückseite
Hat Spaß gemacht. Traut euch! Ich könnt ja mit einem 3*3*3 Würfel anfangen, der
dann ohne Schieberegister und ohne Treiber direkt von den Ports des
Mikroprozessors gesteuert wird. Egal was ihr baut: Schickt mir Bilder!!!