DCF77: Kā darbojas laika signālu sistēma?

Sveiki, Habr.

DroÅ”i vien daudzi, kas iegādājas pulksteni vai meteoroloÄ£isko staciju, uz iepakojuma ir redzējuÅ”i radio vadāmo pulksteni vai pat atompulksteņa logotipu. Tas ir ļoti ērti, jo vienkārÅ”i jānoliek pulkstenis uz galda, un pēc kāda laika tas automātiski pielāgosies precÄ«zam laikam.
DCF77: Kā darbojas laika signālu sistēma?

Izdomāsim, kā tas darbojas, un uzrakstīsim dekodētāju programmā Python.

Ir dažādas laika sinhronizācijas sistēmas. Vispopulārākā Eiropā ir vācu sistēma DCF-77, Japānai ir sava sistēma JJY, ASV ir sistēma WWVB, un tā tālāk. Tālāk sižets bÅ«s par DCF77, kā aktuālāko un uzņemÅ”anai pieejamāko vietām Krievijas Eiropas daļā un kaimiņvalstÄ«s (Tālo Austrumu iedzÄ«votājiem var bÅ«t pretējs viedoklis, taču viņi, savukārt, var saņemt un analizēt japāņu signālu;).

Viss, kas rakstīts zemāk, būs par DCF77.

Signāla uztverŔana

DCF77 ir garo viļņu stacija, kas darbojas ar frekvenci 77.5 kHz un pārraida signālus amplitÅ«das modulācijā. 50KW stacija atrodas 25 km attālumā no Frankfurtes, tā sāka darboties 1959. gadā, un 1973. gadā datuma informācija tika pievienota precÄ«zam laikam. Viļņa garums 77 KHz frekvencē ir ļoti garÅ”, tāpēc arÄ« antenas lauka izmēri ir diezgan pieklājÄ«gi (foto no Wikipedia):
DCF77: Kā darbojas laika signālu sistēma?

Ar Ŕādu antenu un strāvas ievadi uztverŔanas zona aptver gandrīz visu Eiropu, Baltkrieviju, Ukrainu un daļu Krievijas.

DCF77: Kā darbojas laika signālu sistēma?

Ikviens var ierakstÄ«t signālu. Lai to izdarÄ«tu, vienkārÅ”i dodieties uz tieÅ”saistes uztvērēju http://websdr.ewi.utwente.nl:8901/, izvēlieties frekvenci 76.5KHz un tur USB modulāciju. Jāatveras attēlam, kas izskatās apmēram Ŕādi:

DCF77: Kā darbojas laika signālu sistēma?

Tur mēs nospiežam lejupielādes pogu un ierakstām vairākas minūtes garu fragmentu. Protams, ja jums ir "īsts" uztvērējs, kas spēj ierakstīt 77.5 kHz frekvenci, varat to izmantot.

Protams, saņemot radio laika signālus caur internetu, mēs nesaņemsim patiesi precÄ«zu laiku ā€“ signāls tiek pārraidÄ«ts ar kavÄ“Å”anos. Bet mÅ«su mērÄ·is ir tikai izprast signāla struktÅ«ru; Å”im nolÅ«kam ar interneta ierakstu ir vairāk nekā pietiekami. Reālajā dzÄ«vē, protams, saņemÅ”anai un dekodÄ“Å”anai tiek izmantotas specializētas ierÄ«ces, tās tiks apskatÄ«tas tālāk.

Tātad, esam saņēmuÅ”i ierakstu, sāksim tā apstrādi.

Signāla dekodÄ“Å”ana

Ielādēsim failu, izmantojot Python, un apskatīsim tā struktūru:

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

Mēs redzam tipisku amplitūdas modulāciju:
DCF77: Kā darbojas laika signālu sistēma?

Lai vienkārÅ”otu dekodÄ“Å”anu, ņemsim signāla aploksni, izmantojot Hilberta transformāciju:

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

Palielināts rezultāts:
DCF77: Kā darbojas laika signālu sistēma?

IzlÄ«dzināsim trokŔņu emisijas, izmantojot zemas caurlaidÄ«bas filtru, un tajā paŔā laikā aprēķināsim vidējo vērtÄ«bu, kas vēlāk noderēs parsÄ“Å”anai.

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

Rezultāts (dzeltena līnija): gandrīz kvadrātveida viļņu signāls, ko ir diezgan viegli analizēt.
DCF77: Kā darbojas laika signālu sistēma?

ParsēŔana

Vispirms jums jāiegūst bitu secība. Pati signāla struktūra ir ļoti vienkārŔa.
DCF77: Kā darbojas laika signālu sistēma?

Impulsi ir sadalÄ«ti otrajās intervālos. Ja attālums starp impulsiem ir 0.1 s (t.i., paÅ”a impulsa garums ir 0.9 s), pievienojiet bitu secÄ«bai ā€œ0ā€, ja attālums ir 0.2 s (t.i., garums ir 0.8 s), pievienojiet ā€œ1ā€. Katras minÅ«tes beigas tiek norādÄ«tas ar ā€œgaruā€ impulsu, 2 s garÅ”, bitu secÄ«ba tiek atiestatÄ«ta uz nulli, un aizpildÄ«Å”ana sākas no jauna.

IepriekÅ” minēto ir viegli uzrakstÄ«t 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

Rezultātā mēs iegÅ«stam bitu secÄ«bu, mÅ«su piemērā divas sekundes tas izskatās Ŕādi:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Starp citu, interesanti, ka signālam ir arÄ« datu ā€œotrais slānisā€. Bitu secÄ«ba tiek kodēta arÄ« izmantojot fāzes modulācija. Teorētiski tam vajadzētu nodroÅ”ināt spēcÄ«gāku dekodÄ“Å”anu pat novājināta signāla gadÄ«jumā.

MÅ«su pēdējais solis: faktisko datu iegÅ«Å”ana. Biti tiek pārraidÄ«ti reizi sekundē, tāpēc mums kopā ir 59 biti, kuros tiek iekodēts diezgan daudz informācijas:
DCF77: Kā darbojas laika signālu sistēma?

Biti ir aprakstÄ«ti sadaļā Wikipedia, un viņi ir diezgan ziņkārÄ«gi. Pirmie 15 biti netiek izmantoti, lai gan bija plāni tos izmantot brÄ«dināŔanas sistēmām un civilajai aizsardzÄ«bai. Bits A1 norāda, ka pulkstenis nākamajā stundā pārslēgsies uz vasaras laiku. Bits A2 norāda, ka papildu lēciens otrais, ko dažreiz izmanto, lai pielāgotu laiku atbilstoÅ”i Zemes rotācijai. AtlikuÅ”ie biti kodē stundas, minÅ«tes, sekundes un datumu.

DCF77: Kā darbojas laika signālu sistēma?

Tiem, kas vēlas eksperimentēt paÅ”i, dekodÄ“Å”anas kods ir norādÄ«ts zem spoilera.
Pirmkods

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)

Palaižot programmu, mēs redzēsim līdzīgu izvadi:

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

PatiesÄ«bā tā ir visa burvÄ«ba. Šādas sistēmas priekÅ”rocÄ«ba ir tā, ka dekodÄ“Å”ana ir ārkārtÄ«gi vienkārÅ”a un to var veikt uz jebkura, pat visvienkārŔākā mikrokontrollera. Mēs vienkārÅ”i saskaitām impulsu garumu, uzkrājam 60 bitus un katras minÅ«tes beigās iegÅ«stam precÄ«zu laiku. SalÄ«dzinot ar citiem laika sinhronizācijas paņēmieniem (GPS, piemēram, vai nedod Dievs, internets:), Ŕādai radio sinhronizācijai praktiski nav nepiecieÅ”ama elektrÄ«ba ā€“ piemēram, parasta mājas meteoroloÄ£iskā stacija aptuveni gadu darbojas ar 2 AA baterijām. Tāpēc pat rokas pulksteņi tiek izgatavoti ar radio sinhronizāciju, nemaz nerunājot, protams, sienas pulksteņi vai ielu stacijas pulksteņi.

DCF ērtÄ«bas un vienkārŔība piesaista arÄ« DIY entuziastus. Tikai par 10-20 dolāriem var iegādāties gatavu antenas moduli ar gatavu uztvērēju un TTL izeju, ko var savienot ar Arduino vai citu kontrolieri.
DCF77: Kā darbojas laika signālu sistēma?

Jau rakstÄ«ts priekÅ” Arduino gatavās bibliotēkas. Tomēr jau ir zināms, ka neatkarÄ«gi no tā, ko jÅ«s darāt ar mikrokontrolleru, jÅ«s saņemat vai nu pulksteni, vai meteoroloÄ£isko staciju. Ar Ŕādu ierÄ«ci precÄ«za laika iegÅ«Å”ana ir patieŔām vienkārÅ”a, protams, ja atrodaties reÄ£istratÅ«ras zonā. Nu, jÅ«s varat pakārt pulkstenim uzrakstu ā€œAtompulkstenisā€ un tajā paŔā laikā visiem paskaidrot, ka ierÄ«ce patieŔām tiek sinhronizēta, izmantojot atompulksteni.

Tie, kas vēlas, var pat uzlabot savu veco vecmāmiņas pulksteni, uzstādot jaunu mehānismu ar radio sinhronizāciju:

DCF77: Kā darbojas laika signālu sistēma?

JÅ«s varat to atrast vietnē ebay, izmantojot atslēgvārdus ā€œRadio Controlled Movementā€.

Un visbeidzot, dzÄ«ves hack tiem, kas ir izlasÄ«juÅ”i lÄ«dz Å”im. Pat ja tuvāko pāris tÅ«kstoÅ”u km laikā nav neviena radiosignāla raidÄ«tāja, paÅ”am Ŕādu signālu Ä£enerēt nav grÅ«ti. Pakalpojumā Google Play ir programma ar nosaukumu ā€œDCF77 Emulatorā€, kas izvada signālu austiņās. Pēc autora domām, aptinot austiņu vadu ap pulksteni, tās uztvers signālu (interesanti, kā, jo parastās austiņas neradÄ«s 77KHz signālu, bet uztverÅ”ana, iespējams, ir harmonikas dēļ). Operētājsistēmā Android 9 programma man vispār nedarbojās - vienkārÅ”i nebija skaņas (vai varbÅ«t es to nedzirdēju - galu galā tas ir 77KHz :), bet varbÅ«t kādam paveiksies labāk. Tomēr daži veido sevi par pilnvērtÄ«gu DCF signālu Ä£eneratoru, ko ir viegli izveidot tajā paŔā Arduino vai ESP32:

DCF77: Kā darbojas laika signālu sistēma?
(avots sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

Secinājums

DCF sistēma izrādÄ«jās patieŔām diezgan vienkārÅ”a un ērta. Izmantojot vienkārÅ”u un lētu uztvērēju, vienmēr un visur var atrast precÄ«zu laiku, protams, reÄ£istratÅ«ras zonā. Å Ä·iet, pat neskatoties uz plaÅ”i izplatÄ«to digitalizāciju un lietu internetu, Ŕādi vienkārÅ”i risinājumi bÅ«s pieprasÄ«ti vēl ilgi.

Avots: www.habr.com

Pievieno komentāru