DCF77: ako funguje systém prenosu signálov presného času?

Ahoj Habr.

Mnohí z vás, ktorí si zakúpili hodiny alebo meteorologickú stanicu, možno videli na obale logo Radio Controlled Clock alebo dokonca Atomic Clock. Je to veľmi praktické, stačí položiť hodiny na stôl a po chvíli sa automaticky nastavia na presný čas.
DCF77: ako funguje systém prenosu signálov presného času?

Poďme sa pozrieť, ako to funguje a napíšeme dekodér v jazyku Python.

Existujú rôzne systémy synchronizácie času. Najpopulárnejší v Európe je nemecký systém DCF-77, v Japonsku existuje svoj systém JJY, v USA je systém WWVB, a tak ďalej. Nasledujúci príbeh bude o DCF77, ako o najaktuálnejšom a dostupnom na prijímanie v niektorých oblastiach európskej časti Ruska a susedných krajinách (obyvatelia Ďalekého východu môžu mať iný názor, avšak môžu prijímať a analyzovať aj japonský signál;).

Všetko, čo bude napísané ďalej, sa bude týkať DCF77.

Prijímanie signálu

DCF77 je dlhwaveová stanica pracujúca na frekvencii 77,5 kHz a prenášajúca signály v amplitúdovej modulácii. Stanica s výkonom 50 kW sa nachádza 25 km od Frankfurtu, začala pracovať už v roku 1959, v roku 1973 bola k presnému času pridaná informácia o dátume. Dĺžka vlny pri frekvencii 77 kHz je dosť veľká, a preto sú rozmery antény tiež celkom značné (foto z Wikipédie):
DCF77: ako funguje systém prenosu signálov presného času?

Pri takej anténe a dodávanej výkonnej zóne prijatia pokrýva prakticky celú Európu, Bielorusko, Ukrajinu a časť Ruska.

DCF77: ako funguje systém prenosu signálov presného času?

Signál si môže zapísať každý. Stačí sa prihlásiť na online prijímač http://websdr.ewi.utwente.nl:8901/, vybrať tam frekvenciu 76,5 kHz a USB moduláciu. Mala by sa zobraziť obrázok približne takého typu:

DCF77: ako funguje systém prenosu signálov presného času?

Tam klikneme na tlačidlo download a zapíšeme úryvok s dĺžkou niekoľkých minút. Samozrejme, ak máme „skutočný“ prijímač, schopný zapiť frekvenciu 77,5 kHz, môžeme ho tiež použiť.

Samozrejme, prijímaním rádiových signálov presného času cez Internet nedostaneme skutočne presný čas — signál sa prenáša so oneskorením. Naším cieľom je len pochopiť štruktúru signálu, na to sú internetové záznamy viac než dostatočné. V skutočnosti sa samozrejme používajú špecializované zariadenia na prijímanie a dekódovanie, o ktorých sa zmienime nižšie.

Takže sme získali záznam, poďme sa pustiť do spracovania.

Dekódovanie signálu

Načítame súbor pomocou Pythonu a pozrieme sa na jeho štruktúru:

from scipy.io import wavfile
from scipy import signal
import matplotlib.pyplot as plt
import numpy as np

sample_rate, data = wavfile.read("dcf_websdr_2019-03-26T20_25_34Z_76.6kHz.wav")
plt.plot(data[:100000])
plt.show()

Vidíme typickú amplitúdovú moduláciu:
DCF77: ako funguje systém prenosu signálov presného času?

Na zjednodušenie dekódovania vezmeme obálku signálu pomocou Hilbertovej transformácie:

analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])

Výsledok vo zväčšenom zobrazení:
DCF77: ako funguje systém prenosu signálov presného času?

Vyhladíme výkyvy od rušenia pomocou low-pass filtra a zároveň vypočítame priemernú hodnotu, tá sa nám neskôr zíde na parsovanie.

b, a = signal.butter(2, 20.0/sample_rate)
zi = signal.lfilter_zi(b, a)
A, _ = signal.lfilter(b, a, A, zi=zi*A[0])
avg = (np.amax(A) + np.amin(A))/2

Výsledok (žltá čiara): prakticky obdĺžnikový signál, ktorý sa pomerne ľahko analyzuje.
DCF77: ako funguje systém prenosu signálov presného času?

Parsovanie

Najprv musíme získať bitovú sekvenciu. Samotná štruktúra signálu je veľmi jednoduchá.
DCF77: ako funguje systém prenosu signálov presného času?

Impulzy sú rozdelené do sekundových intervalov. Ak je vzdialenosť medzi impulzmi 0,1 s (t.j. dĺžka samotného impulzu 0,9 s), k bitovej sekvencii pridáme „0“, ak je vzdialenosť 0,2 s (t.j. dĺžka 0,8 s), pridáme „1“. Koniec každej minúty je označený „dlhým“ impulzom, ktorý trvá 2 s, bitová sekvencia sa pritom vynuluje a vyplnenie začína znova.

To, čo je napísané vyššie, nie je ťažké zapísať v jazyku Python.

sig_start, sig_stop = 0, 0
pos = 0
bits_str = ""
while pos < cnt - 4:
    if A[pos]  avg:
        # Začiatok signálu
        sig_start = pos
    if A[pos] > avg and A[pos+1] < avg:
        # Koniec signálu
        sig_stop = pos

        diff = sig_stop - sig_start
    
        if diff  0.85*sample_rate and diff  1.5*sample_rate:
            print(bits_str)
            bits_str = ""

    pos += 1

Výsledkom dostávame sekvenciu bitov, v našom prípade pre dve sekundy vyzerá takto:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Mimochodom, zaujímavé je, že v signále je aj „druhý“ vrstvený dát. fázová modulácia. Teoreticky by to malo zabezpečiť stabilnejšie dekódovanie aj v prípade oslabeného signálu.

Naším posledným krokom je získanie samotných údajov. Bity sa prenášajú raz za sekundu, takže máme celkom 59 bitov, v ktorých je zakódovaných dosť veľa informácií:
DCF77: ako funguje systém prenosu signálov presného času?

Bity sú popísané v Wikipedia, a sú dosť zaujímavé. Prvých 15 bitov sa nepoužíva, hoci existovali plány využiť ich na varovné systémy a civilnú obranu. Bit A1 naznačuje, že o hodinu sa hodiny posunú na letný čas. Bit A2 naznačuje, že o hodinu sa pridá pridaná sekunda, ktorá sa niekedy používa na korekciu času podľa rotácie Zeme. Ostatné bity kódujú hodiny, minúty, sekundy a dátum.

DCF77: ako funguje systém prenosu signálov presného času?

Pre tých, ktorí si chcú experimentovať sami, je kód na dekódovanie uvedený pod spoilerom.
Zdrojový kód

def decode(bits):
    if bits[0] != '0' or bits[20] != '1':
        return
    
    minutes, hours, day_of_month, weekday, month, year = map(convert_block,
                                                             (bits[21:28], bits[29:35], bits[36:42], bits[42:45],
                                                              bits[45:50], bits[50:58]))
    days = ('Nedeľa', 'Pondelok', 'Utorok', 'Streda', 'Štvrtok', 'Piatok', 'Sobota', 'Nedeľa')
    print('{dow}, {dom:02}.{mon:02}.{y}, {h:02}:{m:02}'.format(h=hours, m=minutes, dow=days[weekday],
                                                               dom=day_of_month, mon=month, y=year))


def convert_ones(bits):
    return sum(2**i for i, bit in enumerate(bits) if bit == '1')


def convert_tens(bits):
    return 10*convert_ones(bits)


def right_parity(bits, parity_bit):
    num_of_ones = sum(int(bit) for bit in bits)
    return num_of_ones % 2 == int(parity_bit)


def convert_block(bits, parity=False):
    if parity and not right_parity(bits[:-1], bits[-1]):
        return -1
    
    ones = bits[:4]
    tens = bits[4:]
    return convert_tens(tens) + convert_ones(ones)

Keď spustíme program, uvidíme približne takýto výstup:

0011110110111000001011000001010000100110010101100010011000
Utorok, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Utorok, 26.03.19, 21:42

Vlastne, to je celá mágia. Výhodou tohto systému je, že dekódovanie je mimoriadne jednoduché a môže sa uskutočniť na akomkoľvek, aj najjednoduchšom mikrokontroléri. Stačí počítať dĺžku impulzov, zhromaždiť 60 bitov a na konci každej minúty získať presný čas. V porovnaní s inými spôsobmi synchronizácie času (napr. GPS, alebo, nedajbože, Internet:), táto rádiová synchronizácia prakticky nevyžaduje energiu — na príklad, bežná domácnosť meteostanica funguje asi rok na 2 batérie AA. Preto sa s rádiovou synchronizáciou vyrábajú aj náramkové hodinky, nieto ešte nástenné alebo na verejných železničných staniciach.

Pohodlnosť a jednoduchosť DCF lákajú aj milovníkov DIY. Za 10-20 $ si môžete kúpiť hotový modul s anténou a hotovým prijímačom s TTL výstupom, ktorý môžete pripojiť k Arduinu alebo inému ovládaču.
DCF77: ako funguje systém prenosu signálov presného času?

Pre Arduino už sú napísané a hotové knižnice. Avšak je známe, že čokoľvek urobíte s mikrokontrolérom, skončíte buď s hodinami, alebo s meteostanicou. S takýmto zariadením nie je ťažké získať presný čas, ak sa samozrejme nachádzate v prijmovej zóne. A môžete na hodiny umiestniť nápis „Atómové hodiny“ a zároveň všetkým vysvetľovať, že zariadenie sa naozaj synchronizuje pomocou atómových hodín.

Tí, ktorí chcú, si dokonca môžu vylepšiť staré babičkine hodiny, nainštalovaním nového mechanizmu s rádiovou synchronizáciou:

DCF77: ako funguje systém prenosu signálov presného času?

Takýto mechanizmus je možné nájsť na ebay pomocou kľúčových slov „Radio Controlled Movement“.

A napokon, tip pre tých, ktorí sa dostali až sem. Aj keď v niekoľkých tisícoch kilometrov nie je žiadny rádiový prenos, taký signál si môžete ľahko vygenerovať sami. V Google Play je aplikácia s názvom „DCF77 Emulator“, ktorá vysiela signál do slúchadiel. Podľa tvrdení autora, ak obtočíte kábel slúchadiel okolo hodín, zachytia signál (zaujímavé, ako, veď bežné slúchadlá nevytvoria signál 77KHz, ale prijímanie môže prebiehať kvôli harmonickým frekvenciám). Na mojom Android 9 aplikácia vôbec nefungovala — jednoducho nebol zvuk (alebo som ho počul — 77KHz predsa len:), ale možno niekto bude mať viac šťastia. Niektorí si však robia aj úplný generátor signálov DCF, ktorý nie je ťažké vytvoriť na tej istej Arduino alebo ESP32:

DCF77: ako funguje systém prenosu signálov presného času?
(zdroj sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

Záver

Systém DCF sa ukázal ako skutočne jednoduchý a praktický. S pomocou jednoduchého a lacného prijímača môžete mať vždy a všade presný čas, samozrejme v oblasti prijmu. Myslím, že aj napriek všeobecnej digitalizácii a „internetu vecí“, budú takéto jednoduché riešenia dopytované ešte dlho.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster