DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?

Hello Habr.

Tingali daghan nga namalit og relo o weather station ang nakakita sa Radio Controlled Clock o bisan Atomic Clock nga logo sa packaging. Kini sayon ​​​​kaayo, tungod kay kinahanglan nimo nga ibutang ang orasan sa lamesa, ug pagkahuman sa usa ka panahon kini awtomatiko nga mag-adjust sa eksaktong oras.
DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?

Atong mahibal-an kung giunsa kini paglihok ug pagsulat usa ka decoder sa Python.

Adunay lainlaing mga sistema sa pag-synchronize sa oras. Ang labing popular sa Europe mao ang German nga sistema DCF-77, ang Japan adunay kaugalingong sistema JJY, sa USA naay sistema WWVB, ug uban pa. Sunod, ang istorya mahitungod sa DCF77, ingon nga ang labing may kalabutan ug accessible alang sa pagdawat sa pipila ka mga dapit sa European nga bahin sa Russia ug silingang mga nasud (mga residente sa Far East mahimong adunay kaatbang nga opinyon, bisan pa niana, sila, sa baylo, makadawat ug analisa ang Japanese signal;).

Ang tanan nga gisulat sa ubos mahitungod sa DCF77.

Pagdawat sa signal

Ang DCF77 usa ka taas nga istasyon sa balud nga naglihok sa frequency nga 77.5 kHz ug nagpadala mga signal sa amplitude modulation. Ang estasyon sa 50KW nahimutang 25 km gikan sa Frankfurt, nagsugod kini sa operasyon kaniadtong 1959, ug kaniadtong 1973 ang impormasyon sa petsa gidugang sa eksaktong oras. Ang wavelength sa frequency nga 77 KHz taas kaayo, busa ang mga sukod sa antenna field medyo disente usab (litrato gikan sa Wikipedia):
DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?

Uban sa ingon nga antenna ug power input, ang reception area naglangkob sa halos tibuok Europe, Belarus, Ukraine ug bahin sa Russia.

DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?

Bisan kinsa makarekord og signal. Aron mahimo kini, adto lang sa online receiver http://websdr.ewi.utwente.nl:8901/, pilia ang frequency 76.5KHz ug USB modulation didto. Kinahanglang magbukas ang usa ka imahen nga ingon niini:

DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?

Didto among gipugos ang buton sa pag-download ug girekord ang usa ka tipik pipila ka minuto ang gitas-on. Siyempre, kung ikaw adunay "tinuod" nga tigdawat nga makahimo sa pagrekord sa 77.5KHz frequency, mahimo nimong gamiton kana.

Siyempre, pinaagi sa pagdawat sa mga signal sa oras sa radyo pinaagi sa Internet, dili kami makadawat sa tinuud nga tukma nga oras - ang signal gipasa sa usa ka paglangan. Apan ang among katuyoan mao ra ang pagsabut sa istruktura sa signal; alang niini, ang pagrekord sa Internet labi pa sa igo. Sa tinuud nga kinabuhi, siyempre, gigamit ang mga espesyal nga aparato alang sa pagdawat ug pag-decode, hisgutan sa ubos.

Busa, nadawat na namo ang rekording, ato nang sugdan ang pagproseso niini.

Pag-decode sa Signal

Atong i-load ang file gamit ang Python ug tan-awa ang istruktura niini:

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

Nakita namon ang tipikal nga modulasyon sa amplitude:
DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?

Aron mapasayon ​​ang pag-decode, atong kuhaon ang signal envelope gamit ang Hilbert transform:

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

Gipadako nga resulta:
DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?

Atong pahapsay ang mga emisyon sa kasaba gamit ang usa ka low-pass nga filter, ug sa samang higayon kuwentahon ang kasagaran nga kantidad, nga magamit sa ulahi alang sa pag-parse.

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

Resulta (dilaw nga linya): usa ka hapit square wave signal nga dali ra analisahon.
DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?

Pag-parse

Una kinahanglan nimo nga makuha ang gamay nga pagkasunod-sunod. Ang istruktura sa signal mismo yano kaayo.
DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?

Ang mga pulso gibahin sa ikaduha nga mga agwat. Kung ang gilay-on tali sa mga pulso 0.1s (ie ang gitas-on sa pulso mismo 0.9s), idugang ang "0" sa gamay nga han-ay; kung ang distansya 0.2s (ie ang gitas-on mao ang 0.8s), idugang ang "1". Ang katapusan sa matag minuto gipakita sa usa ka "taas" nga pulso, 2s ang gitas-on, ang gamay nga han-ay gi-reset sa zero, ug ang pagpuno magsugod pag-usab.

Ang sa ibabaw dali nga isulat sa 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

Ingon usa ka sangputanan, nakakuha kami usa ka han-ay sa mga bit, sa among panig-ingnan sa duha ka segundo ingon kini:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Pinaagi sa dalan, kini makapaikag nga ang signal usab adunay "ikaduha nga layer" sa datos. Ang bit nga han-ay gi-encode usab gamit phase modulasyon. Sa teorya, kini kinahanglan nga maghatag labi ka lig-on nga pag-decode bisan sa kaso sa usa ka huyang nga signal.

Ang among katapusang lakang: pagkuha sa aktuwal nga datos. Ang mga bit gipasa kausa matag segundo, mao nga kita adunay kinatibuk-an nga 59 ka mga bit, diin daghang impormasyon ang na-encode:
DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?

Ang mga bit gihulagway sa Wikipedia, ug medyo kuryuso sila. Ang una nga 15 ka bit wala gigamit, bisan kung adunay mga plano nga gamiton kini alang sa mga sistema sa pasidaan ug sibil nga depensa. Ang bit A1 nagpakita nga ang orasan mausab sa daylight saving time sa sunod nga oras. Bit A2 nagpakita nga ang usa ka dugang lukso ikaduha, nga usahay gigamit sa pag-adjust sa oras sumala sa pagtuyok sa Yuta. Ang nahabilin nga mga piraso nag-encode sa mga oras, minuto, segundo ug petsa.

DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?

Alang niadtong gusto nga mag-eksperimento sa ilang kaugalingon, ang decoding code gihatag ubos sa spoiler.
Source 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)

Kung atong gipadagan ang programa, atong makita ang output nga susama niini:

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

Sa tinuud, kana ang tanan nga salamangka. Ang bentaha sa ingon nga sistema mao nga ang pag-decode labi ka yano ug mahimo sa bisan unsang, bisan ang pinakasimple nga microcontroller. Giihap lang namo ang gitas-on sa mga pulso, natigom ang 60 ka bits, ug sa kataposan sa matag minuto makuha namo ang eksaktong oras. Kung itandi sa ubang mga pamaagi sa pag-synchronize sa oras (GPS, pananglitan, o idili sa Diyos, ang Internet :)), ang ingon nga pag-synchronize sa radyo halos wala’y kinahanglan nga kuryente - pananglitan, ang usa ka regular nga istasyon sa panahon sa balay nagdagan mga usa ka tuig sa 2 ka baterya sa AA. Busa, bisan ang mga relo sa pulso gihimo uban sa pag-synchronize sa radyo, wala pay labot, siyempre, mga relo sa dingding o mga relo sa estasyon sa kadalanan.

Ang kasayon ​​​​ug kayano sa DCF nakadani usab sa mga mahiligon sa DIY. Para lang sa $10-20 makapalit ka ug ready-made antenna module nga adunay ready-made receiver ug TTL output, nga mahimong konektado sa Arduino o uban pang controller.
DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?

Gisulat na alang sa Arduino andam nga mga librarya. Bisan pa, nahibal-an na nga bisan unsa pa ang imong buhaton sa usa ka microcontroller, adunay usa ka orasan o usa ka istasyon sa panahon. Sa ingon nga aparato, ang pagkuha sa eksakto nga oras dali ra, nga gihatag, siyempre, nga naa ka sa lugar sa pagdawat. Aw, mahimo nimong ibitay ang inskripsiyon nga "Atomic Clock" sa imong relo, ug sa samang higayon ipasabut sa tanan nga ang aparato gi-synchronize gyud gamit ang atomic nga orasan.

Kadtong nangandoy mahimo pa gani nga mag-upgrade sa relo sa ilang tigulang nga lola pinaagi sa pag-instalar og bag-ong mekanismo nga adunay pag-synchronize sa radyo:

DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?

Makita nimo ang usa sa ebay gamit ang mga keyword nga "Radio Controlled Movement".

Ug sa katapusan, usa ka hack sa kinabuhi alang sa mga nakabasa hangtod karon. Bisan kung wala'y usa ka radio signal transmitter sa sunod nga duha ka libo nga km, dili lisud ang paghimo sa ingon nga signal sa imong kaugalingon. Adunay usa ka programa sa Google Play nga gitawag nga "DCF77 Emulator" nga nagpagawas sa signal sa mga headphone. Sumala sa tagsulat, kung imong ibalot ang wire sa mga headphone sa palibot sa relo, ilang kuhaon ang signal (kini makapainteres kung giunsa, tungod kay ang ordinaryong mga headphone dili makahimo og 77KHz signal, apan ang pagdawat lagmit tungod sa harmonics). Sa Android 9, ang programa wala gyud nagtrabaho alang kanako - wala’y tingog (o tingali wala nako kini madungog - kini 77KHz, pagkahuman sa tanan :)), apan tingali adunay usa nga adunay mas maayo nga swerte. Ang uban, bisan pa, naghimo sa ilang kaugalingon nga usa ka hingpit nga generator sa signal sa DCF, nga dali buhaton sa parehas nga Arduino o ESP32:

DCF77: Giunsa pagtrabaho ang sistema sa signal sa oras?
(gigikanan sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

konklusyon

Ang sistema sa DCF nahimo nga yano ug sayon. Sa tabang sa usa ka yano ug barato nga tigdawat, mahimo nimo ang eksaktong oras kanunay ug bisan diin, siyempre sa lugar sa pagdawat. Ingon og bisan pa sa kaylap nga digitalization ug sa Internet of Things, ang ingon nga yano nga mga solusyon kinahanglan nga pangayoon sa dugay nga panahon.

Source: www.habr.com

Idugang sa usa ka comment