DCF77: kedu ka usoro akara oge si arụ ọrụ?

Ndewo Habr.

Ma eleghị anya, ọtụtụ ndị na-azụta elekere ma ọ bụ ọdụ ihu igwe ahụla elekere Redio Controlled Clock ma ọ bụ ọbụna akara elekere Atomic na nkwakọ ngwaahịa. Nke a dị ezigbo mma, n'ihi na naanị ị ga-etinye elekere na tebụl, ma mgbe obere oge gasịrị, ọ ga-agbanwe ozugbo na oge ahụ.
DCF77: kedu ka usoro akara oge si arụ ọrụ?

Ka anyị chepụta ka o si arụ ọrụ wee dee decoder na Python.

Enwere usoro mmekọrịta oge dị iche iche. Ihe kacha ewu ewu na Europe bụ usoro German DCF-77, Japan nwere usoro nke ya JJY, na USA enwere usoro WWVB, were gabazie. Na-esote, akụkọ ahụ ga-abụ banyere DCF77, dị ka ihe kachasị mkpa na ịnweta maka nnabata n'ebe ụfọdụ na mpaghara Europe nke Russia na mba ndị agbata obi (ndị bi n'Ebe Ọwụwa Anyanwụ Ụwa nwere ike inwe echiche dị iche, Otú ọ dị, ha, n'aka nke ya, nwere ike ịnata. ma nyochaa akara ngosi Japanese;).

Ihe niile edere n'okpuru ga-abụ maka DCF77.

nnabata mgbaàmà

DCF77 bụ ọdụ ụgbọ mmiri dị ogologo na-arụ ọrụ na ugboro nke 77.5 kHz ma na-ebufe akara na njupụta modulation. Ụlọ ọrụ 50KW dị kilomita 25 site na Frankfurt, ọ malitere ọrụ na 1959, na 1973 ozi ụbọchị agbakwunyere na oge. Ogologo ikuku na ugboro nke 77 kHz dị ogologo, yabụ akụkụ nke oghere antenna dịkwa mma (foto sitere na Wikipedia):
DCF77: kedu ka usoro akara oge si arụ ọrụ?

Site na antenna dị otú ahụ na ntinye ike, mpaghara nnabata na-ekpuchi ihe fọrọ nke nta ka ọ bụrụ Europe, Belarus, Ukraine na akụkụ nke Russia.

DCF77: kedu ka usoro akara oge si arụ ọrụ?

Onye ọ bụla nwere ike ịdekọ mgbama. Iji mee nke a, naanị gaa na onye nnata ịntanetị http://websdr.ewi.utwente.nl:8901/, họrọ ugboro 76.5KHz na USB modulation ebe ahụ. Oyiyi kwesịrị imepe nke yiri nke a:

DCF77: kedu ka usoro akara oge si arụ ọrụ?

N'ebe ahụ, anyị na-pịa bọtịnụ nbudata ma dekọọ iberibe ogologo nkeji ole na ole. N'ezie, ọ bụrụ na ị nwere "ezigbo" nnata nwere ike ịdekọ ugboro 77.5KHz, ị nwere ike iji nke ahụ.

N'ezie, site n'inweta akara oge redio site na ịntanetị, anyị agaghị enweta oge ziri ezi n'ezie - a na-ebufe mgbaàmà na igbu oge. Mana ihe mgbaru ọsọ anyị bụ naanị ịghọta usoro nke mgbaàmà ahụ; maka nke a, ndekọ ịntanetị karịrị nke ọma. Na ndụ n'ezie, n'ezie, a na-eji ngwaọrụ pụrụ iche maka ịnata na ngbanwe; a ga-atụle ha n'okpuru.

Yabụ, anyị enwetala ndekọ ahụ, ka anyị bido nhazi ya.

Nchọpụta akara ngosi

Ka anyị jiri Python buo faịlụ ahụ wee hụ usoro ya:

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

Anyị na-ahụ ụdị njupụta modulation:
DCF77: kedu ka usoro akara oge si arụ ọrụ?

Iji mee ka ngbanwe dị mfe, ka anyị were mgbanwe Hilbert were were envelopu mgbama:

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

Nsonaazụ gbasaara:
DCF77: kedu ka usoro akara oge si arụ ọrụ?

Ka anyị were nzacha dị ala mee ka mkpọtụ mkpọtụ dị nro, ma n'otu oge ahụ gbakọọ ọnụ ahịa nkezi, nke ga-aba uru ma emechaa maka nyocha.

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

Nsonaazụ (akara edo edo): mgbama ebili mmiri nke fọrọ nke nta ka ọ bụrụ square nke dị mfe nyocha.
DCF77: kedu ka usoro akara oge si arụ ọrụ?

Ntụle

Mbụ ị ga-enweta usoro nke bit. Ọdịdị mgbaàmà n'onwe ya dị nnọọ mfe.
DCF77: kedu ka usoro akara oge si arụ ọrụ?

A na-ekewa pulses na nkeji nke abụọ. Ọ bụrụ na anya n'etiti pulses bụ 0.1s (ya bụ ogologo nke usu n'onwe ya bụ 0.9s), tinye "0" na usoro nkebi; ọ bụrụ na anya dị 0.2s (ya bụ ogologo 0.8s), tinye "1". A na-egosipụta njedebe nke nkeji ọ bụla site na mkpịrị “ogologo” ogologo, ogologo 2s ogologo, usoro ntakịrị ka ewegharịrị na efu, na ndochi ga-amalite ọzọ.

Ihe dị n'elu dị mfe ide na 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

N'ihi ya, anyị na-enweta usoro nke ibe n'ibe, na ihe atụ anyị maka sekọnd abụọ ọ dị ka nke a:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Site n'ụzọ, ọ na-adọrọ mmasị na mgbaàmà ahụ nwekwara "okpukpu nke abụọ" nke data. A na-etinyekwa usoro nke bit ahụ site na iji usoro modulation. Na tiori, nke a kwesịrị inye nhọpụta nrụpụta siri ike karịa ọbụlagodi n'ihe mgbaàmà adịghị ike.

Nzọụkwụ ikpeazụ anyị: ịnweta data n'ezie. A na-ebufe bits otu ugboro kwa sekọnd, yabụ anyị nwere ngụkọta nke 59 ibe n'ibe, nke etinyere ọtụtụ ozi na ya:
DCF77: kedu ka usoro akara oge si arụ ọrụ?

A na-akọwa ibe n'ime Wikipedia, ma ha na-achọsi ike. A naghị eji ibe 15 nke mbụ eme ihe, n'agbanyeghị na e nwere atụmatụ iji ha maka usoro ịdọ aka ná ntị na nchekwa obodo. Bit A1 na-egosi na elekere ga-agbanwe na oge nchekwa ìhè ehihie na elekere ọzọ. Bit A2 na-egosi na mgbakwunye wuo nke abụọ, nke a na-eji oge ụfọdụ gbanwee oge dịka ntụgharị ụwa si dị. Iberibe ndị fọdụrụ na-etinye koodu awa, nkeji, sekọnd na ụbọchị.

DCF77: kedu ka usoro akara oge si arụ ọrụ?

Maka ndị chọrọ ịnwale onwe ha, a na-enye koodu ngbanwe n'okpuru onye na-emebi ihe.
Koodu e si nweta ya

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)

Mgbe anyị na-agba ọsọ mmemme, anyị ga-ahụ mmepụta yiri nke a:

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

N'ezie, nke ahụ bụ anwansi. Uru nke usoro dị otú ahụ bụ na ngbanwe dị oke mfe ma enwere ike ime ya na nke ọ bụla, ọbụlagodi obere microcontroller. Anyị na-agụta ogologo nke mkpụrụ osisi, na-agbakọta 60 ibe n'ibe, na njedebe nke nkeji ọ bụla anyị na-enweta oge. Tụnyere usoro ndị ọzọ nke oge mmekọrịta (GPS, dị ka ihe atụ, ma ọ bụ Chineke ekwe, Internet:), dị otú ahụ redio mmekọrịta na-achọ fọrọ nke nta ka ọ dịghị ọkụ eletrik - ọmụmaatụ, a mgbe n'ụlọ ihu igwe ọdụ na-agba ọsọ ihe dị ka otu afọ na 2 AA batrị. Ya mere, a na-eme ọbụna elekere mgbanaka site na mmekọrịta redio, ọ bụghị ịkọ, n'ezie, elekere mgbidi ma ọ bụ elekere n'okporo ámá.

Ọdịmma na ịdị mfe nke DCF na-adọtakwa ndị na-anụ ọkụ n'obi DIY. Maka naanị $10-20 ị nwere ike zụta modul antenna emebere nke nwere ihe nnata emebere na mmepụta TTL, nke enwere ike ijikọ na Arduino ma ọ bụ onye njikwa ọzọ.
DCF77: kedu ka usoro akara oge si arụ ọrụ?

Ederelarị maka Arduino ọba akwụkwọ ndị emebere. Otú ọ dị, a maraworị na n'agbanyeghị ihe ị na-eme na microcontroller, ị ga-ejedebe ma ọ bụ elekere ma ọ bụ ọdụ ihu igwe. Site na ngwaọrụ dị otú ahụ, ịnweta oge ahụ dị mfe n'ezie, ma ọ bụrụ na ị nọ na mpaghara nnabata. Ọfọn, ị nwere ike kpọgidere ihe e dere “Atomic Clock” na elekere gị, ma n'otu oge ahụ kọwaara onye ọ bụla na a na-emekọrịta ngwaọrụ ahụ n'ezie site na iji elekere atọm.

Ndị na-achọrọ nwere ike kwalite elekere nne nne ochie ha site na ịwụnye usoro ọhụrụ na mmekọrịta redio:

DCF77: kedu ka usoro akara oge si arụ ọrụ?

Ị nwere ike ịchọta otu na ebay site na iji mkpụrụokwu "Radio Controlled Movement".

Na n'ikpeazụ, a ndụ mbanye anataghị ikike ndị na-agụ nke a anya. Ọbụlagodi na enweghị otu mgbasa ozi redio n'ime puku kilomita abụọ na-esote, ọ naghị esiri gị ike iwepụta ụdị mgbama a n'onwe gị. Enwere mmemme na Google Play akpọrọ “DCF77 Emulator” nke na-ewepụta akara na ekweisi. Dị ka onye edemede si kwuo, ọ bụrụ na ị kechie waya nke ekweisi gburugburu elekere, ha ga-ebuli mgbaàmà (ọ bụ ihe na-adọrọ mmasị otú, n'ihi na ekweisi nkịtị agaghị emepụta akara 77KHz, mana nnabata nwere ike ịbụ n'ihi nkwekọrịta). Na gam akporo 9, mmemme ahụ arụghị m ọrụ ma ọlị - ọ nweghị ụda ọ bụla (ma ọ bụ ikekwe anụghị m ya - ọ bụ 77KHz, ka emechara :), mana ikekwe mmadụ ga-enwe chi ọma. Ụfọdụ, Otú ọ dị, na-eme onwe ha onye na-emepụta ihe mgbaàmà DCF zuru oke, nke dị mfe ime n'otu Arduino ma ọ bụ ESP32:

DCF77: kedu ka usoro akara oge si arụ ọrụ?
(isi mmalite sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

nkwubi

Sistemu DCF tụgharịrị bụrụ nke dị mfe ma dịkwa mma. Site n'enyemaka nke onye na-anata ihe dị mfe ma dị ọnụ ala, ị nwere ike ịnweta oge kpọmkwem mgbe niile na ebe niile, n'ezie na mpaghara nnabata. Ọ dị ka n'agbanyeghị na dijitalụ zuru ebe niile na ịntanetị nke ihe, ngwọta dị mfe dị otú ahụ ga-achọ ogologo oge.

isi: www.habr.com

Tinye a comment