Projekt: Weihnachtsstern

Weihnachtsstern-Bild Dieser dekorative Weihnachtsstern besteht aus 50 speziellen RGB-LEDs, die von einem ATtiny44A angesteuert werden. Dabei ändern alle LEDs kontinuierlich per Pseudo-Zufall die Farbe und die Helligkeit. Für etwas Abwechslung sorgen einige Effekte, die ebenfalls per Zufall aktiviert werden. Über 3 Trimm-Potentiometer lässt sich die Intensität der Grundfarben beeinflussen. Mit einem Taster kann die Stellung der Potentiometer auf den LEDs angezeigt werden, außerdem lässt sich damit die Farbwechsel- und Effekt-Geschwindigkeit in 3 Stufen umschalten. Dieses Projekt wurde komplett mit SMD-Bauteilen aufgebaut und wegen der speziellen Platinenform gibt es hier auch ein Platinenlayout. Trotz der einfachen Schaltung ist der Aufbau recht knifflig und nicht unbedingt für Einsteiger geeignet.

Symbol Status
Statusaktiv
Letzte Bearbeitung12.11.2022
Aktueller Softwarestandv1.11 vom 12.12.2021
SymbolDownloads
Schaltplan
Stückliste mit Empfehlungen zur Bauteilbestellung
Software v1.11 für ATtiny44A mit komplettem Quelltext in C vom 12.12.2021w-stern-v111.zip
Platinen-Layout (Sprint-Layout und PDF) für LEDs WS2812, 5 Einzelteile auf Europlatine 160mm x 100mw-stern-layout-ws2812.zip
Platinen-Layout (Sprint-Layout, PDF und Gerber) für LEDs WS2812B, 5 Einzelteile auf Europlatine 160mm x 100m vom 29.12.2013 w-stern-layout-ws2812b.zip
Platinen-Layout (Sprint-Layout, PDF und Gerber) für LEDs WS2812B, kompletter Stern auf Platine 185mm x 175mm vom 08.02.2014 w-stern-layout-ws2812b-2.zip
Platinen-Layout (Sprint-Layout) für LEDs WS2812B, kompletter Stern auf Platine 185mm x 175mm vom 24.01.2021 w-stern-layout-ws2812b-3.zip
Platinen-Layout (Gerber) für LEDs WS2812B, Stern ohne Controller-Elektronik vom 12.11.2022w-stern-layout-ws2812b-4.zip
Platinen-Layout (Corel Draw und PDF) für LEDs WS2813, kompletter Stern auf einer Platine vom 26.02.2018w-stern-layout-ws2813.zip
Platinen-Layout (Sprint-Layout) für Controller-Platine im Fuß-Gehäuse und Stern mit WS2812B ohne Controller vom 24.10.2019 w-stern-layout-controller.zip
SymbolInhaltsverzeichnis
BeschreibungAllgemeine Informationen über den Weihnachtsstern
SchaltungBeschreibung der Schaltung
HardwareBilder und Hinweise zum Aufbau des Weihnachtssterns
SoftwareBeschreibung der Software
InbetriebnahmeInbetriebnahme des Weihnachtsstern
BedienungBedienungsanleitung des Weihnachtssterns
SonstigesEinige Hintergrundinformationen zur Entwicklung
SymbolBeschreibung

Schon länger war ich auf der Suche nach einer elektronischen Weihnachtsdekoration, die man ins Fenster stellen oder hängen kann. Allerdings haben mich die Beleuchtungen, die man fertig kaufen kann, nicht so recht überzeugt. So entstand dieser Weihnachtsstern, welcher aus 50 speziellen RGB-LEDs besteht. Diese LEDs beinhalten zusätzlich einen PWM-Treiber für jede Grundfarbe sowie einen einfachen Controller und werden seriell über eine einzelne Datenleitung angesteuert. Weiterhin besitzen die LEDs auch einen Datenausgang und können so zu einer langen Kette kaskadiert werden. Damit ist es möglich, jede LED dieser Kette mit beliebiger Farbe und Helligkeit leuchten zu lassen. Farbe und Helligkeit werden dabei über 3 Bytes festgelegt - jeweils ein Byte enthält den Farbwert für Rot, Grün und Blau im Bereich von 0 bis 255. Zur Steuerung der LEDs im Weihnachtsstern dient ein ATtiny44A, dieser berechnet zyklisch die RGB-Werte für die 50 LEDs und gibt sie dann als seriellen Datenstrom an die LED-Kette aus.

Die Software des Weihnachtssterns, die übrigens zum größten Teil in C geschrieben wurde, steuert einen kontinuierlichen Farbwechsel aller LEDs. Eine ganz wichtige Funktion übernimmt dabei ein Pseudozufallsgenerator. Über diesen wird die nächste Farbe ermittelt und auch einige zusätzliche Effekte werden davon abgeleitet. Über 3 Trimmpotentiometer lässt sich die Intensität der 3 Grundfarben einstellen. Außerdem wird die Stellung der Potentiometer beim Einschalten des Sterns gelesen und als Startwert für den Zufallsgenerator benutzt. Damit wird es möglich, mehrere Sterne nebeneinander zu betreiben: Eine unterschiedliche Potentiometer-Stellung führt dazu, dass die Sterne völlig verschiedene Farbwechsel und Effekte zeigen. Weiterhin ist noch ein Taster vorhanden. Über diesen lässt sich die Stellung der Potentiometer über die LEDs anzeigen und die Geschwindigkeit der Effekte in 3 Stufen ändern.

