DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?

Tere, Habr.

TÔenÀoliselt on paljud, kes ostavad kella vÔi ilmateatejaama, nÀinud pakendil logo Radio Controlled Clock vÔi isegi Atomic Clock. See on vÀga mugav, sest piisab, kui asetada kell lauale, ja see seadistub mÔne aja pÀrast automaatselt tÀpselt Ôigeks ajaks.
DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?

Selgitage, kuidas see töötab ja kirjutame dekoodri Pythonis.

Aja sĂŒnkroonimiseks on erinevaid sĂŒsteeme. Euroopas on kĂ”ige populaarsem saksa sĂŒsteem DCF-77, Jaapanis on oma sĂŒsteem JJY, Ameerika Ühendriikides on sĂŒsteem WWVB, ja nii edasi. Edasi rÀÀgitakse DCF77-st, kuna see on kĂ”ige aktuaalsem ja kergesti vastuvĂ”etav mĂ”nes Euroopa Venemaa piirkonnas ja naabruses (Kaug-Ida elanikel vĂ”ib olla vastupidine arvamus, kuid nad omakorda vĂ”ivad vastu vĂ”tta ja analĂŒĂŒsida Jaapani signaali;).

KÔik, mis edasi kirjutatakse, kÀsitleb DCF77.

Signaali vastuvÔtt

DCF77 on pikalainejaam, mis töötab sagedusel 77,5 kHz ja edastab amplituudmodulatsiooniga signaale. 50 kW vĂ”imsusega jaam asub Frankfurtist 25 km kaugusel, alustas ta tööd juba 1959. aastal ning 1973. aastal lisati tĂ€psetele ajale ka kuupĂ€eva info. 77 kHz sagedusel on lainepikkus ĂŒsna suur, seega on ka antenni vĂ€lja suurus mĂ€rkimisvÀÀrne (foto Wikimedia Commons-ist):
DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?

Sellise antenni ja edastatava vÔimsusega katab vastuvÔtuala praktiliselt kogu Euroopa, Valgevene, Ukraina ja osa Venemaast.

DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?

Signaali saab salvestada igaĂŒks. Selleks piisab, kui minna veebivastuvĂ”tjale http://websdr.ewi.utwente.nl:8901/, valida seal sagedus 76,5 kHz ja USB-modulatsioon. Pidada avama pilt umbes sellise:

DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?

Seal vajutame nupule alla laadida ja salvestame mitu minutit kestva lĂ”igu. Loomulikult vĂ”ib kasutada ka „pĂ€ris“ vastuvĂ”tjat, mis suudab salvestada sagedust 77,5 kHz.

Muidugi, kui vĂ”tame Interneti kaudu tĂ€psete aja raadiosignaale, ei saa me tĂ”eliselt tĂ€pset aega – signaal edastatakse viivitusega. Kuid meie eesmĂ€rk on mĂ”ista signaali struktuuri, selleks on Interneti salvestused rohkem kui piisavad. Tegelikult kasutatavad spetsialiseeritud seadmed signaali vastuvĂ”tmiseks ja dekodeerimiseks, millest rÀÀgime allpool.

Nii saime salvestuse, alustame selle töötlemist.

Signaali dekodeerimine

Laadime faili Pythoniga ja vaatame selle struktuuri:

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

NĂ€eme tĂŒĂŒpilist amplituudimodulatsiooni:
DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?

Dekodeerimise lihtsustamiseks vĂ”tame signaali ĂŒmbrise Hilberti transformatsiooni abil:

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

Tulemus suurendatud kujul:
DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?

Silume mĂŒra vĂ€lja viskamise puhul madalate sageduste filtri abil ja arvutame samal ajal keskmise, mis tuleb hiljem parsimiseks kasuks.

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

Tulemus (kollane joon): praktiliselt ristkĂŒlikukujuline signaal, mida on ĂŒsna lihtne analĂŒĂŒsida.
DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?

Andmete kogumine

Esialgu tuleb saada bittide jÀrjestus. Signaali struktuur on vÀga lihtne.
DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?

Impulsid on jagatud sekundi intervallideks. Kui impulsi vahemaa on 0,1 s (st impulsi pikkus 0,9 s), lisame bittide jÀrjestusse '0', kui vahemaa on 0,2 s (st pikkus 0,8 s), lisame '1'. Iga minuti lÔppu tÀhistatakse 'pika' impulssiga, mille pikkus on 2 s, mille kÀigus bittide jÀrjestus nullitakse ja tÀitmine algab uuesti.

Ülaltoodud on lihtne ĂŒles kirjutada Pythonis.

sig_start, sig_stop = 0, 0
pos = 0
bits_str = ""
while pos < cnt - 4:
    if A[pos]  avg:
        # Signaali algus
        sig_start = pos
    if A[pos] > avg and A[pos+1] < avg:
        # Signaali lÔpp
        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

Tulemusena saame bittide jÀrjestuse, meie nÀites nÀeb see vÀlja jÀrgmiselt kahe sekundi jooksul:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Üldiselt on huvitav, et signaalis on ka "teine kiht" andmeid. Bitijada on samuti kodeeritud faasi modulaatoriga. Teoreetiliselt peaks see tagama stabiilsema dekodeerimise isegi nĂ”rgenenud signaali korral.

Meie viimane samm: saada tegelikud andmed. Bitid edastatakse iga sekundi tagant, seega on meil kokku 59 bitti, milles on kodeeritud piisavalt teavet:
DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?

Bitid on kirjeldatud Vikipeediale, ja need on ĂŒsna huvitavad. Esimesi 15 bitti ei kasutata, ehkki oli plaan kasutada neid hĂ€iresĂŒsteemide ja tsiviilkaitse jaoks. Bit A1 nĂ€itab, et jĂ€rgmisel tunnil kellad seatakse suveajale. Bit A2 nĂ€itab, et jĂ€rgmisel tunnil lisatakse tĂ€iendav sekund, mida mĂ”nikord kasutatakse aja korrigeerimiseks vastavalt Maa pöörlemisele. ÜlejÀÀnud bitid kodeerivad tunde, minuteid, sekundeid ja kuupĂ€eva.

DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?

Neile, kes soovivad ise katsetada, on dekodeerimise kood toodud spoileris.
Allikasood

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 = ('PĂŒhapĂ€ev', 'EsmaspĂ€ev', 'TeisipĂ€ev', 'KolmapĂ€ev', 'NeljapĂ€ev', 'Reede', 'LaupĂ€ev', 'PĂŒhapĂ€ev')
    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)

KÀivitades programmi, nÀeme umbkaudu sellist vÀljundit:

0011110110111000001011000001010000100110010101100010011000
TeisipÀev, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
TeisipÀev, 26.03.19, 21:42

Siin on kogu maagia. Sellise sĂŒsteemi eeliseks on see, et dekodeerimine on ÀÀrmiselt lihtne ja seda saab teostada igasugustes, isegi kĂ”ige lihtsamates mikrokontrollerites. Lihtsalt loeme impulsi pikkuse, kogume 60 bitti ja iga minuti lĂ”pus saame tĂ€pse aja. VĂ”rreldes teiste ajasĂŒnkroniseerimise meetoditega (nĂ€iteks GPS-i vĂ”i, jumala kaitse, Internetiga :), vajab selline raadiotehnika energiat praktiliselt mitte midagi — nĂ€iteks tavaline kodune ilmateade töötab umbes aasta kahe AA patareiga. SeetĂ”ttu kasutatakse raadiotehnika vĂ”imalusi isegi kĂ€ekellades, rÀÀkimata seinalehtedest vĂ”i vĂ€ljakute kelladest.

DCF mugavus ja lihtsus meeldivad ka DIY entusiastidele. Ainult 10-20 dollari eest saab osta valmis mooduli antenniga koos valmis vastuvĂ”tja ja TTL-vĂ€ljundiga, mida saab ĂŒhendada Arduino vĂ”i muu kontrolleriga.
DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?

Arduino jaoks on juba kirjutatud ja valmis raamatukogud. Kuid on juba ammu teada, et ĂŒkskĂ”ik mida mikrokontrolleriga teha, tulevad vĂ€lja kas kell vĂ”i ilmateade. Sellise seadmega on tĂ”epoolest lihtne tĂ€pset aega saada, kui olla vastuvĂ”tualas. Ja kellale vĂ”ib lisada sildi „Aatomikell”, ning seletada kĂ”igile, kes soovivad, et seade tĂ”epoolest sĂŒnkroniseerub aatomikelladega.

Soovijad vĂ”ivad isegi vanaema kella uuendada, paigaldades sinna uue raadio sĂŒnkroniseerimise mehhanismi:

DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?

Sellist vĂ”ib leida ebay's otsesĂ”nadega „Raadio juhitav mehhanism”.

Ja lĂ”puks, nip neile, kes on siiani saanud. Isegi kui lĂ€hima paari tuhande kilomeetri raadiovastuvĂ”tjat ei ole, on sellise signaali genereerimine ĂŒsna lihtne. Google Play's on rakendus nimega „DCF77 Emulator”, mis edastab signaali kĂ”rvaklappidesse. Autori kinnitusel, kui mĂ€hkida kĂ”rvaklappide juhe kellade ĂŒmber, peaksid need signaali saama (huvitav, kuidas, sest tavalised kĂ”rvaklapid ei tooda 77 kHz signaali, aga tĂ”enĂ€oliselt toimub vastuvĂ”tt harmoonikate kaudu). Minu Android 9 seadmest see rakendus ei töötanud — lihtsalt ei olnud heli (vĂ”ib-olla ei kuulnud ma seda — 77 kHz ju :), aga Ă€kki mĂ”nedele see rohkem Ă”nnestub. MĂ”ned, muide, teevad endale ka korraliku DCF-signaaligeneraatori, mille valmistamine on lihtne sama Arduino vĂ”i ESP32 peal.

DCF77: kuidas töötab tĂ€psete ajasignaalide edastamise sĂŒsteem?
(allikas sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

KokkuvÔte

DCF sĂŒsteem osutus tĂ”eliselt lihtsaks ja mugavaks. Lihtsa ja odava vastuvĂ”tjaga on vĂ”imalik alati ja igal pool tĂ€pset aega saada, muidugi vastuvĂ”tu alas. Usun, et isegi vaatamata laialdasele digitaliseerimisele ja „asjade internetile” jÀÀvad sellised lihtsad lahendused seriaalmasiinaks veel pikaks ajaks.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster