FunkUsb: Funkuhr-Modul mit USB-Anschluss

Ein DCF77-Zeitzeichen-Funkempfänger mit USB-Anschluss.

Früher war deren Anschluss an COM-Ports oder Parallelports üblich. Diese für Bastler so bequemen Schnittstellen sind an heutigen Notebooks praktisch ausgestorben. Ein kleiner, billiger, weitverbreiteter 8-poliger Mikrocontroller genügt für diese Aufgabe.

Für Bastler so praktisch: Es gibt ihn im DIL-Gehäuse. Passend für Steckboards. Aber auch im SMD-Gehäuse, der locker in einen USB-Stecker passt.

FunkUsb, COM-Port emulierend

Emuliert eine serielle Schnittstelle (COMx) per CDC und funktioniert unter Windows 2000 bis 7, 32 oder (schwierig) 64 bit, sowie unter Linux. Sollte auch unter Windows 98, Me sowie auf dem Mac zum Laufen zu bringen sein.

Mittlerweile gibt es auch eine überarbeitete Firmware-Version, die einen Joystick emuliert. Ansonsten sieht alles genauso aus.

Antrieb

Übliche Funkuhr-Module benötigen eine serielle Schnittstelle. Bei den heute üblichen schnittstellen-verarmten PCs und Laptops behilft man sich üblicherweise mit einem USB-Seriell-Konverter, die preiswert zu haben sind und zumeist sogar funktionieren.

Nun fallen aus defekten Funkuhren und Funkweckern gelegentlich funktionierende Funkuhr-Module an; ich musste also keins bei Conrad kaufen. Doch warum dann eine übliche Anpassschaltung fürs serielle Port anschalten, wenn's auch gleich mit USB geht? Dafür reicht ein 8poliger ATtiny45, gefüllt mit schlauer Software namens V-USB und AVR-CDC. Damit erscheint der Funkempfänger wie gehabt an einem (neuen) seriellen Anschluss, und man benötigt keinerlei Software-Anpassung.

Funktion

Das Empfangssignal wird an alle Pins der (emulierten) seriellen Schnittstelle angelegt, somit ist es für Empfangssoftware egal, welche Leitung abgefragt wird.

Mit „Funkuhr.exe“ funktionieren DCD, DSR RI und RxD; das Signal CTS funktioniert nicht.

Mit RxD erfolgt die Pulslängenmessung im Mikrocontroller, sodass deren Auswertung nicht von der Rechnerlast abhängt, also sicherer ist. Dabei ist die richtige Signalpolarität wichtig; bei allen anderen Anschlüssen kann „Funkuhr.exe“ die Polarität automatisch feststellen und ggf. automatisch negieren.

Mit der Auswahlmöglichkeit in Funkuhr.exe „Stromversorgung“ wird das Funkuhr-Modul aktiviert. Dabei funktionieren TxD und DTR; RTS funktioniert nicht.

Die Beschreibung der Software-Installation unten bezieht sich auf Windows (2k, XP, Vista+). Ich gehe davon aus, dass Linux- und Mac-Anwender wissen, was sie tun müssen. (Bei Linux ist m.W. als erstes ein Patch einzuspielen, um eigentlich verbotene Bulk-Transfers bei Low-Speed zu erlauben.)

Schaltung

Die Schaltung versorgt den Mikrocontroller und den Funkempfänger mit stabilisierten 3,3 V. Die Taktversorgung erfolgt intern mit 16,5 MHz, synchronisiert mithilfe der SOF-Impulse des PCs.

SIG liefert das Empfangssignal, LOW bei DCF77-Trägerabsenkung.
ENA steuert den Funkempfänger, LOW = aktiv.

ENA wird (nur) für den USB-konformen Schlafmodus benötigt.

Die ungewohnte Stromversorgung mit dem Energie sparenden Längsregler TPS71533 (kostenloses Muster von Texas Instruments) ist notwendig, um für den Funkempfänger eine saubere 3,3 V bereitzustellen. Der Querstrom des Reglers beträgt lt. Datenblatt nur 3,2 µA und ist deshalb kein Hindernis für den USB-konformen Schlafmodus.

