DCF77: si funksionon sistemi i sinjalizimit të kohës?

Përshëndetje Habr.

Ndoshta shumë që blejnë një orë ose stacion moti kanë parë logon e orës së kontrolluar me radio ose edhe logon e orës atomike në paketim. Kjo është shumë e përshtatshme, sepse thjesht duhet të vendosni orën në tavolinë, dhe pas një kohe ajo automatikisht do të përshtatet me kohën e saktë.
DCF77: si funksionon sistemi i sinjalizimit të kohës?

Le të kuptojmë se si funksionon dhe të shkruajmë një dekoder në Python.

Ekzistojnë sisteme të ndryshme të sinkronizimit të kohës. Më i popullarizuari në Evropë është sistemi gjerman DCF-77, Japonia ka sistemin e saj JJY, në SHBA ekziston një sistem WWVB, dhe kështu me radhë. Tjetra, historia do të jetë për DCF77, si më e rëndësishme dhe e arritshme për pritje në disa vende në pjesën evropiane të Rusisë dhe vendeve fqinje (banorët e Lindjes së Largët mund të kenë mendim të kundërt, megjithatë, ata, nga ana tjetër, mund të marrin dhe analizoni sinjalin japonez;).

Gjithçka e shkruar më poshtë do të jetë rreth DCF77.

Marrja e sinjalit

DCF77 është një stacion me valë të gjatë që funksionon në një frekuencë prej 77.5 kHz dhe transmeton sinjale në modulimin e amplitudës. Stacioni 50 KW ndodhet 25 km larg Frankfurtit, ai filloi funksionimin në 1959 dhe në 1973 informacioni i datës iu shtua kohës së saktë. Gjatësia e valës në një frekuencë prej 77 KHz është shumë e gjatë, kështu që dimensionet e fushës së antenës janë gjithashtu mjaft të përshtatshme (foto nga Wikipedia):
DCF77: si funksionon sistemi i sinjalizimit të kohës?

Me një antenë të tillë dhe hyrje të energjisë, zona e pritjes mbulon pothuajse të gjithë Evropën, Bjellorusinë, Ukrainën dhe një pjesë të Rusisë.

DCF77: si funksionon sistemi i sinjalizimit të kohës?

Çdokush mund të regjistrojë një sinjal. Për ta bërë këtë, thjesht shkoni te marrësi në internet http://websdr.ewi.utwente.nl:8901/, zgjidhni frekuencën 76.5 KHz dhe modulimin USB atje. Duhet të hapet një imazh që duket diçka si kjo:

DCF77: si funksionon sistemi i sinjalizimit të kohës?

Atje shtypim butonin e shkarkimit dhe regjistrojmë një fragment disa minuta. Sigurisht, nëse keni një marrës "të vërtetë" të aftë për të regjistruar frekuencën 77.5 KHz, mund ta përdorni atë.

Natyrisht, duke marrë sinjale të kohës së radios përmes internetit, ne nuk do të marrim kohë vërtet të saktë - sinjali transmetohet me vonesë. Por qëllimi ynë është vetëm të kuptojmë strukturën e sinjalit; për këtë, regjistrimi në internet është më se i mjaftueshëm. Në jetën reale, natyrisht, pajisjet e specializuara përdoren për marrjen dhe dekodimin; ato do të diskutohen më poshtë.

Pra, ne kemi marrë regjistrimin, le të fillojmë ta përpunojmë atë.

Dekodimi i sinjalit

Le të ngarkojmë skedarin duke përdorur Python dhe të shohim strukturën e tij:

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

Ne shohim modulimin tipik të amplitudës:
DCF77: si funksionon sistemi i sinjalizimit të kohës?

Për të thjeshtuar dekodimin, le të marrim zarfin e sinjalit duke përdorur transformimin Hilbert:

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

Rezultati i zgjeruar:
DCF77: si funksionon sistemi i sinjalizimit të kohës?

Le të zbusim emetimet e zhurmës duke përdorur një filtër me kalim të ulët dhe në të njëjtën kohë të llogarisim vlerën mesatare, e cila do të jetë e dobishme më vonë për analizë.

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

Rezultati (vija e verdhë): një sinjal me valë pothuajse katrore që analizohet mjaft lehtë.
DCF77: si funksionon sistemi i sinjalizimit të kohës?

Parsing

Së pari ju duhet të merrni sekuencën e bitave. Vetë struktura e sinjalit është shumë e thjeshtë.
DCF77: si funksionon sistemi i sinjalizimit të kohës?

Impulset ndahen në intervale të dyta. Nëse distanca midis pulseve është 0.1 s (d.m.th. gjatësia e vetë pulsit është 0.9 s), shtoni "0" në sekuencën e biteve; nëse distanca është 0.2 s (d.m.th. gjatësia është 0.8 s), shtoni "1". Fundi i çdo minutë tregohet nga një puls "i gjatë", 2 s i gjatë, sekuenca e biteve rivendoset në zero dhe mbushja fillon përsëri.

Sa më sipër është e lehtë për t'u shkruar në 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

Si rezultat, marrim një sekuencë bitash, në shembullin tonë për dy sekonda duket kështu:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Nga rruga, është interesante që sinjali ka gjithashtu një "shtresë të dytë" të të dhënave. Sekuenca e biteve është gjithashtu e koduar duke përdorur modulimi fazor. Në teori, kjo duhet të sigurojë dekodim më të fuqishëm edhe në rastin e një sinjali të dobësuar.

Hapi ynë i fundit: marrja e të dhënave aktuale. Bitët transmetohen një herë në sekondë, kështu që kemi gjithsej 59 bit, në të cilët kodohet mjaft informacion:
DCF77: si funksionon sistemi i sinjalizimit të kohës?

Bitet përshkruhen në Wikipedia, dhe ata janë mjaft kureshtarë. 15 bitet e para nuk janë përdorur, megjithëse ka pasur plane për t'i përdorur ato për sistemet e paralajmërimit dhe mbrojtjen civile. Biti A1 tregon se ora do të ndryshojë në orën e ditës në orën e ardhshme. Biti A2 tregon se një shtesë kërcim i dytë, e cila ndonjëherë përdoret për të rregulluar kohën sipas rrotullimit të Tokës. Bitet e mbetura kodojnë orët, minutat, sekondat dhe datën.

DCF77: si funksionon sistemi i sinjalizimit të kohës?

Për ata që duan të eksperimentojnë vetë, kodi i dekodimit jepet nën spoiler.
Kodi i burimit

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)

Kur ekzekutojmë programin, do të shohim dalje të ngjashme me këtë:

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

Në fakt, kjo është e gjithë magjia. Avantazhi i një sistemi të tillë është se dekodimi është jashtëzakonisht i thjeshtë dhe mund të bëhet në çdo mikrokontrollues, madje edhe më të thjeshtë. Ne thjesht numërojmë gjatësinë e pulseve, grumbullojmë 60 bit dhe në fund të çdo minutë marrim kohën e saktë. Krahasuar me metodat e tjera të sinkronizimit të kohës (GPS, për shembull, ose Zoti na ruajt, interneti :), një sinkronizim i tillë radio nuk kërkon pothuajse asnjë energji elektrike - për shembull, një stacion i rregullt i motit në shtëpi funksionon për rreth një vit me 2 bateri AA. Prandaj, edhe orët e dorës bëhen me sinkronizim radio, për të mos përmendur, natyrisht, orët e murit ose orët e stacionit të rrugës.

Komoditeti dhe thjeshtësia e DCF tërheq gjithashtu entuziastët DIY. Për vetëm 10-20 dollarë mund të blini një modul antene të gatshme me një marrës të gatshëm dhe dalje TTL, i cili mund të lidhet me një Arduino ose një kontrollues tjetër.
DCF77: si funksionon sistemi i sinjalizimit të kohës?

Shkruar tashmë për Arduino biblioteka të gatshme. Sidoqoftë, dihet tashmë se pavarësisht se çfarë bëni në një mikrokontrollues, përfundoni ose me një orë ose një stacion meteorologjik. Me një pajisje të tillë, marrja e kohës së saktë është vërtet e lehtë, me kusht që, sigurisht, të jeni në zonën e pritjes. Epo, mund të varni mbishkrimin "Ora atomike" në orën tuaj dhe në të njëjtën kohë t'u shpjegoni të gjithëve se pajisja është sinkronizuar me të vërtetë duke përdorur një orë atomike.

Ata që dëshirojnë mund të përmirësojnë edhe orën e gjyshes së tyre të vjetër duke instaluar një mekanizëm të ri me sinkronizim radio:

DCF77: si funksionon sistemi i sinjalizimit të kohës?

Mund ta gjeni në ebay duke përdorur fjalët kyçe "Lëvizja e kontrolluar me radio".

Dhe së fundi, një hak jetësor për ata që kanë lexuar deri këtu. Edhe nëse nuk ka asnjë transmetues të vetëm të sinjalit radio në dy mijë kilometrat e ardhshëm, nuk është e vështirë të gjeneroni vetë një sinjal të tillë. Ekziston një program në Google Play i quajtur "Emulator DCF77" që nxjerr sinjalin në kufje. Sipas autorit, nëse mbështillni telin e kufjeve rreth orës, ata do të marrin sinjalin (është interesante se si, sepse kufjet e zakonshme nuk do të prodhojnë një sinjal 77 KHz, por pritja është ndoshta për shkak të harmonikave). Në Android 9, programi nuk funksionoi fare për mua - thjesht nuk kishte zë (ose ndoshta nuk e dëgjova - është 77 KHz, në fund të fundit :), por mbase dikush do të ketë fat më të mirë. Disa, megjithatë, e bëjnë veten një gjenerator të plotë të sinjalit DCF, i cili është i lehtë për t'u bërë në të njëjtin Arduino ose ESP32:

DCF77: si funksionon sistemi i sinjalizimit të kohës?
(burimi sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

Përfundim

Sistemi DCF doli të ishte vërtet mjaft i thjeshtë dhe i përshtatshëm. Me ndihmën e një marrësi të thjeshtë dhe të lirë, mund të keni kohën e saktë gjithmonë dhe kudo, sigurisht në ambientet e pritjes. Duket se edhe përkundër dixhitalizimit të gjerë dhe Internetit të Gjërave, zgjidhje të tilla të thjeshta do të jenë të kërkuara për një kohë të gjatë.

Burimi: www.habr.com

Shto një koment