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ụ.
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
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):
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.
Onye ọ bụla nwere ike ịdekọ mgbama. Iji mee nke a, naanị gaa na onye nnata ịntanetị
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:
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:
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.
Ntụle
Mbụ ị ga-enweta usoro nke bit. Ọdịdị mgbaàmà n'onwe ya dị nnọọ mfe.
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
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:
A na-akọwa ibe n'ime
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ọ.
Ederelarị maka Arduino
Ndị na-achọrọ nwere ike kwalite elekere nne nne ochie ha site na ịwụnye usoro ọhụrụ na mmekọrịta redio:
Ị 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:
(isi mmalite
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