Aufgrund der besonderen Form des Sterns gibt es bei diesem Projekt ein Platinenlayout, welches vom Bastlerkollegen Dietmar Heyer entwickelt wurde. Das Layout passt komplett auf eine Euro-Platine mit den Maßen 160mm x 100mm. Es besteht allerdings aus mehreren Teilen, die erst zum Weihnachtsstern zusammengefügt werden müssen. Bei den Bauelementen dieses Projektes wurden ausschließlich SMD-Typen verwendet. Dies ermöglicht eine sehr kompakte Platine, erhöht aber den Schwierigkeitsgrad beim Aufbau enorm. Dieses Projekt ist also nicht unbedingt für Einsteiger geeignet. Allerdings gibt es noch eine alternative Möglichkeit ganz ohne SMD-Technik, die am Ende des Abschnitts Hardware kurz beschrieben wird.

SymbolSchaltung

Schaltung1 Die gesamte Schaltung des Weihnachtssterns ist relativ einfach und schnell beschrieben: Als zentrales Bauteil wird hier der Mikrocontroller ATtiny44A (IC1) verwendet. Dieser wird einer Taktfrequenz von 16MHz betrieben, welche mithilfe des Quarzes Q1 erzeugt wird. Diese relativ hohe Frequenz ist notwendig, um ein möglichst präzises Datensignal für die LEDs zu erzeugen. An den 3 Controller-Anschlüssen PA0-PA2 (Pin 13, 12 und 11) sind Potentiometer angeschlossen. Abhängig von deren Stellung liegen hier Spannungen zwischen 0V und 5V, die zyklisch vom Mikrocontroller gemessen und für die Erzeugung der Farbwerte verwendet werden. Über den Anschluss PA3 (Pin 10) wird der Zustand des Tasters S1 gelesen. Die Anschlüsse PA4-PA6 sowie der Anschluss PB3 sind an den ISP-Anschluss J1 geführt. Dieser Anschluss wird zur Programmierung des Mikrocontrollers benötigt und entspricht dem Atmel-Standard.

Übrig bleibt noch der Anschluss PB2 und über diesen werden die Daten zur LED-Kette gesendet. Wie schon in der Beschreibung erwähnt, erfolgt der Datentransfer seriell, wobei hier Impulse mit einer Frequenz von 800kHz gesendet werden. Jeder Impuls überträgt ein Bit und das Impuls/Pausen-Verhältnis bestimmt die Wertigkeit (0 oder 1). Die Gesamtlänge eines Impulses beträgt immer 1,25µs, im Falle eines 0-Bits wird der Anschluss PB2 für 0,312µs auf High und für 0,938µs auf Low gesetzt. Bei einem 1-Bit liegt der Anschluss für 0,812µs auf High und für 0,438µs auf Low. Auf diese Weise werden insgesamt 1200 Bits auf die Reise geschickt, das ergibt 150 Bytes, also jeweils 3 Farbwerte für die 50 LEDs. Das Senden eines vollständigen Datenpakets dauert 1,5ms und dieser Vorgang wird alle 4ms wiederholt, also 250 mal pro Sekunde.

Dieser Datenstrom wird zur LED-Kette (bestehend aus IC2-IC51) gesendet, von der nur die ersten 3 LEDs im Schaltplan eingezeichnet sind. Alle weiteren LEDs sind auf die gleiche Art und Weise angeschlossen. Die seriellen Daten werden von der ersten LED (IC2) am Anschluss DI (Pin 2) empfangen und dabei passiert folgendes: Die ersten 3 Bytes werden vom internen Controller als Farbwerte in der Reihenfolge Grün-Rot-Blau interpretiert und direkt an die internen LED-Treiber weitergegeben. Diese 3 Bytes werden jedoch nicht zur nächsten LED gesendet. Erst das Byte 4 und alle folgenden Bytes werden über den Anschluss DO (Pin 1) zum Anschluss DI der nächsten LED (IC3) übertragen. Auch diese LED nimmt sich wiederum die ersten 3 Bytes für sich und gibt den Rest an die nächste LED weiter - bezogen auf den Original-Datenstrom ist das Byte 7 und alle nachfolgenden. Auf diese Weise nehmen sich alle LEDs ihre 3 Byte aus dem Datenstrom und an der letzten LED (IC51) kommen schließlich die letzten 3 Bytes an.

Zur Stromversorgung des Weihnachtssterns wird eine stabilisierte Spannung von 5V benötigt, die am besten aus einem passenden Schaltnetzteil gewonnen wird. Bei voller Helligkeit beträgt die Stromaufnahme maximal 600mA, dabei werden die LEDs übrigens nicht voll ausgesteuert. Für den Farbwechsel wird vom möglichen Wertebereich 0-255 nur der Bereich 0-63 verwendet, bei den Effekten werden einzelne LEDs bis zum Wert 100 betrieben. Das ist ausreichend hell und spart viel Strom.

In dieser Stückliste sind alle benötigten Bauteile aufgeführt. Zusätzlich gibt es noch einige Empfehlungen für die Bestellung.

Wichtig: Die Schaltung besitzt keinerlei Schutz gegen Überspannung oder Falschpolung! Man sollte also unbedingt ein geregeltes 5V-Netzteil benutzen und den Stern ausschließlich mit diesem Netzteil über eine verpolungssichere Steckverbindung betreiben. Weiterhin sind die LEDs sehr empfindlich gegen elektrostatische Entladungen. Man sollte die LEDs möglichst nicht berühren und den Stern zum Transport nur am Ständer anfassen.

