DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?

Aloha Habr.

Ua ʻike paha ka nui o ka poʻe kūʻai i ka wati a i ʻole ke kahua hoʻokele manawa i ka Radio Controlled Clock a i ʻole ka hōʻailona Atomic Clock ma ka pahu. He mea maʻalahi kēia, no ka mea, pono ʻoe e kau i ka uaki ma ka papaʻaina, a ma hope o kekahi manawa e hoʻololi koke ia i ka manawa kūpono.
DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?

E noʻonoʻo pehea e hana ai a kākau i kahi decoder ma Python.

Aia nā ʻōnaehana hoʻonohonoho manawa like ʻole. ʻO ka mea kaulana loa ma ʻEulopa ʻo ka ʻōnaehana Kelemania DCF-77, He ʻōnaehana ponoʻī ko Iapana ʻO JJY, i ka USA aia kahi ʻōnaehana WWVB, a laila. A laila, e pili ana ka moʻolelo e pili ana i ka DCF77, ʻo ia ka mea kūpono loa a hiki i ka hoʻokipa ʻana ma kekahi mau wahi ma ka ʻāpana ʻEulopa o Rūsia a me nā ʻāina e pili ana (ʻo ka poʻe o ka Hikina Hikina hiki ke loaʻa i ka manaʻo kūʻē, akā naʻe, hiki iā lākou ke loaʻa. a nana i ka hoailona Iapana;).

ʻO nā mea a pau i kākau ʻia ma lalo nei e pili ana i ka DCF77.

Hoʻokipa hōʻailona

ʻO DCF77 kahi kikowaena nalu lōʻihi e hana ana ma ke alapine o 77.5 kHz a me ka hoʻouna ʻana i nā hōʻailona ma ka modulation amplitude. Aia ke kikowaena 50KW ma 25 km mai Frankfurt, ua hoʻomaka ka hana ma 1959, a i ka makahiki 1973 ua hoʻohui ʻia ka ʻike i ka manawa kūpono. ʻO ka lōʻihi o ka nalu ma ke alapine o 77 KHz he lōʻihi loa, no laila, ʻoi aku ka maikaʻi o nā ana o ke kahua antenna (kiʻi mai Wikipedia):
DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?

Me kēlā ʻano antenna a me ka mana hoʻokomo, uhi ʻia ka wahi hoʻokipa ma kahi o ʻEulopa, Belarus, Ukraine a me kahi hapa o Rūsia.

DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?

Hiki i kekahi ke hoʻopaʻa i kahi hōʻailona. No ka hana ʻana i kēia, e hele wale i ka mea hoʻokipa pūnaewele http://websdr.ewi.utwente.nl:8901/, koho i ke alapine 76.5KHz a me USB modulation ma laila. Pono e wehe ʻia kahi kiʻi e like me kēia:

DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?

Ma laila mākou e kaomi i ke pihi download a hoʻopaʻa i kahi ʻāpana i mau minuke lōʻihi. ʻOiaʻiʻo, inā loaʻa iā ʻoe kahi mea hoʻokipa "maoli" hiki ke hoʻopaʻa i ke alapine 77.5KHz, hiki iā ʻoe ke hoʻohana i kēlā.

ʻOiaʻiʻo, ma ka loaʻa ʻana o nā hōʻailona manawa lekiō ma o ka Pūnaewele, ʻaʻole mākou e loaʻa i ka manawa kūpono maoli - ua hoʻouna ʻia ka hōʻailona me ka lohi. Akā ʻo kā mākou pahuhopu wale nō ka hoʻomaopopo ʻana i ke ʻano o ka hōʻailona; no kēia, ʻoi aku ka nui o ka hoʻopaʻa ʻana o ka Pūnaewele. I ke ola maoli, ʻoiaʻiʻo, hoʻohana ʻia nā mea hana kūikawā no ka loaʻa ʻana a me ka decoding; e kūkākūkā ʻia lākou ma lalo nei.

No laila, ua loaʻa iā mākou ka hoʻopaʻa ʻana, e hoʻomaka kākou e hana.

Hoʻoholo hōʻailona

E hoʻouka i ka faila me ka Python a ʻike i kona ʻano:

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

