14. März 2011

LED-Cube für Elektronikanfänger

Heute mal ein Beitrag zum Thema Elektronik. Ursprünglich war das Thema als E-Mail gedacht. Ich habe mir jedoch überlegt, dass auch andere Menschen Interesse an diesem Thema haben könnten, somit möchte ich das Wissen mit der Allgemeinheit teilen.

Es geht um LED-Cubes. Dabei handelt es sich um einen Würfel, der aus LEDs besteht. Klingt komisch, daher hier ein Bild
Was kann man damit machen: eigentlich hat er keinen tieferen Sinn außer schön auszusehen und Programmierprojekte daran auszuprobieren. Wie man sieht, besteht der Würfel aus vielen einzelnen LEDs, die möglichst alle einzeln angesteuert werden sollen. Bei einem Würfel aus 5x5x5 ( = 125) LEDs ist das gar nicht so einfach. Allerdings gibt es einige Tricks, wie man auch mit begrenztem Hardwareeinsatz das Teil zum Leuchten bekommt. Zuerst aber eine kleine Übersicht der einzelnen Komponenten des Würfels:
- LEDs
- der Mikrocontroller zur Ansteuerung der LEDs
- Verdrahten/Platine
- Stromversorgung
- Software

Da die ganzen Einzelkomponenten teils stark miteinander verzahnt sind, empfiehlt es sich, den Beitrag vollständig zu lesen. Ich versuche hier nicht alle Informationen von anderen Bauanleitungen widerzukäuen - vielmehr möchte ich zu bereits vorhandenen Einträgen im Netz Anregungen und Tipps geben, die einem Anfängerden Einstieg erleichtern sollen.

Die LEDs
Wenn man auf Youtube nach LED-Cube sucht, findet man Würfel in unterschiedlichsten Farben. Qausi die ganze Palette, die die LED-Farbenwelt hergibt: grün, rot, blau, gelb, orange, ja sogar bunt (RGB) ist möglich. Da die Auswahl so unendlich groß ist, möchte ich an dieser Stelle ein paar Einschränkungen (als Entscheidungserleichterung) geben:
- keine RGB-LEDs verwenden. Diese LEDs besitzen 3 statt den üblichen 2 Beinchen. Des Weiteren sind PWM-Steuerungen (o.Ä.) nötig um alle Farbstufen mischen zu können. So schön wie RGB-LEDs sind, Finger weg.
- Wahl der LEDs nach Leistungsaufnahme. Standard-LEDs ziehen im Arbeitspunkt 20 mA. Das ist an sich erstmal nicht viel. Will man jedoch 100 LEDs ansteuern, ist man schnell bei einem Eingangsstrom von 2 A. So viel Strom kann ein handelsüblicher USB-Port nicht zur Verfügung zu stellen (ohne nach kurzer Zeit Rauchzeichen von sich zu geben). Alternativ gibt es auch Low-Current LEDs, die nur 2 mA im Arbeitspunkt benötigen. Für eine sehr einfache Stromversorgung per USB sollte man sich diese LEDs einmal anschauen. Weiteres findet man im Abschnitt Stromversorgung.
Folgende Hinweise habe ich auch noch durch Forenbeiträge angelesen:
- die LEDs sollten vor dem Verlöten unbedingt mehrere Tage am Stück einem Dauertest unterzogen werden. Grund: nachträgliche Herumlöten am fertigen Cube ist äußerst problematisch. Um spätere "Pixelfehler", also kaputte LEDs, zu reduzieren, kann der Dauertest helfen.
- es gibt klare und difuse LEDs. Es sollten diffuse LEDs bevorzugt werden, da diese in einem größeren Bereich Licht streuen. Somit hat man aus verschiedenen Betrachtungswinkeln ein gutes Bild

Wie findet man den Arbeitspunkt und damit den Vorwiderstand der LEDs: Bitte keine Low-Costversion der Art: ein Vorwiderstand für alle LEDs gemeinsam. Nicht nur, dass dieser schneller durchbrennen könnte: umso mehr LEDs eingeschaltet sind, umso dunkler werden sie. Daher: jede LED bekommt einen eigenen Vorwiderstand. Ganz wichtig: das Datasheet der LED. Dieses sollte man sich sogar lokal auf der Festplatte speichern. Wie berechnet man den Vorwiderstand:
Beispiel: eine LED hat laut Datenblatt bei 1,75 Volt und 20 mA den Betriebspunkt. Die Eingangsspannung beträgt 5 Volt. Damit ergibt sich: R = (5 V - 1,75 V) / 20 mA = 162,5 Ohm. Nun kann es passieren, dass Reichelt und Co. keinen solchen Widerstand findet. Man könnte diesen Wert aus mehreren Widerständen zusammenbauen, aber das ist unsinnig. Besserer Vorschlag: 20 mA sind recht viel und die LED würde auch mit weniger Strom funktionieren. Daher sollte man den berechneten Widerstand einfach ein wenig Aufrunden, beispielsweise auf 170 Ohm. Gegenrechnung: I_LED = (5 V - 1,75 V) / 170 Ohm = 19,1 mA --> passt!
Wer es wirklich genau wissen will, sollte sich das "Forward Current Vs Forward Voltage" Diagramm anschauen (sieht ein wenig aus wie eine quadratische Funktion oder e-Funktion). Bei den Low Current LEDs würde ich aber eher aufrunden!

Der Mikrocontroller
Möchte man tolle Animationen auf dem LED-Cube darstellen, wird eine entsprechende Ansteuerung benötigt. Diese wird mit einem Mikrocontroller realisiert. Mikrocontroller sind recht preisgünstig (unter 5 Euro), vielseitig einsetzbar und benötigen nicht hunderte weitere Bauteile als externe Beschaltung. In dem LED-Cube Artikel von mikrocontroller.net wird ein ATMega16 der Firma Atmel verwendet. An sich kein schlechtes Teil aber es gibt ein entscheidendes Problem für Anfänger: wie kommt das Programm vom PC auf den Controller. Klar könnte man sagen: es gibt günstige Programmiergeräte für unter 30 Euro oder man baut sich eines selbst. Dann muss man sich nur noch mit dem Programmieren befassen, den Fusebits und den Programmierarten und ist ja alles kein Problem. Nach einem Jahr Bücher wälzen (Vorlesungen in der örtlichen Hochschule besuchen ist auch von Vorteil), kann man irgendwann einen ATMega16 programmieren. - Toll! Geht es vielleicht noch komplizierter?
Es ist natürlich unsinnig, für den Bau des Würfels noch mehrere 100 Euro für Programmiergeräte und Bücher auszugeben. Daher möchte ich eine schönere Alternative vorstellen: das Arduino-Projekt. Arduino ist einfach, günstig, Open Source, vielseitig, flexibel.

Was ist Arduino?
Dabei handelt es sich um eine Platine mit einem Mikrocontroller und einiger weiterer Bauteile für einen sehr schnellen Einstieg in die Embedded Programmierung. Die Platine wird einfach per USB-Kabel am PC angeschlossen und die Programmierung kann losgehen (ok, man muss noch einen Treiber installieren). Die Programmierumgebung gibt ist ebenfalls Open Source und für viele Betriebssysteme verfügbar (der Treiber ebenfalls). Ein erfolgreich kompilliertes Programm wird über einen virtuellen COM-Port an USB übertragen. Mit ein bisschen Glück läuft der Mikrocontroller sofort los. Klingt einfach - ist es auch.
Einen Arduino kann man für unter 30 Euro kaufen, verschiedene 100% kompatible Clones gibt es für teilweise unter 20 Euro. Ich hatte mir damals bei Watterott einen Boarduino gekauft und zusätzlich einen weiteren Ersatz-ATMega, der bereits den Arduino-Bootloader enthält. Falls der Mikrocontroller auf dem Board das Zeitliche segnet, kann man ihn problemlos gegen dem Ersatzchip austauschen. Aus diesem Grund würde ich ebenfalls ein Board mit Mikrocontroller auf DIL-/DIP-Gehäuse empfehlen. DIL und DIP ist das Gleiche; es bezeichnet allgemein Chips mit großen, gut lötbaren Beinchen. Ein bekannter Pendant ist SMD. Diese Chips sind für Normalsterbliche kaum lötbar! D.h.: ein Arduino mit SMD-ATMega ist tendenziell doof.

Den Boarduino gibt es auch als Selbstbauversion. Auf der Platine ist ebenfalls ein kleiner SMD-Chip verbaut (dieser sorgt für den virtuellen COM-Port). Der Chip ist jedoch bereits vorgelötet!

