DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?

Hello Habr.

Mwinamwake ambiri amene amagula wotchi kapena malo owonetsera nyengo awonapo chizindikiro cha Radio Controlled Clock kapena Atomic Clock pachovala. Izi ndizothandiza kwambiri, chifukwa mumangofunika kuyika wotchiyo patebulo, ndipo pakapita nthawi idzasintha nthawi yake.
DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?

Tiyeni tiwone momwe zimagwirira ntchito ndikulemba decoder mu Python.

Pali njira zosiyanasiyana zolumikizirana nthawi. Odziwika kwambiri ku Europe ndi dongosolo la Germany Chithunzi cha DCF-77, Japan ili ndi dongosolo lake JJY, ku USA pali dongosolo WWVB, ndi zina zotero. Chotsatira, nkhaniyi idzakhala ya DCF77, yomwe ili yoyenera kwambiri komanso yopezeka ku phwando m'madera ena a ku Ulaya ku Russia ndi mayiko oyandikana nawo (anthu okhala ku Far East angakhale ndi maganizo osiyana, komabe, nawonso akhoza kulandira. ndi kusanthula chizindikiro cha Japan;).

Chilichonse cholembedwa pansipa chikhala chokhudza DCF77.

Kulandila kwa ma Signal

DCF77 ndi mafunde aatali omwe amagwira ntchito pafupipafupi 77.5 kHz ndikutumiza ma siginecha mumatalikidwe osinthika. Sitima yapamtunda ya 50KW ili pamtunda wa 25 km kuchokera ku Frankfurt, idayamba kugwira ntchito mu 1959, ndipo mu 1973 zambiri zatsiku zidawonjezedwa ku nthawi yeniyeni. Kutalika kwa mafunde pafupipafupi 77 KHz ndiatali kwambiri, kotero miyeso ya gawo la mlongoti ndi yabwino kwambiri (chithunzi kuchokera ku Wikipedia):
DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?

Ndi mlongoti wotere ndi kulowetsa mphamvu, malo olandirira alendo amafika pafupifupi ku Ulaya, Belarus, Ukraine ndi mbali ya Russia.

DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?

Aliyense akhoza kulemba chizindikiro. Kuti muchite izi, ingopitani ku wolandila pa intaneti http://websdr.ewi.utwente.nl:8901/, sankhani ma frequency 76.5KHz ndi kusinthasintha kwa USB pamenepo. Chithunzi chiyenera kutsegulidwa chomwe chikuwoneka motere:

DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?

Pamenepo timasindikiza batani lotsitsa ndikulemba kachidutswa kwa mphindi zingapo. Zachidziwikire, ngati muli ndi "weniweni" wolandila yemwe amatha kujambula ma frequency a 77.5KHz, mutha kugwiritsa ntchito.

Zoonadi, polandira zizindikiro za nthawi ya wailesi kudzera pa intaneti, sitidzalandira nthawi yolondola - chizindikirocho chimaperekedwa mochedwa. Koma cholinga chathu ndikungomvetsetsa mawonekedwe a chizindikirocho; pa izi, kujambula pa intaneti ndikokwanira. M'moyo weniweni, zida zapadera zimagwiritsidwa ntchito polandila ndi kusindikiza; zidzakambidwa pansipa.

Kotero, talandira kujambula, tiyeni tiyambe kukonza.

Kusintha kwa Signal

Tiyeni tiyike fayiloyo pogwiritsa ntchito Python ndikuwona kapangidwe kake:

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

Timawona kusinthasintha kwa matalikidwe:
DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?

Kuti muchepetse kumasulira, tiyeni titenge envelopu yolumikizira pogwiritsa ntchito kusintha kwa Hilbert:

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

Zotsatira zokulitsidwa:
DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?

Tiyeni tiwongolere zotulutsa zaphokoso pogwiritsa ntchito fyuluta yotsika pang'ono, ndipo nthawi yomweyo tiziwerengera mtengo wapakati, womwe udzakhala wothandiza mtsogolomo.

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

Zotsatira (mzere wachikasu): chizindikiro cha mafunde pafupifupi masikweya chomwe ndi chosavuta kuunika.
DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?

Kusanthula

Choyamba muyenera kupeza bits sequence. Mapangidwe azizindikiro okha ndi osavuta.
DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?

Ma pulses amagawidwa mu magawo achiwiri. Ngati mtunda wapakati pa pulse ndi 0.1s (ie kutalika kwa kugunda komweko ndi 0.9s), onjezani "0" kutsatizana pang'ono; ngati mtunda uli 0.2s (ie kutalika ndi 0.8s), onjezani "1". Mapeto a miniti iliyonse akuwonetsedwa ndi kugunda kwa "kutalika", 2s kutalika, kutsatizana pang'ono kumakhazikitsidwanso ku zero, ndipo kudzaza kumayambanso.

Zomwe zili pamwambazi ndizosavuta kulemba mu 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

Zotsatira zake, timapeza ma bits, mu chitsanzo chathu kwa masekondi awiri zikuwoneka motere:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Mwa njira, ndizosangalatsa kuti chizindikirocho chilinso ndi "gawo lachiwiri" la deta. The bit sequence is also encoded ntchito kusintha kwa gawo. Mwachidziwitso, izi ziyenera kupereka ma decoding amphamvu kwambiri ngakhale pakakhala chizindikiro chofooka.

