Hello Habr.
Wataƙila da yawa waɗanda suka sayi agogo ko tashar yanayi sun ga agogon Sarrafa Radiyo ko ma tambarin Atomic Clock akan marufi. Wannan ya dace sosai, saboda kawai kuna buƙatar sanya agogo a kan tebur, kuma bayan ɗan lokaci zai daidaita ta atomatik zuwa daidai lokacin.
Bari mu gano yadda yake aiki kuma mu rubuta decoder a Python.
Akwai tsarin daidaita lokaci daban-daban. Mafi shahara a Turai shine tsarin Jamus
Duk abin da aka rubuta a ƙasa zai kasance game da DCF77.
liyafar sigina
DCF77 tashar igiyar ruwa ce mai tsayi da ke aiki akan mitar 77.5 kHz kuma tana watsa sigina a cikin haɓakar girma. Tashar 50KW tana da nisan kilomita 25 daga Frankfurt, ta fara aiki a 1959, kuma a cikin 1973 an ƙara bayanin kwanan wata zuwa daidai lokacin. Tsawon zangon mita 77 kHz yana da tsayi sosai, don haka girman filin eriya shima yana da kyau sosai (hoto daga Wikipedia):
Tare da irin wannan eriya da shigar da wutar lantarki, yankin liyafar ya shafi kusan dukkanin Turai, Belarus, Ukraine da wani ɓangare na Rasha.
Kowa na iya yin rikodin sigina. Don yin wannan, kawai je zuwa mai karɓar kan layi
Anan muna danna maɓallin zazzagewa kuma muna yin rikodin guntu tsawon mintuna da yawa. Tabbas, idan kuna da mai karɓar "ainihin" mai iya yin rikodin mitar 77.5KHz, zaku iya amfani da hakan.
Tabbas, ta hanyar karɓar siginar lokacin rediyo ta Intanet, ba za mu sami ingantaccen lokacin gaske ba - ana watsa siginar tare da jinkiri. Amma burin mu shine kawai fahimtar tsarin siginar; saboda wannan, rikodin Intanet ya fi isa. A cikin rayuwa ta gaske, ba shakka, ana amfani da na'urori na musamman don karɓa da yanke hukunci; za a tattauna su a ƙasa.
Don haka, mun sami rikodin, bari mu fara sarrafa shi.
Ƙididdigar siginar
Bari mu loda fayil ɗin ta amfani da Python mu ga tsarinsa:
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()
Muna ganin nau'in haɓakawa na al'ada:
Don sauƙaƙe ƙaddamarwa, bari mu ɗauki ambulaf ɗin siginar ta amfani da canjin Hilbert:
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
Sakamakon girma:
Bari mu daidaita hayaniya ta amfani da matattara mai ƙarancin wucewa, kuma a lokaci guda ƙididdige matsakaicin ƙimar, wanda zai zama da amfani daga baya don tantancewa.
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
Sakamako (layin rawaya): sigina kusan murabba'i wanda yake da sauƙin tantancewa.
Yin nazari
Da farko kuna buƙatar samun bitar bitar. Tsarin siginar kanta abu ne mai sauqi qwarai.
An raba bugun jini zuwa tazara na biyu. Idan nisa tsakanin bugun jini shine 0.1s (watau tsayin bugun kanta shine 0.9s), ƙara "0" zuwa jerin bitar; idan nisa shine 0.2s (watau tsawon shine 0.8s), ƙara "1". Ƙarshen kowane minti ana nuna shi da bugun bugun "dogon" mai tsayi, tsayin 2s, an sake saita bitar bitar zuwa sifili, kuma ciko zai sake farawa.
Abin da ke sama yana da sauƙin rubutawa cikin 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
A sakamakon haka, muna samun jerin raƙuman ruwa, a cikin misalinmu na daƙiƙa biyu yana kama da haka:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
Af, yana da ban sha'awa cewa siginar kuma yana da "launi na biyu" na bayanai. Hakanan ana shigar da tsarin bitar ta amfani da shi
Matakinmu na ƙarshe: samun ainihin bayanai. Ana watsa bits sau ɗaya a cikin daƙiƙa guda, don haka muna da jimillar 59 ragowa, waɗanda ke da cikakkun bayanai masu yawa:
An bayyana ragowa a ciki
Ga waɗanda suke son yin gwaji da kansu, ana ba da lambar yanke hukunci a ƙarƙashin mai ɓarna.
Source
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)
Lokacin da muke gudanar da shirin, za mu ga fitarwa kamar haka:
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
A gaskiya, wannan shine duk sihirin. Amfanin irin wannan tsarin shine ƙaddamarwa yana da sauƙi sosai kuma ana iya yin shi akan kowane, har ma da mafi sauƙin microcontroller. Muna kawai ƙidaya tsayin bugun jini, tara rago 60, kuma a ƙarshen kowane minti muna samun ainihin lokacin. Idan aka kwatanta da sauran hanyoyin daidaita lokaci (GPS, misali, ko Allah ya kiyaye, Intanet:), irin wannan aiki tare na rediyo yana buƙatar kusan babu wutar lantarki - misali tashar yanayi ta gida ta yau da kullun tana aiki kusan shekara guda akan batir 2 AA. Saboda haka, ko da agogon hannu ana yin su tare da daidaitawa ta rediyo, ba ma maganar, ba shakka, agogon bango ko agogon tashar titi.
A saukakawa da sauƙi na DCF kuma suna jan hankalin masu sha'awar DIY. Don kawai $10-20 za ku iya siyan tsarin eriya da aka yi da shirye-shiryen mai karɓa da fitarwar TTL, wanda za'a iya haɗa shi da Arduino ko wani mai sarrafawa.
An riga an rubuta don Arduino
Wadanda suke so suna iya haɓaka agogon tsohuwar kakarsu ta hanyar shigar da sabon tsari tare da aiki tare na rediyo:
Kuna iya samun ɗaya akan ebay ta amfani da maɓallan "Radio Controlled Movement".
Kuma a ƙarshe, hack na rayuwa ga waɗanda suka karanta wannan zuwa yanzu. Ko da babu mai watsa siginar rediyo guda ɗaya a cikin dubu biyun kilomita masu zuwa, ba shi da wahala a samar da irin wannan siginar da kanku. Akwai wani shiri a Google Play mai suna "DCF77 Emulator" wanda ke fitar da siginar zuwa belun kunne. A cewar marubucin, idan kun nannade wayar belun kunne a kusa da agogon, za su karɓi siginar (yana da ban sha'awa yadda, saboda belun kunne na yau da kullun ba zai haifar da siginar 77KHz ba, amma liyafar mai yiwuwa ne saboda jituwa). A kan Android 9, shirin bai yi aiki da ni ba - babu sauti kawai (ko watakila ban ji shi ba - 77KHz ne, bayan haka:), amma watakila wani zai sami sa'a mafi kyau. Wasu, duk da haka, suna yin wa kansu cikakken janareta na siginar DCF, wanda ke da sauƙin yin akan Arduino ko ESP32 iri ɗaya:
(tushe
ƙarshe
Tsarin DCF ya juya ya zama da gaske mai sauƙi da dacewa. Tare da taimakon mai karɓa mai sauƙi da arha, zaku iya samun ainihin lokacin koyaushe kuma a ko'ina, ba shakka a cikin wurin liyafar. Da alama cewa ko da duk da tartsatsi na dijital da Intanet na Abubuwa, irin waɗannan mafita masu sauƙi za su kasance cikin buƙata na dogon lokaci.
source: www.habr.com