www.jb-electronics.de » Elektronik » Digitaltechnik » LED-Wecker
Auch dieses kleine Projekt war gar nicht für mich gedacht, sondern für meinen Vater, dem es von Zeit zu Zeit nachweislich schwer fällt, seinem Wecker in den frühen Morgenstunden die gebührende Aufmerksamkeit zu schenken.
Da dachte ich mir, dass ein selbstgebauter Wecker mit genügend Durchschlagskraft bestimmt Abhilfe schaffen würde. Aber was sollte er denn können, der Wecker?
Den kompletten Schaltplan des Weckers finden Sie weiter unten, im Folgenden werden die einzelnen Komponenten etwas näher beleuchtet.
Ich entschied mich für blaue Siebensegment-Anzeigen mit einer Ziffernhöhe von 38.1mm (1.5"). Für den Doppelpunkt zwischen den Stunden und Minuten verwendete ich zwei blaue Wald-und-Wiesen-LEDs. Die Vorwiderstände sind so bemessen, dass durch die Siebensegment-Anzeigen nicht mehr als 25mA pro Segment fließt, und durch die Doppelpunkt-LEDs maximal 20mA.
Angesteuert werden die Siebensegment-Anzeigen mit ULN2803A-Darlington-Arrays, die jeweils acht Kanäle besitzen. Wichtig ist, dass der ULN2803A verwendet wird, dessen Eingänge sind für 5V TTL-Pegel konzipiert. Das anzuzeigende Bitmuster erhalten die vier ULN2803A jeweils von einem altbewährten CD4094-Schieberegister. Die Doppelpunkt-LEDs werden von einem BC547 npn-Transistor angesteuert.
Geschaltet werden die Siebensegment-LEDs (mit gemeinsamer Anode) gegen +12V. Alles in allem bei der Ansteuerung also nichts Besonderes.
Nein, dieses Mal verwendete ich keinen PIC16F627A, sondern den PIC16F716. Warum? Nun ja, der Mensch sollte sich ja ab und an mal an etwas Neues gewöhnen, daher schadet es sicherlich nicht, einmal einen etwas anderen PIC zu verwenden, zudem bot es sich hier wirklich an.
Denn obwohl PIC16F627A viele nützliche Funktionen bietet, hat er den Nachteil, keinen eingebauten ADC zu haben. Da die Helligkeit der LEDs aber über einen Drehpoti dimmbar sein sollte, lag es nahe, endlich mal auf einen PIC mit eingebautem ADC umzusteigen.
Und genau das liefert der PIC16F716 (genau genommen hat er sogar vier ADC-Eingänge, Auflösung 8 Bit), der sogar preisgünstiger ist als der PIC16F627A. Ebenfalls hat er eine 10Bit-Hardware-PWM-Stufe eingebaut (wie auch der PIC16F627A).
Für das Programmieren und Kompilieren musste ich mir die neueste Version des PICC-Lite-Compilers herunterladen, da meine alte Version den PIC16F716 nicht unterstützte, aber danach funktionierte alles einwandfrei.
Der Wecker sollte ja optisch etwas hermachen, daher entschloss ich mich, eine batteriebetriebene Rundumleuchte dafür zweckzuentfremden:
Nach Entfernen des Gehäuses sieht sie nun so aus:
Und ohne das 4.5V-Batteriefach haben wir endlich, was wir wollen:
Die Rundumleuchte wird im Folgenden mit 5V statt 4.5V betrieben, aber das macht keinen großen Unterschied.
Es gibt Mikrocontroller, mit denen MP3-Dateien abgespielt werden können. Unserer hier kann das nicht so ohne Weiteres, und das war auch gar nicht mein Ziel. Denn es sollte ja nur eine einzelne MP3-Datei als Weckton abgespielt werden.
Meine Lösung: Einfach einen preiswerten MP3-Player (ca. 8 €) kaufen, und dann schauen, wie er so tickt:
Wir sehen, er arbeitet mit 1.5V, aber so kritisch ist das nicht, da SD-Karten mit 3.3V arbeiten, und somit auf der Platine die 1.5V Eingangsspannung auf 3.3V heraufgewandelt werden müssen. Eine Ansteuerung mit 2.5V ist also unproblematisch, da Step-Up-Wandler meistens auch mit ein bisschen mehr Eingangsspannung zurechtkommen.
Hier sieht man die ganze Hardware, die wir dank MP3-Player nicht selber aufbauen müssen:
Dieser MP3-Player wird durch einen Multifunktionsknopf gesteuert, der nach rechts und links bewegt werden kann (TItel vor / zurück) oder als Taster gedrückt werden kann (Titel spielen, pausieren, ein- oder ausschalten).
Da wir nur einen Titel abspielen wollen, ist der Drucktaster im Multifunktionsknopf entscheidend. Durch vorsichtiges Spannungsmessen fand ich heraus, dass einer der Pins beim Drücken des Multifunktionsknopfs von +3.3V auf GND gezogen wird. Zudem griff ich noch den Eingangspin für unsere 2.5V Versorgungsspannung sowie GND ab:
Aber wie steuern wir das nun elektronisch an? Das ist sehr einfach: Wir benötigen nur einen npn-Transistor, der uns das Steuerungskabel auf GND zieht. Selbst auf einen Pullup können wir verzichten, da dieser auf der MP3-Platine oder direkt im MP3-Controller zugeschaltet sein muss.
Das heißt: mit einem Signal können wir nun eine MP3-Datei abspielen. Das finde ich eine erstaunliche Vereinfachung; hier lässt sich der aktuellen Wegwerfelektronik-Philosophie wirklich einmal etwas abgewinnen.
Da der Kopfhörer-Ausgang des MP3-Players klarerweise nicht viel Leistung liefert, wurde noch ein fertiges Verstärkermodul nachgeschaltet. Ich hatte noch ein 3.5W-Verstärkermodul von KEMO herumliegen, daher fiel die Wahl auf dieses. Mittels eines Potis, das als Spannungsteiler fungiert, kann die Eingangsspannung des Verstärkers und somit die effektive Lautstärke des Wecktons eingestellt werden.
Dazu wird die folgende Schaltung einfach vor den Verstärkereingang geschaltet:
Als Gehäuse wählte ich ein schrecklich orangefarbenes Tischgehäuse von Conrad, das genau die richtigen Maße hatte. Es wurde natürlich umgehend silbern angesprüht. Als Frontplatte wählte ich klarblaues Acrylglas, das optisch sehr schön zu der blauen Rumdumleuchte passt.
Der Programmcode sollte eigentlich ausreichend kommentiert sein; hier trotzdem noch einige Erläuterungen, da es sich schon um ein recht umfangreiches Programm handelt:
Die Pins RA0:3 sind alle als ADC-Eingänge definiert, obwohl nur der Pin RA0 als ADC ausgewertet wird. Bei den anderen Pins wird einfach abgefragt, ob der ADC-Wert größer als 127 ist (die Hälfte von 255), und dann wird der Pin als HIGH behandelt, sonst als LOW. Dieser Wert von 127 ist eigentlich willkürlich. Warum das ganze? Weil es nicht möglich ist, nur Pin RA0 als rein analogen Eingang zu verwenden, und Pins RA1:3 als rein digitale. Daher diese Aushilfsmaßnahme.
Die Helligkeit der LEDs kann in 16 Stufen eingestellt werden; dazu wird der 8-Bit Eingangswert des ADC vierfach gesampled und dann durch 16 geteilt, wodurch er fast nicht mehr rauscht (was klar ist, er hat ja nun auch eine viel schlechtere Auflösung). Die Position des Drehknopfs des Potis wird also auf eine Zahl zwischen 0..15 abgebildet. Der PIC16F716 besitzt ja eine 10-Bit-PWM, der Duty-Cycle-Wert kann also von 0 (ganz aus) bis 1023 (ganz an) gewählt werden. Da die menschliche Helligkeitswahrnehmung aber nicht linear ist, und in den oberen Bereichen der Duty-Cycle (also von ca. 800 aufwärts, das sind ca. 80% Tastverhältnis) kaum noch Unterschiede wahrgenommen werden, bietet sich ein Array der Länge 16 an, in dem dann die entsprechenden Duty-Cycle-Werte eingespeichert werden. Sie können so in der Software frei gewählt werden und müssen nicht kompliziert errechnet werden. Ich entschied mich für diese Wertefolge:
static int pwm_table[16]= {0, 1, 3, 5, 10, 20, 50, 80, 100, 150, 200, 300, 400, 600, 800, 1023};
Wenn die Helligkeit einen gewissen Grenzwert überschreitet, wird ein Lüfter eingeschaltet, der am Kühlkörper des 7805-Spannungsreglers sitzt. Streng genommen ist der Lüfter hier fehl am Platze, da die LEDs ja direkt von den 12V versorgt werden, aber dennoch ist ein bisschen zirkulierende Luft im Gehäuse eine sehr gute Sache. Den Hauptzweck erfüllt der Lüfter jedoch beim Wecken: Die Rundumleuchte zieht satte 450mA, da fallen also ca 3W Verlustleistung am 7805 ab, der daher unbedingt gekühlt werden und mit einem Kühlkörper versehen werden muss.
Das Siebensegment-Bitmuster für die LEDs wird ebenfalls in einem Array gespeichert; da ich die Anzeigeplatine (wie auch eigentlich alles Andere) von Hand verdrahte, achtete ich darauf, die Leitungen vom Schieberegister zu den ULN2803A und von dort aus zu den Siebensegment-Anzeigen möglichst kurz werden zu lassen. Daher sind die Verbindungen nicht so wie im Schaltplan weiter unten ersichtlich, wo ich sie aus Übersichtlichkeitsgründen geradlinig eingezeichnet habe. Aber das ist auch egal; das Array namens get7 kann einfach abgeändert werden, bei mir sieht es so aus:
static unsigned char get7[10] = {0b01110111, 0b00010001, 0b10110110, 0b10110011, 0b11010001, 0b11100011, 0b11100111, 0b00110001, 0b11110111, 0b11110011};
Durch Herumprobieren (genau so habe ich es auch gemacht!) findet mensch schnell die entsprechenden Muster heraus. Nur sollte beim Nachbau darauf geachtet werden, die Verdrahtung bei allen Registern gleich durchzuführen.
Ansonsten sei noch gesagt, dass die Variable Modus festlegt, in welchem Zustand der Wecker sich befindet; 0 bedeutet den normale Uhrenmodus (mit aktiviertem oder deaktiviertem Alarm, das speichert das Bit namens ARMED), 1 bedeutet, der Alarm ist im Gange, und 2 bedeutet Schlummermodus. Denn nach dem Ertönen des Weckers kann der Benutzer auf irgendeine Taste seiner Wahl drücken, und die nächste Weckung erfolgt dann in weiteren fünf Minuten. Die Schlummerzeit lässt sich in der Software mittels der Variablen SleepMinutes einstellen, der fest einprogrammierte Standardwert ist - wie gesagt - 5.
Wenn der Weckmodus (also Modus == 1) mehr als vier Minuten aktiv ist, schaltet der Wecker automatisch in den Sleep-Modus. Diese Sicherheitsabschaltung gewährleistet, dass der Wecker nicht unnütz Energie verschwendet, wenn zum Beispiel vergessen wird, die Weckfunktion vor dem Verlassen des Hauses oder vor dem Duschen auszuschalten. Dieses Zeitintervall kann in der Software über die Variable ALARM_ON_TIME_MAX in Sekunden eingestellt werden, der hier fest einprogrammierte Wert ist 240.
Auch das ist nochmals abgesichert: die vollkommene Sicherheitsabschaltung, also das Zurücksetzen in Modus 0 und Deaktivieren der Weckfunktion, tritt auf, wenn die automatische Sicherheitsabschaltung, wie sie im obigen Absatz beschrieben wurde, drei mal unmittelbar hintereinander ausgelöst wurde. Dieser Wert ist in der Variablen AUTOMATIC_SLEEP_COUNT_MAX gespeichert und standardmäßig auf 3 gesetzt.
Für alle Interessierten gibt es hier den C-Quellcode und das fertig kompilierte HEX-File: Wecker.zip (8 KB)
Die Bedienung sollte recht einfach gehalten werden und orientierte sich an einem bereits vorhandenen Wecker. Dieser Wecker besitzt drei Taster namens STD, MIN und SLP.
Nachdem dies gesagt wurde, hier nun der Schaltplan des Weckers:
Hier ist der Schaltplan in höherer Auflösung zu finden.
Dieser Schaltplan ist der zweite Anlauf des Projektes; die Rundumleuchte hat starke Probleme verursacht, da deren Motor die Schaltung erheblich störte. Wichtig beim Nachbau ist, dass die Zuleitung zur Rundumleuchte weit weg vom Controller angebracht wird. Zudem sollten ebenso die Pufferkondensatoren nicht weggelassen werden. Die Freilaufdioden bei induktiven Lasten wie dem Lüfter und der Rundumleuchte sind ebenfalls Pflicht. Mensch hätte noch dem Motor einen eigenen 7805-Regler verpassen können, um die Controller-Versorgungsspannung von der des Motors zu enkoppeln, aber im obigen Setup läuft die Schaltung bei mir schon stabil. Es ist jedoch immer eine gute Idee, Steuer- und Lastkreise zu trennen bzw. mittels Dioden etwas zu entkoppeln, für die nächsten Projekte werde ich mir das merken.
Die vorgesehene Eingangsspannung liegt bei 12V; sollten die LEDs zu hell sein, kann auch ein 9V-Steckernetzteil verwendet werden.
Dem aufmerksamen Schaltplanleser wird aufgefallen sein, dass RB4 im Nichts endet. Ja, das stimmt, RB4 sollte ursprünglich den Doppelpunkt ansteuern, aber dann wäre der Doppelpunkt nicht pulsweitenmoduliert gewesen und somit fast immer deutlich heller gewesen als der Rest des Displays. Klar, mittels eines weiteren Transistors hätten RB4 und das PWM-Signal von RB3 verUNDet werden können, aber da der Doppelpunkt sowieso permanent eingeschaltet sein sollte, wurde dessen Steuerleitung vom Mikrocontroller aufgetrennt und mit der ENABLE-Leitung der Schieberegister verbunden, an der - siehe Schaltplan - wiederum das PWM-Signal anliegt.
Ein unkonventioneller Schritt ist die Zuschaltung des Lautsprechers über ein Relais. Das erschien mir notwendig, weil die PWM-Frequenz selbst bei ausgeschaltetem Verstärker über den Lautsprecher hörbar war. Wenn nun der Weckton abgespielt würde, wäre sie das immer noch (weil das Relais ja dann geschlossen wird), somit wird als Ausweg aus der Misere beim Wecken die Helligkeit der Anzeige voll hochgeregelt, sodass das PWM-Signal permanent auf HIGH-Pegel ist. Es kann dann klarerweise keine Störungen mehr einstreuen, weil es sich bei dem Signal nur noch um eine konstante Spannung von 5V handelt. Das trägt zum optischen Effekt des Weckens bei und soll hier nur der Vollständigkeit halber erwähnt werden.
Nach so viel Text sollen ein paar Bilder des fertigen Weckers sowie des Innenlebens natürlich nicht fehlen.
Hier ist die Hauptplatine des Weckers zu sehen:
Gut zu erkennen sind die Stiftleisten, an denen die Peripherie angeschlossen wird.
Die Display-Platine ist allerdings optisch ansprechender gestaltet:
Sie wird über dieses Kabel mit der Hauptplatine verbunden:
Hier das leere Gehäuse mit montierter Hohlbuchse für die Eingangsspannung, dem montierten MP3-Player, und dem montierten Poti für die Helligkeitseinstellung:
Das braune Material ist Platinenmaterial (Hartpapier), das nur aus Stabilitätsgründen eingebaut wurde. Es gibt der Hauptplatine Halt.
Mit eingebauten Platinen sieht das Gehäuse so aus:
Von oben sind die einzelnen Komponenten noch einmal schön zu erkennen:
So wurde der MP3-Player mit einem kleinen Klotz Holz gekontert, damit die SD-Karte problemlos gewechselt werden kann.
Die Taster und die Rundumleuchte werden über Pfostenstecker mit der Hauptplatine verbunden, zudem wird nun die blaue Acrylglasscheibe eingesetzt:
Mit blauer Acrylglasfront und geschlossenem Deckel sieht der betriebsbereite Wecker nun so aus:
Die Taster sind in der Reihenfolge STD MIN SLP belegt.
Hier ist der Wecker nun endlich im Betrieb zu sehen:
Und hier während eines Alarms:
Diese Schaltung hat mich lange beschäftigt, sie ist ja auch schon recht komplex mit vielen separaten Komponenten. Aber schlussendlich denke ich, dass es sich gelohnt hat, diesen Wecker so aufzubauen und nicht anders, er ist ein echtes Unikat geworden.
www.jb-electronics.de » Electronics » Digital Technology » LED Alarm Clock
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.