Publié le 16 mars 2020 - par

L’heure GPS sur votre Raspberry Pi

Le GPS est basé sur l’utilisation d’horloges atomiques (très précises). Le satellite envoie un message de navigation et les éphémérides permettant de calculer la position du satellite. Le récepteur enregistre l’heure de réception, ce qui lui permet de calculer sa position dès lors qu’il reçoit au moins 3 satellites. L’information horaire peut également être utilisée pour fournir l’heure à un système informatique via le protocole NTP.

Offrez l’heure GPS à votre Raspberry Pi

Objectif de cette réalisation

Mon but est de disposer d’une source d’heure utilisable avec un Raspberry Pi “isolé”, c’est à dire sans possibilité de se connecter à un réseau. Le GPS est un moyen de lui fournir une heure précise sans avoir recours à une carte RTC équipée d’une pile. L’idée est de fournir l’heure à un Raspberry Pi chargé de fournir des données à un émetteur LoRa.

Principe du GPS

Principe du GPS

Source 3grt.fr

Le GPS comprend au moins 24 satellites en orbite à 20 200 km d’altitude. Ils se répartissent sur 6 orbites distinctes à raison de 4 satellites par orbite. Ces satellites émettent en permanence sur deux fréquences L1 (1 575,42 MHz) et L2 (1 227,60 MHz) modulées en phase (BPSK) par un ou plusieurs codes pseudo-aléatoires, datés précisément grâce à leur horloge atomique, et par un message de navigation. Ce message, transmis à 50 bit/s, inclut en particulier les éphémérides permettant le calcul de la position des satellites, ainsi que des informations sur leur horloge interne.
Ainsi, un récepteur GPS qui capte les signaux d’au moins quatre satellites équipés de plusieurs horloges atomiques peut, en calculant les temps de propagation de ces signaux entre les satellites et lui, connaître sa distance par rapport à ceux-ci et calculer précisément sa position en trois dimensions avec une précision de 3 à 50 mètres pour le système standard. (source Wikipedia)

Matériel et logiciels utilisés

Pour tester ce GPS j’ai utilisé

  • Un Raspberry Pi 4 4Go
  • Une carte microSD Sandisk 16Go classe 10 – A1
  • La version de Raspbian disponible au 11 mars 2020
  • Installation avec Raspberry Pi Imager + Mise à jour

Installation du service gpsd

L’article Un GPS USB pour le Raspberry Pi explique comment connecter le GPS au Raspberry Pi, et vérifier son fonctionnement. Merci de vous y reporter.

L’installation du démon gpsd a également été vue dans l’article précédent. Vérifiez avec gpsmon que le démon fonctionne bien et fournit les informations attendues.

Une fois tout ceci vérifié, on dispose d’une source d’informations GPS consultable sur le port 2947.

ntp : c’est quoi ?

NTP est un protocole qui permet de synchroniser, via un réseau informatique, l’horloge locale d’ordinateurs sur une référence d’heure.NTP prévoit une architecture arborescente avec des niveaux de serveurs horaires. Le niveau 1 (stratum 1) est connecté à une/des horloges(s) atomique(s). Les serveurs de strate 2 utilisent cette référence de strate 1 et ainsi de suite. (source Wikipedia)

Installer ntp

ntp est disponible sur les dépôts Raspbian. Son installation est donc simplifiée :

Configurer ntp

Ouvrez le fichier ntp.conf

Repérez les lignes commençant par pool

Mettez les lignes ci-dessus en commentaire (ajoutez un # au début) puisque nous ne souhaitons pas que le Raspberry Pi se mette à l’heure sur Internet.

On va maintenant indiquer à ntp d’utiliser les informations provenant du GPS. Ajouter à la fin du fichier les lignes suivantes :

Sauvegardez le fichier et quittez (CTRL X) puis relancez ntp :

On peut maintenant vérifier que notre modification a bien été prise en compte avec la commande:

Le terminal doit afficher une ligne commençant par *SHM(0)  .GPS.

L’étoile en début de ligne indique que le GPS a été reconnu pair (peer) du système et qu’il fournit ses données au système. Ici j’ai lancé à plusieurs reprises ntpq -p, et on voit que la zone reach augmente de 7 à 37. Ceci signifie que le tampon circulaire se remplit avec des paquets NTP.

Lorsque le tampon est plein, reach affiche … 377 ! Bizarre non ? Pas tant que ça, puisque les développeurs ont choisi d’afficher cette valeur en octal 🙂 Et 377 en octal… ça fait 255 en décimal ou 0xFF en hexadécimal et même 111111111 en binaire.

Supposons que lors de la prochaine lecture de serveur NTP, un paquet soit perdu. (Comme NTP est un protocole basé sur l’UDP sans garantie de livraison, ce n’est pas nécessairement inquiétant). Mais le démon NTP enregistre consciencieusement cet échec dans le tampon circulaire et attend la prochaine période de sondage. Le journal contient maintenant 11111110 et une valeur de champ de portée de 376.

Exécuter gpsd au démarrage

Si gpsd est bien lancé au démarrage du système, il reste en sommeil. Il ne se lancera que si un logiciel en fait la demande. C’est fait pour économiser les ressources du Raspberry Pi, mais dans notre cas, c’est embêtant car aucune donnée GPS (dont l’heure) ne sera accessible tant qu’aucune application n’aura fait appel à gpsd. Vous allez me dire que  NTP se sert de gpsd.  C’est vrai mais… Il n’utilise pas directement gpsd ! Il pioche dans sa mémoire partagée, et donc il ne lance pas le service lui-même. Du coup, tant que vous n’avez pas lancé opencpn, gpsmon, navit ou, n’espérez pas obtenir de synchronisation horaire.

La solution on la trouve sur le site du créateur de gpsd (https://gpsd.gitlab.io/gpsd/ section Troubleshooting Start at Boot ) : Il faut créer un nouveau fichier de configuration pour gpsd pour le forcer à se lancer au démarrage, même si aucun programme ne fait appel à lui :

Créer le fichier gpsd.service et collez les lignes ci-dessous dans le fichier.

Enregistrez le fichier (CTRL X). La ligne vraiment importante de ce fichier c’est ExecStart qui active gpsd.

Pour prendre ce service en compte on redémarre les services avec la nouvelle configuration:

On redémarre ensuite le Raspberry Pi, et normalement, tout fonctionne ! Vous pouvez tester successivement en lancant gpsmon et ntpq -p pour voir si tout va bien.

L’heure devrait se recaler après un court moment d’attente.

Est-ce parfait ?

Offset et Jitter

Cette solution ne nécessite pas de connexion à Internet. Le mieux pour le récepteur GPS est d’avoir une vue sur le ciel, par exemple à proximité d’une fenêtre. Si vous disposez d’un récepteur GPS Bluetooth vous pourrez éventuellement placer le récepteur à l’extérieur. Avec ce serveur vous pourrez aussi fournir l’heure aux autres machines de votre réseau. Avec ce modèle de GPS ce ne sera parfait. Le mieux est un GPS fournissant un signal PPS (Pulse par Seconde) qui permet d’obtenir une base de temps juste, ce qui n’est pas le cas des modèles classiques. De plus les infos de notre GPS transitant par le port USB subissent des avances/retards aléatoire…

On voit sur cette sortie que l’offset* est à 0.8 mS et le jitter* à 0.9 mS. Généralement on tourne entre + et – 2 mS, ce qui est parfaitement suffisant pour la majorité des projets, qui ne demandent pas une précision de l’ordre de la milliseconde.

* Jitter ou gigue NTP : c’est une mesure de la variance de la latence sur le réseau. Si la latence sur le réseau est constante, il n’y a pas de gigue.

* Offset ou décalage : c’est la différence d’heure entre notre serveur et le serveur de synchronisation ; une valeur positive signifie que notre horloge est trop rapide, une valeur négative signifie qu’elle est trop lente.

A part au démarrage où on a un offset de 10ms, ensuite la valeur se stabilise et reste pratiquement entre 0 et 2 mS.

Et sur une durée plus longue, de 15h à minuit on voit que l’offset reste raisonnable.

Précision de l’horloge

On distingue plusieurs heures :

  • L’heure locale est la date/heure indiquée par votre PC.
  • L’heure UTC, Temps universel coordonné, communément appelé GMT (Greenwich Mean Time), ou heure zoulou. L’heure locale diffère de l’heure UTC du nombre d’heures de décalage de votre fuseau horaire.
  • L’heure GPS, (Global Positioning System time), est l’échelle de temps atomique mise en œuvre par les horloges atomiques des stations de contrôle au sol du GPS et les satellites GPS eux-mêmes. Le temps GPS a pour référence 0h le 6 Janvier 1980 et comme il n’est pas modifié par les secondes intercalaires, l’heure GPS est actuellement en avance de 18 secondes sur l’heure UTC.

On voit donc que l’heure fournie par le GPS n’est pas l’heur officielle. Après pour horodater les infos d’un Raspberry Pi isolé c’est souvent très suffisant 🙂 C’est vous qui voyez.

 

Sources

 

Share Button

À propos François MOCQ

Électronicien d'origine, devenu informaticien, et passionné de nouvelles technologies, formateur en maintenance informatique puis en Réseau et Télécommunications. Dès son arrivée sur le marché, le potentiel offert par Raspberry Pi m’a enthousiasmé j'ai rapidement créé un blog dédié à ce nano-ordinateur (www.framboise314.fr) pour partager cette passion. Auteur de plusieurs livres sur le Raspberry Pi publiés aux Editions ENI.

19 réflexions au sujet de « L’heure GPS sur votre Raspberry Pi »

  1. Ping : L’heure GPS sur votre Raspberry Pi – Framboise 314, le Raspberry Pi à la sauce française…. – Jhc Info

  2. Stéphane

    Salut,

    J’ai tenté plusieurs installations avec des récepteurs gnss et de l’utiliser pour synchroniser l’heure du raspberry. Pour ma part, j’ai fini par laisser tomber ntpd qui mettait beaucoup trop de temps à synchroniser, pour basculer sur chrony, qui a l’air d’être plus adapté pour des systèmes isolés de l’internet. Il a en tout cas l’avantage de resynchroniser l’horloge du Pi beaucoup plus rapidement, en fait “sauter” l’horloge à la bonne valeur plutôt qu’en l’accélérant pour rattraper progressivement le décalage.
    https://chrony.tuxfamily.org/

    Par contre, pour ceux qui utilisent du PPS, les instructions les plus courantes semblent erronées au sujet des connexion pps en “sock”. Un article qui m’a aidé :
    https://medium.com/@srfilipek/chronos-a-stratum-1-time-server-e7a89cd808bc

    Répondre
      1. Larget Gérard

        Bonjour,
        La Startup dans laquelle je travaille est spécialisée dans les systemes de synchronisation horaire de précision et de grande sécurité.
        En effet aujourd’hui un probleme de taille existe sur la synchronisation des serveurs ou applications par les satellites GNSS en raison de brouillage et de leurrage de ceux-ci étant
        constaté de plus en plus régulièrement dans des parutions d’articles sur le sujet.
        C’est pour cela que SCPTime® met en oeuvre une infrastructure et un service de diffusion de l’heure légale du pays avec un signal horaire Sécurisé Certifié Précis et Traçable.
        Un réseau de diffuseurs certifiés proposent ce nouveau service par des abonnements.
        SÉCURISÉ CERTIFIÉ PRÉCIS TRAÇABLE
        SCPTime® offre une solution globale de synchronisation horaire pour vos réseaux et équipements.
        Le fondement de la synchronisation horaire SCPTime® est la réponse aux enjeux soulevés par la fulgurante numérisation des échanges : cybersécurité et traçabilité deviennent des maîtres-mots.
        La distribution de l’heure SCPTime® est certifiée légale, sécurisée, traçable et précise selon votre utilisation.
        Cordialement
        Gérard
        http://www.scptime.com

        Répondre
        1. François MOCQ Auteur de l’article

          Merci Gérard
          là on est quand même sur une solution professionnelle …
          ici l’article est plutôt à destination des makers qui souhaitent mettre à l’heure une installation à base de Raspberry Pi non connectée à Internet.
          Mais votre solution peut intéresser des entreprise.
          Cdt
          François

          Répondre
  3. Erwann

    Chrony “a en tout cas l’avantage de resynchroniser l’horloge du Pi beaucoup plus rapidement, en fait “sauter” l’horloge à la bonne valeur plutôt qu’en l’accélérant pour rattraper progressivement le décalage.”

    Attention, l’objectif de ntp est d’être strictement monotone (pas de saut en arrière) et de synchroniser le système progressivement, excepté lors du boot.
    ntp n’est pas lent mais a justement été conçu pour assurer une “stabilité” du temps.
    C’est en particulier critique pour des systèmes temps réel (automatisation).

    C’est d’ailleurs pour cette raison, que les systèmes automatisés basés sur Windows ne doivent pas utiliser “windows.time.protocol” (qui n’est pas monotone) mais préférer ntp.

    Le problème causé par la solution proposée est que le système a déjà booté lors du premier appel à gpsd, ce qui empêche le système de synchroniser “brutalement” lors de la première synchro au démarrage.

    Répondre
    1. Didier B

      Bonjour, mon besoin est basique : mettre l(horloge du CPU à l’heure.
      Je n’arrive pas à faire fonctionner ntp de façon stable, et souhaite tester chrony …
      Où puis-je trouver des infos sur sa mise en œuvre ?
      Merci d’avance

      Répondre
        1. Didier B

          Bonjour, j’ai tenté uns install de chrony, mais je bute dès la 2 ème ligne :
          sudo systemctl enable chronyd, qui me répond too many xyz ?
          A creuser plus tard …

          Répondre
  4. Didier b

    Bonjour,
    gpsmon fonctionne, mais ntpq -p n’a fonctionné qu’une fois ! J’ai pourtant contrôlé ntp.conf

    J’ai arrété puis relancé gpsd service & ntp service sans plus de succès …

    Répondre
    1. Didier B

      petit UP
      Ooops, il y avait du shimmy dans le buster ! (impossible de changer l’image de fond du bureau …)
      Refait la SD avec rpi imager (parfait !) repris les étapes des 2 articles sur le GPS, et c’est tip-top !

      Répondre
      1. Didier B

        hélas, après un reboot ntpq -p ne donne pas le résultat attendu (pas d’* !)
        Si quelqu’un peut aider à éclaircir ce mystère …

        Répondre
  5. Didier B

    A l’aide !
    J’ai bien installé et configuré ntp, et mon RPi s’est bien mis à l’heure. Youpe !
    Vérifiction par une série de démarrage : c’est OK.
    Le lendemain cela ne fonctionne plus : plus de mise à jour de l’heure machine !
    La commande ntpq -p n’affiche plus l’étoile et la valeur “reach” reste désespérément à 0 !
    Là je sèche ! Si quelqu’un peut m’aider je suis preneur…

    Répondre
    1. François MOCQ Auteur de l’article

      bonjour Didier
      désolé aucune idée ici ça fonctionne…
      je pense que vous avez testé une re install?
      l’article date de Mars 2020 depuis l’OS a changé… peut etre la cause ?
      cdt
      françois

      Répondre
      1. Didier B

        C’est tombé en marche ! j’ai fait une SD qui fonctionne. J’arrive même à les dupliquer avec SD card copier, car win10 refuse de les détecter … donc impossible de les dupliquer avec win32diskimager … Dommage, l’USB 3.0 est pourtant plus rapide que le lecteur SD
        Raspberry ! Ne me demandez pas ce que j’ai fait pour cela !

        Répondre
  6. Didier B

    Décitément ntp est totalement instable :!
    Après une application du tuto pas à pas, tout fonctionne, même après reboot et extinction du Pi !
    Le lendemain, ou qq heures plus tard, patatras, plus de mise à lheure, et l’étoile est absente de la réponse à : ntpq -p.
    J’ai trouvé plusieurs fois les 3 dernières lignes duppliquées dans /etc/ntp.conf ! (bizare non ?)
    Mais corriger ce fichier n’a pas suffi. Voici ce que je dois faire pour (tenter de) rétablir la situation :
    sudo apt remove –purge ntp
    sudo apt install ntp
    Editer le ficheier etc/ntp.conf
    sudo service ntp restart
    sudo systemctl daemon-reload
    sudo systemctl reenable gpsd.service
    sudo reboot
    … et c’est reparti … jusqu’au lendemain !

    Ma version de Raspbian :
    cat /etc/os-release
    PRETTY_NAME=”Raspbian GNU/Linux 10 (buster)”
    NAME=”Raspbian GNU/Linux”
    VERSION_ID=”10″
    VERSION=”10 (buster)”
    VERSION_CODENAME=buster
    ID=raspbian
    ID_LIKE=debian

    Toute suggestion sera la bienvenue, je suis à cours d’idée…

    Répondre
  7. Didier B

    Ce matin, re-belote, plus moyen de tirer quelquechose de ce Grrrr. ntp !
    Ma seule chance de progresser est que le bug réside dans le fichier /etc/ntp.conf …
    Armé de toute mon incompétence j’ai joué les apprentis sorciers en l’élaguant sauvagement, après remove –purge et ré-install de ntp !

    Voici ce qu’il en reste :
    =====================================================================
    L1 leapfile /usr/share/zoneinfo/leap-seconds.list
    L2 disable auth
    L3 broadcastclient
    L4 #GPS TIME SOURCE
    L5 server 127.127.28.0 minpoll 4 maxpoll 4
    L6 fudge 127.127.28.0 refid GPS
    =====================================================================
    note L1- Laissé cela car j’ignore tout des “leap-seconds” !
    note L2 L3 :
    # If you want to listen to time broadcasts on your local subnet, de-comment the
    # next lines. Please do this only if you trust everybody on the network!
    # OUI, OUI OUI !
    Là – dessus :
    sudo service ntp restart
    ntpq -p (OK, l’étoile est là !)
    sudo reboot

    Bon, je propage sur mes 5 SD, et donnerai des nouvelles demain. Quel feuilleton !

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP * Time limit is exhausted. Please reload CAPTCHA.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.