budo's Web
Hier findet ihr einiges zu meinen Hobbies

Uhren-Synchronisation

Meine Projekte mit Realzeituhren (Terrarium-Steuerung, Tabletten-Uhr und Data-Logger) werden derzeit von Hand gestellt, in dem man manuell Datum und Uhrzeit in ein Uhren-Setzprogramm eingibt und dieser zu der entsprechenden Zeit startet. Hinterher wird das Uhren-Setzprogramm wieder durch das eigentliche Programm ersetzt. Die Uhren-Synchronisation soll dies automatisieren und vereinfachen.

Für die Synchronisation von Realzeituhren gibt es verschiedene Möglichkeiten, wie der Anschluss einer DCF77 Funkuhr, die Abfrage eines NTP Zeit-Servers per Ethernet oder die Synchronisation mit der PC-Uhrzeit z.B. per Processing Software. Da ich aber nicht für jedes Gerät eine Funkuhr, ein Ethernet-Adapter oder einen PC spendieren möchte, benötige ich eine Lösung die man während des Betriebes anschließen kann und dann automatisch die Synchronisation durchführt.

Da alle oben angeführten Uhren-Projekte auf I2C basieren, bietet sich eine externe Synchronisation per I2C an. Ein budoino, der die Zeitdaten per Funkuhr, per NTP/Ethernet oder per PC/Processing empfängt, gibt die Zeitinformation per I2C an die Uhren-Schaltungen weiter, die diese per Interrupt-Routine aufnehmen, ihre Uhren setzen und dann normal weiterarbeiten.

Für die erforderliche Hardware ist nur wenig Aufwand erforderlich. Für die PC/Processing Lösung genügt ein Standard budoino, für die NTP Lösung ein Ethernet-budoino und für die Funkuhr wiederum ein Standard budoino. Die Variante mit der Funkuhr werde ich gleich mit einem LCD-Display ausstatten, so dass man eine vollwertige Digitaluhr zusätzlich hat. Stromlaufpläne / Blockschaltbilder erübrigen sich deshalb.

Uhrensynchronisation via PC mit Processing

Processing ist analog zu der Arduino Softwareumgebung, die ja auf Processing basiert, das Gegenstück zu Arduino auf dem PC, um z.B. Arduino Daten zu visualisieren oder wie hier, Daten vom PC an den Arduino zu senden. Um den Aufbau und Ablauf für alle 3 Varianten gleich zu gestalten, wurde hier ein weiterer budoino zwischen PC und dem "Clock" budoino gesteckt, obwohl dies für die Processing Version nicht erforderlich wäre. Der Ablauf ist wie folgt:

Der Clock budoino sendet innerhalb des loops einen TIMEREQUEST via I2C an den SyncGenerator budoino, sobald er eine Verbindung zu diesem aufbauen kann, d.h., sobald der Clock budoino angesteckt wird. Damit der Vorgang nur einmalig erfolgt, verriegelt sich der Clock budoino mittels cmdSend. Der TIMEREQUEST wird vom SyncGenerator budoino per receiveEvent Interrupt aufgenommen und per cmdReceived an das Hauptprogramm (loop) übermittelt. Das Haupprogramm des SyncGenerator budoino sendet daraufhin einen TIMEREQUEST via serieller Schnittstelle an den Processing PC, der seinerseits die aktuelle Uhrzeit an den SyncGenerator budoino zurück sendet. Der SyncGenerator budoino sendet die aktuelle Zeit via I2C weiter an den Clock budoino und schließt verriegelt sich mit cmdReceived. Last but not least nimmt der Clock budoino per receiveEvent Interrupt auf, übergibt an sein Hauptprogramm dataReceived, welches daraufhin die Uhrzeit auf die akzuelle Zeit setzt. Der Durchlauf ist damit beendet und kann nur durch einen Reset des Clock budoino erneut gestartet werden. Im nachfolgender Darstellung sind die zusammengehörigen Informationen mit gleichen Farben dargestellt. Die Farben sind folglich die Übergänge zwischen den einzelnen Geräten und Softwareteilen (Hauptprogramm oder Interrupt-Routine).

sync

Ablauf der Uhren Synchronisation mit der aktuellen PC Zeit via Processing

Uhrensynchronisation via NTP-Server über das Ethernet

Der Syncronisationsablauf bei NTP ist analog zum obigen Processing ablauf, bei dem der PC Anteil fehlt. Die auf dem SyncGenerator laufende Software Uhr der Time-Library wird über NTP gesetzt und die Synchronisationszeit von dieser Software Uhr dann entnommen.

ntp

Ablauf der Uhren Synchronisation mit NTP via Ethernet

Für NTP via Ethernet gibt es Beispiele für die unterschiedlichen Libraries im Internet. Der Test wurde mit einem angepassten Beispiel des Programms ntpSync aus der Ethernet Library für WIZ5100 durchgeführt, allerdings mit UIPEthernet Library auf ENC28J60. Die ntpSync Programm-Anpassung entspricht obig skizziertem Ablauf.

Uhrensynchronisation via Funkuhr

Ursprünglich habe ich für eine anderes Projekt die Funkuhr von Pollin DCF1 getestet, die ich mit einer Spannungsanpassung und einem nachfolgenden Verstärker (LM358) getestet habe. Die Ergebnisse waren ernüchternd. Die DCF1 hat mit 2 Exemplaren quasi nie funktioniert, da das Umfeld für die Uhr zu schlecht war, bzw. die Uhr zu schlecht war für das Umfeld. Messungen mit einem Oszilloskop zeigten beliebig viele zusätzliche Spikes (sowohl bei HIGH als auch bei LOW). Möglicherweise funktioniert die DCF1 Uhr, wenn man einen selektiven Vorverstärker wie in Elektor 2008/07 beschrieben, verwendet. Auf einen Test mit nachgeschaltetem Hardware- oder Software-Filter hab ich verzichtet, da das empfangene Signal zu schlecht ausgesehen hat.

Nachfolgende Beschreibung basiert auf einer ELV DCF2 Funkuhr. Der erste Test mit einer fertig aufgebauten Uhr eines Freundes hat auf Anhieb funktioniert und liefert nach 2 Minuten stabile Ergebnisse. Hier gilt halt die Aussage, Qualität hat seinen Preis.

Der Ablauf ist der gleiche wie bei NTP. Die Software Uhr wird mit wenigen Kommandos der DCF77 Library mit dem DCF77 Empfänger synchronisiert.

fu

Funkuhr mit abgesetztem DCF77-Empfänger

bu

ds

Funkuhr Steuerplatine

Funkuhr Display

Nachtrag

Nach meinen Erfahrungen mit Filtern habe ich die Signale der Pollin Funkuhr DCF1 in einem 2ms Takt ausgewertet und einmal direkt und einmal über ein Smooth-Filter ausgegeben und mit dem Logic Analysator aufgezeichnet.

fu

bu

Das Original-DCF-Signal (rot) und das direkt ausgegebene Signal (schwarz) zeigen ein Störsignal, beim gefilterten Signal (braun) ist der Störer eliminiert. D.h., mir diesem Filter, was eine reine Softwarefunktion ist, lässt sich auch die qualitativ schlechte Pollin DCF1 Funkuhr zum laufen bringen. Der Synchronistationszeitpunkt wird aber um ein paar ms verschoben.


Nach Oben