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.
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
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):
Uban sa ingon nga antenna ug power input, ang reception area naglangkob sa halos tibuok Europe, Belarus, Ukraine ug bahin sa Russia.
Bisan kinsa makarekord og signal. Aron mahimo kini, adto lang sa online receiver
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:
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:
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.
Pag-parse
Una kinahanglan nimo nga makuha ang gamay nga pagkasunod-sunod. Ang istruktura sa signal mismo yano kaayo.
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
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:
Ang mga bit gihulagway sa
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.
Gisulat na alang sa Arduino
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:
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:
(gigikanan
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