Mhoro Habr.
Pamwe vazhinji vanotenga wachi kana chiteshi chemamiriro ekunze vaona Radio Controlled Clock kana kunyange Atomic Clock logo pakurongedzerwa. Izvi zvakanyanya nyore, nekuti iwe unongoda kuisa wachi patafura, uye mushure mechinguva inozozvigadzirisa kune chaiyo nguva.
Ngationei kuti inoshanda sei uye tinyore decoder muPython.
Kune akasiyana masisitimu ekuyananisa nguva. Iyo inonyanya kufarirwa muEurope iGerman system
Zvese zvakanyorwa pazasi zvichange zviri nezve DCF77.
Signal reception
DCF77 inzvimbo refu yemafungu inoshanda pafrequency ye77.5 kHz uye inotumira masaini mune amplitude modulation. Chiteshi che50KW chiri makiromita makumi maviri neshanu kubva kuFrankfurt, chakatanga kushanda muna 25, uye muna 1959 ruzivo rwezuva rwakawedzerwa kune iyo nguva chaiyo. Iyo wavelength pafrequency ye 1973 KHz yakareba kwazvo, saka zviyero zvemunda weantenna zvakare zvakatsiga (mufananidzo kubva kuWikipedia):
Iine antenna yakadaro uye simba rekuisa, nzvimbo yekugamuchira inovhara inenge yese yeEurope, Belarus, Ukraine uye chikamu cheRussia.
Chero ani zvake anogona kunyora chiratidzo. Kuti uite izvi, ingoenda kune inogamuchira online
Ikoko tinodzvanya bhatani rekurodha uye tinorekodha chidimbu maminetsi akati wandei. Ehe, kana iwe uine "chaiyo" inogamuchira inokwanisa kurekodha iyo 77.5KHz frequency, unogona kuzvishandisa.
Ehe, nekugamuchira masaini eredhiyo nguva kuburikidza neInternet, isu hatigamuchire chaiyo chaiyo nguva - chiratidzo chinofambiswa nekunonoka. Asi chinangwa chedu ndechekunzwisisa chimiro chechiratidzo; nekuda kweizvi, kurekodha kweInternet kunopfuura zvakakwana. Muhupenyu chaihwo, hongu, maturusi ehunyanzvi anoshandiswa kugashira uye kudhirodha; ivo vanozokurukurwa pazasi.
Saka, tagamuchira kurekodhwa, ngatitangei kugadzirisa.
Signal Decoding
Ngatiisei faira tichishandisa Python uye tione chimiro chayo:
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()
Isu tinoona yakajairika amplitude modulation:
Kurerutsa decoding, ngatitorei hamvuropu yechiratidzo tichishandisa Hilbert shanduko:
analytic_signal = signal.hilbert(data)
A = np.abs(analytic_signal)
plt.plot(A[:100000])
Mubairo wakakurisa:
Ngatigadzirise kuburitsa kweruzha tichishandisa yakaderera-pass sefa, uye panguva imwe chete kuverenga kukosha kweavhareji, iyo inozobatsira gare gare pakurongedza.
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
Mhedzisiro (yero mutsara): chiratidzo chinenge square wave chiri nyore kuongorora.
Parsing
Kutanga iwe unofanirwa kuwana iyo bit sequence. Chimiro chechiratidzo pachacho chiri nyore kwazvo.
Mapurusi akakamurwa kuita nhanho dzechipiri. Kana chinhambwe chiri pakati pemapuruzi chiri 0.1s (kureva kuti kureba kwepombo pachayo kuri 0.9s), wedzera "0" kune kutevedzana kwebhiti; kana chinhambwe chiri 0.2s (kureva kureba kuri 0.8s), wedzera "1". Kupera kweminiti imwe neimwe kunoratidzwa ne "refu" pulse, 2s kureba, bit sequence inogadziriswazve kune zero, uye kuzadza kunotanga zvakare.
Izvo zviri pamusoro zviri nyore kunyora muPython.
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
Nekuda kweizvozvo, tinowana kutevedzana kwemabits, mumuenzaniso wedu kwemasekonzi maviri zvinoita seizvi:
0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000
Nenzira, zvinonakidza kuti chiratidzo chinewo "yechipiri layer" yedata. Iyo bit sequence inoiswawo encoded uchishandisa
Nhanho yedu yekupedzisira: kuwana iyo chaiyo data. Mabhiti anofambiswa kamwe pasekondi, saka isu tine huwandu hwe59 bits, umo ruzivo rwakawanda rwakaiswa encoded:
Mabhiti anotsanangurwa mukati
Kune avo vanoda kuedza ivo pachavo, iyo decoding code inopiwa pasi pemuparadzi.
Purogiramu yekupa
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)
Patinomhanyisa chirongwa, tinoona kubuda kwakafanana neiyi:
0011110110111000001011000001010000100110010101100010011000
Tuesday, 26.03.19, 21:41
0001111100110110001010100001010000100110010101100010011000
Tuesday, 26.03.19, 21:42
Chaizvoizvo, ndiwo ese mashiripiti. Chakanakira sisitimu yakadai ndechekuti decoding yakapusa uye inogona kuitwa pane chero, kunyangwe yakapusa microcontroller. Isu tinongoverenga kureba kwemapulses, kuunganidza 60 bits, uye pakupera kweminiti imwe neimwe tinowana nguva chaiyo. Kuenzaniswa nedzimwe nzira dzekubatanidza nguva (GPS, semuenzaniso, kana Mwari ngaasadaro, Indaneti :), kuwiriranisa kweredhiyo kwakadaro kunoda anenge asina magetsi - semuenzaniso, chiteshi chemamiriro ekunze pamba chinomhanya kwerinenge gore pamabhatiri maviri AA. Naizvozvo, kunyangwe mawachi emaoko anogadzirwa neredhiyo synchronization, tisingataure, hongu, mawachi emadziro kana mawachi echiteshi.
Iko kureruka uye kureruka kweDCF zvakare kunokwezva DIY vanofarira. Nemadhora gumi kusvika makumi maviri chete unogona kutenga antenna module ine yakagadzirira-yakagadzirwa inogamuchira uye TTL inobuda, inogona kubatana neArduino kana imwe controller.
Yakatonyorerwa Arduino
Avo vanoshuvira vanogona kunyange kukwidziridza wachi yavo yekare nekuisa michina mitsva ine radio synchronization:
Unogona kuwana imwe pa ebay uchishandisa mazwi akakosha "Radio Controlled Movement".
Uye pakupedzisira, hack yehupenyu kune avo vakaverenga kusvika zvino. Kunyangwe pasina kana redhiyo chiratidzo chedhidhiyo mune anotevera zviuru zvemakiromita, hazvina kuoma kugadzira chiratidzo chakadaro iwe pachako. Pane chirongwa paGoogle Play chinonzi "DCF77 Emulator" chinoburitsa chiratidzo kumahedhifoni. Sekureva kwemunyori, kana iwe ukaputira waya yehedhifoni pawachi, ivo vanotora chiratidzo (zvinonakidza sei, nekuti akajairwa mahedhifoni haaburitse chiratidzo che77KHz, asi kugamuchirwa kungangove kuri nekuda kweharmonics). Pa Android 9, chirongwa hachina kundiitira zvachose - pakanga pasina ruzha (kana kuti pamwe handina kuzvinzwa - 77KHz, mushure mezvose :), asi pamwe mumwe munhu angave nerombo rakanaka. Vamwe, zvisinei, vanozviita yakazara-yakazara DCF chiratidzo jenareta, iri nyore kugadzira pane imwechete Arduino kana ESP32:
(tsime
mhedziso
Iyo DCF sisitimu yakazove yakapusa uye nyore. Nerubatsiro rwemugamuchiri ari nyore uye akachipa, unogona kuva nenguva chaiyo nguva dzose uye kwese kwese, hongu munzvimbo yekugamuchira. Zvinoita sekunge kunyangwe kupararira kwedhijitari uye Internet yezvinhu, zvigadziriso zviri nyore zvakadaro zvichange zvichidikanwa kwenguva yakareba.
Source: www.habr.com