Of is dat “Tijd-transmissie”?
In de post over het neonhorloge staat dat het horloge gelijk gezet wordt door middel van een computerprogramma dat het scherm laat opflitsen om zo de huidige tijd over te dragen aan het horloge. Sinds de post over het neonhorloge heb ik mijn lichtwekker aangepast zodat ik ook daarmee het neonhorloge gelijk kan zetten. In deze post laat ik zien hoe de tijd naar het horloge verstuurd wordt. (Also available in English)
Eerst hoe het horloge gelijkgezet wordt met de klok van de computer.
Een filmpje van het gelijkzetten is in de eerste blogpost over het neonhorloge te vinden, of op youtube.
Het programma hiervoor is geschreven in python. De source is te vinden in deze git gist. Met een python-omgeving naar keuze is deze te runnen (en aan te passen), ik gebruikte Thony. Laat gerust een reactie achter als iets aan het programma beter/netter/mooier/pythonischer kan (patches welcome, zogezegd).
Het programma stuurt de uren, minuten, en seconden, gevolgd door een crc-8 checksum naar het horloge. Voor elk van deze getallen wordt een byte gebruikt.
Ik ga er van uit dat het computerscherm met maximaal 60 Hz kan verversen. Voor het gemak rond ik naar boven af op 20 ms als ‘schermverversings-periodetijd’ (dat is eigenlijk 50 Hz). Een bit bestaat uit een periode dat het scherm licht is en een periode dat het scherm donker is. Die periode houdt ik minimaal 2 schermverversings-periodetijden lang.
Ook wil ik dat elk bit, ongeacht of het een 1 of een 0 is, in totaal even lang duurt. Dan is de transmissietijd bekend en kan daarvoor gecompenseerd worden.
Een 1 is 40 ms donker gevolgd door 80 ms licht.
Een 0 is 80 ms donker gevolgd door 40 ms licht.
Een bit duurt in totaal dus 120 ms, ongeacht of het een 1 of een 0 is. De totale transmissie van uren, minuten, seconden en checksum zijn 4 bytes, dus 32 bits. De totale transmissietijd is dus 3,84 s. De tijd die verstuurd wordt, wordt dus ter compensatie met 4 seconden verhoogd alvorens te versturen.
‘Lang licht’ wordt door het horloge gebruikt om te resetten naar het eerste1 bit.
De lichtwekker gebruikt dezelfde methode om de tijd aan het horloge over te dragen.
Als de bovenste knop van de lichtwekker langer dan 3 seconden ingedrukt gehouden wordt gaat 1 van de bovenste LED’s van de ledstrip blauw branden. Deze LED blijft 5 seconden blauw branden zodat er tijd is het horloge voor de LED te houden (en zodat het horloge naar het begin-bit reset)
Daarna zal de LED wit knipperen om zo de huidige tijd over te dragen naar het horloge. Daarbij is de WS2811 (of 12?) ledstrip niet gedimd, omdat anders de PWM de data-overdracht zou verstoren. Na de data-overdracht wordt dat weer hersteld. Ook de lichtwekker compenseert voor de transmissietijd.
De aanpassing aan de lichtwekker-software is te vinden in de ‘watchsync’ branch van het lichtwekker project op github.
Het neon-horloge toont alleen de tijd, en niet de datum. Anders was deze optische data-overdracht behalve tijd-overdracht ook datum-overdracht ;-).
Voetnoten
- Nulde bit, eigenlijk. Laat ik het ‘het begin-bit’ noemen. Het voorkomt dat door veranderingen in omgevingslicht, of door bewegen van het horloge, het horloge denkt dat het al enkele bits binnen heeft. Dan zou de gegevensoverdracht mislukken en herhaald moeten worden. ↩︎
Leave a Reply