Als Mikrocontroller wird beim Arduino statt eines ATMega16 ein ATMega168 oder ATMega328 eingesetzt. Leistungstechnisch unterscheiden sich beide Mikrocontroller kaum vom ATMega16, haben jedoch weniger Pins. Schaut man die anderen Artikel an, stellt man fest: ein 8x8x8 Würfel benötigt 8+8+8 = 24 Pins. Der Arduino hat insgesamt jedoch nur 24. Davon gehen jedoch noch einige Pins weg für Programmieren, für den Taktgeber und Reset, bleiben noch 18 Pins übrig. Damit könnte man ungefähr einen 6x6x6 Würfel aufbauen. Allerdings muss der Code dann auch effizient geschrieben sein, damit die Performance noch passt. Für kleinere Würfel wird die Effizienz unwichtiger.

Für Leute, die also einen leistungsfähigeren Controller mit mehr "Bumms" haben oder 8x8x8 Würfel bauen wollen, bleibt an dieser Stelle noch ein Verweis auf den Sanguino. Der Sanguino ist der große Bruder des Arduino - bzw. ein Clone. Die Programmierumgebung, die Befehle usw. sind alle gleich. Allerdings wird der Sanguino mit einem leistungsfähigeren Mikrocontroller, dem ATMega644(P), aufgebaut. Er bietet mehr Pins und viel viel mehr Speicher. Für Leute, die Mikrocontroller etwas umfangreicher nutzen wollen, sicherlich sinnvoll. Leider ist der Sanguino momentan in Deutschland ganz schlecht erhältlich. Bestellungen gehen nur aus den USA. Allerdings muss sich niemand einschränken: man kann den Arduino auch als Programmiergerät benutzen. Damit lässt sich aus einen gekauften ATMega644 ein Sanguino selber bauen (z.B. mit einem Breadboard).

Noch ein paar sinnvolle Hintergrundinfos:
- ein Pin des ATMega darf maximal 20 mA Strom geben. der gesamte Controller an sich darf maximal 100 mA abgeben. Größere LED-Lichterketten können daher gefährlich werden
- die Analogeingänge und die PWM-Pins können auch ganz normal als digitaler Ausgang verwendet werden! (dies ist im ersten Moment nicht unbedingt klar und man hätte nur sehr wenige verfügbare Pins)
- auf weitere Infos wird im Abschnitt Software eingegangen

Verdrahten/Platine:
Irgendwann müssen dann die Steuersignale vom Mikrocontroller zu den LEDs kommen. Für diese Beschaltungen verweise ich wieder an andere Artikel. Wem nicht klar ist, was dieser oder jener Chip macht: einfach im Netz nach den Bezeichnungen googlen. Am Anfang empfiehlt es sich, die Bauteile erstmal auf einem Steckbrett (auch Breadboard genannt) aufzubauen. Einige Arduinos (wie der Boarduino) sind so aufgebaut, dass man die Platine auf das Steckbrett steckt. Damit lassen sich dann die Signale der Pins direkt auf dem Steckbrett abgreifen. Wer in dem Drahtsalat irgendwann nicht mehr durchblickt oder alles genau planen möchte, sollte sich das Programm Fritzing anschauen. Dort hat man ein virtuelles Steckbrett.

Hinweise:
- auch das Steckbrett wird bei 2 Ampere Strom Probleme bekommen! Es gibt im Netz entsprechende Hinweise, wo die Maximalgrenze liegt, ohne dass das Brett schwarze Stellen bekommt
- Leitungen: es gibt Pakete mit fertig konfektionierten Drähten. Ist zwar schön aber meist überteuert. Wer einen Elektroinstallateur kennt, sollte ihn nach Datenleitungen oder Signalleitungen fragen. Daraus lassen sich mit wenig Aufwand beliebige Verbindungsleitungen für das Board bauen. Eventuell gibt es sogar für ganz kleines Geld kurze Reststücke. Wichtig: es darf keine Litze sein sondern "massive" Leiter! Leiterquerschnitt ist fast egal. Er sollte nur nicht zu groß sein, da man damit das Brett beschädigt. Ich kann mich dunkel an etwas mit 0,15 mm erinnern. 1,5 mm oder gar 2,5 mm sind zu dick, starr und unflexibel! Nicht isolierten Blankdraht sollte man aufgrund von Kurzschlussmöglichkeiten ebenfalls vermeiden.


Stromversorgung:
Bei der Versorgung des LED-Cubes mit Strom gibt es ebenfalls viele Möglichkeiten. Die einfachste Möglichkeit ist die Versorgung über den USB-Port. Dies ist jedoch mit Vorsicht zu genießen. USB erlaubt nach Spezifikation maximal 500 mA pro Port. Für größere Würfel sollte die Energieversorgung von einem externen Netzteil erledigt werden. Dabei ist natürlich drauf zu achten, dass es bei den üblichen 5 Volt Spannung auch ausreichend Strom liefert. Wer nicht weiß, welches Netzteil sinnvoll ist, sollte nach Labornetzteilen suchen.

Wichtig bei der Beschaltung:
- die 5 Volt vom USB dürfen nicht mit den 5 Volt des Netzteils verbunden werden
- dafür sollen die Masse von USB mit der Masse des Netzteils verbunden werden
- Masse = GND = Ground (meist schwarz Farbe für Leitungen)


Software:
Nach der vielen komplizierten Hardware, noch einige Hinweise zur Programmierung.

Normalerweise ist die Programmierung von Mikrocontrollern für Anfänger recht ungewohnt. Als Programmiersprache wird zwar C benutzt. Um jedoch Ein- und Ausgänge ansprechen zu können, muss man kryptische Register auslesen oder in sie hineinschreiben. Besondere Befehle im Arduinoprojekt vereinfachen dies deutlich. Ein weiterer Grund, warum ich den Arduino so toll finde. Kurzer Hintergrund: die Befehle sind größtenteils so etwas wie Metafunktionen. D.h.: hinter dem Arduino-Befehl stecken ein bis zwei Zeilen klassischer C-Code, um mit dem Register zu kommunizieren. Das Schöne daran: auch regulärer C-Code kann parallel zu den Arduino-Befehlen verwendet werden. Somit lassen sich auch die Code-Beispiele des mikrocontroller.net Artikels austesten.

Nun noch ein paar Hinweise, die sich aufgrund der Hardware ergeben:
- Integer haben 16 Bit
- alle oben erwähnten ATMega-Controller sind 8Bit-Kisten. Daher sollte man Datentypen mit Bedacht wählen. Konkret: ein long int mit 32 Bit benötigt 4 Takte zum Berechnen; ein char mit 8 Bit dagegen nur einen Takt
- Gleitkommazahlen sollten mit aller Gewalt vermieden werden. Grund: die Mikrocontroller unterstützen hardwareseitig kein Gleitkomma. Float und Co können zwar benutzt werden, sind jedoch ausschließlich in Software implementiert ( = sehr sehr langsame Verarbeitung)
- aufgrund des Gleitkommaproblems sind Drehungen und Rotationen problematisch. Abhilfe schaffen fertige Arrays mit Sinus- und Cosinustabellen. Entweder kann man sie als fertige Codeschnipsel klauen oder an muss sie sich selber basteln
- leider ist mit dem Arduino kein Debuggen möglich. Grund: für die ATMega 168, 328 und 644 wird eine spezielle Hardware benötigt (Kostenpunkt 80 Euro aufwärts). Debughilfe: man verwendet den virtuellen COM-Port um Daten zwischen PC und Mikrocontroller auszutauschen.
- schneller Daten an die Pins schieben: verwendet man die Arduino-Befehle, wird normalerweise immer nur ein Pin auf einmal geändert. Hardwaremäßig sind jedoch immer 8 Pins zu einem Port (bzw. einem Register) zusammengefasst. Damit lässt sich effizienter programmieren, als jedes Bit einzeln zu schubsen.
- Hex lässt sich klassisch in C mit 0x... angeben ( z.B.: 0xFF = 255); zusätzlich gibt es Defines für binäre Schreibweise: %... (z.B.: 01001 = 9), dabei wichtig: es MÜSSEN alle 8 Bits geschrieben werden, selbst wenn sie 0 sind


Zum Schluss die Links:
http://www.arduino.cc - Arduino Website
http://www.ladyada.net/make/boarduino/ - Boarduino Website
http://www.sanguino.cc - Sanguino Website
http://www.mikrocontroller.net/articles/LED_cube - Artikel von mikrocontroller.net
http://arduino.cc/en/Tutorial/ArduinoISP - Arduino als Programmer
http://itp.nyu.edu/physcomp/Tutorials/ArduinoBreadboard - Arduino auf dem Breadboard

Keine Kommentare: