DCF77: Lub sijhawm teeb liab ua haujlwm li cas?

Nyob zoo Habr.

Tej zaum muaj coob tus uas yuav lub moos lossis chaw nres tsheb huab cua tau pom Xov Tooj Cua Tswj Clock lossis txawm tias Atomic Clock logo ntawm lub ntim. Qhov no yooj yim heev, vim tias koj tsuas yog yuav tsum tau muab lub moos tso rau ntawm lub rooj, thiab tom qab ib ntus nws yuav hloov kho raws li lub sijhawm.
DCF77: Lub sijhawm teeb liab ua haujlwm li cas?

Cia peb xyuas seb nws ua haujlwm li cas thiab sau tus decoder hauv Python.

Muaj ntau lub sijhawm synchronization tshuab. Qhov nrov tshaj plaws hauv Tebchaws Europe yog German system DCF-77, Nyiv muaj nws tus kheej system JJY, nyob USA muaj ib qhov system WWB, thiab lwm yam. Tom ntej no, zaj dab neeg yuav hais txog DCF77, raws li qhov tseem ceeb tshaj plaws thiab siv tau rau kev txais tos hauv qee qhov chaw nyob sab Europe ntawm Russia thiab cov tebchaws nyob sib ze (cov neeg nyob hauv Far East tej zaum yuav muaj kev xav tsis zoo, txawm li cas los xij, lawv tuaj yeem tau txais. thiab txheeb xyuas cov teeb liab Japanese;).

Txhua yam sau hauv qab no yuav hais txog DCF77.

Teeb liab txais

DCF77 yog qhov chaw nres tsheb ntev nthwv dej ua haujlwm ntawm qhov zaus ntawm 77.5 kHz thiab xa cov teeb liab hauv amplitude modulation. Qhov chaw nres tsheb 50KW nyob ntawm 25 km ntawm Frankfurt, nws pib ua haujlwm hauv xyoo 1959, thiab xyoo 1973 cov ntaub ntawv tau muab ntxiv rau lub sijhawm. Lub wavelength ntawm ib zaus ntawm 77 KHz yog ntev heev, yog li qhov ntev ntawm lub kav hlau txais xov teb kuj zoo heev (duab los ntawm Wikipedia):
DCF77: Lub sijhawm teeb liab ua haujlwm li cas?

Nrog xws li ib tug kav hlau txais xov thiab lub hwj chim input, lub txais tos cheeb tsam npog yuav luag tag nrho cov teb chaws Europe, Belarus, Ukraine thiab ib feem ntawm Russia.

DCF77: Lub sijhawm teeb liab ua haujlwm li cas?

Leej twg tuaj yeem kaw lub teeb liab. Txhawm rau ua qhov no, tsuas yog mus rau tus txais online http://websdr.ewi.utwente.nl:8901/, xaiv qhov zaus 76.5KHz thiab USB hloov kho muaj. Ib daim duab yuav tsum qhib uas zoo li no:

DCF77: Lub sijhawm teeb liab ua haujlwm li cas?

Nyob ntawd peb nias lub download khawm thiab sau ib feem ob peb feeb ntev. Tau kawg, yog tias koj muaj "tiag tiag" receiver muaj peev xwm sau tau 77.5KHz zaus, koj tuaj yeem siv qhov ntawd.

Tau kawg, los ntawm kev tau txais xov tooj cua lub sijhawm teeb liab ntawm Is Taws Nem, peb yuav tsis tau txais lub sijhawm tiag tiag - lub teeb liab kis tau nrog kev ncua. Tab sis peb lub hom phiaj tsuas yog kom nkag siab txog cov qauv ntawm lub teeb liab; rau qhov no, kev kaw hauv Internet yog ntau tshaj li txaus. Hauv lub neej tiag tiag, tau kawg, cov cuab yeej tshwj xeeb yog siv rau kev txais thiab kev txiav txim siab; lawv yuav tau tham hauv qab no.

Yog li, peb tau txais cov ntaubntawv povthawj siv, cia peb pib ua nws.

Teeb liab decoding

Cia peb thauj cov ntaub ntawv siv Python thiab saib nws cov qauv:

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

Peb pom amplitude modulation:
DCF77: Lub sijhawm teeb liab ua haujlwm li cas?

Txhawm rau kom yooj yim txiav txim siab, cia peb nqa lub hnab ntawv teeb liab siv Hilbert hloov pauv:

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

Cov txiaj ntsig loj:
DCF77: Lub sijhawm teeb liab ua haujlwm li cas?

Cia peb ua kom cov suab nrov emissions siv lub lim dej qis, thiab tib lub sijhawm suav cov nqi nruab nrab, uas yuav muaj txiaj ntsig tom qab rau kev txheeb xyuas.

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

Qhov tshwm sim (kab daj): yuav luag square yoj teeb liab uas yooj yim heev rau kev txheeb xyuas.
DCF77: Lub sijhawm teeb liab ua haujlwm li cas?

Parsing

Ua ntej koj yuav tsum tau txais qhov me ntsis ib ntus. Lub teeb liab qauv nws tus kheej yog yooj yim heev.
DCF77: Lub sijhawm teeb liab ua haujlwm li cas?

Cov pulses muab faib ua ob ntu. Yog hais tias qhov kev ncua deb ntawm pulses yog 0.1s (piv txwv li qhov ntev ntawm lub mem tes nws tus kheej yog 0.9s), ntxiv "0" rau qhov sib lawv liag me ntsis; yog tias qhov kev ncua deb yog 0.2s (piv txwv li qhov ntev yog 0.8s), ntxiv "1". Qhov kawg ntawm txhua feeb yog qhia los ntawm "ntev" mem tes, 2s ntev, qhov me ntsis ib ntus rov pib dua xoom, thiab rov pib dua.

Cov saum toj no yooj yim sau hauv 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

Yog li ntawd, peb tau txais ib ntu ntawm cov khoom, hauv peb qhov piv txwv rau ob vib nas this nws zoo li no:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Los ntawm txoj kev, nws yog qhov nthuav tias lub teeb liab kuj muaj "thib ob" ntawm cov ntaub ntawv. Lub ntsis ib theem kuj yog encoded siv theem modulation. Hauv txoj kev xav, qhov no yuav tsum muab kev txiav txim siab zoo dua txawm tias muaj teeb meem tsis muaj zog.

Peb cov kauj ruam kawg: tau txais cov ntaub ntawv tiag tiag. Cov khoom raug xa mus ib zaug hauv ib ob, yog li peb muaj tag nrho ntawm 59 cov khoom, uas muaj ntau cov ntaub ntawv tau nkag mus:
DCF77: Lub sijhawm teeb liab ua haujlwm li cas?

Cov khoom tau piav qhia hauv Wikipedia, thiab lawv kuj xav paub heev. Thawj 15 cov khoom siv tsis siv, txawm hais tias muaj kev npaj siv lawv rau kev ceeb toom thiab kev tiv thaiv pej xeem. Bit A1 qhia tias lub moos yuav hloov mus rau hnub ci txuag lub sijhawm nyob rau ib teev tom ntej. Bit A2 qhia tias ib qho ntxiv dhia thib ob, uas yog qee zaum siv los kho lub sijhawm raws li lub ntiaj teb kev sib hloov. Cov khoom seem encode teev, feeb, vib nas this thiab hnub tim.

DCF77: Lub sijhawm teeb liab ua haujlwm li cas?

Rau cov neeg uas xav sim ntawm lawv tus kheej, tus lej txiav txim siab tau muab rau hauv qab tus spoiler.
Qhov chaws code

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)

Thaum peb khiav qhov program, peb yuav pom cov zis zoo ib yam li qhov no:

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

Qhov tseeb, qhov ntawd yog txhua yam khawv koob. Qhov zoo ntawm xws li ib qho system yog tias kev txiav txim siab yog qhov yooj yim heev thiab tuaj yeem ua tiav ntawm ib qho, txawm tias qhov yooj yim tshaj plaws microcontroller. Peb tsuas suav qhov ntev ntawm cov pulses, sau 60 khoom, thiab thaum kawg ntawm txhua feeb peb tau txais lub sijhawm. Piv nrog rau lwm txoj hauv kev synchronization ntawm lub sijhawm (GPS, piv txwv li, lossis Vajtswv txwv, Is Taws Nem:), xws li xov tooj cua synchronization yuav tsum tsis muaj hluav taws xob - piv txwv li, lub chaw nres tsheb huab cua hauv tsev ua haujlwm li ib xyoos ntawm 2 AA roj teeb. Yog li ntawd, txawm lub wristwatches yog tsim nrog xov tooj cua synchronization, tsis hais, ntawm chav kawm, phab ntsa watches los yog txoj kev chaw nres tsheb watches.

Qhov yooj yim thiab yooj yim ntawm DCF kuj nyiam DIY enthusiasts. Tsuas yog $ 10-20 koj tuaj yeem yuav ib lub kav hlau txais xov npaj tau nrog lub txais tos thiab TTL tso tawm, uas tuaj yeem txuas nrog Arduino lossis lwm yam khoom siv.
DCF77: Lub sijhawm teeb liab ua haujlwm li cas?

Twb tau sau rau Arduino cov tsev qiv ntawv npaj txhij. Txawm li cas los xij, nws twb paub lawm tias txawm koj ua dab tsi ntawm lub microcontroller, koj yuav xaus nrog lub moos lossis chaw nres tsheb huab cua. Nrog rau cov cuab yeej zoo li no, tau txais lub sijhawm tiag tiag yog qhov yooj yim heev, muab, tau kawg, tias koj nyob hauv thaj chaw txais tos. Zoo, koj tuaj yeem dai cov ntawv sau "Atomic Clock" ntawm koj lub moos, thiab tib lub sijhawm piav qhia rau txhua tus neeg tias lub cuab yeej yeej synchronized siv lub moos atomic.

Cov neeg uas xav tuaj yeem hloov kho lawv cov pog laus saib los ntawm kev txhim kho lub tshuab tshiab nrog xov tooj cua synchronization:

DCF77: Lub sijhawm teeb liab ua haujlwm li cas?

Koj tuaj yeem nrhiav tau ib qho ntawm ebay siv cov lus tseem ceeb "Xov tooj cua tswj kev txav".

Thiab thaum kawg, lub neej hack rau cov neeg uas tau nyeem tam sim no. Txawm hais tias tsis muaj ib lub xov tooj cua xa xov tooj cua hauv ob peb txhiab km tom ntej, nws tsis yooj yim los tsim cov teeb liab li no rau koj tus kheej. Muaj ib qho kev pab cuam hauv Google Play hu ua "DCF77 Emulator" uas tso tawm cov teeb liab rau lub mloog pob ntseg. Raws li tus kws sau ntawv, yog tias koj qhwv lub xov tooj ntawm lub mloog pob ntseg nyob ib ncig ntawm lub moos, lawv yuav khaws lub teeb liab (nws yog qhov nthuav, vim hais tias lub mloog pob ntseg zoo tib yam yuav tsis tsim lub teeb liab 77KHz, tab sis kev txais tos yog tej zaum vim kev sib haum xeeb). Hauv Android 9, qhov kev zov me nyuam tsis ua haujlwm rau kuv - tsis muaj suab nrov (lossis tej zaum kuv tsis hnov ​​nws - nws yog 77KHz, tom qab tag nrho:), tab sis tej zaum ib tug neeg yuav muaj hmoo zoo. Qee qhov, txawm li cas los xij, ua rau lawv tus kheej ua tiav DCF teeb liab lub tshuab hluav taws xob, uas yooj yim ua rau tib Arduino lossis ESP32:

DCF77: Lub sijhawm teeb liab ua haujlwm li cas?
(qhov chaw sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

xaus

Lub DCF system tau ua kom yooj yim heev thiab yooj yim. Nrog kev pab los ntawm ib tug yooj yim thiab pheej yig receiver, koj muaj peev xwm muaj lub caij nyoog lub sij hawm ib txwm thiab nyob txhua qhov chaw, ntawm chav kawm nyob rau hauv lub txais tos. Nws zoo nkaus li tias txawm hais tias muaj ntau qhov digitalization thiab Internet ntawm Yam, cov kev daws teeb meem yooj yim no yuav xav tau ntev.

Tau qhov twg los: www.hab.com

Ntxiv ib saib