LED-Weihnachtsbaum (Teil 3)

Licht Weihnachten DIY

Bald ist Weihnachten. Es wird also Zeit unseren LED-Weihnachtsbaum fertigzustellen und die Elektronik zu bauen.

Es werde Licht

Im vorherigen Teil unseres LED-Weihnachtsbaum-Projekts haben wir den Holzbaum gebaut. Obwohl der Baum an sich schon ganz nett ist, wollen wir in diesem Blog Spaß mit Elektronik haben. Das bedeutet, dass es an der Zeit ist, diese einzubauen. In diesem letzten Teil unseres Projekts werde ich dich Schritt für Schritt durch diesen Prozess führen und das Arduino-Programm erklären, das wir für unseren Baum verwenden werden. Los geht's!

Aufbau der Schaltung

Wir brauchen acht LEDs für unseren Weihnachtsbaum und wenn wir sie direkt an unseren Arduino anschließen würden, müssten wir eine Menge Kabel aus dem Baumständer herausführen. Eine gängige Lösung für dieses Problem ist die Verwendung eines Schieberegisters wie dem 74HC595. Die Schaltung, die wir bauen, ist so gebräuchlich, dass sie sogar als Beispielschaltung in einigen 74HC595-Datenblättern aufgeführt ist. Das Schieberegister selbst ist, wie viele andere Standard-Logik-ICs, von diversen Herstellern erhältlich.

Das Schieberegister hat 8 Ausgangspins Q0 - Q7. Um diese Ausgänge zu steuern, müssen acht Datenbits in das Schieberegister geschrieben werden. Ein Schieberegister besteht aus einer Reihe von Flipflops, die aneinandergereiht sind (in diesem Fall acht Stück.). Der Eingang des ersten Flipflops ist mit dem Pin DS verbunden, an dem das zu schreibende Datenbit signalisiert werden kann. Dieses Bit wird in das Register übertragen, wenn der Taktpin ST_CP von LOW auf HIGH wechselt. Danach enthält das Flipflop eins das an DS angelegte Bit, Flipflop zwei enthält nun das Bit, das vorher in Flipflop eins gespeichert war und so weiter. Bei jedem Übergang von LOW nach HIGH werden die Daten um ein Bit weiter in das Schieberegister geschoben. Daten, die aus dem Flipflop acht herausgeschoben werden, werden verworfen, wenn nur ein Schieberegister genutzt wird. Um mehr LEDs zu ermöglichen, können mehrere Schieberegister aneinandergereiht werden. Das Schieberegister hat dafür einen zusätzlichen Ausgang Q7', der mit dem DS-Pin des nächsten Schieberegisters verbunden werden kann. Das Schieberegister hat dafür einen zusätzlichen Ausgang Q7', der mit dem DS-Pin des nächsten Schieberegisters verbunden werden kann. Im 74HC595 gibt es für jeden Ausgang einen zusätzlichen Ausgangspuffer. Wenn der SH_CP-Pin von LOW auf HIGH wechselt, wird der Ausgang der Flipflops in den Ausgangspuffer übertragen. Dies ermöglicht es, neue Daten in das Schieberegister zu schreiben, ohne dass sich der Ausgang sofort ändert. Der 74HC595 hat auch einen Master-Reset-Eingang (MR), der den Inhalt der Flipflops zurücksetzt. Wir brauchen diesen nicht und können daher diesen Pin direkt mit VCC verbinden. Der einzige verbleibende Pin ist der Output-Enable-Pin (OE). Wenn wir ihn mit Masse verbinden, werden die Ausgänge des Schieberegisters aktiviert. Wenn OE HIGH ist, sind alle Ausgänge deaktiviert, selbst wenn eine Eins im Ausgangspuffer steht.

In der unten gezeigten Schaltung kann man sehen, dass ich einen 360 Ω Vorwiderstand für jede LED hinzugefügt habe. Dadurch wird der Strom pro LED begrenzt. Die LEDs erreichen ihre maximale Helligkeit bei 20 mA. Die Ausgänge der Schieberegister können jedoch nur 70 mA insgesamt und 35 mA pro Ausgang verkraften. Das ist der Grund, warum ich einen so hohen Widerstandswert gewählt habe. Dies garantiert, dass das Schieberegister auch dann nicht beschädigt wird, wenn alle acht LEDs gleichzeitig leuchten.

Weihnachtsbaum-Schaltung

So viel zu den Grundlagen. Beginnen wir nun, die Schaltung Schritt für Schritt aufzubauen.

Programmieren des Arduino

Der Baum ist fertig und die Elektronik ist an ihrem Platz. Jetzt ist es an der Zeit, den Baum mit dem Arduino zu verbinden und ein Programm dafür zu schreiben.

Ich habe die folgenden Pins für dieses Projekt verwendet:

  • Der OE-Eingang, der den Ausgang des Schieberegisters bei einem LOW-Spannungspegel freigibt, wird an Pin 9 angeschlossen.
  • Der ST_CP-Eingang, der den Takt zum Einlesen des nächsten Datenbits liefert, ist mit Pin 2 verbunden
  • Der DS-Eingang, der zum Senden der Datenbits an das Schieberegister verwendet wird, ist mit Pin 3 verbunden
  • Der Eingang SH_CP, der die Daten aus den Flipflops in den Ausgangspuffer überträgt, nachdem alle Bits gesetzt wurden, wird an Pin 4 angeschlossen

Alle Pins müssen in der setup-Prozedur als Ausgang initialisiert werden. Für den Funkel-Effekt habe ich mich entschieden, zufällig LEDs einzuschalten. Hierfür können wir die Arduino-Funktion random verwenden. Dazu müssen wir den Pseudo-Zufallszahlengenerator in der setup-Prozedur initialisieren.
Dies können wir wie folgt tun:

randomSeed(analogRead(0)); 

Diese Zeile liest den Analogwert vom potentialfreien Pin A0. Der gelesene Wert ist undefiniert und kann als unsere initiale Zufallsquelle verwendet werden. Wir brauchen dies, damit der Pseudo-Zufallszahlengenerator nicht jedes Mal, wenn wir den Arduino einschalten, die gleichen Muster erzeugt.

Nachdem das erledigt ist, müssen wir uns Gedanken über den Code machen, den wir in der loop-Prozedur ausführen. Mit random(255) können wir 8 Zufallsbits erzeugen, wobei eine Eins bedeutet, dass die entsprechende LED eingeschaltet ist. Damit können wir einen zufälligen Satz von LEDs aktivieren.

Um diese Daten an das Schieberegister zu senden, verfügt Arduino über eine Funktion namens shiftOut(dataPin, clockPin, bitOrder, value). Die Daten können beginnend mit Bit 0 (LSBFIRST) oder mit Bit 7 (MSBFIRST) gesendet werden. In unserem Fall spielt das keine Rolle, da wir ohnehin ein zufälliges Byte als value senden. Die restlichen zwei Argumente sind die Nummer des Datenpins und des Taktpins. Sobald Daten in das Schieberegister geschrieben wurden, müssen sie manuell in den Ausgangspuffer übertragen werden, indem Pin 4 aus und ein geschaltet wird.

Um die Animation noch schöner aussehen zu lassen, können wir am Output-Enable-Pin, der an Pin 9 angeschlossen ist, PWM benutzen, um die LEDs zu dimmen. Die gesamte Prozedur besteht darin, einen zufälligen Teil der LEDs auszuwählen, die Helligkeit langsam zu erhöhen, dann die Helligkeit wieder zu reduzieren, um schließlich in der nächsten Iteration einen neuen zufälligen Teil der LEDs auszuwählen. Da der LED-Weihnachtsbaum hauptsächlich bei Dunkelheit verwendet werden soll, wollte ich nicht die volle LED-Helligkeit nutzen. Ich dimme zwischen 0 und 150. Eine Verzögerung sorgt dafür, dass das Auf- und Abblenden schön langsam erfolgt. Ein Aufruf von analogWrite gibt ein PWM-Signal entsprechend dem aktuellen Helligkeitswert aus. Wenn du mehr über PWM lernen willst, kannst du dir dieses Tutorial ansehen.

Wenn wir alles zusammensetzen, erhalten wir schließlich den folgenden Code:

const int clockPin = 2; // ST_CP
const int dataPin = 3; // DS
const int latchPin = 4; // SH_CP
const int oePin = 9; // OE

void setup() {
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(oePin, OUTPUT);
  randomSeed(analogRead(0));
}

void loop() {
  // Enable random LEDs
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, random(255));
  digitalWrite(latchPin, HIGH);

  // Do fade animation
  for(int i = 0; i < 150; i++) {
    analogWrite(9, 255-i);
    delay(50);  
  }

  for(int i = 150; i >= 0; i--) {
    analogWrite(oePin, 255-i);
    delay(50);  
  }
}

Das Ergebnis

Sobald der Arduino programmiert ist, beginnt unser Weihnachtsbaum zu leuchten. Du kannst ihn im Video unten funkeln sehen. Während das Projekt selbst an dieser Stelle fertig ist, kannst du weiter mit dem Code experimentieren und deine eigene Animation erstellen. Zur Erinnerung: Mit dem OE-Eingang, der an Pin 9 angeschlossen ist, kannst du alle LEDs auf einmal ansteuern. Wenn du Pin 9 auf HIGH setzt, werden alle LEDs ausgeschaltet. Einzelne LEDs können durch das Schreiben einer Eins in das entsprechende Bit im Schieberegister aktiviert werden. Viel Spaß!

Ich wünsche dir ein besinnliches Weihnachten und ein frohes neues Jahr! Gott segne dich.

Vorheriger Beitrag Nächster Beitrag