DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës të saktë?

Përshëndetje Habr.

Shumë njerëz që blejnë ora ose stacione meteorologjike e kanë parë logon Radio Controlled Clock ose madje Atomic Clock në paketim. Kjo është tepër e dobishme, pasi mjafton ta vendosni orën në tryezë dhe pas disa kohësh ajo automatikisht do të konfigurohet me orën e saktë.
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës të saktë?

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

Ekzistojnë sisteme të ndryshme për sinkronizimin e kohës. Sistemi më popullor në Evropë është sistemi gjerman DCF-77, në Japoni ka sistemin e saj JJY, në SHBA ka sistemin WWVB, dhe kështu me radhë. Historia e mëtejshme do të flasë për DCF77, si sistemi më i aktualizuar dhe i pranueshëm për marrje në disa vende të Evropës lindore të Rusisë dhe vendeve fqinjë (banorët e Dallgendit të Lindjes mund të kenë një mendim tjetër, megjithatë ata gjithashtu mund të pranojnë dhe të analizojnë sinjalin japonez;).

Gjithçka që do të thuhet më pas do të jetë rreth DCF77.

Pranimi i sinjalit

DCF77 është një stacion me valë të gjatë që punon në frekuencën 77.5 kHz dhe dërgon sinjale në modullim amplitudinal. Stacioni me fuqinë 50 kW ndodhet 25 km nga Frankfurt, ka filluar punën që nga viti 1959, dhe në vitin 1973 informacioni mbi datën iu shtua kohës së saktë. Gjatësia e valës në frekuencën 77 kHz është shumë e madhe, prandaj dimensionet e fushës së antenës janë gjithashtu të konsiderueshme (foto nga Wikipedia):
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës të saktë?

Me këtë antinë dhe fuqinë e aplikuar, zona e pranimit mbulon praktikisht të gjithë Evropën, Bjellorusinë, Ukrainën dhe një pjesë të Rusisë.

DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës të saktë?

Çdo kush mund tĂ« regjistrojĂ« sinjalin. Mjafton tĂ« hyjĂ« nĂ« njĂ« pranues online http://websdr.ewi.utwente.nl:8901/, tĂ« zgjedhĂ« atje frekuencĂ«n 76.5 kHz dhe modullimin USB. Duhet tĂ« hapet njĂ« imazh pĂ«rafĂ«rsisht si ky:

DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës të saktë?

Atje shtypim butonin download dhe regjistrojmë një fragment me gjatësi disa minutash. Së voni, me një "pranues të vërtetë" që është i aftë të regjistrojë frekuencën 77.5 kHz, mund ta përdorni atë.

Sigurisht, duke marrë sinjalet radio të kohës së saktë përmes internetit, nuk do të marrim vërtet një kohë të saktë - sinjali dërgohet me vonesë. Por qëllimi ynë është vetëm të kuptojmë strukturën e sinjalit, për këtë regjistrimet në internet janë më se të mjaftueshme. Në realitet, sigurisht, përdoren pajisje të specializuara për pranimin dhe dekodimin, për të cilat do të flitet më poshtë.

Pra, kemi marrë regjistrimin, le t'i fillojmë përpunimet e tij.

Dekodimi i sinjalit

Le të ngarkojmë skedarin me 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 një modulim tipik të amplitudës:
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës të saktë?

Për thjeshtimin e dekodimit, le të marrim përkufizimin 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 transmetimit të sinjaleve të kohës të saktë?

Për të zbutur shpërthimet nga zhurmat, do të përdorim një filtrë low-pass dhe do të llogarisim mesataren, e cila do të na nevojitet më vonë për renditjen.

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 pothuajse katror, i cili është relativisht i lehtë për t'u analizuar.
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës të saktë?

Renditja

Së pari, duhet të fitojmë sekuencën e bitëve. Struktura e sinjalit është shumë e thjeshtë.
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës të saktë?

Impulsat janë të ndara në intervale sekondash. Nëse distanca midis impulsave është 0.1 sekondë (dmth. gjatësia e impulsit është 0.9 sekondë), shtojmë "0" në sekuencën e bitëve. Nëse distanca është 0.2 sekondë (dmth. gjatësia është 0.8 sekondë), shtojmë "1". Fundi i çdo minute tregohet me një impuls "të gjatë", me gjatësi 2 sekonda, dhe sekuenca e bitëve në këtë pikë reset-het, duke filluar nga e para.

E përmendur më lart nuk është e vështirë të shkruhet në gjuhën Python.

sig_start, sig_stop = 0, 0
pos = 0
bits_str = ""
while pos < cnt - 4:
    if A[pos]  avg:
        # Fillimi i sinjalit
        sig_start = pos
    if A[pos] > avg and A[pos+1] < avg:
        # Fundi i sinjalit
        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

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

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Përkthehet interesante që në sinjal ka edhe një "shtresë të dytë" të dhënash. Sekuenca e bitëve gjithashtu është koduar me modulim fazor. Teoretikisht, kjo duhet të sigurojë një dekodim më të qëndrueshëm, madje edhe në rast të një sinjali të dobësuar.

