DCF77: Ciamar a tha an siostam comharran ùine ag obair?

Halo Habr.

Is dòcha gu bheil mòran a cheannaicheas uaireadair no stèisean sìde air an suaicheantas Cloc Smachd Rèidio no eadhon Cloc Atamach fhaicinn air a’ phacaid. Tha seo gu math goireasach, oir feumaidh tu dìreach an gleoc a chuir air a’ bhòrd, agus an ceann greis atharraichidh e gu fèin-ghluasadach chun dearbh àm.
DCF77: Ciamar a tha an siostam comharran ùine ag obair?

Feuch an obraich sinn a-mach mar a tha e ag obair agus sgrìobh decoder ann am Python.

Tha diofar shiostaman sioncronaidh ùine ann. Is e siostam na Gearmailt am fear as mòr-chòrdte san Roinn Eòrpa DCF-77, Tha a siostam fhèin aig Iapan JJY, anns na SA tha siostam ann WWVB, Agus mar sin air adhart. An ath rud, bidh an sgeulachd mu DCF77, mar an fheadhainn as buntainniche agus ruigsinneach airson fàilteachadh ann an cuid de dh'àiteachan ann am pàirt Eòrpach na Ruis agus na dùthchannan a tha faisg air làimh (is dòcha gum bi a 'bheachd eile aig luchd-còmhnaidh an Ear Chèin, ge-tà, is urrainn dhaibh, an uair sin, faighinn agus dèan mion-sgrùdadh air comharra Iapanach;).

Bidh a h-uile dad a tha sgrìobhte gu h-ìosal mu dheidhinn an DCF77.

Fàilteachadh chomharran

Tha DCF77 na stèisean tonn fada ag obair aig tricead 77.5 kHz agus a’ tar-chuir comharran ann am modaladh leudachaidh. Tha an stèisean 50KW suidhichte 25 km bho Frankfurt, thòisich e ag obair ann an 1959, agus ann an 1973 chaidh fiosrachadh a chuir ris an dearbh àm. Tha an tonn-tonn aig tricead 77 KHz glè fhada, agus mar sin tha tomhasan an raon antenna cuideachd gu math reusanta (dealbh bho Wikipedia):
DCF77: Ciamar a tha an siostam comharran ùine ag obair?

Le leithid de antenna agus cumhachd a-steach, tha an ionad fàilte a 'còmhdach cha mhòr a h-uile Roinn Eòrpa, Belarus, an Úcráin agus pàirt den Ruis.

DCF77: Ciamar a tha an siostam comharran ùine ag obair?

Faodaidh duine sam bith comharra a chlàradh. Gus seo a dhèanamh, dìreach a dhol chun a 'ghlacadair air-loidhne http://websdr.ewi.utwente.nl:8901/, tagh an tricead 76.5KHz agus modaladh USB an sin. Bu chòir ìomhaigh coltach ri seo fhosgladh:

DCF77: Ciamar a tha an siostam comharran ùine ag obair?

An sin brùth sinn am putan luchdaich sìos agus clàraich sinn criomag grunn mhionaidean a dh’ fhaid. Gu dearbh, ma tha “fìor ghlacadair” agad a tha comasach air tricead 77.5KHz a chlàradh, faodaidh tu sin a chleachdadh.

Gu dearbh, le bhith a 'faighinn comharran ùine rèidio tron ​​​​eadar-lìon, chan fhaigh sinn ùine fìor cheart - tha an comharra air a ghluasad le dàil. Ach is e ar n-amas dìreach structar a’ chomharra a thuigsinn; airson seo, tha clàradh eadar-lìn nas motha na gu leòr. Ann am fìor bheatha, gu dearbh, thathas a’ cleachdadh innealan sònraichte airson faighinn agus dì-chòdachadh; thèid beachdachadh orra gu h-ìosal.

Mar sin, tha sinn air an clàradh fhaighinn, tòisichidh sinn ga ghiullachd.

Còdachadh chomharran

Nach luchdaich sinn am faidhle a’ cleachdadh Python agus chì sinn an structar aige:

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

Chì sinn atharrachadh àbhaisteach amplitude:
DCF77: Ciamar a tha an siostam comharran ùine ag obair?

Gus dì-chòdachadh a dhèanamh nas sìmplidhe, gabhamaid a’ chèis chomharran a’ cleachdadh cruth-atharrachadh Hilbert:

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

Toradh nas motha:
DCF77: Ciamar a tha an siostam comharran ùine ag obair?

Feuch an cuir sinn a-mach sgaoilidhean fuaim le bhith a ’cleachdadh sìoltachan pas ìosal, agus aig an aon àm obraich a-mach an luach cuibheasach, a bhios feumail airson parsadh nas fhaide air adhart.

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

Toradh (loidhne buidhe): comharra tonn cha mhòr ceàrnagach a tha gu math furasta a sgrùdadh.
DCF77: Ciamar a tha an siostam comharran ùine ag obair?

A' parsadh

An toiseach feumaidh tu an sreath bit fhaighinn. Tha structar nan comharran fhèin gu math sìmplidh.
DCF77: Ciamar a tha an siostam comharran ùine ag obair?

Tha na buillean air an roinn ann an dàrna amannan. Ma tha an astar eadar buillean 0.1s (ie fad a’ chuisle fhèin 0.9s), cuir “0” ris an t-sreath bit; ma tha an t-astar 0.2s (i.e. tha an fhaid 0.8s), cuir “1” ris. Tha deireadh gach mionaid air a chomharrachadh le buillean “fada”, 2s a dh’ fhaid, tha an sreath bit air ath-shuidheachadh gu neoni, agus tha an lìonadh a’ tòiseachadh a-rithist.

Tha na tha gu h-àrd furasta a sgrìobhadh ann am 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

Mar thoradh air an sin, gheibh sinn sreath de phìosan, anns an eisimpleir againn airson dà dhiog tha e a’ coimhead mar seo:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Co-dhiù, tha e inntinneach gu bheil “dàrna sreath” de dhàta aig a’ chomharra cuideachd. Tha an sreath bit cuideachd air a chòdachadh le bhith a’ cleachdadh modaladh ìre. Ann an teòiridh, bu chòir dha seo dì-chòdachadh nas làidire a thoirt seachad eadhon ged a tha comharra lag.

An ceum mu dheireadh againn: faighinn an fhìor dàta. Bithear a’ tar-chuir pìosan aon uair san diog, agus mar sin tha 59 pìosan againn uile gu lèir, anns a bheil tòrr fiosrachaidh air a chòdachadh:
DCF77: Ciamar a tha an siostam comharran ùine ag obair?

Tha na pìosan air am mìneachadh ann an Uicipeid, agus tha iad gu math fiosrach. Chan eil a' chiad 15 pìosan gan cleachdadh, ged a bha planaichean ann airson an cleachdadh airson siostaman rabhaidh agus dìon catharra. Tha Bit A1 a’ comharrachadh gun atharraich an gleoc gu àm sàbhalaidh solas an latha anns an ath uair a thìde. Tha pìos A2 a’ nochdadh gu bheil fear a bharrachd ann leum an dàrna, a tha uaireannan air a chleachdadh gus ùine atharrachadh a rèir cuairteachadh na Talmhainn. Bidh na pìosan a tha air fhàgail a’ còdachadh uairean, mionaidean, diogan agus ceann-latha.

DCF77: Ciamar a tha an siostam comharran ùine ag obair?

Dhaibhsan a tha airson feuchainn leotha fhèin, tha an còd dì-chòdaidh air a thoirt seachad fon spoiler.
Còd tùs

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)

Nuair a ruitheas sinn am prògram, chì sinn toradh coltach ri seo:

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

Gu fìrinneach, is e sin an draoidheachd gu lèir. Is e a’ bhuannachd a tha ann an leithid de shiostam gu bheil dì-chòdachadh gu math sìmplidh agus faodar a dhèanamh air gin, eadhon am microcontroller as sìmplidh. Bidh sinn dìreach a’ cunntadh fad nam buillean, cruinnichidh sinn 60 pìosan, agus aig deireadh gach mionaid gheibh sinn an dearbh àm. Ann an coimeas ri dòighean eile synchronization ùine (GPS, mar eisimpleir, no Dia toirmisgte, an eadar-lìon :), a leithid rèidio synchronization feum cha mhòr gun dealan - mar eisimpleir, cunbhalach stèisean sìde dachaigh a 'ruith airson timcheall air bliadhna air 2 AA bataraidhean. Mar sin, bidh eadhon uaireadairean wrist air an dèanamh le sioncronadh rèidio, gun luaidh air, gu dearbh, uaireadairean balla no uaireadairean stèisean sràide.

Bidh goireasachd agus sìmplidheachd DCF cuideachd a’ tàladh luchd-dealasach DIY. Airson dìreach $ 10-20 faodaidh tu modal antenna deiseil a cheannach le cuidhteas deiseil agus toradh TTL, a dh’ fhaodar a cheangal ri Arduino no rianadair eile.
DCF77: Ciamar a tha an siostam comharran ùine ag obair?

Sgrìobhte mu thràth airson Arduino leabharlannan deiseil. Ach, tha fios mu thràth, ge bith dè a nì thu air microcontroller, gum bi an dàrna cuid cloc no stèisean sìde agad. Le inneal mar seo, tha e gu math furasta an dearbh ùine fhaighinn, fhad ‘s a tha, gu dearbh, gu bheil thu san ionad-fàilte. Uill, faodaidh tu an sgrìobhadh “Atomic Clock” a chrochadh air an uaireadair agad, agus aig an aon àm mìneachadh don h-uile duine gu bheil an inneal dha-rìribh air a shioncronadh le bhith a ’cleachdadh gleoc atamach.

Faodaidh an fheadhainn a tha ag iarraidh eadhon uaireadair an t-seann seanmhair ùrachadh le bhith a’ stàladh uidheamachd ùr le sioncronadh rèidio:

DCF77: Ciamar a tha an siostam comharran ùine ag obair?

Gheibh thu fear air ebay a’ cleachdadh na prìomh fhaclan “Radio Controlled Movement”.

Agus mu dheireadh, hack beatha dhaibhsan a tha air leughadh gu ruige seo. Fiù mura h-eil aon inneal-sgaoilidh comharran rèidio anns an ath dhà mhìle km, chan eil e duilich a leithid de chomharran a ghineadh thu fhèin. Tha prògram air Google Play leis an t-ainm “DCF77 Emulator” a bheir a-mach an comharra gu fònaichean-cluaise. A rèir an ùghdair, ma phaisg thu uèir nam fònaichean-cluaise timcheall an uaireadair, togaidh iad an comharra (tha e inntinneach ciamar, leis nach toir fònaichean-cluaise àbhaisteach comharra 77KHz, ach is dòcha gu bheil fàilteachadh mar thoradh air harmonics). Air Android 9, cha do dh’ obraich am prògram dhòmhsa idir - dìreach cha robh fuaim ann (no is dòcha nach cuala mi e - is e 77KHz a th’ ann, às deidh a h-uile càil :), ach is dòcha gum bi fortan nas fheàrr aig cuideigin. Bidh cuid, ge-tà, gan dèanamh fhèin nan gineadair chomharran DCF làn-chuimseach, a tha furasta a dhèanamh air an aon Arduino no ESP32:

DCF77: Ciamar a tha an siostam comharran ùine ag obair?
(stòr sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

co-dhùnadh

Thionndaidh an siostam DCF a-mach gu bhith gu math sìmplidh agus goireasach. Le cuideachadh bho ghlacadair sìmplidh agus saor, faodaidh tu an dearbh ùine a bhith agad an-còmhnaidh agus anns a h-uile àite, gu dearbh anns an ionad fàilte. Tha e coltach, eadhon a dh’ aindeoin digiteachadh farsaing agus eadar-lìn nan rudan, gum bi feum air fuasglaidhean sìmplidh mar sin airson ùine mhòr.

Source: www.habr.com

Cuir beachd ann