www.jb-electronics.de » Elektronik » Digitaltechnik » Elektronische Kerze
Überall sind sie zu sehen, diese elektronischen Kerzen, aber nur sehr wenige arbeiten zufriedenstellend. Denn bei den elektronischen Kerzen gibt es tendenziell zwei Probleme:
Gerade beim zweiten Punkt schwächeln viele kommerziell erhältliche Kerzen, da sie einfach nur ein festes Programm abspulen. Das sollte hier anders gelöst werden. Aber wie? Durch einen Zufallsgenerator.
Zu diesem Thema gibt es ganze Bücher, daher werde ich hier die grundsätzliche Problematik auch nur anreißen können.
Mikrocontroller sind deterministische Bauteile, das bedeutet, dass es zu jeder Zeit möglich ist, den kompletten Zustand des Systems zu kennen. Das bedeutet aber auch, dass ein echter Zufall niemals intern im Controller erzeugt werden kann.
Eine Möglichkeit ist es, ein fertiges Array von vorher extern und echt erzeugten Zufallszahlen abzuspeichern, und dieses dann durchzugehen. Eine etwas elegantere Methode dieser Art (mit einer Periodendauer von mehreren Millionen) kann durch einen linear kongruenten Generator (englisch: LCG) realisiert werden.
Doch diesen Weg wollte ich hier nicht gehen, da es nicht immer sehr leicht ist, die entsprechenden Parameter des linear kongruenten Generators so zu wählen, dass wirklich gute Zufallszahlen herauskommen (also Zahlen mit einer hohen Periodendauer, d.h. sie wiederholen sich erst sehr spät).
Wo wir gerade dabei sind: Der elektronische Würfel oder der Lottozahlengenerator erzeugen ja auch quasi-zufällige Zahlen. Warum funktioniert das dort? Ganz einfach: es gibt einen externen Parameter, nämlich das Drücken einer Taste durch den Anwender. Wenn die Schaltung sehr sehr schnell durchzählt, weiß sie selber ja, wo sie gerade steht, aber nicht der Anwender. Wenn nun die Taste gedrückt wird, hört die Schaltung einfach auf, weiterzuzählen. Somit sind die Zahlen für die Schaltung natürlich nicht zufällig, wohl aber für den unwissenden weil zu langsamen Anwender.
Doch das funktioniert bei einer Schaltung, die automatisch in regelmäßigen Abständen Zufallszahlen erzeugen soll, natürlich nicht, denn Mikrocontroller arbeiten auf den Takt genau. Was also tun?
Die Lösung ist die folgende: Viele Mikrocontroller haben Analog-Digital-Wandler (ADCs) eingebaut. Wenn deren Eingänge an nichts angeschlossen sind - sozusagen in der Luft hängen - rauschen die niederwertigen Bits (die Least Significant Bits, LSBs) recht stark. Das können wir nun nutzen, um echten Zufall zu erhalten, indem wir einfach n-mal ein solches LSB auslesen und auf die Bits unserer Zufallszahl verteilen.
Dieses Rauschen ist in den allermeisten Fällen wirklich rein stochastisch und somit ein echter Glücksgriff, was den Zufall angeht. Aufpassen sollte mensch aber bei Schaltungen, die ihrerseits Störsignale erzeugen, wie sie etwa bei Schaltnetzteilen auftreten. In diesem Falle wäre das Rauschen mit dem Status Quo der Schaltung korreliert, und somit wäre auch unser schöner echter Zufall dahin. Zudem ist diese Art von Zufallszahlenerzeugung alles andere als störsicher, da sich das Verhalten der Zufallswerte stark durch Störfelder manipulieren lässt.
In unserem Fall (wir benutzen für unsere LED-Kerze ja nur Gleichspannung aus Batterien) ist das aber vollkommen unkritisch. Wenn wir also eine Zufallszahl zwischen 0 und 255 erzeugen wollten, nähmen wir also acht mal hintereinander das LSB vom ADC und setzten das entsprechende Bit.
Der hier verwendete PIC ist der PIC16F716, weil er vier ADCs besitzt. Somit werden hintereinander alle vier ADC-Kanäle ausgelesen und deren LSB verwendet, um eine 4-Bit-Zufallszahl zu erzeugen, was uns hier an Auflösung durchaus reicht. Es wird alle x Takte eine neue solche Zufallszahl generiert (beziehungsweise werden mehrere überlagert und davon der Mittelwert gebildet, um wenn gewünscht schwächere Helligkeitsschwankungen zu erzeugen), und dann der Helligkeitswert der LEDs mit variabler Geschwindigkeit v angepasst.
Durch Variation dieser Parameter lassen sich verschiedene Kerzen-Stile erzeugen; im Quellcode sind zehn solcher Stile einprogrammiert, die über einen Codierschalter ausgewählt werden können. Auf PORTB sind wieder die internen Pullups eingeschaltet, sodass der Codierschalter direkt gegen GND schalten kann.
Für alle Interessierten gibt es hier den C-Quellcode und das fertig kompilierte HEX-File: Elektronische_Kerze.zip (3 KB)
Hier ist nun der Schaltplan der elektronischen Kerze zu sehen:
Hier ist der Schaltplan in höherer Auflösung zu finden.
Betrieben wird sie mit drei AAA-Batterien; es können auch problemlos AA-Batterien verwendet werden, Hauptsache, die Versorgungsspannung liegt im Bereich von 3...5V.
Zum Schluss noch ein paar Bilder des Aufbaus; ich verwendete eine orange und eine gelbe LED, um das Flammenbild etwas realistischer zu gestalten.
Der Sockel stammt übrigens vom Ständer einer preiswerten Klobürste, das sieht mensch ihm so gar nicht an. Hier ist das Innenleben zu sehen:
Die Batterien und auch die Platine wurden mit Spiegelband am Metall befestigt.
Die Schaltung ist wirklich sehr kompakt aufgebaut:
Nun wird einfach eine ausgehöhlte echte Kerze auf den Sockel gestellt:
Im Dunkeln sieht die Kerze so aus:
Die LEDs arbeiten die Kontur des Wachses sehr schön heraus, nur mit der Leuchtkraft einer echten Kerze kann diese elektronische Variante leider nicht mithalten.
Und wieder gibt es eine elektronische Kerze mehr auf der Welt - ob sie nun wirklich besser ist, als kommerziell erhältliche, kann ich so genau nicht sagen, da das ja ein sehr subjektiver Eindruck ist. So oder so stellt sie jedoch einen interessanten alternativen Ansatz dar.
www.jb-electronics.de » Electronics » Digital Technology » Electronic Candle
There is no English translation of this page available yet. It will take some more time for me to translate the whole website.
If you have a particular interest in this page getting translated as fast as possible, please contact me; I will see what I can do. Please click here for the German version.