Im Muster war die 5-V-Speisespannung nicht stabil genug, um mit den üblichen zwei in Reihe geschalteten Siliziumdioden eine hinreichend saubere 3,3-V-Betriebsspannung bereitzustellen, damit der Funkempfänger ordentlich arbeitet.

Diskrete Längsregler mit Z-Dioden sind schwierig auszulegen, weil für die geforderten geringen Querströme (max. 200 µA) die handelsüblichen Z-Dioden nicht steil genug sind. Querregler allein (TL431) beißen sich mit dem USB-Schlafmodus.

Aufbau

Der Aufbau erfolge naheliegenderweise auf einer Lochrasterplatte. Diese ist in ihren Abmessungen passend für das preiswerte und trittfeste Reichelt-Gehäuse „GEH KS 21“ (etwa 0,72 €). Das Funkempfängermodul wurde mit kleinen Schrauben des toten Funkweckers locker (wichtig: ohne Verzug der Platine!) befestigt. Für die raumsparende Befestigung der Antenne wurde ein Loch in die Platine gesägt und der Ferritstab mit Draht gesichert.

[Foto Platine Bestückungsseite] [Foto Platine Leiterseite]
Fotos vom Versuchsmuster
Extrem Strom sparende Längsregler scheint es nur im SMD-Gehäuse zu geben; dieser wurde auf die Leiterseite gelötet. NC-Pins wurden kurzerhand mit auf Masse gelegt, der Lötkolben war zu groß.
[Detail TPS71533]  
So wurde der winzige TPS71533 verlötet

Die Durchsteck-Alternative ist LP2950ACZ-3.3, den es neuerdings auch bei Reichelt gibt.

Programmierung

Das Einschreiben der Firmware erfolgte im Muster mit einem extra Steckboard, welches als STK200-kompatibles Programmiergerät hergerichtet wurde. Das Programmieren im eingelöteten Zustand (in-system) ist hier nicht vorgesehen. Deshalb die IC-Fassung.

Die Firmware kann frei verwendet werden (FunkUsb.c: Public Domain; der V-USB-Teil: GNU LGPL). Sie enthält einige Neuerungen, die einerseits die Synchronisation des Oszillators betrifft, als auch erhebliche Änderungen an AVR-CDC zur Unterstützung virtueller Statusleitungen.

Installation

Wie für alle AVR-CDC-Projekte wird kein Treiber benötigt, Windows bringt den Treiber „usbser.sys“ mit. Allerdings wird eine .INF-Datei benötigt, die beim ersten Anstecken des Gerätes FunkUsb dem Hardware-Assistenten mitgegeben wird. Damit wird eine serielle Schnittstelle eingebunden, die von gängigen Funkuhrempfangsprogrammen verwendet werden kann.

Hinweis: Mit dem Anstecken und Installieren wird noch keine Zeit empfangen oder die PC-Uhr gestellt! Das macht beispielsweise das nächste Programm.

Verwendung (Windows)

Zum komfortablen Empfang und dem Stellen der Computer-Uhr habe ich das Programm „Funkuhr.exe“ geschrieben.

Es kann auch jedes andere gängige Funkuhr-Empfangsprogramm verwendet werden, beispielsweise:

DOS-Software funktioniert nicht.

Die LED leuchtet normalerweise halbhell. [Nicht implementiert: Bei USB-Datenpaketen der Busaufzählung wird sie dunkel getastet.] Bei Funksignal (Trägerabsenkung) leuchtet sie hell. Dazu muss eine Empfangssoftware laufen, die mindestens eine der Leitungen TxD oder DTR aktiviert. Im USB-Schlafmodus ist die LED aus.

Nachbau durch andere Bastler

von Hans-Peter Bock

… Ich habe mir letztes Wochenende ein SMD-Layout dafür erstellt. Es funktioniert wunderbar! Wenn Sie Interesse an dem Layout haben, schicke ich es Ihnen gerne zu. Eine unbestückte Platine habe ich auch noch übrig.

Grüße, Hans-Peter Bock [Webseite, Blog]