Schaltung2 In der ursprünglichen Schaltung wurden LEDs vom Typ WS2812 verwendet. Inzwischen gibt es die verbesserten WS2812B, die zwar in den technischen Daten vollkommen kompatibel zu ihren Vorgängern sind, leider aber eine andere Anschlussbelegung haben. Das nebenstehende Bild zeigt die Schaltung der LED-Kette mit WS2812B. Zu beachten ist hier auch, dass sich die Gehäuse-Markierung jetzt an Pin 3 befindet und nicht mehr an Pin 1 (muss man nicht verstehen).

Dadurch verändert sich natürlich auch das Platinenlayout. Beim Aufbau sollte man also darauf achten, dass auch das zum LED-Typ passende Platinenlayout verwendet wird.

Schaltung3 Der Fortschritt ist nicht aufzuhalten: Im Jahr 2016 kam der Nachfolger WS2813 auf den Markt und dieser wird vermutlich alle Vorgänger ersetzen. Die WS2813 haben die Bauform der ursprünglichen WS2812 und auch wieder die Markierung an Pin 1, allerdings wurde die Anschlussbelegung geändert. Im Inneren arbeitet ein neuer Chip, der einen zusätzlichen Backup-Dateneingang besitzt. Dieser muss, wie im Schaltplan zu sehen ist, mit dem Dateneingang der vorherigen LED verbunden werden. Bei den bisher verwendeten WS2812 und WS2812B führt der Ausfall einer LED zum Ausfall aller nachfolgenden LEDs in der Kette. Bei den WS2813 übernimmt in einem solchen Fall der Backup-Eingang den Datenstrom, blendet die Daten der vorherigen LED aus und die restliche LED-Kette arbeitet normal weiter. Weiterhin enthalten die LEDs intern einen Stützkondensator, so dass die Kondensatoren C5-C44 entfallen können. Die LEDs gibt es übrigens in den 4 Varianten WS2813A, WS2813B, WS2813C und WS2813D. Die Varianten A und B arbeiten (wie die WS2812 und WS2812B) mit 18mA LED-Strom pro Farbe, die B-Variante ist nicht ganz so hell und etwas günstiger. Bei den Varianten C und D beträgt der LED-Strom 5mA und hier ist die D-Variante nicht ganz so hell und günstiger. Für den Weihnachtsstern empfehle ich die WS2813B.

Leider wurde das Timing für die Datenübertragung etwas geändert, so dass ein mit WS2813 aufgebauter Weihnachtsstern zwingend mit der Software v1.10 (oder höher) betrieben werden muss. Auch das Platinenlayout hat sich wieder geändert.

SymbolHardware

W-Stern Bild1 Der Aufbau des Weihnachtssterns ist eine schweißtreibende Angelegenheit. Zunächst müssen die 5 Einzelteile ausgeschnitten und geschliffen werden. Dabei ist höchste Präzision erforderlich, damit alle Teile exakt zusammenpassen. Beim Prototyp habe ich noch Handsäge und Feilen verwendet, für den Aufbau weiterer Sterne standen mir eine Tischkreissäge und ein Tellerschleifgerät aus dem Hause Proxxon zur Verfügung, welche die Arbeit sehr erleichtert haben. Vielen Dank an dieser Stelle an den Bastlerkollegen Dietmar Heyer für die Leihgabe der Geräte. Von ihm stammt auch das linke Bild, auf dem die Platinenteile mit 0Ω-Widerständen zusammengelötet wurden. Weiterhin hat der Kollege alle Lötpads verzinnt, um die Bestückung zu erleichtern. Das ist aber nicht notwendig, wenn man nach der Reinigung und Montage der Platinenteile sofort mit der Bestückung beginnt. Für eine bessere Stabilität empfiehlt es sich, die Stoßstellen auf der Platinen-Rückseite (die Seite ohne Kupfer) mit Zweikomponenten-Kleber zu überstreichen.

Hinweis: Alle Bilder wurden lange vor der Veröffentlichung erstellt und zeigen ein älteres Platinen-Layout für den LED-Typ WS2812. Die aktuellen Layouts wurden in einigen Details verbessert, die grundsätzliche Lage der Bauteile ist aber weitgehend identisch.

W-Stern Bild2 Dieses Bild zeigt den zentralen Schaltungsteil eines fertig aufgebauten Weihnachtssterns. Die Bestückung der Bauteile sollte man in der folgenden Reihenfolge vornehmen: IC1 (Markierung links unten), R1, R2, C1, C2, C3, P1, P2, P3, Q1, C4 (Plus unten), J1 und S1. Anschließend müssen noch 0Ω-Widerstände, die als Brücke für einige Verbindungen dienen, bestückt werden. Hier unterscheidet sich die aktuelle Platinenversion vom Bild und es sind insgesamt 10 Stück 0Ω-Widerstände einzulöten. In den Download-Paketen für die Platinen-Layouts ist die Bestückung gut dokumentiert, so dass man sich an diesen Plänen orientieren kann. Nach der Bestückung des Zentralteils sollte man einen ersten Funktionstest durchführen und wenn dieser erfolgreich ist, die Software in den Mikrocontroller übertragen. Siehe dazu auch den Abschnitt Inbetriebnahme.

Übrigens, ich habe die Platinenteile hier nicht mit den vorgesehenen 0Ω-Widerständen verbunden und stattdessen an 3 Stellen flächig verlötet. Das ergibt eine stabilere Verbindung. Allerdings muss man sehr vorsichtig arbeiten, denn durch die Erwärmung kann sich die Spitze leicht verbiegen. Bei den aktuellen Platinen-Layouts gibt es übrigens auch die Möglichkeit, die Pads der Platinenteile direkt über einen Lötpunkt zu verbinden. Die Pads sind für diesen Zweck bis an die Stoßkante verlängert worden. Das gibt mehr Stabilität und sieht trotzdem sauber aus, da das Lötzinn nicht verlaufen kann.

