DCF77: ¿cómo funciona el sistema de señalización horaria?

Hola Habr.

Probablemente muchos de los que compran un reloj o una estación meteorológica han visto el reloj controlado por radio o incluso el logotipo del reloj atómico en el empaque. Esto es muy conveniente, porque basta con poner el reloj sobre la mesa y, después de un tiempo, se ajustará automáticamente a la hora exacta.
DCF77: ¿cómo funciona el sistema de señalización horaria?

Averigüemos cómo funciona y escribamos un decodificador en Python.

Existen diferentes sistemas de sincronización horaria. El más popular en Europa es el sistema alemán. DCF-77Japón tiene su propio sistema. JJY, en USA hay un sistema WWVB, etcétera. Además, la historia será sobre DCF77, como el más relevante y accesible para la recepción en algunos lugares de la parte europea de Rusia y países vecinos (los habitantes del Lejano Oriente pueden tener la opinión opuesta, sin embargo, ellos, a su vez, pueden recibir y analizar la señal japonesa ;).

Todo lo escrito a continuación será sobre DCF77.

Recepción de señal

La DCF77 es una estación de onda larga que opera a 77.5 KHz y transmite señales de AM. La estación con una capacidad de 50 kW se encuentra a 25 km de Frankfurt, comenzó a funcionar en 1959, en 1973 se agregó información sobre la fecha a la hora exacta. La longitud de onda a una frecuencia de 77 kHz es muy grande, por lo que las dimensiones del campo de la antena también son muy decentes (foto de Wikipedia):
DCF77: ¿cómo funciona el sistema de señalización horaria?

Con tal antena y potencia de entrada, el área de recepción cubre casi toda Europa, Bielorrusia, Ucrania y parte de Rusia.

DCF77: ¿cómo funciona el sistema de señalización horaria?

Cualquiera puede grabar. Para hacer esto, simplemente vaya al receptor en línea http://websdr.ewi.utwente.nl:8901/, seleccione una frecuencia de 76.5KHz y modulación USB allí. Una imagen debería aparecer algo como esto:

DCF77: ¿cómo funciona el sistema de señalización horaria?

En el mismo lugar, presionamos el botón de descarga y grabamos un fragmento de unos minutos de duración. Por supuesto, si tiene un receptor "real" capaz de grabar una frecuencia de 77.5 kHz, puede usarlo.

Por supuesto, al recibir señales de radio de hora precisa a través de Internet, no obtendremos una hora realmente precisa: la señal se transmite con un retraso. Pero nuestro objetivo es solo entender la estructura de la señal, para esto la grabación de Internet es más que suficiente. En la vida real, por supuesto, se utilizan dispositivos especializados para recibir y decodificar, se discutirán a continuación.

Entonces, recibimos el registro, comencemos a procesarlo.

Decodificación de señal

Carguemos el archivo con Python y veamos su estructura:

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

Vemos una modulación de amplitud típica:
DCF77: ¿cómo funciona el sistema de señalización horaria?

Para simplificar la decodificación, tomamos la envolvente de la señal usando la transformada de Hilbert:

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

Resultado ampliado:
DCF77: ¿cómo funciona el sistema de señalización horaria?

Suavicemos las emisiones de ruido utilizando un filtro de paso bajo, al mismo tiempo calculemos el valor promedio, será útil más adelante para el análisis.

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

Resultado (línea amarilla): una señal casi rectangular que es bastante fácil de analizar.
DCF77: ¿cómo funciona el sistema de señalización horaria?

Parsing

Primero necesitas obtener la secuencia de bits. La estructura de la señal en sí es muy simple.
DCF77: ¿cómo funciona el sistema de señalización horaria?

Los pulsos se dividen en intervalos de segundos. Si la distancia entre pulsos es 0.1 s (es decir, la duración del pulso en sí es 0.9 s), agregamos "0" a la secuencia de bits, si la distancia es 0.2 s (es decir, la duración es 0.8 s), agregamos “1”. El final de cada minuto se indica mediante un pulso "largo", de 2 s de duración, la secuencia de bits se pone a cero y el llenado comienza de nuevo.

Lo anterior es fácil de escribir en 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

Como resultado, obtenemos una secuencia de bits, en nuestro ejemplo durante dos segundos se ve así:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000

Por cierto, es interesante que también haya una "segunda capa" de datos en la señal. La secuencia de bits también se codifica con modulación de fase. Teóricamente, esto debería proporcionar una decodificación más robusta incluso en el caso de una señal debilitada.

Nuestro último paso: obtener los datos reales. Los bits se transmiten una vez por segundo, por lo que solo tenemos 59 bits, en los que se codifica bastante información:
DCF77: ¿cómo funciona el sistema de señalización horaria?

Los bits se describen en Р'РёРєРёРμРμРμРёРёРёРёРёy son bastante curiosos. Los primeros 15 bits no se utilizan, aunque había planes para utilizarlos en sistemas de megafonía y defensa civil. El bit A1 indica que el reloj cambiará al horario de verano en la próxima hora. El bit A2 indica que se agregará la siguiente hora segundo intercalar, que a veces se usa para corregir el tiempo según la rotación de la Tierra. Los bits restantes codifican horas, minutos, segundos y fecha.

DCF77: ¿cómo funciona el sistema de señalización horaria?

Para aquellos que quieran experimentar por su cuenta, el código de decodificación se encuentra debajo del spoiler.
Código fuente

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)

Ejecutando el programa, veremos algo como este resultado:

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

En realidad, esa es toda la magia. La ventaja de un sistema de este tipo es que la decodificación es extremadamente simple y se puede realizar en cualquier microcontrolador, el más sencillo. Simplemente contamos la duración de los pulsos, acumulamos 60 bits y al final de cada minuto obtenemos la hora exacta. En comparación con otros métodos de sincronización de tiempo (GPS, por ejemplo, o Dios no lo quiera, Internet :), dicha sincronización de radio prácticamente no requiere electricidad; por ejemplo, una estación meteorológica doméstica normal funciona durante aproximadamente un año con 2 pilas AA. Por eso, incluso los relojes de pulsera se fabrican con sincronización por radio, por no hablar, por supuesto, de los relojes de pared o de la calle.

La conveniencia y la simplicidad del DCF también atraen a los entusiastas del bricolaje. Por solo $ 10-20, puede comprar un módulo de antena listo para usar con un receptor listo para usar y una salida TTL que se puede conectar a un Arduino u otro controlador.
DCF77: ¿cómo funciona el sistema de señalización horaria?

Para Arduino ya escrito y bibliotecas preparadas. Sin embargo, ya se sabe que hagas lo que hagas en el microcontrolador, obtienes un reloj o una estación meteorológica. Con un dispositivo de este tipo, obtener la hora exacta es realmente fácil, a menos, por supuesto, que se encuentre en el área de recepción. Bueno, puede colgar la inscripción "Reloj atómico" en el reloj y, al mismo tiempo, explicarles a todos que el dispositivo está realmente sincronizado con un reloj atómico.

Aquellos que lo deseen pueden incluso actualizar el reloj de la vieja abuela instalando un nuevo mecanismo con sincronización por radio:

DCF77: ¿cómo funciona el sistema de señalización horaria?

Puede encontrar uno en eBay usando las palabras clave "Movimiento controlado por radio".

Y finalmente, un truco de vida para aquellos que han leído hasta aquí. Incluso si no hay un solo transmisor de señal de radio en los próximos miles de kilómetros, esa señal es fácil de generar por su cuenta. Hay un programa en Google Play llamado "DCF77 Emulator" que envía una señal a los auriculares. Según el autor, si enrollas el cable de los auriculares durante todo el día, captarán la señal (me pregunto cómo, porque los auriculares normales no emiten una señal de 77 KHz, pero probablemente la recepción se deba a los armónicos). El programa no funcionó para mí en Android 9 en absoluto, simplemente no había sonido (o tal vez no lo escuché, 77 KHz, después de todo :), pero tal vez alguien tenga más suerte. Algunos, sin embargo, se convierten en un generador de señales DCF completo, lo cual es fácil de hacer en el mismo Arduino o ESP32:

DCF77: ¿cómo funciona el sistema de señalización horaria?
(fuente sgfantasytoys.wordpress.com/2015/05/13/sincronizar-reloj-controlado-por-radio-sin-acceso)

Conclusión

El sistema DCF resultó ser bastante simple y conveniente. Con la ayuda de un receptor simple y económico, puede tener la hora exacta siempre y en todas partes, por supuesto en el área de recepción. Parece que incluso a pesar de la digitalización generalizada y el "Internet de las cosas", estas soluciones simples seguirán siendo demandadas durante mucho tiempo.

Fuente: habr.com

Añadir un comentario