[Aufbau-Foto]
Den Empfänger scheint Herr Bock unter Linux einzusetzen und mit nur wenigen Kode-Zeilen zu einem NTP-Server zu machen.

von Hannes Jochriem

… Ich habe dein DCF77-Projekt aufgegriffen und einen kleinen Bausatz daraus gemacht den ich in meinem Shop anbiete.

FunkUsb, Joystick emulierend

Die Installation eines COM-Port-Treibers für das obige Modell ist mittlerweile ziemlich kompliziert geworden. Einfach ist es nur unter Windows 2000 und Windows XP. Die Probleme im einzelnen:

Lösung

Die neue Firmware emuliert einen Joystick mit 1 Knopf und – seit April 2013 – 1 Hebel. Das bietet folgende Vorteile: Nachteil: Im übrigen muss man nichts an der Hardware ändern. Einfach den Mikrocontroller tauschen oder neu flashen, das ist alles.

Klar, dass zumindest mein Programm „Funkuhr.exe“ um dieses Interface erweitert wurde. Wie sollte ich's sonst testen …

Hinweis: Die Kombination beider USB-Interfaces in einer Firmware ist zwar technisch möglich, bereitet aber noch mehr Komplikationen in der Anwendung des Gerätes als nur ein Interface.

Außerdem: Der Firmware-Quelltext ist seit April 2013 mit einstellbaren Portpins sowie für gcc4 geeignet umgestrickt. Somit ist dieser besser auf eigene Bastelprojekte anpassbar. Ein ATtiny25 ist nun fast voll.

Hinweis zum Zeitschriftenartikel

In der Zeitschrift CQ-DL Oktober 2013 Seite 709 ff. ist in etwa dieses Ding vorgestellt. Der mechanische Aufbau … kein Kommentar.

Zum Nachbau habe ich die folgende Bemerkung: Die Nachbausicherheit ist durch die Verwendung des (in der Tat exotischen) TPS71533 arg erschwert. Schon dessen Beschaffung ist für den Normalverbraucher hinderlich. (Ich hatte diesen gerade in der Bastelkiste herumliegen.) Ganz zu schweigen von der Löterei.

Ich würde hier die Verwendung des LP2950ACZ-3.3 im bequemen TO-92-Gehäuse empfehlen. Dessen Querstrom ist zwar höher, aber:

Auch das etwas höhere minimale Spannungsgefälle (Drop) stört hier nicht. Ich habe die Schaltung auf Steckbrett getestet, und es funktioniert auch mit diesem Regler.

Das angegebene käufliche Funkuhr-Modul hat einen HIGH-aktiven ENA-Eingang. Für USB-konformen Schlafmodus muss die Firmware für High-aktives ENA kompiliert werden. Dazu ist in Zeile 36 der Datei FunkUsb.c das Symbol ENA_INV auf 0 zu setzen.

Für den Bastler mag es OK sein, auf ENA oder ENA zu verzichten. Dann zieht der Funkempfänger permanent 1..2 mA aus dem USB-Anschluss. Muss man halt wissen, bevor man sich beschwert, wenn der Laptop-Akku unerwartet leer sein sollte. Beim akkulosen Vorlaufempfänger unten ist das prinzipbedingt.

Eigentlich habe ich gerade für Funkamateure im Windows-Programm die Empfangsmöglichkeit per Soundkarte eingebaut. Fertige Empfangsmodule, noch dazu gekaufte, sind für Bastler geradezu unsportlich.

Die angegebene Ausrichtung der Antenne quer nach Frankfurt am Main ist zwar theoretisch richtig, praktisch sollte man die Antenne längs zum nächsten Störer (Fernsehempfänger, Röhrenmonitor) ausrichten.

Nutzung unter Linux

Der Zeitserver ntpd unterstützt mit seiner DCF77-Synchronisation ausschließlich das serielle Port am RxD-Eingang. Dieser lässt die einfache Messung der Pulslänge in 20-ms-Stückelung zu. Den (ziemlich unüber­sicht­lichen und anti­quierten) Quelltext auf einen Joystick zu ändern übersteigt meine Möglichkeiten. Pardon!

Zumindest zum Stellen der Systemuhr habe ich ein Programm geschrieben namens dcf77-js.c. Der Quelltext benötigt keine zusätzlichen Bibliotheken und kann somit recht zweckmäßig die Uhr eines autonomen Raspberry Pi stellen.
Dieser hat bekanntlich keine Echtzeituhr. Auf Grund der Knappheit der USB-Anschlüsse sowie der Verfügbarkeit eines RS232-Anschlusses mit TTL-Pegeln ist jedoch dieser FunkUsb für diesen Anwendungsfall Overkill, es geht auch einfacher.

Standardmäßig benutzt es /dev/input/js0. Der einzig mögliche Kommandozeilenschalter gibt einen alternativen Joystick an.

Das Programm hat zwei Betriebsmodi:

Beim Beenden (mittels Strg+C) wird ein Histogramm der empfangenen Bitlängen angezeigt. Die Eimerbreite beträgt 20 ms.

Im Archiv befindet sich zz. ein Kompilat für x86-64.

Firmware Januar 2015

Das neueste Update fügt dem Joystick einen Slider (Schiebesteller) hinzu. Dieser kodiert, in Millisekunden, die Zeit zwischen der Flanke (= Ereignis) und dem Abholen des Reports. Damit kann die begrenzte Auflösung bedingt durch den Zeitverzug von GetReport (lt. USB-Standard bei Low-Speed: 10 ms, Windows: 8 ms) auf 1 ms minimiert werden. Es mag etwas Spielerei sein, die Auflösung der Vorderflanke eines 100-ms-Impulses so genau detektieren zu wollen, der ntpd macht aber um diesen Umstand ziemlich viel Federnlesen. Mein Windows-Programm macht davon keinen Gebrauch.

FunkUsb als Vorlaufempfänger

Alle üblichen Funkuhr-Module haben den Nachteil, dass die Dekodierung durch den PC vorgenommen werden muss und die Uhrzeit nicht bereits beim Booten des Rechners bereitsteht.

Da die oben genannten Dinger einen Mikrocontroller enthalten, kann er diese Aufgabe ohnehin übernehmen. Nur ein geeignetes Protokoll ist noch auszudenken. Natürlich fällt da die Wahl auf HID!

Nun muss ein derartiger Empfänger möglichst ein paar Minuten vor dem Einschalten des Rechners laufen. Da dieser Zeitpunkt sehr schwer vorherbestimmbar ist, läuft die Funkuhr einfach akkubetrieben durch. Die Alternative wäre die Speisung durch das PC-Netzteil im Standby-Modus. Nur wenige USB-Buchsen eignen sich hierfür (typischerweise in der Nähe oder an Stelle der PS/2-Buchsen für Tastatur und Maus). Und man muss auf dem Board passende Jumper umstecken oder BIOS-Einstellungen vornehmen. Nicht sonderlich universell. Deshalb die Entscheidung für Akkus. Primärbatterien würden nur wenige Tage durchhalten, sofern an den Wetterdaten Interesse besteht.

Schaltpläne

Natürlich sollte der Controller auch das Nachladen des Akkus überwachen! Dazu wird der Strom aus der USB-Buchse benutzt. Auch ein USB-Ladegerät wird unterstützt und dazu die Brücke zwischen DATA+ und DATA– von der Firmware detektiert. Das Laden erfolgt mit Konstantstrom oder mit gelücktem Konstantstrom, und die Spannung wird überwacht. In der Firmware einstellbar ist der angeschlossene Akkutyp (siehe Tabelle im Schaltplan).

Schaltung 1

Diese erste Schaltung kommt mit einigermaßen konventionellen Bauelementen aus. Mikrocontroller und Uhrenchip hängen fest an dem Akku. Dieser muss durch seinen geringen Innenwiderstand etwaige Brummstörungen aus dem PC unterdrücken.

Einfacher Schaltplan

