DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?

Salama Habr.

Maro amin'ireo mividy famantaranandro na tobim-pandrefesana toetr'andro no nahita ny famantaranandron'ny Radio Controlled na ny famantarana famantarana famantarana atomika eo amin'ny fonosana. Tena mety izany, satria mila mametraka ny famantaranandro eo amin'ny latabatra fotsiny ianao, ary rehefa afaka kelikely dia hiova ho azy amin'ny fotoana marina izany.
DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?

Andeha hojerentsika ny fomba fiasany ary manoratra decoder amin'ny Python.

Misy rafitra synchronization fotoana samy hafa. Ny malaza indrindra any Eoropa dia ny rafitra alemana DCF-77, manana rafitra manokana i Japana JJY, any Etazonia misy rafitra WWVB, sy ny sisa. Manaraka, ny tantara dia momba ny DCF77, satria ny tena manan-danja sy azo idirana amin'ny fandraisana any amin'ny toerana sasany any amin'ny faritra Eoropeana ao Rosia sy ny firenena manodidina (ny mponina any amin'ny Far East dia mety manana hevitra mifanohitra, na izany aza, izy ireo kosa dia afaka mahazo. ary diniho ny famantarana japoney;).

Ny zavatra rehetra voasoratra etsy ambany dia momba ny DCF77.

Fandraisana famantarana

DCF77 dia onjam-peo lava miasa amin'ny fatran'ny 77.5 kHz ary mandefa famantarana amin'ny amplitude modulation. Ny gara 50KW dia 25 km miala an'i Frankfurt, nanomboka niasa tamin'ny 1959, ary tamin'ny 1973 dia nampiana ny fotoana marina ny vaovao momba ny daty. Ny halavan'ny onjam amin'ny fatran'ny 77 KHz dia lava be, noho izany dia mendrika ihany koa ny refin'ny sahan'ny antenne (sary avy amin'ny Wikipedia):
DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?

Miaraka amin'ny antena toy izany sy ny fampidirana herinaratra, ny faritra fandraisana dia saika manerana an'i Eoropa, Belarosia, Okraina ary ampahany amin'i Rosia.

DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?

Afaka mirakitra famantarana ny olona rehetra. Mba hanaovana izany, mandehana fotsiny any amin'ny mpandray an-tserasera http://websdr.ewi.utwente.nl:8901/, safidio ny frequence 76.5KHz sy USB modulation ao. Tokony hisokatra ny sary iray izay toa izao:

DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?

Ao no manindry ny bokotra fampidinana ary mirakitra sombiny iray minitra maromaro. Mazava ho azy fa raha manana mpandray "tena" ianao afaka mirakitra ny fatran'ny 77.5KHz dia azonao ampiasaina izany.

Mazava ho azy, amin'ny fandraisana famantarana amin'ny radio amin'ny alΓ lan'ny Internet, dia tsy hahazo fotoana tena marina isika - alefa miaraka amin'ny fahatarana ny famantarana. Saingy ny tanjonay dia ny hahatakatra ny firafitry ny famantarana ihany; noho izany, ny firaketana amin'ny Internet dia mihoatra ny ampy. Amin'ny tena fiainana, mazava ho azy, ny fitaovana manokana dia ampiasaina amin'ny fandraisana sy decoding, horesahina etsy ambany.

Noho izany, voaray ny fandraisam-peo, andao hanomboka ny fanodinana azy.

Famaritana famantarana

Andao hampiditra ny rakitra mampiasa Python ary jereo ny rafitra:

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

Hitantsika ny modulation amplitude mahazatra:
DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?

Mba hanatsorana ny decoding, andeha horaisintsika ny valopy famantarana amin'ny fampiasana ny fanovana Hilbert:

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

Vokatra lehibe kokoa:
DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?

Andao hanalefaka ny fivoahan'ny tabataba amin'ny alΓ lan'ny sivana ambany-pass, ary kajy ny sandan'ny salan'isa, izay ilaina amin'ny famafazana.

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

Vokany (tsipika mavo): mari-pamantarana onjam-peo saika efa-joro izay mora ny fakafakaina.
DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?

Famakafakana

Voalohany dia mila mahazo ny filaharan'ny bit ianao. Ny rafitra famantarana mihitsy dia tena tsotra.
DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?

Mizara roa ny pulses. Raha 0.1s ny elanelan'ny pulses (izany hoe 0.9s ny halavan'ny pulses), ampio ny "0" amin'ny filaharana bit; raha 0.2s ny elanelana (izany hoe 0.8s ny halavany), ampio ny "1". Ny fiafaran'ny minitra tsirairay dia aseho amin'ny alΓ lan'ny pulse "lava", 2s ny halavany, averina amin'ny zero ny filaharana bit, ary manomboka indray ny famenoana.

Ity ambony ity dia mora soratana amin'ny 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

Vokatr'izany dia mahazo filaharan'ny bits isika, amin'ny ohatra asehontsika mandritra ny roa segondra dia toa izao:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Amin'ny lafiny iray, mahaliana fa ny famantarana koa dia manana angon-drakitra "sosona faharoa". Ny filaharan'ny bit dia ampiasaina ihany koa phase modulation. Raha ny teoria dia tokony hanome decoding matanjaka kokoa izany na dia amin'ny tranganΓ  famantarana malemy aza.

Ny dingana farany ataontsika: maka ny tena angona. Ampitaina indray mandeha isan-tsegondra ny bits, noho izany dia manana totalin'ny 59 bit isika, izay misy fampahalalana be dia be voarakitra:
DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?

Ny bits dia voalaza ao Wikipedia, ary tena mahaliana azy ireo. Ny bitika 15 voalohany dia tsy ampiasaina, na dia nisy aza ny fikasana hampiasa azy ireo ho an'ny rafitra fampitandremana sy fiarovana sivily. Bit A1 dia manondro fa ny famantaranandro dia hiova ho ora antoandro amin'ny ora manaraka. Bit A2 dia manondro fa fanampiny mitsambikina faharoa, izay ampiasaina indraindray mba hanitsiana ny fotoana araka ny fihodinan’ny tany. Ny bits sisa dia manisa ora, minitra, segondra ary daty.

DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?

Ho an'ireo izay te hanandrana samirery dia omena eo ambanin'ny mpandroba ny code decoding.
Source

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)

Rehefa mihazakazaka ny programa isika dia hahita vokatra mitovy amin'ity:

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

Raha ny marina, izany no majika rehetra. Ny tombony amin'ny rafitra toy izany dia ny decoding dia tena tsotra ary azo atao amin'ny rehetra, na dia ny microcontroller tsotra indrindra. Manisa fotsiny ny halavan'ny pulses isika, manangona 60 bit, ary amin'ny faran'ny minitra tsirairay dia mahazo ny fotoana marina. Raha ampitahaina amin'ny fomba hafa amin'ny fampifanarahana ny fotoana (GPS, ohatra, na mandrara an'Andriamanitra, ny Internet :)), ny fampifanarahana amin'ny onjam-peo toy izany dia tsy mitaky herinaratra - ohatra, ny tobim-pitaterana toetr'andro ao an-trano dia mandeha mandritra ny herintaona amin'ny batterie 2 AA. Noho izany, na ny wristwatches aza dia vita amin'ny radio synchronization, tsy lazaina intsony, mazava ho azy, ny famantaranandro rindrina na famantaranandro eny an-dalambe.

Ny fanamorana sy ny fahatsoran'ny DCF dia mahasarika mpankafy DIY ihany koa. Ho an'ny $ 10-20 fotsiny dia azonao atao ny mividy mody antena efa vita miaraka amin'ny mpandray efa vonona sy ny famoahana TTL, izay azo ampifandraisina amin'ny Arduino na mpanara-maso hafa.
DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?

Efa nosoratana ho an'ny Arduino tranomboky efa vonona. Na izany aza, efa fantatra fa na inona na inona ataonao amin'ny microcontroller dia miafara amin'ny famantaranandro na famantaranandro. Miaraka amin'ny fitaovana toy izany, ny fahazoana ny fotoana marina dia tena mora, raha toa ka, mazava ho azy, fa ao amin'ny faritra fandraisana ianao. Eny ary, azonao atao ny manantona ny soratra hoe "Clock Atomic" amin'ny famantaranandro, ary manazava amin'ny olona rehetra fa tena ampiarahina amin'ny famantaranandro atomika ilay fitaovana.

Ireo izay maniry dia afaka manavao ny famantaranandron'ny renibeny taloha amin'ny fametrahana mekanika vaovao miaraka amin'ny fampifanarahana amin'ny radio:

DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?

Azonao atao ny mahita iray amin'ny ebay amin'ny fampiasana ny teny fanalahidy hoe "Radio Controlled Movement".

Ary farany, hack fiainana ho an'ireo izay namaky hatramin'izao. Na dia tsy misy mpampita famantarana radio iray aza ao anatin'ny roa arivo km manaraka, dia tsy sarotra ny mamorona famantarana toy izany. Misy programa ao amin'ny Google Play antsoina hoe "DCF77 Emulator" izay mamoaka ny famantarana amin'ny Γ©couteur. Araka ny filazan'ny mpanoratra, raha mamatotra ny tariby amin'ny Γ©couteur manodidina ny famantaranandro ianao, dia haka ny famantarana izy ireo (mahaliana ny fomba, satria ny headphone tsotra dia tsy hamokatra famantarana 77KHz, fa ny fandraisana dia mety noho ny harmonics). Ao amin'ny Android 9 dia tsy niasa tamiko mihitsy ilay programa - tsy nisy feo tsotra izao (na angamba tsy nandre izany aho - 77KHz izany, na izany aza :), fa angamba hisy olona hahazo vintana tsara kokoa. Ny sasany anefa dia manao ny tenany ho mpamokatra famantarana DCF feno, izay mora atao amin'ny Arduino na ESP32 ihany:

DCF77: Ahoana no fiasan'ny rafitra famantarana ny fotoana?
(loharano iray sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access)

famaranana

Ny rafitra DCF dia nivadika ho tena tsotra sy mety. Miaraka amin'ny fanampian'ny mpandray tsotra sy mora, dia afaka manana ny fotoana marina foana sy na aiza na aiza, mazava ho azy ao amin'ny faritra fandraisana. Toa na dia eo aza ny digitalization miely patrana sy ny Internet of Things, ny vahaolana tsotra toy izany dia hitakiana mandritra ny fotoana maharitra.

Source: www.habr.com

Add a comment