W-Stern Bild3 Wenn der zentrale Schaltungsteil funktioniert, dann kann mit der Bestückung der LEDs (IC2-IC51) und der dazugehörigen Stützkondensatoren (C7-C44) begonnen werden. Um das Platinenlayout etwas zu vereinfachen, beginnt die LED-Kette nicht an der oberen Spitze, sondern an der im nebenstehenden Bild markierten Position und setzt sich dann in Pfeilrichtung fort. Die Kette endet dann schließlich bei IC51 (unterhalb der Markierung). Bei der Bestückung sollte genau in dieser Reihenfolge vorgegangen werden und das hat folgenden Grund: Man kann zunächst einen Teil der LED-Kette sowie der Stützkondensatoren bestücken und jederzeit die Funktion testen. Ich habe beim Aufbau meiner Sterne immer Gruppen von 10 LEDs eingelötet (eine komplette Spitze) und anschließend einen Testlauf durchgeführt. So sind eventuelle Fehler leichter zu finden. Es hat sich nämlich gezeigt, dass die verwendeten LEDs nicht unbedingt von bester Qualität sind. Ab und zu findet man ein defektes Exemplar, welches nur teilweise oder überhaupt nicht funktioniert. Leider ist nicht immer klar zu erkennen, ob eine nicht funktionierende LED defekt ist, denn das Problem kann auch durch einen Fehler am Ausgang DO der vorherigen LED verursacht werden.

Wichtig: Beim Einlöten der LEDs immer auf die richtige Lage achten! Diese kann den Dateien im Platinen-Layout entnommen werden. Hier unterscheiden sich die beiden Varianten enorm: Während sich bei den WS2812 und WS2813 die Gehäuse-Markierung an Pin 1 befindet, hat man bei den WS2812B die Markierung an Pin 3 angebracht.

Übrigens, ich habe für alle Lötarbeiten eine Ringlupenleuchte verwendet, da die Strukturen doch recht winzig und meine Augen nicht mehr so gut sind.

W-Stern Bild4 Wenn man alles richtig gemacht hat, dann kann das so aussehen wie im linken Bild.

Als Ständer für den Stern kommt hier ein Aluminiumrohr mit 8mm Durchmesser zum Einsatz, welches in ein Gehäuse (ebenfalls aus Aluminium) eingeklebt wurde. Das obere Ende des Rohrs ist direkt mittels Zweikomponenten-Kleber an die Rückseite des Sterns geklebt. Die Stromleitung zur Platine wurde durch das Rohr geschoben und im Fuß-Gehäuse parallel an 2 Hohlstecker-Kupplungen geführt (jeweils eine an jeder Gehäuseseite). So lässt sich die Stromversorgung wahlweise von beiden Seiten anschließen und es ist eine einfache Kaskadierung mehrerer Sterne möglich.

In der Stückliste sind im unteren Tabellenteil (Bereich Option) die zusätzlichen Teile zu finden, die ich für meine Sterne verwendet habe.

Noch ein Hinweis: Wenn die Platine selbst hergestellt wird, dann ist es erforderlich, die Kupferflächen zu versiegeln. Anderenfalls werden sie im Laufe der Zeit oxidieren und das sieht sehr hässlich aus. Ich bin folgendermaßen vorgegangen: Direkt nach der Bestückung der Platine, dem Anlöten der Stromversorgungskabel und einem ausgiebigen Funktionstest wurden die Kupferflächen zunächst mit Spiritus gereinigt. Sind die Kupferflächen noch rein, dann kann man direkt mit der Versiegelung beginnen. Ich hatte leider zu lange gewartet und musste erst die beginnenden Oxidationsspuren mit einer Display-Polierpaste beseitigen. Im nächsten Schritt habe ich die Potis und den Taster mit einem Stück Klebestreifen geschützt und einen Buchsenstecker als Schutz für die Kontaktstifte auf den ISP-Anschluss gesteckt. Anschließend wurde die gesamte Platinenfläche mit einem Sprüh-Klarlack auf Kunstharzbasis versiegelt. Man kann dabei ruhig über alle Bauteile und auch die LEDs sprühen. Vor der weiteren Bearbeitung sollte man die Platine gut 2 Tage lang trocknen lassen. Danach kann der Standfuß montiert und das Gesamtwerk vollendet werden.

W-Stern Bild5 Ich habe eine Gruppe von 4 Sternen aufgebaut. Hier wird von der Kaskadierung Gebrauch gemacht und ein gemeinsames 5V/3A-Netzteil versorgt alle Sterne. Weiterhin ist beim parallelen Betrieb mehrerer Sterne wichtig, die Potentiometer aller Sterne unterschiedlich einzustellen. Damit ist sichergestellt, dass der Pseudozufallsgenerator jedes Sterns anders initialisiert wird und somit unterschiedliche Farbwechsel- und Effekt-Programme ausgeführt werden.

Übrigens, es ist recht schwierig, die Sterne im laufenden Betrieb zu fotografieren. Ein besseres Bild war leider nicht möglich, aber es sieht in der Realität wirklich gut aus :-)

W-Stern Bild6 Falls jemand gänzlich mit der SMD-Technik auf Kriegsfuß steht, dann bietet sich noch eine Alternative an. Die für den Stern verwendeten LEDs gibt es auch auf fertig konfektionierten Streifen zu kaufen. Diese lassen sich nach jeder LED beliebig trennen, können dann in Sternenform auf eine Trägerplatte geklebt und als LED-Kette verkabelt werden. Die zentrale Schaltung lässt sich dann z.B. mit klassischen Bauelementen auf einer Lochraster-Platine aufbauen. Diese Variante wurde allerdings nicht gestestet. Außerdem wird der Stern etwas größer, da der Abstand der LEDs mit knapp 17mm deutlich größer ist als die 11,5mm auf der Platine.

SymbolSoftware

Die aktuelle Software für den Weihnachtsstern wurde mit dem Atmel Studio 7 in C und Assembler geschrieben und besteht hauptsächlich aus folgenden beiden Dateien:

Weihnachtsstern.centhält das Hauptprogramm in C zur Steuerung des Farbwechsels und der Effekte
Weihnachtsstern_asm.senthält die zeitkritische Ausgaberoutine für die LED-Daten in Assembler

Die Funktionen der beiden Dateien werden im folgenden Abschnitt etwas ausführlicher beschrieben:

Weihnachtsstern.c

Das Hauptprogramm des Weihnachtssterns beginnt zunächst mit der Definition von Konstanten. Einige davon sind fest auf die verwendete Hardware abgestimmt und sollten auch nicht geändert werden. Der größere Teil der Konstanten lässt sich jedoch ändern und so können Farbwechsel und Effekte nach eigenen Wünschen angepasst werden. Da sich der Stern in 3 Geschwindigkeitsstufen betreiben lässt, können bei vielen Konstanten 3 Werte festgelegt werden.

Im folgenden Abschnitt werden viele Variablen deklariert. Ein Datenfeld von 150 Bytes bildet die größte Variable, diese setzt sich aus jeweils 3 Farbbytes für die 50 LEDs zusammen. Hier werden die komplett aufbereiteten LED-Daten gespeichert und alle 4ms der Assembler-Routine zur Ausgabe an die LED-Kette übergeben. Das RAM des ATtiny44A wurde übrigens weitgehend ausgereizt, Platz für Erweiterungen gibt es hier leider nicht mehr. Weiterhin wird noch eine Variable im EEPROM deklariert, hier wird die zuletzt gewählte Geschwindigkeitsstufe dauerhaft gespeichert.

Der nächste Abschnitt enthält 3 Funktionen. Die erste wird für die Erzeugung der Zufallszahlen verwendet und besteht aus einem relativ einfachen Verfahren, welches auf Bit-Verschiebungen und Exklusiv-Oder-Verknüpfungen beruht. Zur Verbesserung der Zufallswerte wird außerdem noch der aktuelle Zählerstand des 16-Bit-Timers 1 gelesen und ebenfalls mit Exklusiv-Oder verknüpft. Der Timer 1 läuft für diesen Zweck mit der höchsten Taktgeschwindigkeit von 16MHz. Somit wird der Zufallswert zusätzlich noch vom Zeitpunkt des Funktionsaufrufs abhängig. Die nächste Funktion wird für die Steuerung des Farbwechsels benötigt und die letzte dient zur Steuerung einer der 6-Effekt-LEDs. Dazu muss ich kurz auf das Konzept der LED-Steuerung eingehen: Da das RAM nicht ausreicht, um alle 50 LEDs komplett unabhängig zu steuern, habe ich einen Kompromiss gewählt. Es werden nur 3 Variablen verwendet, um ständig einen neuen Wert für den Farbwechsel zu berechnen und dieser Wert wird grundsätzlich parallel an alle 50 LEDs ausgegeben, d.h. alle LEDs zeigen immer die gleiche Farbe. Damit das nicht zu eintönig wird, habe ich 6 Effekt-LEDs definiert, die jeweils ein eigenes Variablenfeld besitzen. Es können somit bis zu 6 LEDs aus dem Standard-Farbwechsel herausgenommen und unabhängig vom Rest gesteuert werden. Eine Effekt-LED wird zunächst über die Routine in diesem Abschnitt aktiviert. Die Steuerung im Hauptprogramm blendet dann diese LED vom aktuellen Farbwert langsam auf einen festgelegten Weißwert auf und fährt Helligkeit und Farbe anschließend wieder langsam auf den normalen Farbwechsel-Wert zurück. Mit diesen 6 Effekt-LEDs werden der Sternenfunkel-Effekt und alle Lauflicht-Effekte erzeugt.

Im weiteren Quelltext folgt eine Interruptroutine. Diese wird vom Timer 0 alle 2ms ausgelöst und steuert das gesamte Timing des Weihnachtssterns. Zunächst wird der Analog-Digital-Konverter (ADC) gelesen und der enthält immer den Wert eines der 3 Potentiometer. Welches Poti gelesen wird, bestimmt eine Variable, die bei jedem Aufruf der Interruptroutine erhöht wird und den ADC auf den nächsten Poti-Anschluss setzt. Nach 3 Durchläufen wird wieder beim ersten Poti begonnen, so dass alle 6ms die aktuellen Poti-Werte vorliegen. Weiterhin werden einige Zählerwerte vermindert, die für das Timing des Farbwechsels und der Pausen zwischen den Effekten zuständig sind. Auch die 6 Effekt-LEDs haben jeweils einen Zähler, der hier bearbeitet wird.
Der restliche Teil der Interruptroutine dient zur Erkennung eines Tasterdrucks. Dazu wird bei jedem Interrupt der Zustand des Tasters gelesen und ist dieser mindestens 25 Interrupts durchgehend gedrückt (50ms), dann wird eine Variable gesetzt und dem Hauptprogramm signalisiert, dass ein kurzer Tasterdruck erkannt wurde. Außerdem wird ein weiterer Zähler erhöht und wenn nach 20 x 50ms der Taster immer noch aktiv ist, dann wird dem Hauptprogramm ein langer Tasterdruck übermittelt.

Nun beginnt der Hauptprogrammteil mit der Initialisierung, hier werden zunächst die I/O-Ports, der ADC und die beiden Timer eingestellt. Anschließend wird die gespeicherte Geschwindigkeitsstufe aus dem EEPROM gelesen, 3 Timer-Interrupts gewartet, die ermittelten Poti-Stellungen gelesen und daraus der Startwert für den Pseudozufallsgenerator ermittelt. Zum Abschluss der Initialisierung wird der Farbwert auf einen niedrigen Startwert gesetzt und die Start-Sequenz ausgelöst.

Nach der Initialisierung beginnt die Hauptprogrammschleife und diese unterteilt sich wiederum in mehrere Abschnitte:

Weihnachtsstern_asm.s

Diese Routine sendet ein vom C-Programm berechnetes Datenfeld an die LED-Kette. Dazu wird zunächst der erste übergebene Parameter als Adress-Zeiger ins Z-Register kopiert. Der zweite Parameter enthält die Anzahl der zu sendenden Bytes und wird später nach dem Senden eines kompletten Bytes um 1 vermindert und geprüft. Zunächst wird ein Zähl-Register für die einzelnen Bits auf 8 gesetzt und 1 Byte vom Datenfeld geholt. Der Datenausgang wird auf High gesetzt und damit beginnt die Datenübertragung. Durch Rotieren des Bytes nach links rückt das oberste Bit ins Carry-Flag und abhängig vom Carry wird entweder kurz gewartet (0-Bit) oder lange (1-Bit) und anschließend der Datenausgang wieder auf Low gesetzt. Es folgt eine Prüfung, ob alle 8 Bits gesendet wurden und entweder das nächste Bit ins Carry geschoben oder der Byte-Zähler geprüft. Sind weitere Bytes zu senden, dann beginnt die Schleife von vorn, anderenfalls wird die Routine beendet.

Die Struktur dieser Routine ist durch die vielen NOPs etwas schwer zu durchschauen. Es geht aber nicht anders, wenn das Timing genau stimmen soll. Experimente haben zwar ergeben, dass die LEDs recht große Toleranzen bei der Geschwindigkeit und der Puls/Pausenzeiten akzeptieren. Trotzdem habe ich mich beim Timing exakt an das Datenblatt der WS2812, WS2812B und WS2813 gehalten, damit man später im Dauerbetrieb bei Spannungs- und Temperaturschwankungen keine Überraschungen erlebt.

SymbolInbetriebnahme

Für die Inbetriebnahme des Weihnachtssterns wird die aktuelle Software v1.11 vom 12.12.2021 benötigt. In diesem Paket befinden sich die Quelltextdateien in C und Assembler und natürlich auch das fertig kompilierte Programm Weihnachtsstern.hex, zu finden im Verzeichnis Weihnachtsstern\Weihnachtsstern\Release. Diese Software unterstützt alle LED-Typen WS2812, WS2812B und WS2813.

Im Gegensatz zu den meisten anderen Projekten dieser Seite empfehle ich hier einen anderen Weg für die Inbetriebnahme. Es sollte zunächst nur der zentrale Schaltungsteil und eventuell noch die erste LED (IC2) bestückt werden. Jetzt schließt man am besten das für den Stern vorgesehene 5V-Netzteil an die Platine an, wobei die Plus-Leitung nicht direkt, sondern über einen Widerstand im Bereich von 50 bis 100Ω an die Platine geführt wird. Damit werden Schäden an Schaltung und Netzteil vermieden, falls die Platine irgendwo einen Kurzschluss hat. Nach dem Einschalten des Netzteils misst man die Spannung direkt an der Schaltung (hinter dem eingefügten Widerstand) und hier sollten mindestens 4,5V angezeigt werden. Falls das nicht der Fall ist, dann muss die Platine auf Kurzschlüsse untersucht werden.

Ist die Spannung in Ordnung, dann kann man mit der Programmierung beginnen. Das Programmiergerät wird angeschlossen, die Spannung wieder eingeschaltet (diesmal ohne den zusätzlichen Widerstand) und die Software Weihnachtsstern.hex in den Mikrocontroller geschrieben. Anschließend macht man gleich bei den Fuse-Bits weiter, die folgendermaßen aussehen müssen:

Fusebits Andere Programmiersoftware bietet oft nicht so einen übersichtlichen Dialog an. Hier werden stattdessen die Werte für die 3 Fuse-Bit-Register erwartet und direkt geschrieben (z.B. bei AVRDUDE oder myAVR-ProgTool). In diesem Fall kann man die 3 benötigten Werte aus dem unteren Teil des Bildes entnehmen:

EXTENDED = 0xFF
HIGH = 0xD5
LOW = 0xFF

Wenn die Programmierung erfolgreich war, dann kann die Bestückung der LEDs, beginnend mit IC2, erfolgen. Es wird empfohlen, immer nur kleine Gruppen von maximal 10 LEDs zu bestücken und anschließend einen Funktionstest durchzuführen. Der Stern funktioniert auch mit einer Teilbestückung und so kann man jederzeit die bisherige Arbeit überprüfen und Fehler leichter lokalisieren.

SymbolBedienung

Nach dem Einschalten der Stromversorgung beginnt der Weihnachtsstern mit seiner Arbeit und die sieht folgendermaßen aus: Es werden zunächst die Stellungen der 3 Potentiometer P1-P3 gelesen, die ermittelten Werte zu einem 16-Bit-Wert verknüpft und das Ergebnis dem Pseudozufallsgenerator als Startwert übergeben. Anschließend werden Zufallszahlen für den Rot-, Grün und Blau-Wert erzeugt und die Farbwechsel-Steuerung aktiviert. Gleichzeitig wird der Start-Effekt aktiviert, bei dem alle Sternspitzen kurzzeitig hell aufleuchten. Wenig später schaltet sich der erste Effekt ein, dies ist immer das „Sternenfunkeln“. Dabei werden einzelne LEDs des Sterns kurz aufgeblendet, wobei auch hier der Zufall beteiligt ist - er bestimmt die Anzahl (zwischen 10 und 30), die LED-Nummer und die Zeit bis zum nächsten Funkeln. Nach dem Sternenfunkeln legt der Stern eine kurze Pause ein und einer der Lauflicht-Effekte wird aktiv. Auch hier bestimmt der Zufall über die Art des Lauflichts und legt außerdem fest, an welcher Spitze begonnen wird. Nach einem kompletten Umlauf beendet sich der Effekt und nach einer kurzen Pause wird wieder das Sternenfunkeln aktiv - der Zyklus beginnt von vorn. Es wiederholen sich also immer abwechselnd der Sternenfunkel- und einer der Lauflicht-Effekte, während der Farbwechsel im Hintergrund permanent aktiv ist. Dieses Programm läuft endlos ab, bis der Strom abgeschaltet wird. Alternativ kann man über folgende Bedienelemente in den Ablauf eingreifen:

Potentiometer P1, P2 und P3 - Die Software des Weihnachtssterns verwendet einen Werte-Bereich von 0 und 63 für jede Grundfarbe (Rot, Grün und Blau) zur Steuerung des Farbwechsels. Der Wert 0 bedeutet, dass diese Grundfarbe gar nicht verwendet wird und je höher der Wert, desto intensiver ist der Farbanteil. Dieser Werte-Bereich lässt sich durch die Potentiometer P1-P3 verändern, um den Farbwechsel und auch die Helligkeit individuell zu gestalten. Dazu liest die Software ständig die Stellung der Potis und benutzt den eingestellten Wert als Bereichsgrenze. Das Poti P1 bestimmt dabei den Bereich für die Farbe Rot, P2 den Bereich für Grün und P3 den Bereich für Blau.

Die Potis haben noch eine weitere Funktion. Da es auf einem Mikrocontroller keinen echten Zufall gibt, muss man ein wenig nachhelfen. Für diesen Zweck wird die Stellung der 3 Potis beim Einschalten der Stromversorgung gelesen, die Werte verknüpft und der ermittelte 16-Bit-Wert zur Initialisierung des Zufallsgenerators verwendet. Das ist insbesondere dann wichtig, wenn mehrere Sterne nebeneinander betrieben werden, denn die sollen ja nicht alle das gleiche Programm abspielen. Also stellt man die Potis einfach etwas unterschiedlich ein und dann wird jeder Stern ein anderes Bild zeigen.

Da sich die Poti-Stellung nur schwer einschätzen lässt, habe ich eine Funktion zur Anzeige der Stellung eingebaut und dafür kommt ein weiteres Bedienelement zum Einsatz:

Taster S1 - Über diesen Taster wurden 2 Funktionen realisiert, die durch eine unterschiedliche Dauer des Tasterdrucks ausgewählt werden:

Kurzer Druck (kleiner als eine Sekunde): Damit werden die 50 LEDs des Sterns in eine Zustandsanzeige für die Poti-Stellungen umgeschaltet. Ausgehend von der oberen Sternspitze wird im Uhrzeigersinn die Anzahl LEDs eingeschaltet, die der Stellung eines Potis entspricht. Steht beispielsweise das Poti für Rot am linken Anschlag, dann leuchtet keine rote LED; bei Mittelstellung des Potis leuchten alle roten LEDs der rechten Sternhälfte und bei der Poti-Stellung am rechten Anschlag leuchten alle roten LEDs. Das gleiche passiert mit den Farben Grün und Blau entsprechend der Stellung des dazugehörigen Potis. Dabei überlagern sich zwangsläufig die Farben im unteren Bereich. Das ist sicher etwas gewöhnungsbedürftig, aber wenn man an einem der Potis dreht, wird man schnell das System verstehen. Es kann übrigens passieren, dass die letzte LED etwas flackert. Das kommt durch die Analog-Digital-Wandlung zustande und zeigt, dass die Poti-Stellung zwischen 2 Werten schwankt - das ist durchaus normal.

Langer Druck (größer als eine Sekunde): Mit dieser Funktion wird die Geschwindigkeitsstufe umgeschaltet. Der Weihnachtsstern kann in 3 Geschwindigkeitsstufen betrieben werden und das wirkt sich sowohl auf den Farbwechsel also auch auf die Effekte aus. Nach der Inbetriebnahme eines neuen Sterns ist zunächst die mittlere Geschwindigkeit (Stufe 2) aktiv. Durch einen langen Tasterdruck wird auf die nächst höhere Geschwindigkeit umgeschaltet, also auf Stufe 3. Das wird außerdem zur kurzes Aufleuchten der ersten 3 LEDs, beginnend an der oberen Spitze, optisch angezeigt. Nach dem Loslassen des Tasters beginnt der Stern mit seiner normalen Arbeit - allerdings in der neuen Geschwindigkeitsstufe. Wird der Taster erneut lang gedrückt, dann wird wiederum auf die nächste Stufe geschaltet, wobei in diesem Fall wieder bei der Stufe 1 begonnen wird. Auch dies wird durch kurzes Aufleuchten der ersten LED quittiert. Während des Tasterdrucks wird zunächst auch der kurze Druck erkannt und es erscheint vorübergehend die Poti-Stellung - das ist normal. Danach wird die Geschwindigkeit umgeschaltet, die neue Stufe angezeigt und auch dauerhaft im EEPROM des Controllers gespeichert. Es ist übrigens nicht vorgesehen, die eingestellte Stufe anzuzeigen, sie lässt sich nur (wie beschrieben) umschalten. Also einfach dreimal lang drücken, dann wird die ursprüngliche Stufe wieder eingestellt und angezeigt.