Gawo lathu lomaliza: kupeza deta yeniyeni. Ma bits amatumizidwa kamodzi pa sekondi iliyonse, kotero tili ndi ma bits 59, momwe zambiri zimasungidwa:
DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?

Mabiti akufotokozedwa mu Wikipedia, ndipo amachita chidwi kwambiri. Ma bits 15 oyambilira sagwiritsidwa ntchito, ngakhale panali mapulani oti azigwiritsa ntchito pamachenjezo komanso chitetezo cha anthu. Bit A1 ikuwonetsa kuti wotchiyo isintha kukhala nthawi yopulumutsa masana mu ola lotsatira. Bit A2 ikuwonetsa kuti zowonjezera kudumpha kachiwiri, yomwe nthawi zina imagwiritsidwa ntchito kukonza nthawi molingana ndi kuzungulira kwa Dziko lapansi. Ma bits otsala amasunga maola, mphindi, masekondi ndi tsiku.

DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?

Kwa iwo omwe akufuna kuyesa okha, code decoding imaperekedwa pansi pa wowononga.
Nambala yachinsinsi

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)

Tikayendetsa pulogalamuyo, tidzawona zotsatira zofanana ndi izi:

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

Kwenikweni, ndiwo matsenga onse. Ubwino wamakina otere ndikuti decoding ndiyosavuta kwambiri ndipo imatha kuchitika pa chilichonse, ngakhale chowongolera chosavuta kwambiri. Timangowerengera kutalika kwa ma pulse, kudziunjikira ma bits 60, ndipo kumapeto kwa mphindi iliyonse timapeza nthawi yeniyeni. Poyerekeza ndi njira zina za kalunzanitsidwe nthawi (GPS, mwachitsanzo, kapena Mulungu aletsa, Intaneti :), ngati wailesi kalunzanitsidwe amafuna pafupifupi palibe magetsi - mwachitsanzo, wokhazikika kunyumba siteshoni nyengo akuthamanga kwa pafupifupi chaka pa 2 AA mabatire. Chifukwa chake, ngakhale mawotchi am'manja amapangidwa ndi kulumikizana kwa wailesi, osatchulanso, mawotchi apakhoma kapena mawotchi apamsewu.

Kusavuta komanso kuphweka kwa DCF kumakopanso okonda DIY. Kwa $ 10-20 yokha mutha kugula gawo la mlongoti lopangidwa mokonzeka ndi cholandirira chokonzekera ndi kutulutsa kwa TTL, komwe kumatha kulumikizidwa ndi Arduino kapena wowongolera wina.
DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?

Zalembedwa kale ku Arduino malaibulale okonzeka. Komabe, zimadziwika kale kuti ziribe kanthu zomwe mungachite pa microcontroller, mumatha kukhala ndi wotchi kapena malo owonetsera nyengo. Ndi chipangizo choterocho, kupeza nthawi yeniyeni ndikosavuta kwenikweni, kuperekedwa, ndithudi, kuti muli kumalo olandirira alendo. Chabwino, mutha kupachika mawu oti "Atomic Clock" pa wotchi yanu, ndipo nthawi yomweyo fotokozerani aliyense kuti chipangizocho chimalumikizidwa ndi wotchi ya atomiki.

Iwo omwe akufuna atha kukweza wotchi ya agogo awo akale poyika makina atsopano ndi kulumikizana ndi wailesi:

DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?

Mutha kupeza imodzi pa ebay pogwiritsa ntchito mawu osakira "Radio Controlled Movement".

Ndipo potsiriza, kuthyolako kwa moyo kwa iwo omwe awerenga mpaka pano. Ngakhale palibe chowulutsa chimodzi chawayilesi pamakilomita masauzande angapo otsatira, sikovuta kupanga siginecha yotere nokha. Pali pulogalamu pa Google Play yotchedwa "DCF77 Emulator" yomwe imatulutsa chizindikiro kumakutu. Malinga ndi wolemba, ngati mukulunga waya wa mahedifoni mozungulira wotchiyo, amatenga chizindikirocho (ndizosangalatsa bwanji, chifukwa mahedifoni wamba sangapange chizindikiro cha 77KHz, koma kulandila mwina chifukwa cha ma harmonics). Pa Android 9, pulogalamuyi sinandigwire ntchito konse - kunalibe phokoso (kapena mwina sindinamve - ndi 77KHz, pambuyo pa zonse :), koma mwina wina angakhale ndi mwayi wabwinoko. Ena, komabe, amadzipangira okha DCF chizindikiro chojambulira, chomwe ndi chosavuta kupanga pa Arduino kapena ESP32 yomweyo:

DCF77: Kodi njira yolumikizira nthawi imagwira ntchito bwanji?
(gwero sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

Pomaliza

Dongosolo la DCF lidakhala losavuta komanso losavuta. Mothandizidwa ndi wolandila wosavuta komanso wotsika mtengo, mutha kukhala ndi nthawi yeniyeni nthawi zonse komanso kulikonse, ndithudi kumalo olandirira alendo. Zikuwoneka kuti ngakhale kufalikira kwa digito ndi intaneti ya Zinthu, mayankho osavuta otere adzakhala ofunikira kwa nthawi yayitali.

Source: www.habr.com

Kuwonjezera ndemanga