Wort-Uhr (Wörter-Uhr, Word-Clock: mein QLOCKTWO-Nachbau)
(Überarbeitetes Gehäuse, Hard- und Software in Version 1.1)
Translate from German into English (some links may be mistranslated, then turn back to the original site):
Anfang 2012 sprach mich ein Freund an: er habe eine interessante Uhr gesehen. Die QlockTwo der deutschen Firma Biegert. Dabei handele es sich um eine Uhr, die die Uhrzeit in Klartext über Buchstabenblöcke ausgibt. Leider wäre sie etwas teuer (ca. 800 €) und er wolle sie nachbauen...
...und er brauche daher meine Hilfe...
Schnell war ich für das Projekt eingenommen; solch eine Uhr als besonderer Blickfang im Wohnzimmer würde mir gefallen. Und: interessantes Thema - für den Mikrokontroller-Fan!
Recherchen im Internet brachten einige Nachbau-Projekte der QlockTwo hervor; allerdings konnte ich mich mit keiner der Selbstbauten anfreunden: zu komplizierte und unnötig aufwändige Hardware (meist auf "arduino"-Basis), fehlende Software bzw. fehlerhafte Links zur Software. Und ich fragte mich nach der Sinnhaftigkeit eines bei einem Projekt verwendeten RTC-Moduls (RealTimeClock) mit Batterie-Backup bei einer DCF-77-gesteuerten Funkuhr ???... Oder: warum muss eine Funkuhr zunächst gestellt werden ??? Dilettantische und wenig hilfreiche Beiträge in diversen Foren ergänzten diesen Eindruck.
Daher war wieder einmal Selbermachen angesagt. Die Hardware sollte möglichst einfach werden; dann haben auch Elektronik-Newbies eine Chance auf Nachbau. In der Tat ist die nötige Platine so einfach, dass sie kaum Erklärungen bedarf. arduino kam nicht in Frage. Entweder zu wenig Ausgangs-Pins (dann müssen extern zusätzlich Multiplexerbausteine verbaut werden) oder insgesamt zu viel Aufwand: warum ein komplettes Board, wenn ein (1) Bauteil - der Controller - reicht. Ich entschied mich - auch aufgrund meiner Erfahrungen der Vergangenheit - für die AVR-Controller der Firma Atmel. Der ATMega16 ist genau richtig: ausreichend Flash-Rom für die Aufnahme des Programmes und vor allen Dingen: es gibt ihn in der handlichen PDIP40-Gehäuseform mit ausreichend Anschlüssen. Alternativ geht auch der ATMega32: er ist - bis auf den (unnötig) doppelt so großen Flash-Rom-Speicher - identisch zum ATMega16.
Außerdem hab' ich da doch noch eine Lizenz für die BASCOM-AVR-Entwicklungsumgebung. Ich bin zwar total aus der Übung, aber bestimmt schnell wieder eingearbeitet. Bisher bin ich bei meinen Projekten mit der sehr umfangreichen IDE der holländischen Firma MCS electronics gut gefahren. Das Beste daran sind die mitgelieferten Bibliotheken - die im Hintergrund laufende, interrupt-gesteuerte DCF-Uhren-Routine erscheint im Quelltext als Einzeiler !! - dann muss man das Rad nicht selbst erfinden. Und die tollen Entwicklungs-Tools...
Die Controller der AVR-Linie sind RISC-Prozessoren: der Befehlssatz ist sehr eingeschränkt, aber dafür werden fast alle Befehle innerhalb eines Prozessor-Taktes abgearbeitet. "RISC" steht für Reduced Instruction Set Computer; er kann nicht viel, das aber rasend schnell - ist also prädestiniert für die Entwicklung der Software in Hochsprache. Ich bedaure immer die Leute, die den AVR in Assembler programmieren - dafür wurde er definitiv nicht gemacht!!! Ich habe vor Ewigkeiten 6502, 8080, Z80 und den 68000 in Assembler programmiert und liebe seitdem Hochsprachen...
Folgende Eigenschaften waren mir wichtig:
- keine Bedienelemente
- DCF77-gesteuert mittels internem bzw. externem Empfänger (s.u.)
- robuste Software
- Hilfe zum Ausrichten des Empfängers
- einfache Anpassung an regionale Besonderheiten (Viertel vor / Dreiviertel) ohne Programmcodeänderung
- Helligkeitssteuerung
- eingebaute Testroutinen
- nachbausichere Hardware (einfach nachzubauende Platine - der Rest der Bauteile wird frei verdrahtet
- keine Spezialbauteile
Die Hardware ist vergleichsweise einfach: Kern der Schaltung (aktuell in der Version 1.1, hier: Schaltbild / Schematic) ist die Matrix, in deren Kreuzungspunkten die Leuchtdioden untergebracht sind. Die Ansteuerung erfolgt über zeilenweises Multiplexen: dabei wird zunächst eine Zeile auf Versorgungsspannung gelegt (mittels der Darlington-Transistoren T12 - T22). Diejenigen LEDs, die leuchten sollen, müssen dann noch per Spaltentransistoren T1 - T11 an Masse gelegt werden. Dann folgt die nächste Zeile, usw. Voilà! Die Widerstände R1 - R11 sorgen elektrisch korrekt für die Strombegrenzung. Der Rest ist schnell erledigt: ein LDR-Widerstand zur Messung der Umgebungshelligkeit, ein Testeingang (Pin 17 an Masse), der nach dem Zusammenbau die Matrix-Dioden zeilen- und spaltenweise ansteuert - als Testinstrument. Weiter der DCF-Empfänger, der fertig aufgebaut bezogen werden kann, und die 3-Volt-Stromversorgung dafür mittels Z-Diode. Es folgt eine Schutzdiode, ggf. der Programmieradapter und der Schwingquarz (die beiden Kondensatoren im Umfeld des Quarzes habe ich vorerst weggelassen; damit kann die Uhr auf genau getrimmt werden - macht aber bei ständiger Synchronisation keinen Sinn). Der Kondensator C1 puffert die Lastspitzen der Matrix. Nicht vergessen: die Vorwiderstände für die Matrix-Transistoren. Und natürlich der ATMEL-Controller. Eine Teileliste der elektronischen Komponenten mit Bezugshinweisen gibt es hier.
Es sind nicht alle Matrix-Kreuzungen mit LEDs besetzt, da bestimmte Punkte nie angesteuert werden. Das Buchstaben-Layout habe ich vom Original übernommen - besser kann man es nicht machen. Die Zuordnung der LEDs zu den Buchstaben kann diesem Dokument entnommen werden. Dort ist auch die Konfigurations-Logik ersichtlich. Verwendet werden 98 weiße und 4 rote LEDs - Wenn man einen 100-er Pack bestellt, hat man 2 weiße LEDs als Reserve.
Die LEDs unter der Buchstabenfolge "FUNK" sind rote LEDs. Diese haben die Funktion, das DCF-Empfangssignal beim erstmaligen Stellen der Uhr nach dem Einschalten anzuzeigen: sie leuchten im Takte des DCF-Signales auf: 100ms (logisch 0) bzw. 200ms (logisch 1). Das ist die Ausrichthilfe bei schwierigen Empfangsbedingungen. Bitte beachten: diese LEDs werden über einen zusätzlichen Vorwiderstand betrieben - s.u.
Es zeigte sich, dass das konsequente Multiplexen immer aller 11 Zeilen (die 4 Eck-LEDs für die Einzel-Minuten-Ausgabe sind in der 11. Zeile untergebracht) keine ausreichende Helligkeit gewährleisten konnte. Abhilfe brachte eine intelligente Ansteuerung: es werden lediglich 5 Zeilen gemultiplext, da zeitgleich max. 4 Buchstaben-Zeilen und ggf. die (11.) Minutenzeile angesteuert werden müsssen. Z.B. "ES IST ZEHN UHR": 2 Zeilen; "ES IST FÜNF NACH HALB SIEBEN": 4 Zeilen. Ggf. noch Zeile 11 für die 4 Einzel-Minuten. Im Sinne einer konstanten Helligkeit (unabhängig von der tatsächlichen Anzahl der Zeilen) werden bei weniger als 5 Zeilen "DUMMY"-Zeilen virtuell eingefügt.
Das Timing sieht jetzt so aus, dass jede Zeile einen Zeitschlitz von 1 Millisekunde bekommt, bei 5 ms Gesamtzeitrahmenbreite. Damit ergibt sich eine Multiplex-Frequenz von 200 Hz. Dabei ist keinerlei Flackern mehr sichtbar. Um die Helligkeit zu maximieren fließt ein Strom von ca. 100 mA durch jede eingeschaltete Leuchtdiode. Bei einem Tastverhältnis von 1:5 ergibt sich im Mittel ca. 20 mA - ein Wert, der die Spezifikationsgrenzen nicht überschreitet.
Das Dimmen der Helligkeit wird dadurch realisiert, dass der aktive Zeitschlitz im Bereich von max. 1 ms bis auf min. 1/500 ms variiert wird - in Abhängigkeit der Umgebungshelligkeit.
Das Multiplexen ist nötig, da nicht jede einzelne LED direkt vom Controller angesteuert werden kann - soviel Anschluss-Pins hat er nicht. Leider hat das Multiplexen neben dem Helligkeitsverlust den weiteren Nachteil, dass die steilflankigen Signale der Matrix Funkstörungen produzieren (der "Drahtverhau" wirkt wie eine Sendeantenne!). Ein Mittelwellen-Radio empfängt in unmittelbarer Nähe ausschließlich die Oberwellen der 200 Hz-Signale. Leider. Der Einsatz von Kondensatoren zur Abflachung der Schaltflanken zeigte nicht den gewünschten Effekt. Er erzeugte lediglich unerwünschtes Nebensprechen in den LED-Nachbarzellen.
Auch der DCF-Empfänger wird mal stärker, mal schwächer - je nach Montageort (da macht sich bereits 1 cm bemerkbar) - gestört. Konsequent könnte man sich entscheiden, den Empfänger in ein externes Gehäuse zu verbauen und mittels Kabel anzubinden. Dann könnte man den Empfänger so positionieren und ausrichten, dass stabiler Empfang jederzeit möglich ist.
Ich habe mich entschieden, den Empfängers ins Gehäuse zu verbauen und während der Stellphase auf das störende Multiplexing zu verzichten; die "FUNK"-LEDs werden deshalb direkt angesteuert. Der Strom wird durch zusätzliche 100 Ohm-Widerstände (R42 - R45) vor diesen 4 LEDs begrenzt. Erst nach der Synchronisation wird das Multiplexing zur Anzeige der Uhrzeit eingeschaltet. Die Software versucht ständig zu synchronisieren. Gelingt das nicht, so wird nach einem Tag fehlgeschlagener Synchronisation nachts um 3 Uhr, nur wenn es dunkel ist, die Beleuchtung abgeschaltet und 15 Minuten auf die Synchronisation gewartet. Eine dunkle Anzeige bedeutet hier also nicht, dass die Software abgestürzt ist sondern lediglich, dass Funkstörungen vermieden werden sollen. Meine Erfahrungen nach einigen Wochen Dauertest zeigen, dass die Synchronisation doch erstaunlich oft klappt und der Notfallplan i.d.R. nicht zum Einsatz kommt. Das mag unter schwierigen Empfangsbedingungen und abhängig von der geografischen Lage anders sein. Na, jedenfalls ist die Software gerüstet... Sie unterstützt sowohl die interne als auch die externe Empfängervariante.
Tipp: Verwenden Sie ein (altes) längsgeregeltes Steckernetzteil. Das sind die großen schweren Dinger mit Trafo. Im Gegensatz zu den (modernen) Schaltnetzteilen sind sie völlig strahlungsfrei! Bei billigen Schaltnetzteilen (aus China) kommt es immer wieder zu Beeinflussungen des Empfängers. Diese Teile schwingen unkontrolliert und unabgeschirmt und stören durch ihre HF-Abstrahlung!
Apropos Software: hier finden Sie den überarbeiteten BASCOM-Quelltext für die Hardware-Version 1.1. Kommentare (grün) sind reichlich vorhanden. Meine Testzeilen sind absichtlich erhalten geblieben - auskommentiert und damit unwirksam. Ggf sind diese Testzeilen für denjenigen hilfreich, der die Software verbessern / erweitern / anpassen will. Ein gezipptes Archiv enthält alle nötigen Dateien. Die Objekt-Files erlauben die Programmierung (das Flashen) des Chips mit beliebigen - auch kostenlosen - Programmier-Adaptern. Hier wird ein Programmer beschrieben, der mit 3 Widerständen auskommt aber an der parallelen PC-Schnittstelle betrieben werden muss. Er kann auch direkt aus der BASCOM-IDE angesprochen werden.
[Update:] Ganz unten gibt es weitere Tipps zum Programmieren des Controllers!
Die linear programmierte Software besteht im Grunde aus einer großen Hauptschleife und ist trotz konsequenter Vermeidung hochsprachlicher Strukturelemente (Prozeduren, Funktionen, ...) erstaunlich übersichtlich. Zunächst werden aber die nötigen Variablen definiert, die DCF-Uhr konfiguriert (Config Dcf77 ...) und die Muster für die Matrix-Steuerung in Arrays abgelegt (Minuten- und Stunden-Pattern). Es folgen diverse Einstellungen für Pins und ADC-Wandler. Dann wird in die Testroutine eingestiegen, wenn Pin 17 des Controllers an Masse liegt. Damit kann der eifrige Bastler die Hardware nach dem Zusammenbau testen. Im Normalfall liegt Pin 17 per Widerstand auf High-Niveau und die Tests werden übersprungen.
Als Nächstes wir die Uhr gestellt. Im Stellmodus (erstmalige Synchronisation) wird ein Blinkmuster (die DCF-Impulse) ausgegeben.
Nun beginnt die Hauptschleife: gibt es eine Minuten-Änderung, so wird der Canvas-Teil der Software aktiv (1x pro Minute): hier wird die Canvas-Matrix (Canvas = Leinwand) befüllt. Jeweils ein Bit repräsentiert eine LED in dem Array. In Abhängigkeit der Pattern-Definitionen werden gezielt diejenigen Bits gesetzt, deren LED-Repräsentationen leuchten sollen.
Der nachfolgende Teil gibt die Canvas 200x pro Sekunde aus. Hauptschleifen-Ende
Es folgt die Timer-Interrupt-Routine, die 1x pro Sekunde ausgeführt wird. Hier wird der ADC (Analog-Digital-Converter) abgefragt, der die Helligkeitsinformation des Fotowiderstandes in einen 8-Bit-Wert verpackt. Es werden daraus die Ontime- und Offtime-Variablen gesetzt; diese steuern (weiter oben) das Multiplex-Timing. Diese Routine zählt weiterhin die Zeit, in der keine Synchronisation bestand (Std_no_sync). Das geschieht über die interne Variable _day. Diese wird zyklisch immer wieder auf den (Dummy-) Wert 0 gesetzt. Erfolgte eine Synchronisation wird der Wert mit dem korrekten Tagesdatum überschrieben und Std_no_sync gecleart.
Die abschließende RS232-Routine ist für die Entwicklung hilfreich gewesen und wird für den Wirkeinsatz auskommentiert. Dort können diverse Variablen per Terminalprogramm (9600 8 N 1) abgefragt und gesetzt werden. So habe ich z.B. den Zusammenhang zwischen Umgebungshelligkeit und nötiger LED-Helligkeit ermittelt. Es ergab sich ein linearer Zusammenhang - damit hatte ich nicht gerechnet. Die programmtechnische Umsetzung wurde dadurch vereinfacht. Noch ein Tipp: das Windows-XP-Programm "Hyperterminal" eignet sich zur Kommunikation zwischen Uhr und PC recht gut. Das Programm ist bei Windows 7 nicht mehr dabei, kann aber durch Kopieren der beiden Dateien hypertrm.exe und hypertrm.dll auch auf letzterem System zum Laufen gebracht werden. Die Hardware-Anbindung geschieht über einen kleinen Pegelwandler. Dieser liefert auf der Controller-Seite TTL-kompatible Signale und wird mit den TxD- bzw. RxD-Anschlüssen des Controllers verbunden. Der 9-pol. Sub-D-Stecker wird entweder direkt mit dem PC verbunden (wenn man ein älteres Modell mit seriellen Anschlüssen hat) oder es wird ein Seriell-USB-Adapter aufgesteckt.
Zur Mechanik / zum Gehäuse: der bisher von mir empfohlene Bilderrahmen "RIBBA" von IKEA ist leider aus dem Programm genommen worden. Für die Aufnahme von Elektronik und Leuchtdioden sollte er 50x50 cm groß und mit ca. 4,5 cm extra tief sein. Eine 3 mm starke Hartschaumplatte aus PVC ("Creativ": gibt es im Baumarkt) nimmt die LEDs, die Matrix mit ihren Transistoren und den dicken Pufferkondensator in "freier" Verdrahtung auf, ebenso die Platine und den Empfänger samt Ferritantenne. Eine darüber liegende 15 mm starke Styroporplatte wird mittels Schleifstift - Kugelform, D=30 mm - mit der Oberfräse so bearbeitet, dass die LEDs in kleinen Mulden untergebracht sind. Das Licht diffuser Leuchtdioden - mit großem Abstrahlwinkel >30° - wird durch die Reflektion am weißen Styropor so optimal genutzt und gegeneinander abgeschirmt. Sollte die Ausleuchtung der Buchstaben nicht gleichmäßig genug sein, so hilft ein zusätzliches Blatt Transparentpapier (oder auch mehrere). Tipp: bei der Bestellung der LEDs nach folgenden Stichwörten suchen: diffus superhell weiß.
Hinweis: Die folgende Beschreibung ist nicht vollständig und stellt i.d.S. keine Bauanleitung dar. Auf eine Bauanleitung in Form einer Schritt-für-Schritt-Anleitung habe ich bewußt verzichtet: ich habe keine Lust, alles "klitzeklein" zu beschreiben. Also sind zum Nachbau Eigeninitiative und eigene Ideen gefordert. Meine Beschreibung liefert aber hoffentlich genügend Anregungen, sich mit dieser interessanten Uhr näher zu beschäftigen.
Endmontage! Diverse Werbe- und Dekorationshäuser bieten Laserschnitt-Folien an. Dort lässt man sich eine selbstklebende Folie anfertigen. Es gibt sie als Positiv (Klebeseite auf der Rückseite) und Negativ (Klebeseite auf der Vorderseite). Der erste Versuch wurde mit einer Positiv-Folie gestartet; sie wurde auf einen dünnen Plexiglasträger (nicht klar sondern "milchig" zur besseren Streuung!) aufgeklebt. Dieser Träger wurde dann direkt hinter der Glasfläche eingebaut. Inzwischen bin ich der Meinung, dass es lichttechnisch besser ist, eine Negativ-Folie direkt auf die Glasfläche zu verkleben. Das muss ich demnächst mal versuchen. Bei Bedarf versende ich Erich's Layout-Vorschlag für das "Ziffernblatt" im PDF- u. CorrelDraw-Format in der Größe 50x50 cm per eMail: Dazu bitte mein Kontaktformular verwenden.
Es gibt natürlich reichlich Verbesserungspotential. Es ließe sich eine große Paltine entwickeln, die alle Bauteile, die Matrix und den Empfänger aufnehmen könnte. Diese könnte so konstruiert sein, dass die (funk-) störende Matrix komplett zwischen abschirmenden Kupferflächen (Multilayer-Platine) verschwände. Die Verwendung von SMD-Bauteilen, insbesondere SMD-LEDs, würde die Bauhöhe drastisch verringern. Für mich ist das alles zu viel Aufwand, zumal ich nicht beabsichtige, in Serienproduktion zu gehen: ich werde eine geringe einstellige Anzahl Uhren bauen - zum Verschenken. Aber vielleicht findet sich ein Freiwilliger, der diese Arbeit leisten möchte.
Noch ein Hinweis zur Helligkeit der LEDs: sollte die Helligkeit (besonders in abgedunkelten Räumen) zu groß sein, so hilft ggf. das Anbringen von ein (oder zwei) Transparentpapierstreifen direkt vor dem Sensor - oder man passt die Software an...
Zum Erkenntnisgewinn wurde vorab ein Prototyp gebastelt. Einige Bilder vom Prototypen finden Sie hier.
Tipp: Zum Programmieren des Chips mit der Firmware eignet sich der im Internet für wenig Geld - ich habe ihn für 3,99 € incl. Versand (!!) direkt in China bestellt - erhältliche "USBASP"-Programmer. Unter Windows muss zunächst der dafür nötige Treiber installiert werden.
Für die BASCOM-AVR-Entwicklungsumgebung existiert eine Demo-Version. Mit dieser Demo-Version lässt sich zwar der Quelltext nicht übersetzen (zu lang: die Demo-Version hat eine 4k-Grenze!), aber das integrierte Brennprogramm funktioniert auch für größere Kompilate!. Es kennt so ziemlich jeden Programmer, auch den preiswerten USBASP-Flasher: in "Options / Programmer" wird "USBASP" ausgewählt.
Das schon erwähnte Archiv wird entpackt und komplett (!!) in den vom BASCOM angelegten Projektordner kopiert. Nun wird die Quelltextdatei "qlocktwo.bas" in den Editor geladen ("File/Open"). Mit F7 könnte (!) man nun kompilieren, aber das quittiert die IDE mit einen Hinweis auf das Überschreiten der Demo-Version-Grenze. Also nicht F7 drücken!! (Wenn schon passiert: Demo-BASCOM löscht dabei die .bin-Datei. Darin stecken die zu brennenden Daten! - diese Datei muss also nochmals entpackt werden.)
Zum Flashen reicht das Drücken der F4-Taste. Die Daten der .bin-Datei wandern ins Flash-Rom und die .prg-Datei konfiguriert die Lock- und Fusebits des Controllers. Man kann das alles auch manuell machen: "Program / Send to Chip / Manual Program": die Daten (qlocktwo.bin) laden und ins Flash-Rom schreiben. Danach die Lock- und Fusebits von Hand manipulieren.
Will man den Chip ausserhalb der Zielschaltung programmieren, so bietet sich diese Schaltung an. Eine ext. Stromversorgung ist unnötig, da die Schaltung vom Programmiergerät gespeist wird (Brücke auf dem Programmer stecken!).
Die Ausrichthilfe (des Empfängers) lässt während der Stellphase der Uhr die "FUNK"-LEDs blinken. Dieses Blinken muss gleichmäßig im 1Sek-Rhythmus ohne jegliches Flackern geschehen!! Als Anschauungsobjekt gibt es dazu kurze Videos:
[Update:] Wenn man die Konstantendefinitionen der Stunden- und Minutenpattern ins AVR-interne EEPROM packt, wird der verbleibende Programm-Code so kurz, dass mit der BASCOM-Demoversion erfolgreich compiliert werden kann!! In Kürze wird es hier die Sourcen geben.
[Update 2:] OK, da war doch noch Etwas... Wer mit der BASCOM-Demo-Entwicklungsumgebung und meinem QlockTwo-Quelltext experimentieren möchte, findet nun hier die versprochene Version, die die Pattern ins EEPROM schreibt. Das reine Compilat reißt nun nicht mehr die 4 KByte-Grenze (ROMIMAGE: 4026 dec). Hier gibt es den Projekt-Ordner (Mega32). Beim Programmieren des Chips ist darauf zu achten, dass die EEPROM-Daten auch tatsächlich geschrieben werden. Dazu muss in den Programmer-Optionen "Upload Code and Data" aktiviert werden. Die Pattern-Daten habe ich ins Include "eeps.bas" ausgelagert.
Viel Erfolg!
Nachsatz: Die Wörteruhr wurde nicht von der anfangs erwähnten Firma Biegert erfunden. Erfinder der "Kult-Uhr" ist Achim Schneider (www.kult-uhr.com). Bei ihm kann man die Uhr auch kaufen: zu weit aus moderateren Preisen als bei Biegert. Leider sind seine angebotenen Uhren viel kleiner und daher als Wanduhren weniger geeignet!
Nachsatz 2: Aus gegebenen Anlass weise ich darauf hin, dass eine Ferndiagnose bei nicht funktionierenden Nachbauten schwierig ist! Sie sollten den Nachbau ausschließlich dann wagen, wenn Ihnen der Lötkolben im Allgemeinen und elektronische Schaltungen im Besonderen nicht allzu fremd sind! Eine Nachbau-Garantie will und kann ich nicht geben!!
Zu Ihrer Information: es gibt erfolgreiche Nachbauten - es geht also!
Nachsatz 3: Um weiteren Anfragen vorzubeugen: nein, ich verkaufe keine Wörteruhren und baue auch keine gegen Entgelt. Auch einen Bausatz gibt es nicht von mir!