Hier sind noch einige Tipps für die Praxis: Der optimale Farbwechsel ergibt sich bei Mittelstellung der Potis. Stellt man zu hohe Werte ein (z.B. Rechts-Anschlag), dann wirkt der Stern insgesamt heller, allerdings ist dann der Kontrast zum Sternenfunkeln und zu den Lauflicht-Effekten nicht mehr so gut. Sehr niedrige Poti-Werte sind ebenfalls nicht zu empfehlen, da hier eine Schwachstelle der LEDs extrem auffällt: Bei geringer Helligkeit sind die einzelnen PWM-Stufen deutlich zu sehen und der Farbwechsel wirkt etwas ruckelig. Im Betrieb versucht die Software, solche niedrigen Werte beim Farbwechsel zu vermeiden, allerdings wird dieser Mechanismus bei niedrigen Poti-Werten außer Kraft gesetzt.

SymbolSonstiges

Die Idee für dieses Projekt entstand schon vor längerer Zeit, allerdings hatte ich nie an die Realisierung gedacht, da man hier die von mir favorisierte Lochraster-Technik nicht einsetzen kann. Erst mithilfe eines Bastlerkollegen reifte dann die Idee und so wurde im Januar 2013 mit dem Projekt begonnen. Zunächst wurden passende LEDs gesucht und in die engere Wahl kamen Chips mit RGB-LEDs. Diese hatten allerdings den Nachteil, dass man für jede Farbe noch einen Vorwiderstand benötigt (3 Stück pro LED) und außerdem kräftige Treiber zur Ansteuerung. Also ging die Suche weiter und schließlich wurden die WS2812 entdeckt. Zunächst bestellte ich 20 Stück und baute mit einem vorhandenen ATmega8-Modul eine kleine Versuchsschaltung auf. Nachdem die knifflige Ansteuerung gemeistert wurde, stellten sich erste Erfolge ein und es konnte mit der Entwicklung der Schaltung und des Platinenlayouts begonnen werden. Auch wurde schon mal eine Großbestellung von 500 LEDs getätigt, denn es sollten insgesamt 10 Weihnachtssterne gebaut werden. Schließlich wurde ein erster Prototyp aufgebaut und gegen Ende Februar 2013 in Betrieb genommen. Die Software war natürlich noch im Anfangsstadium und auch am Layout zeigten sich noch einige Schwächen.

Nach einer längeren Pause wurde die Arbeit im Juli 2013 fortgesetzt. Das Platinenlayout war mittlerweile ausgereift und konnte in Serie gehen. Die Arbeiten an der Software wurden fortgesetzt und 4 weitere Sterne entstanden, die auch als Modell für die Bilder verwendet wurden. Hier zeigte sich noch ein weiteres Problem, an das man anfangs gar nicht dachte. So oxidieren die Kupferflächen bei selbst hergestellten Platinen und das sieht bei einem offenen Design gar nicht schön aus. Mit verschiedenen Tests am Prototyp konnte aber auch für dieses Problem eine Lösung gefunden werden (siehe Abschnitt Hardware). Lässt man die Platine bei einer Firma produzieren, dann hat man dieses Problem vermutlich nicht, da hier die Kupferflächen mit Lötstopplack versiegelt werden.

Leider hat uns der technische Fortschritt ein wenig überholt und die WS2812B kamen auf den Markt. Diese hat man im Herstellungsprozess optimiert und auch technisch verbessert (Verpolschutz), allerdings haben sie eine andere Anschlussbelegung und nur noch 4 anstatt 6 Anschlüsse. Technisch sind sie vollkommen identisch zu ihren Vorgängern, so dass die Software nicht geändert werden muss. Aber es ist ein neues Platinenlayout erforderlich. Aus diesem Grund hat der Bastlerkollege Dietmar Heyer nochmals ein Layout entwickelt und auch getestet, so dass letztlich sowohl für die WS2812 als auch für die WS2812B ein Platinenlayout zur Verfügung steht.

Gegen Ende 2017 machte mich ein Bastlerkollege darauf aufmerksam, dass die nächste LED-Generation WS2813 nicht zuverlässig im Weihnachtsstern funktioniert. Mehr noch, er stellte mir einen kompletten Stern mit WS2813 zum Testen zur Verfügung. Ich konnte das Problem nachvollziehen und als hauptsächliche Ursache die Pause zwischen den Datenpaketen ermitteln. Während bei den WS2812 und WS2812B 50µs ausreichend waren, benötigen die WS2813 mindestens 300µs. Die ursprüngliche Software hat zwar 500µs Pause vorgesehen, durch Laufzeitschwankungen werden aber die 300µs oft unterschritten. Bei der Anpassung der Software trat noch ein weiteres Problem auf: Die für den Zufallsgenerator verwendete Bibliothek stdlib.h benötigt in der aktuellen Version vom GCC im Atmel Studio 7 zu viele Ressourcen im RAM. Durch das Entfernen dieser Bibliothek und den Einsatz eines vereinfachten Zufallsgenerators konnte wieder Platz geschaffen und das Timing so angepasst werden, dass nun alle LED-Typen verwendbar sind. Nochmals vielen Dank an Henri Beckmann, der auch noch ein Platinenlayout für den Weihnachtsstern mit WS2813 zur Verfügung gestellt hat.