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 :

pi@raspberrypi:~ $ sudo apt-get install ntp

Configurer ntp

Ouvrez le fichier ntp.conf

pi@raspberrypi:~ $ sudo nano /etc/ntp.conf

Repérez les lignes commençant par pool

# pool.ntp.org maps to about 1000 low-stratum NTP servers. Your server will
# pick a different set every time it starts up. Please consider joining the
# pool: <http://www.pool.ntp.org/join.html>
#pool 0.debian.pool.ntp.org iburst
#pool 1.debian.pool.ntp.org iburst
#pool 2.debian.pool.ntp.org iburst
#pool 3.debian.pool.ntp.org iburst

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 :

#GPS TIME SOURCE
server 127.127.28.0 minpoll 4 maxpoll 4
fudge 127.127.28.0 refid GPS

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

sudo service ntp restart

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

ntpq -p

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 :

sudo nano /etc/systemd/system/gpsd.service

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

[Unit]
Description=GPS (Global Positioning System) Daemon
Requires=gpsd.socket
# Needed with chrony SOCK refclock
After=chronyd.service

[Service]
EnvironmentFile=-/etc/default/gpsd
EnvironmentFile=-/etc/sysconfig/gpsd
ExecStart=/usr/sbin/gpsd -N $GPSD_OPTIONS $DEVICES

[Install]
WantedBy=multi-user.target
Also=gpsd.socket

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:

sudo systemctl daemon-reload
sudo systemctl reenable gpsd.service

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.

6 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

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.