ʻIke mākou i ka modulation amplitude maʻamau:
DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?

No ka maʻalahi o ka wehewehe ʻana, e lawe kāua i ka envelope hōʻailona me ka hoʻololi ʻana iā Hilbert:

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

Hoʻonui ʻia ka hopena:
DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?

E hoʻomaʻemaʻe i ka leo emissions me ka haʻahaʻa-pass kānana, a ma ka manawa like e helu i ka awelika waiwai, i mea e pono ma hope no ka parsing.

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

Ka hopena (laina melemele): kahi hōʻailona hawewe kokoke i maʻalahi ke kālailai.
DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?

ʻO ka hoʻopaʻa ʻana

Pono mua ʻoe e kiʻi i ke kaʻina bit. He mea maʻalahi loa ka hale hōʻailona.
DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?

Hoʻokaʻawale ʻia nā pulses i ʻelua mau manawa. Inā he 0.1s ka mamao ma waena o nā pulupulu (ʻo ia hoʻi. ʻo 0.9s ka lōʻihi o ka pulse), e hoʻohui i ka "0" i ke kaʻina bit; inā he 0.2s ka mamao (ʻo ia hoʻi ka lōʻihi he 0.8s), e hoʻohui i ka "1". Hōʻike ʻia ka hopena o kēlā me kēia minuke e ka pulse "lōʻihi", 2s ka lōʻihi, hoʻihoʻi ʻia ke kaʻina bit i ka ʻole, a hoʻomaka hou ka hoʻopiha.

He maʻalahi ka mea i luna e kākau ma 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

ʻO ka hopena, loaʻa iā mākou kahi kaʻina o nā bits, i kā mākou hiʻohiʻona no ʻelua kekona e like me kēia:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Ma ke ala, he mea hoihoi i ka hōʻailona he "ʻelua papa" o ka ʻikepili. Hoʻopili ʻia ke kaʻina bit me ka hoʻohana ʻana hoʻololi ʻāpana. Ma ke kumumanaʻo, pono kēia e hāʻawi i ka decoding ikaika aʻe i ka hihia o kahi hōʻailona nāwaliwali.

ʻO kā mākou hana hope: loaʻa ka ʻikepili maoli. Hoʻouna ʻia nā bits i hoʻokahi manawa i kēlā me kēia kekona, no laila, loaʻa iā mākou he 59 mau bits, kahi i hoʻopili ʻia ai ka ʻike he nui:
DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?

Hōʻike ʻia nā bits ma ʻO Wikipedia, a he hoihoi loa lakou. ʻAʻole hoʻohana ʻia nā 15 bits mua, ʻoiai aia nā manaʻo e hoʻohana iā lākou no nā ʻōnaehana hoʻolaha a me ka pale kīwila. Hōʻike ka Bit A1 e hoʻololi ka uaki i ka manawa mālama lā i ka hola aʻe. Hōʻike ka Bit A2 i kahi mea hou lele lua, i hoʻohana ʻia i kekahi manawa no ka hoʻoponopono ʻana i ka manawa e like me ke kaʻe ʻana o ka Honua. Hoʻopili nā bits i nā hola, mau minuke, kekona a me ka lā.

DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?

No ka poʻe makemake e hoʻokolohua iā lākou iho, hāʻawi ʻia ke code decoding ma lalo o ka mea hao.
Nīnau

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)

Ke holo mākou i ka papahana, e ʻike mākou i ka hopena e like me kēia:

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

ʻOiaʻiʻo, ʻo ia ka mea kilokilo. ʻO ka pōmaikaʻi o ia ʻōnaehana he mea maʻalahi loa ka decoding a hiki ke hana ʻia ma kekahi, ʻo ka microcontroller maʻalahi loa. Helu wale mākou i ka lōʻihi o nā pulses, hōʻiliʻili i 60 bits, a ma ka hopena o kēlā me kēia minuke loaʻa iā mākou ka manawa kūpono. Ke hoʻohālikelike ʻia me nā ʻano hana ʻē aʻe o ka hoʻonohonoho manawa (GPS, no ka laʻana, a i ʻole ke Akua ʻole, ka Pūnaewele:), ʻaʻohe pono o ka hoʻonohonoho ʻana i ka lekiō - no ka laʻana, holo ma kahi o hoʻokahi makahiki ma 2 mau pihi AA. No laila, hana ʻia nā wristwatches me ka hoʻonohonoho lekiō, ʻaʻole e haʻi ʻia, ʻoiaʻiʻo, nā wati pā a i ʻole nā ​​wati alanui.