Hapi ynë i fundit: të marrim të dhënat vetë. Bitët transmetohen një herë në sekondë, kështu që kemi vetëm 59 bitë, në të cilat janë koduar mjaft informacione:
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës të saktë?

Bitët janë përshkruar në Wikipedia, dhe ata janë mjaft kuriozë. Bitët e parë 15 nuk përdoren, ndonëse kishte plane për t'i përdorur për sisteme alarmi dhe mbrojtje civile. Bit A1 tregon se në orën e ardhshme do të kalohen në orën verore. Bit A2 tregon se në orën e ardhshme do të shtohet një sekondë shtesë, e cila herë pas here përdoret për të korrigjuar kohën në përputhje me rrotullimin e Tokës. Bitët e tjerë kodojnë orët, minutat, sekondat dhe datën.

DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës të saktë?

Për ata që dëshirojnë të eksperimentojnë vetë, kodi për dekodimin është përfshirë nën spoiler.
Kodi burimor

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 = ('E diel', 'E hënë', 'E martë', 'E mërkurë', 'E enjte', 'E premte', 'E shtunë', 'E diel')
    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)

Duke e ekzekutuar programin, ne do të shohim një dalje të tillë:

0011110110111000001011000001010000100110010101100010011000
E Martë, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
E Martë, 26.03.19, 21:42

NĂ« thelb, kjo Ă«shtĂ« e gjithĂ« magjia. PĂ«rfitimi i kĂ«saj sistemi Ă«shtĂ« se dekodimi Ă«shtĂ« jashtĂ«zakonisht i thjeshtĂ« dhe mund tĂ« bĂ«het nĂ« çdo mikrokontroller, madje edhe mĂ« tĂ« thjeshtĂ«. Thjesht llogarisim gjatĂ«si e impulseve, grumbullojmĂ« 60 bitĂ«, dhe nĂ« fund tĂ« çdo minute marrim kohĂ«n e saktĂ«. Krahasuar me metoda tĂ« tjera tĂ« sinkronizimit tĂ« kohĂ«s (si GPS, pĂ«r shembull, ose Zot na ruaj, Interneti :), kjo sinkronizim i radios kĂ«rkon praktikisht pa energji elektrike — pĂ«r shembull, njĂ« stacion meteorologjik standard nĂ« shtĂ«pi funksionon rreth njĂ« vit nga dy bateri AA. Prandaj, me sinkronizimin e radios, bĂ«jnĂ« madje edhe orĂ« dore, pa pĂ«rmendur sigurisht orĂ«t e murit ose tĂ« stacioneve tĂ« jashtme.

Komoditeti dhe thjeshtësia e DCF tërheqin edhe amatorët e DIY. Vetëm për 10-20$ mund të blini një moduli të gatshëm me antenë dhe një marrës të gatshëm me dalje TTL, i cili mund të lidhet me Arduino ose një kontrollues tjetër.
DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës të saktë?

Për Arduino tashmë janë shkruar dhe biblioteka të gatshme. Megjithatë, është e njohur se çfarëdo që të bësh me një mikrocontroller, rezulton ose një orë ose një stacion meteorologjik. Me një pajisje të tillë, është vërtet e lehtë të marrësh kohën e saktë, për sa kohë që je në zonën e marrjes. Po ashtu, mund të vendosësh mbi orë mbishkrimin "Atomic Clock" dhe t'u shpjegosh të gjithëve që pajisja vërtet sinkronizohet përmes orëve atomike.

Ata që dëshirojnë mund ta përmirësojnë edhe orën e vjetër të gjysheve, duke instaluar një mekanizëm të ri me radiosinkronizim:

DCF77: si funksionon sistemi i transmetimit të sinjaleve të kohës të saktë?

Mund ta gjejmë një të tillë në ebay me fjalët kyç "Radio Controlled Movement".

Dhe përfundimisht, një këshillë për ata që e lexuan deri këtu. Edhe nëse në disa mijëra kilometra nuk ka asnjë transmetues sinjali radio, është e lehtë ta gjenerosh një sinjal vetë. Në Google Play ka një program me emrin "DCF77 Emulator", i cili dërgon sinjal në kufje. Sipas autorit, nëse e mbështjell kabllin e kufjeve rreth orës, ato do të kapin sinjalin (është interesante si, pasi kufjet normale nuk do të lëshonin një sinjal 77kHz, por ndoshta marrja bëhet përmes harmonikave). Unë në Android 9 programi nuk funksionoi fare - thjesht nuk kishte zë (ndoshta nuk e dëgjova - 77kHz ndonjëherë:), por ndoshta dikujt do t'i shkojë më mirë. Disa megjithatë, bëjnë edhe një gjenerator sinjalesh DCF, i cili është e lehtë të bëhet me të njëjtin Arduino ose ESP32:

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

Përfundim

Sistemi DCF, u tregua vërtet i thjeshtë dhe i përshtatshëm. Me një marrës të ndjeshëm dhe të lirë, mund të kesh gjithmonë kohën e saktë, sigurisht në zonën e marrjes. Mendoj se, përkundër digjitalizimit të përhapur dhe 'internetit të gjërave', zgjidhjet e tilla të thjeshta do të kërkohen edhe për një kohë të gjatë.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster