|
Mise à l'heure des horloges
RTC
|
|
|
Maj : 15/01/22
Abstract :
The synchronisation problem of RTC (Real Time Clock), when many automatons are in the same environement and must to have exactly the same time to work in phase.
Résumé :
Le problème de synchronisation de RTC (Real Time Clock), lorsque de nombreux automates sont dans le même environnement et doivent avoir exactement le même temps pour fonctionner en phase. |
Multiplicité des horloges
Nous sommes entourés d’horloges dans la vie, et dans l’environnement Arduino, il existe de multiples.
Quand on s’amuse à en mettre quelques-unes, différentes ou non, sur divers automates en les calant initialement simultanément sur la même heure et que l’on relève les écarts dans le temps sur des courbes, on s’aperçoit qu’elles vivent leur vie et partent dans tous les sens (bien évidemment, chaque chip est strictement dans le même environnement à la même température pour le test).
La question est alors « quelle est celle qui donne la bonne heure ? »
La réponse est aucune, mais avec quelques précautions on peut arriver à gérer un parc de manière à peu près cohérente avec une heure relativement identique pour chaque automate.
Il faut toutefois garder son calme, si l’on ne gère que quelques automates pour enregistrer divers paramètres (par exemple météorologiques en domotique), la précision de l’horloge n’est pas très importante, car les événements sont lents et ne sont enregistrés que toutes les quelques minutes, il n’y a pas vraiment de problème de synchronisation.
La RTC incontournable : DS3231
La RTC (Real Time Clock) DS3231 est une horloge I2C à prix dérisoire. Elle est incontournable et possède toutes les qualités de stabilité. Elle sera utilisée dans tous les montages. D’origine elle est associée à une petite EEprom 24c32, qu’il est préférable de remplacer pour une de plus grosse capacité, une 24c1024 coûte maintenant moins d’un $ et permet de stocker de grosses bases de données.
Au début j’ai écrit toute la gestion de la RTC à la main, sans vouloir utiliser une bibliothèque. Cela revenait toutefois à réinventer l’eau tiède, qui est comme il faut le rappeler, un chef d’œuvre d’ingénierie consistant à mélanger en parte égales de l’eau froide avec de l’eau chaude.
D’autres avaient beaucoup travaillé sur ce composant, et ont créé une multitude de bibliothèques en particulier déposées dans Github.
Il y a toutefois un problème, quel driver choisir dans cette abondance ?
Je n’ai pas réussi à me stabiliser, et à chaque nouveau projet j’en teste un de différent, ce qui est une catastrophe pour la maintenance.
Aucun n’est parfait, tous ont des bugs ou des manques, certains sont abandonnés sans mise à jour depuis des années (ce qui ne signifie pas qu’ils avaient atteint la perfection !), d’autres sont des « forks, » reprises d’un ancien travail et plus ou moins maintenus.J’ai tendance maintenant à privilégier les bibliothèques Adafruit qui sont maintenues.
C’est ma quête du Graal… |
|
Mise à l’heure des horloges
Pour mettre à l’heure une horloge temps réel, nous disposons de bien des manières !
Avec un seul automate, la précision de la RTC, n’est pas très importante, mais quand on a une dizaine d’automates autour de soi qui font un petit « Bip » à chaque heure entière, le moindre écart d’une fraction de seconde crée une cacophonie inacceptable.
La DS3231 est très précise, mais il faut la caler exactement et la recaler de temps en temps.
Dans un premier temps, nous allons rappeler quelques méthodes, chacune donnant une heure légèrement différente en fonction des retards de traitement.
Après ces mises à l’heure individuelles d’un ensemble d’automates, en manuel ou en automatique, des écarts de plusieurs secondes seront constatés, car l’on ne sait pas précisément quand la chaîne sera traitée en fonction de l’exécution du programme en cours.
Le comportement de la DS3231 est parfois étrange. Toutes les horloges bien calées peuvent rester très stables un certain temps, mais sans raison apparente se mettent brutalement à glisser érotiquement. C’est pour cela qu’il faut les recaler périodiquement
Nous verrons ensuite comment tout aligner avec grande précision sur la référence commune par la méthode du <TOP 30> |
|
Quelques moyens de mise à l’heure
La liste n’est pas exhaustive, ce ne sont que les techniques les plus courantes.
Mise à l’heure en dur dans la compilation
Chaque fois que l’on appui sur <RESET> sur une carte Arduino ou sur <EN> avec un ESP32, la ligne en tout début de programme s’exécute.
// Exemple avec bibliothèque : www . jarzebski. pl
rtc.setDateTime (2019, 07, 10, 20, 53, 0) ; // Set the date to YYYY, MM, DD, HH, MM, SS
Il faut corriger la ligne, recompiler et recharger si l’on a trop d’écart (Correction précise par la méthode du <Top>).
Une fois satisfait par l’heure lue, il faut commenter la ligne et recompiler et recharger.
C’est une méthode lourde, peu pratique si l’on a beaucoup d’automates à régler. |
|
Mise à l’heure automatique très approximative par l’heure du PC au moment de la compilation
rtc.setDateTime(__DATE__, __TIME__); // Set sketch compiling time
Idem, commenter, recompiler…
Cette méthode a un défaut, l’heure indiquée par la suite a environ systématiquement 13 secondes de retard sur la pendule du PC, car _TIME_ est calculé en début du processus de compilation bien avant le transfert du programme puis le Reset.
Méthode pitoyable pour corriger : Avant la compilation, avancer l’heure du PC de 13 s, puis rétablir après transfert (j’ai honte…).
Suivant les équipements dont dispose l’automate, tout est possible !
Mise à l’heure par le port série
En faisant reconnaître une commande comportant tous les paramètres de temps ou individuellement pour ajuster un registre pour peu que l’horloge soit déjà lancée.
C’est une très mauvaise méthode, car un fil long relie tous les automates, c’est une antenne qui récupère tous les parasites de commutation secteur et plante les automates.
Mise à l’heure par le GPS
Via la chaîne texte en NMEA183, mais c'est long en série.
Mise à l’heure par un serveur de temps en WiFi + Ethernet
Serveur NTP par WiFi. C’est la meilleure solution (si l’on est à proximité d’une box ou d’un téléphone en partage de connexion). Un petit module 8266 ou un ESP32 sont parfaits. Le très bon exemple « simple time » du ESP32 montre comment se connecter à un serveur de temps. |
|
Mise à l’heure par balise Bluetooth depuis une application smartphone
L’heure du smartphone est maintenue précisément par le réseau, mais le dialogue est délicat à gérer pour maîtriser les temps de réponses, peu utilisé.
Mise à l’heure par un module récepteur DCF77
Il y a beaucoup de documentation sur le sujet de l’émetteur Allemand <DCF77> (proche de Francfort) et son décodage est très intéressant pour débuter en Arduino.
Des petits modules avec barreau de ferrite sortent directement les trames à exploiter.
C’est le système utilisé dans les montres et les pendules de table à une dizaine d’Euros.
Mise à l’heure manuelle par tops radio en décamétrique ou sur France Inter en FM
Méthode très ancienne, bien avant l’Internet, mais toujours efficace bien que soumise aux aléas de la propagation.
Du temps de la navigation au sextant, les tops décamétriques nous permettaient d’aligner la pendule du bord pour les calculs astronomiques dans toutes les mers du monde.
Cela reste parfaitement exploitable. |
|
Etc..
Les méthodes de synchronisation par modules de réception Aurel en 432 MHz ou par infra-rouge ont posé trop de problèmes pour être validées.
Je n’ai pas trouvé mieux simplement.
Méthode du <TOP 30>
Il faut avoir prévu sur chaque carte un poussoir qui active une ligne d’interruption dédié au recalage horaire.
Un premier appui arme un timer qui autorise pendant 30 secondes l’interprétation d’un deuxième appui pour réaligner le temps.
Il ne faut pas se recaler sur la seconde zéro, cela complique inutilement le programme s’il faut avancer, passer par exemple de la seconde 59 à la seconde zéro suivante, implique de gérer les minutes, heures, jour, mois, an, ce qui est pénible.
Le top sera pris sur la seconde <30>, en effet, il n’y aura que les secondes à gérer, on lit l’heure actuelle, on remplace les secondes par 30 et on écrit la nouvelle chaîne, puis on relit plusieurs fois en boucle la RTC en affichant l’heure avec un bip aux 10 secondes entières pour vérifier.
On recommence jusqu’au résultat parfait.
Avec un peu d’entraînement, le calage se fait à mieux que le dixième de seconde.
Connexion physique
Déjà évoque avec la RS232. Si plusieurs automates sont proches, même en blindant le fil découplé avec des filtres pour éviter de ramasser tous les parasites secteur qui provoqueront des déclenchements intempestifs à chaque manœuvre d’un interrupteur dans la maison, il y a trop de plantages. Cela ne marche évidemment pas pour les automates isolés. J’ai fini par renoncer à cette méthode trop incertaine avec une liaison permanente.
Conclusion
Jouer au maître du temps n’est pas simple quand on doit gérer un nombre important d’automates. Il faut se choisir une référence de temps fiable et s’y tenir pour harmoniser son parc de RTC.
Toutes les références sont calées à l’identique avec une précision extraordinaire sur des horloges atomiques, mais suivant la méthode utilisée, l’heure récupérée ne sera pas exactement la même en fonction des retards que nous amènerons dans l’exploitation du signal.
Il faut donc aussi bien fixer une méthode commune pour tous, cela peut demander une petite correction négative du résultat qui sera constante pour tous.
Plus on recherchera une grande précision et homogénéité des valeurs, plus les problèmes seront délicats à régler.
La connaissance du temps a préoccupé les savants depuis l’antiquité, à terre, le cadran solaire était très précis, mais les cierges gradués, les sabliers et clepsydres étaient bien trop imprécis pour connaître l’heure en mer, indispensable pour calculer sa position.
Les remarquables horloges de marine ont apporté un début de solution, puis le quartz et les formidables horloges atomiques ont maintenant parfaitement résolu ce problème majeur. |
|
|
© Christian Couderc 1999-2024 Toute
reproduction interdite sans mon autorisation
* Page vue 20535 fois IP : 18.116.52.43
Dernière retouche le 15 Janvier 2022 à 09 h