DCF77: Comment fonctionne le système de transmission précis du signal horaire?

Salut Habr.

Beaucoup de gens qui achètent une montre ou une station météo ont probablement vu le logo de l'horloge radiocommandée ou même l'horloge atomique sur l'emballage. C'est très pratique, car il suffit de mettre l'horloge sur la table, et après un certain temps, ils s'ajustent automatiquement à l'heure exacte.



Voyons comment cela fonctionne et écrivons un décodeur en Python.

Il existe différents systèmes de synchronisation horaire. Le plus populaire en Europe est le système allemand DCF-77 , le Japon a son propre système JJY , les États-Unis ont le système WWVB , etc. De plus, l'histoire portera sur le DCF77, le plus pertinent et disponible pour la réception dans certains endroits de la partie européenne de la Russie et des pays voisins (les résidents de l'Extrême-Orient peuvent avoir l'opinion contraire, mais ils peuvent à leur tour recevoir et analyser le signal japonais).

Tout ce qui est écrit ci-dessous concernera DCF77.

Réception du signal


DCF77 est une station à ondes longues fonctionnant à une fréquence de 77,5 KHz et transmettant des signaux en modulation d'amplitude. La station d'une capacité de 50 kW est située à 25 km de Francfort, elle a commencé à fonctionner en 1959, en 1973 la date a été ajoutée à l'heure exacte. La longueur d'onde à une fréquence de 77KHz est très grande, donc les dimensions du champ d'antenne sont également très décentes (photo de Wikipedia):



Avec une telle antenne et une telle entrée d'alimentation, la zone de réception couvre presque toute l'Europe, la Biélorussie, l'Ukraine et une partie de la Russie.



Tout le monde peut enregistrer un signal. Pour ce faire, allez simplement sur le récepteur en ligne http://websdr.ewi.utwente.nl:8901/ , sélectionnez la fréquence à 76,5 KHz et la modulation USB. Une image de quelque chose comme ça devrait s'ouvrir:



Là, nous appuyons sur le bouton de téléchargement et enregistrons un fragment de plusieurs minutes. Bien sûr, si vous avez un "vrai" récepteur capable d'enregistrer une fréquence de 77,5 KHz, vous pouvez l'utiliser.

Bien sûr, lorsque nous recevons des signaux radio de l'heure exacte via Internet, nous n'obtiendrons pas une heure vraiment précise - le signal est transmis avec un retard. Mais notre objectif n'est que de comprendre la structure du signal; pour cela, l'enregistrement sur Internet est plus que suffisant. Dans la vie réelle, bien sûr, des appareils spécialisés pour la réception et le décodage sont utilisés, ils seront discutés ci-dessous.

Donc, nous avons le dossier, commençons à le traiter.

Décodage du signal


Téléchargez le fichier en utilisant Python et voyez sa structure:
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() 

Nous voyons une modulation d'amplitude typique:



Pour simplifier le décodage, nous prenons l'enveloppe du signal en utilisant la transformée de Hilbert:

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

Résultat dans une vue agrandie:



Nous lissons les émissions des interférences à l'aide d'un filtre passe-bas, en même temps que nous calculons la valeur moyenne, il sera utile plus tard pour l'analyse.

 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 

Résultat (ligne jaune): un signal presque rectangulaire assez facile à analyser.



Analyse


Vous devez d'abord obtenir la séquence de bits. La structure du signal elle-même est très simple.



Les impulsions sont divisées en deuxièmes intervalles. Si la distance entre les impulsions est de 0,1 s (c'est-à-dire que la longueur de l'impulsion elle-même est de 0,9 s), ajoutez «0» à la séquence de bits, si la distance est de 0,2 s (c'est-à-dire que la longueur est de 0,8 s), ajoutez «1». La fin de chaque minute est indiquée par une impulsion «longue» de 2 secondes, la séquence de bits est remise à zéro et le remplissage recommence.

Ce qui précède est facile à écrire 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 

En conséquence, nous obtenons une séquence de bits, dans notre exemple pendant deux minutes, cela ressemble à ceci:

0011110110111000001011000001010000100110010101100010011000
0001111100110110001010100001010000100110010101100010011000


Soit dit en passant, il est intéressant de noter qu'il existe une «deuxième couche» de données dans le signal. La séquence de bits est également codée à l'aide de la modulation de phase . Théoriquement, cela devrait fournir un décodage plus stable même dans le cas d'un signal affaibli.

Notre dernière étape: obtenir les données réelles. Les bits sont transmis une fois par seconde, nous n'avons donc que 59 bits, dans lesquels beaucoup d'informations sont codées:



Les morceaux sont décrits sur Wikipédia , et ils sont assez curieux. Les 15 premiers bits ne sont pas utilisés, bien qu'il soit prévu de les utiliser pour les systèmes d'alerte et la protection civile . Le bit A1 indique que dans l'heure suivante, l'horloge sera réglée sur l'heure d'été. Le bit A2 indique qu'une seconde supplémentaire sera ajoutée dans l'heure suivante, qui est parfois utilisée pour corriger l'heure en fonction de la rotation de la Terre. Les bits restants codent les heures, les minutes et la date.



Pour ceux qui veulent expérimenter par eux-mêmes, le code de décodage est donné sous le spoiler.

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


En exécutant le programme, nous verrons quelque chose comme ceci:

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


En fait, tout cela est magique. L'avantage d'un tel système est que le décodage est extrêmement simple et peut être effectué sur n'importe quel microcontrôleur le plus simple. Il suffit de compter la longueur des impulsions, d'accumuler 60 bits et à la fin de chaque minute, nous obtenons l'heure exacte. Par rapport à d'autres méthodes de synchronisation de l'heure (GPS, par exemple, ou Dieu ne plaise, Internet :), une telle synchronisation radio ne nécessite pratiquement pas d'électricité - par exemple, une station météo domestique ordinaire fonctionne pendant environ un an avec 2 piles AA. Par conséquent, même une montre-bracelet est réalisée avec une synchronisation radio, sans parler bien sûr, d'un mur ou d'une station de rue.

La commodité et la simplicité de DCF attirent les amateurs de produits faits maison. Pour seulement 10-20 $, vous pouvez acheter un module prêt à l'emploi à partir d'une antenne avec un récepteur prêt à l'emploi et une sortie TTL, qui peut être connecté à un Arduino ou à un autre contrôleur.



Pour Arduino, des bibliothèques prêtes à l'emploi ont déjà été écrites. Cependant, il est déjà connu que peu importe ce que vous faites sur le microcontrôleur, vous obtenez une horloge ou une station météo. Avec un tel appareil, obtenir l'heure exacte est vraiment facile, à condition d'être dans la zone de réception. Eh bien, vous pouvez accrocher l'inscription "Horloge atomique" sur la montre, et en même temps expliquer à tous ceux qui le souhaitent, que l'appareil est vraiment synchronisé à l'aide d'une horloge atomique.

Ceux qui le souhaitent peuvent même mettre à niveau les montres de leur ancienne grand-mère en y installant un nouveau mécanisme avec synchronisation radio:



Vous pouvez en trouver un sur ebay en utilisant les mots clés "Mouvement radiocommandé".

Et enfin, un hack de vie pour ceux qui ont lu ici. Même s'il n'y a pas un seul émetteur d'un signal radio dans les deux mille kilomètres suivants, un tel signal est facile à générer indépendamment. Google Play possède un programme appelé "DCF77 Emulator" qui émet un signal vers le casque. Selon l'auteur, si vous enroulez le fil du casque autour de la montre, ils attraperont un signal (je me demande comment, car les écouteurs ordinaires ne donneront pas de signal à 77 kHz, mais la réception provient probablement des harmoniques). Mon programme ne fonctionnait pas du tout sur Android 9 - il n'y avait tout simplement pas de son (ou peut-être que je ne l'ai pas entendu - 77 kHz, après tout :), mais peut-être que quelqu'un aura plus de chance. Certains, cependant, se font un générateur de signaux DCF à part entière, ce qui est facile à faire sur le même Arduino ou ESP32:


(source sgfantasytoys.wordpress.com/2015/05/13/synchronize-radio-controlled-watch-without-access )

Conclusion


Le système DCF s'est avéré vraiment très simple et pratique. Avec l'aide d'un récepteur simple et bon marché, vous pouvez avoir l'heure exacte à tout moment, n'importe où, bien sûr, dans la zone de réception. Il semble que même en dépit de la numérisation généralisée et de «l'Internet des objets», de telles solutions simples seront en demande pendant longtemps.

Source: https://habr.com/ru/post/fr445470/


All Articles