Von T2 wird der Ladevorgang gesteuert. Dessen Basiswiderstand R1 mal Stromverstärkung bestimmt den Ladestrom. Er arbeitet so als Vorwiderstand und Konstantstromquelle für den Akku. Die LED D1 zeigt den Ladevorgang an. Aufgrund der Halbleiterstrukturen eines Bipolartransistors kann es hierbei nicht zur „Rückspeisung“ eines angeschlossenen PCs kommen.

Die LED D2 dient zur Anzeige des Funkempfangs, sinnfälligerweise nur dann, wenn USB-Speisung (etwa ein Laptop, auch im Standby) vorliegt.

Mit dem Spannungsteiler aus R4 und R5 wird die Betriebsspannung des Mikrocontrollers und damit die Akkuspannung überwacht. Schade, dass es nicht ohne das Umprogrammieren des RESET-Anschlusses geht. Der Spannungsteiler wird bei Erreichen der Entladeschlussspannung mitsamt dem Funkempfänger IC2 vom Portpin B4 abgeschaltet. Der verbleibende Power-Down-Entladestrom von 0,5 µA liegt in der Größenordnung jeder Akku-Selbstentladung.

Mit Primärbatterien kann diese Schaltung so nicht gespeist werden, da der USB nicht die Speisung übernehmen kann, ohne die Batterien zu gefährden. Dann müsste eine Schottky-Entkopplungsdiode in die Batterieleitung eingefügt werden. Die zweckfreie Ladeschaltung kann dabei durch 2 in Serie geschaltete Dioden ersetzt werden, und 1 Mikrocontroller-Ausgang wird frei. Wie oben beschrieben ist Batteriebetrieb trotz alledem nicht sinnvoll!

Am besten funktioniert diese Schaltung mit 2-3 NiMH-Akkus wegen ihres geringen Innenwiderstandes. Die Stützzeit bei 2000-mAh-Akkus dürfte bei 1-2 Wochen (150 .. 300 h) liegen.

Diese NiMH-Variante lässt sich gut in einen Funkwecker einbauen! Man sollte aber darauf achten, dass dieser ein Batteriefach mit zwei Rundzellen hat. Das Enable-Signal vom eingebauten Funkwecker-Dekoder wird einfach ignoriert. Der Funkwecker bekommt äußerlich einfach eine USB-Buchse eingebaut, und fertig.

Schaltung 2

Hier werden Controller und Funkuhr-Chip mit sauberen (maximal) 3,3 V betrieben. Dafür fehlt die direkte Anbindung des Akkus an den Controller. Weiterhin kann — bei angeschlossenem Ladegerät — nicht die Leerlauf-Akkuspannung gemessen werden, sondern nur die beim Laden.

Etwas komplexerer Schaltplan

Von T1 wird der Ladevorgang gesteuert. Es muss ein moderner Logik-Level-Typ mit geringem Einschalt-Bahnwiderstand sein. Dessen Drain-Source-Diode sorgt dafür, dass die Schaltung auch ohne externe Speisung anläuft. Der Ladestrom wird durch den Widerstand R1 festgelegt. D1 verhindert die „Rückspeisung“ des angeschlossenen PCs vom Akku. T1 wird leistungslos durchgesteuert, wenn Entladebetrieb vorliegt, um dann die Drain-Source-Diode zu überbrücken. Daher ist es bei dieser Schaltung nicht sinnvoll, den Ladevorgang mit einer roten LED anzuzeigen; stattdessen kann man den Ladeschluss mit der LED D3 anzeigen.

Die LED D2 dient zur Anzeige des Funkempfangs, aber nur dann, wenn USB-Speisung vorliegt.

Mit dem Spannungsteiler aus R4 und R5 wird die Akkuspannung überwacht. Dieser muss so hochohmig wie möglich sein, da dieser nicht vom Akku abgetrennt werden kann. Bei Erreichen der Entladeschlussspannung wird der Controller in PowerDown versetzt und der Funkempfänger IC2 vom Portpin B4 abgeschaltet. Der verbleibende Entladestrom wird vor allem durch den Querstrom von IC3 von 2 µA bestimmt. R4 und R5 machen 0,2 µA aus.

Am besten funktioniert diese Schaltung mit einem Li-Ionen-Akku. Aber auch NiMH und Primärbatterien funktionieren; man muss es dann in einer erweiterten Version von Funkuhr.exe richtig einstellen. Der Innenwiderstand der Speisung ist wegen der nachfolgenden Stabilisierung unkritisch.

Hinweis: Bei allen beiden o.a. Schaltungen gilt als „Funkempfänger“ eine Schaltung mit 3,3 V Betriebsspannung, HIGH-aktivem Ausgang (d.h. HIGH bei Trägerabsenkung) und HIGH-aktivem Enable (d.h. LOW = ausgeschaltet und Stromaufnahme < 1 µA). Typischerweise aus Funkuhren oder Funkweckern ausgeschlachtet.
Nicht geeignet ist das Conrad-Funkuhrmodul, weil die Zener-Diode (als Überspannungsbegrenzung und Verpolschutz) einen nicht abschaltbaren Querstrom schluckt, ggf. nachmessen, ggf. ausbauen!

Schaltung 3

Diese Schaltung ist die USB-Umsetzung des SDR-Geradeausempfängers, vorgestellt 2021/2022 bei mikrocontroller.net. Da die Stromaufnahme bei gefräßigen 10 mA liegt, lohnt sich Akkubetrieb nicht so recht. Gegebenenfalls ist ein „Smart-LiIon-Akku“ mit eingebautem Überlade- und Tiefentladeschutz einzubauen. Die Diode D1 verhindert das Entladen in Richtung USB. Ohne Akkustütze können D1 und R8 gebrückt werden. Als Quarz wurde der Wert von 15 MHz gewählt, weil dieser

Kein Funkempfänger-Modul sondern Software-Filter

Als Vorlaufempfänger sollte diese Schaltung von einem Hilfsnetzteil gespeist werden, weil die Stromaufnahme deutlich über den zulässigen 500 µA liegt. Der Vorteil dieser Schaltung liegt in der sehr guten Frequenzselektivität, der Möglichkeit des Phasenempfangs und des Empfangs anderer Zeitzeichensender sowie der Anpassungsmöglichkeit der Verstärkerschaltung für größere Reichweiten.

Auf der USB-Seite liefert diese Schaltung nicht nur das Funksignal als Joystick-Feuerknopf-Signal, sondern in einem gesonderten HID-Report alle 100 ms die Signalstärke, den Signal-Rauschabstand und die Abweichung der Quarzfrequenz vom DCF77-Träger, der atomuhrgenau ist.

Firmware

In Entwicklung

Zusätzlich zum vorher gehenden 1-Tasten-Joystick (zum Funkempfang wie bisher) gibt es ein HID-Gerät, welches das Abfragen der momentanen Uhrzeit und der empfangegen Wetterdaten der letzten 24 h erlaubt. Es sind also 2 HID-Geräte drin.

Der Brown-Out-Detektor und der Watchdog wird hier nicht verwendet, da diese zu viel Strom fressen, wenn der Akku einmal leer geworden ist.

Zustände

Folgende Zustände können nahezu unabhängig voneinander eintreten:

Zustandsübergänge: TODO

Was ist mit den Wetterdaten?

Integriert. Das Abspeichern der Daten erfolgt im Flash. Um Wetterdaten für alle 90 Regionen aufzuzeichnen muss der Empfänger rund um die Uhr laufen. Alle 3 Minuten fällt ein 24-Bit-Wert an, der mit einem 8-Bit-Datumsstempel versehen auf 32 Bit anwächst. Pro Tag fallen so 20×24 = 480 DWORDs an, was einen Speicherbedarf von knapp 2 KByte bedeutet. RAM und EEPROM sind dafür viel zu klein. Da dieser Flash-Bereich 1× pro Tag beschrieben wird, entspricht die Haltbarkeit von 104 Schreibzyklen einer garantierten Funktionszeit von 27 Jahren.

Software

Wird noch in „Funkuhr.exe“ eingebaut.

Zwischenlösung

Die Software von Franz für den Geradeausempfänger (nur Amplitudenmodulation) habe ich inzwischen erheblich umgestrickt. Das wichtigste:

Zum Zip-Archiv der Firmware

Siehe auch: