DCF77: Hvernig virkar tímamerkjakerfið?

Sæll Habr.

Sennilega hafa margir sem kaupa úr eða veðurstöð séð Radio Controlled Clock eða jafnvel Atomic Clock lógóið á umbúðunum. Þetta er mjög þægilegt, því þú þarft bara að setja klukkuna á borðið og eftir smá stund mun hún stilla sig sjálfkrafa á nákvæman tíma.
DCF77: Hvernig virkar tímamerkjakerfið?

Við skulum reikna út hvernig það virkar og skrifa afkóðara í Python.

Það eru mismunandi tímasamstillingarkerfi. Vinsælast í Evrópu er þýska kerfið DCF-77, Japan hefur sitt eigið kerfi JJY, í Bandaríkjunum er kerfi WWVB, og svo framvegis. Næst mun sagan fjalla um DCF77, þar sem hann er sá besti og aðgengilegastur fyrir móttöku sums staðar í evrópska hluta Rússlands og nágrannalanda (íbúar í Austurlöndum fjær geta haft gagnstæða skoðun, en þeir geta aftur á móti fengið og greina japanska merkið ;).

Allt sem skrifað er hér að neðan mun snúast um DCF77.

Merkjamóttaka

DCF77 er langbylgjustöð sem starfar á 77.5 kHz tíðni og sendir merki í amplitude mótun. 50KW stöðin er staðsett 25 km frá Frankfurt, hún tók til starfa árið 1959 og árið 1973 var dagsetningarupplýsingum bætt við nákvæman tíma. Bylgjulengdin á tíðninni 77 KHz er mjög löng, þannig að stærð loftnetssviðsins er líka nokkuð þokkaleg (mynd frá Wikipedia):
DCF77: Hvernig virkar tímamerkjakerfið?

Með slíku loftneti og aflinntaki nær móttökusvæðið yfir næstum alla Evrópu, Hvíta-Rússland, Úkraínu og hluta Rússlands.

DCF77: Hvernig virkar tímamerkjakerfið?

Hver sem er getur tekið upp merki. Til að gera þetta skaltu bara fara í netmóttakara http://websdr.ewi.utwente.nl:8901/, veldu tíðnina 76.5KHz og USB mótun þar. Mynd ætti að opnast sem lítur eitthvað svona út:

DCF77: Hvernig virkar tímamerkjakerfið?

Þar ýtum við á niðurhalshnappinn og tökum upp nokkurra mínútna langt brot. Auðvitað, ef þú ert með „raunverulegan“ móttakara sem getur tekið upp 77.5KHz tíðnina, geturðu notað það.

Að sjálfsögðu, með því að fá útvarpstímamerki í gegnum internetið, munum við ekki fá raunverulegan nákvæman tíma - merkið er sent með töf. En markmið okkar er aðeins að skilja uppbyggingu merksins; til þess er internetupptakan meira en nóg. Í raunveruleikanum eru auðvitað sérhæfð tæki notuð til að taka á móti og afkóða, þau verða rædd hér að neðan.

Svo við höfum fengið upptökuna, við skulum byrja að vinna úr henni.

Merkjaafkóðun

Við skulum hlaða skránni með Python og sjá uppbyggingu hennar:

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()

Við sjáum dæmigerða amplitude mótun:
DCF77: Hvernig virkar tímamerkjakerfið?

Til að einfalda umskráningu skulum við taka merkjaumslagið með því að nota Hilbert umbreytinguna:

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

Stækkuð niðurstaða:
DCF77: Hvernig virkar tímamerkjakerfið?

Sléttum út hávaðalosun með því að nota lágrásarsíu og reiknum um leið út meðalgildið sem nýtist síðar við þáttun.

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

Niðurstaða (gul lína): næstum ferhyrningsbylgjumerki sem auðvelt er að greina.
DCF77: Hvernig virkar tímamerkjakerfið?

Dálka

Fyrst þarftu að fá bitaröðina. Merkjauppbyggingin sjálf er mjög einföld.
DCF77: Hvernig virkar tímamerkjakerfið?

Púlsunum er skipt í sekúndubil. Ef fjarlægðin á milli púlsanna er 0.1 s (þ.e. lengd púlsins sjálfs er 0.9 s), bætið „0“ við bitaröðina; ef fjarlægðin er 0.2 s (þ.e. lengdin er 0.8 s), bætið „1“ við. Lok hverrar mínútu er auðkennd með „löngu“ púlsi, 2 sekúndum löngum, bitaröðin er núllstillt og fylling hefst aftur.

Auðvelt er að skrifa ofangreint í Python.

sig_start, sig_stop = 0, 0
pos = 0
bits_str = ""
while pos < cnt - 4:
    if A[pos] < avg and A[pos+1] > avg:
        # Signal begin
        sig_start = pos
    if A[pos] > avg and A[pos+1] < avg:
        # Signal end
        sig_stop = pos

        diff = sig_stop - sig_start
    
        if diff < 0.85*sample_rate:
            bits_str += "1"
        if diff > 0.85*sample_rate and diff < 1.25*sample_rate:
            bits_str += "0"
        if diff > 1.5*sample_rate:
            print(bits_str)
            bits_str = ""

    pos += 1

Fyrir vikið fáum við röð af bitum, í dæminu okkar í tvær sekúndur lítur það svona út:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Við the vegur, það er áhugavert að merkið hefur einnig „annað lag“ af gögnum. Bitaröðin er einnig kóðað með því að nota fasa mótun. Fræðilega séð ætti þetta að veita öflugri afkóðun jafnvel ef um er að ræða veikt merki.

Síðasta skrefið okkar: að fá raunveruleg gögn. Bitar eru sendir einu sinni á sekúndu, þannig að við höfum samtals 59 bita, þar sem töluvert mikið af upplýsingum er umritað:
DCF77: Hvernig virkar tímamerkjakerfið?

Bitunum er lýst í Wikipedia, og þeir eru frekar forvitnir. Fyrstu 15 bitarnir eru ekki notaðir, þó til stóð að nota þá fyrir viðvörunarkerfi og almannavarnir. Bit A1 gefur til kynna að klukkan breytist í sumartíma á næstu klukkustund. Bit A2 gefur til kynna að viðbótar stökk sekúndu, sem stundum er notað til að stilla tímann eftir snúningi jarðar. Bitarnir sem eftir eru kóðar klukkustundir, mínútur, sekúndur og dagsetningu.

DCF77: Hvernig virkar tímamerkjakerfið?

Fyrir þá sem vilja gera tilraunir á eigin spýtur er afkóðun kóðann gefinn undir spoilernum.
Kóðinn

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 = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
    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)

Þegar við keyrum forritið munum við sjá framleiðsla svipað þessu:

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

Reyndar er það allur galdurinn. Kosturinn við slíkt kerfi er að afkóðun er einstaklega einföld og hægt að gera á hvaða, jafnvel einfaldasta örstýringu. Við teljum einfaldlega lengd púlsanna, söfnum 60 bitum og í lok hverrar mínútu fáum við nákvæman tíma. Í samanburði við aðrar aðferðir við tímasamstillingu (GPS, til dæmis, eða guð forði, internetið:), þarf slík útvarpssamstilling nánast ekkert rafmagn - til dæmis gengur venjuleg heimilisveðurstöð í um það bil ár á 2 AA rafhlöðum. Þess vegna eru jafnvel armbandsúr framleidd með útvarpssamstillingu, svo ekki sé minnst á að sjálfsögðu veggúr eða götustöðvarúr.

Þægindin og einfaldleikinn í DCF laðar einnig að sér DIY áhugamenn. Fyrir aðeins $10-20 er hægt að kaupa tilbúna loftnetseiningu með tilbúnum móttakara og TTL útgangi, sem hægt er að tengja við Arduino eða annan stjórnanda.
DCF77: Hvernig virkar tímamerkjakerfið?

Þegar skrifað fyrir Arduino tilbúin bókasöfn. Hins vegar er þegar vitað að það er sama hvað þú gerir á örstýringu, þú endar með annað hvort klukku eða veðurstöð. Með slíku tæki er mjög auðvelt að fá nákvæman tíma, að sjálfsögðu að því gefnu að þú sért í móttökunni. Jæja, þú getur hengt áletrunina „Atomic Clock“ á úrið þitt og á sama tíma útskýrt fyrir öllum að tækið sé raunverulega samstillt með atómklukku.

Þeir sem vilja geta jafnvel uppfært gamla ömmuúrið með því að setja upp nýja vélbúnað með útvarpssamstillingu:

DCF77: Hvernig virkar tímamerkjakerfið?

Þú getur fundið einn á ebay með því að nota leitarorðin "Radio Controlled Movement".

Og að lokum, lífstíll fyrir þá sem hafa lesið hingað til. Jafnvel þótt það sé ekki einn útvarpsmerkjasendir á næstu tvö þúsund km, þá er ekki erfitt að búa til slíkt merki sjálfur. Það er forrit á Google Play sem heitir „DCF77 Emulator“ sem gefur út merki í heyrnartól. Samkvæmt höfundinum, ef þú vefur vír heyrnartólanna utan um úrið, munu þau taka upp merkið (það er áhugavert hvernig, vegna þess að venjuleg heyrnartól gefa ekki 77KHz merki, en móttaka er líklega vegna harmonika). Á Android 9 virkaði forritið alls ekki fyrir mig - það var einfaldlega ekkert hljóð (eða kannski heyrði ég það ekki - það er 77KHz, þegar allt kemur til alls:), en kannski mun einhver hafa betur. Sumir gera sig hins vegar fullgildan DCF merkjagjafa, sem auðvelt er að búa til á sama Arduino eða ESP32:

DCF77: Hvernig virkar tímamerkjakerfið?
(heimild sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

Ályktun

DCF kerfið reyndist í raun frekar einfalt og þægilegt. Með hjálp einfalds og ódýrs viðtækis geturðu haft nákvæma tíma alltaf og alls staðar, að sjálfsögðu í móttökunni. Svo virðist sem jafnvel þrátt fyrir útbreidda stafræna væðingu og Internet of Things muni slíkar einfaldar lausnir vera eftirsóttar í langan tíma.

Heimild: www.habr.com

Bæta við athugasemd