ʻO ka ʻoluʻolu a me ka maʻalahi o ka DCF e huki pū i nā mea hoihoi DIY. No $ 10-20 wale nō hiki iā ʻoe ke kūʻai i kahi module antenna i mākaukau me kahi mea hoʻokipa mākaukau a me ka hoʻopuka TTL, hiki ke hoʻopili ʻia i kahi Arduino a i ʻole ka mana ʻē aʻe.
DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?

Ua kākau ʻia no Arduino hale waihona puke i hoʻomākaukau ʻia. Eia naʻe, ua ʻike mua ʻia ʻo nā mea āu e hana ai ma kahi microcontroller, e hoʻopau ʻoe me ka uaki a i ʻole ke kahua hoʻokele manawa. Me kēlā ʻano mea, maʻalahi loa ka loaʻa ʻana o ka manawa kūpono, hāʻawi ʻia, ʻoiaʻiʻo, aia ʻoe i ka wahi hoʻokipa. ʻAe, hiki iā ʻoe ke kau i ka palapala "Atomic Clock" ma kāu wati, a ma ka manawa like e wehewehe i nā poʻe āpau ua hoʻonohonoho pono ʻia ka hāmeʻa me ka hoʻohana ʻana i ka uaki atomika.

Hiki i ka poʻe makemake ke hoʻomaikaʻi i ka wati o ko lākou kupunawahine kahiko ma ke kau ʻana i kahi mīkini hou me ka hoʻonohonoho radio.

DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?

Hiki iā ʻoe ke loaʻa i kekahi ma ebay me ka hoʻohana ʻana i nā huaʻōlelo "Radio Controlled Movement".

A ʻo ka hope, he hack ola no ka poʻe i heluhelu i kēia mamao. ʻOiai inā ʻaʻohe mea hoʻokuʻu lekiō hoʻokahi i nā kaukani mau km e hiki mai ana, ʻaʻole paʻakikī ke hoʻopuka i kēlā hōʻailona iā ʻoe iho. Aia kahi papahana ma Google Play i kapa ʻia ʻo "DCF77 Emulator" e hoʻopuka i ka hōʻailona i nā headphone. Wahi a ka mea kākau, inā ʻoe e hoʻopili i ka uea o nā headphone a puni ka wati, e ʻohi lākou i ka hōʻailona (he mea hoihoi ia pehea, no ka mea, ʻaʻole e hoʻopuka nā headphone maʻamau i kahi hōʻailona 77KHz, akā no ka harmonics paha ka hoʻokipa). Ma ka Android 9, ʻaʻole i hana iki ka papahana iaʻu - ʻaʻohe kani wale (a i ʻole ʻaʻole au i lohe - ʻo 77KHz, ma hope o nā mea a pau:), akā e loaʻa paha i kekahi ka pōmaikaʻi. Akā naʻe, hoʻolilo kekahi iā lākou iho i mea hōʻailona hōʻailona DCF piha, maʻalahi ke hana ma ka Arduino a i ʻole ESP32.

DCF77: Pehea e hana ai ka ʻōnaehana hōʻailona manawa?
(kumuwaiwai sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

hopena

Ua maʻalahi a maʻalahi ka ʻōnaehana DCF. Me ke kōkua o kahi mea hoʻokipa maʻalahi a maʻalahi, hiki iā ʻoe ke loaʻa ka manawa kūpono i nā manawa a pau a me nā wahi āpau, ʻoiaʻiʻo ma ka wahi hoʻokipa. Me he mea lā ʻoiai ʻoiai ka laha ʻana o ka digitalization a me ka Internet of Things, e koi ʻia kēlā mau hoʻonā maʻalahi no ka manawa lōʻihi.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka