You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/fr/3-transport/lessons/1-location-tracking/pi-gps-sensor.md

9.0 KiB

Lire les données GPS - Raspberry Pi

Dans cette partie de la leçon, vous allez ajouter un capteur GPS à votre Raspberry Pi et lire les valeurs qu'il fournit.

Matériel

Le Raspberry Pi nécessite un capteur GPS.

Le capteur que vous utiliserez est un capteur Grove GPS Air530. Ce capteur peut se connecter à plusieurs systèmes GPS pour obtenir une localisation rapide et précise. Le capteur est composé de deux parties : l'électronique principale du capteur et une antenne externe reliée par un fil fin pour capter les ondes radio des satellites.

C'est un capteur UART, il envoie donc les données GPS via UART.

Connecter le capteur GPS

Le capteur GPS Grove peut être connecté au Raspberry Pi.

Tâche - connecter le capteur GPS

Connectez le capteur GPS.

Un capteur GPS Grove

  1. Insérez une extrémité d'un câble Grove dans la prise du capteur GPS. Il ne peut être inséré que dans un seul sens.

  2. Avec le Raspberry Pi éteint, connectez l'autre extrémité du câble Grove à la prise UART marquée UART sur le Grove Base Hat attaché au Pi. Cette prise se trouve sur la rangée du milieu, du côté le plus proche du slot pour carte SD, à l'opposé des ports USB et de la prise Ethernet.

    Le capteur GPS Grove connecté à la prise UART

  3. Positionnez le capteur GPS de manière à ce que l'antenne attachée ait une visibilité sur le ciel - idéalement près d'une fenêtre ouverte ou à l'extérieur. Il est plus facile d'obtenir un signal clair sans obstacle devant l'antenne.

Programmer le capteur GPS

Le Raspberry Pi peut maintenant être programmé pour utiliser le capteur GPS connecté.

Tâche - programmer le capteur GPS

Programmez l'appareil.

  1. Allumez le Pi et attendez qu'il démarre.

  2. Le capteur GPS dispose de 2 LED : une LED bleue qui clignote lorsque des données sont transmises, et une LED verte qui clignote toutes les secondes lorsqu'il reçoit des données des satellites. Assurez-vous que la LED bleue clignote lorsque vous allumez le Pi. Après quelques minutes, la LED verte devrait clignoter - si ce n'est pas le cas, vous devrez peut-être repositionner l'antenne.

  3. Lancez VS Code, soit directement sur le Pi, soit en vous connectant via l'extension Remote SSH.

    ⚠️ Vous pouvez vous référer aux instructions pour configurer et lancer VS Code dans la leçon 1 si nécessaire.

  4. Avec les versions plus récentes du Raspberry Pi qui prennent en charge le Bluetooth, il existe un conflit entre le port série utilisé pour le Bluetooth et celui utilisé par le port UART Grove. Pour résoudre ce problème, procédez comme suit :

    1. Depuis le terminal de VS Code, éditez le fichier /boot/config.txt en utilisant nano, un éditeur de texte intégré au terminal, avec la commande suivante :

      sudo nano /boot/config.txt
      

      Ce fichier ne peut pas être modifié par VS Code car vous devez l'éditer avec des permissions sudo, des permissions élevées. VS Code ne fonctionne pas avec ces permissions.

    2. Utilisez les touches de direction pour naviguer jusqu'à la fin du fichier, puis copiez le code ci-dessous et collez-le à la fin du fichier :

      dtoverlay=pi3-miniuart-bt
      dtoverlay=pi3-disable-bt
      enable_uart=1
      

      Vous pouvez coller en utilisant les raccourcis clavier normaux de votre appareil (Ctrl+v sur Windows, Linux ou Raspberry Pi OS, Cmd+v sur macOS).

    3. Enregistrez ce fichier et quittez nano en appuyant sur Ctrl+x. Appuyez sur y lorsqu'on vous demande si vous voulez enregistrer le tampon modifié, puis appuyez sur Entrée pour confirmer que vous voulez écraser /boot/config.txt.

      Si vous faites une erreur, vous pouvez quitter sans enregistrer, puis répéter ces étapes.

    4. Éditez le fichier /boot/cmdline.txt dans nano avec la commande suivante :

      sudo nano /boot/cmdline.txt
      
    5. Ce fichier contient plusieurs paires clé/valeur séparées par des espaces. Supprimez toutes les paires clé/valeur pour la clé console. Elles ressembleront probablement à ceci :

      console=serial0,115200 console=tty1 
      

      Vous pouvez naviguer jusqu'à ces entrées à l'aide des touches de direction, puis les supprimer en utilisant les touches del ou backspace.

      Par exemple, si votre fichier original ressemble à ceci :

      console=serial0,115200 console=tty1 root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
      

      La nouvelle version sera :

      root=PARTUUID=058e2867-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
      
    6. Suivez les étapes ci-dessus pour enregistrer ce fichier et quitter nano.

    7. Redémarrez votre Pi, puis reconnectez-vous dans VS Code une fois le Pi redémarré.

  5. Depuis le terminal, créez un nouveau dossier dans le répertoire personnel de l'utilisateur pi appelé gps-sensor. Créez un fichier dans ce dossier appelé app.py.

  6. Ouvrez ce dossier dans VS Code.

  7. Le module GPS envoie des données UART via un port série. Installez le package Pip pyserial pour communiquer avec le port série depuis votre code Python :

    pip3 install pyserial
    
  8. Ajoutez le code suivant à votre fichier app.py :

    import time
    import serial
    
    serial = serial.Serial('/dev/ttyAMA0', 9600, timeout=1)
    serial.reset_input_buffer()
    serial.flush()
    
    def print_gps_data(line):
        print(line.rstrip())
    
    while True:
        line = serial.readline().decode('utf-8')
    
        while len(line) > 0:
            print_gps_data(line)
            line = serial.readline().decode('utf-8')
    
        time.sleep(1)
    

    Ce code importe le module serial du package Pip pyserial. Il se connecte ensuite au port série /dev/ttyAMA0 - c'est l'adresse du port série utilisé par le Grove Pi Base Hat pour son port UART. Il efface ensuite toutes les données existantes de cette connexion série.

    Ensuite, une fonction appelée print_gps_data est définie pour afficher dans la console la ligne qui lui est transmise.

    Ensuite, le code boucle indéfiniment, lisant autant de lignes de texte que possible depuis le port série à chaque itération. Il appelle la fonction print_gps_data pour chaque ligne.

    Une fois toutes les données lues, la boucle attend 1 seconde, puis recommence.

  9. Exécutez ce code. Vous verrez la sortie brute du capteur GPS, quelque chose comme ceci :

    $GNGGA,020604.001,4738.538654,N,12208.341758,W,1,3,,164.7,M,-17.1,M,,*67
    $GPGSA,A,1,,,,,,,,,,,,,,,*1E
    $BDGSA,A,1,,,,,,,,,,,,,,,*0F
    $GPGSV,1,1,00*79
    $BDGSV,1,1,00*68
    

    Si vous obtenez l'une des erreurs suivantes en arrêtant et redémarrant votre code, ajoutez un bloc try - except à votre boucle while.

    UnicodeDecodeError: 'utf-8' codec can't decode byte 0x93 in position 0: invalid start byte
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: invalid continuation byte
    
    while True:
        try:
            line = serial.readline().decode('utf-8')
    
            while len(line) > 0:
                print_gps_data()
                line = serial.readline().decode('utf-8')
    
        # There's a random chance the first byte being read is part way through a character.
        # Read another full line and continue.
    
        except UnicodeDecodeError:
            line = serial.readline().decode('utf-8')
    
    time.sleep(1)
    

💁 Vous pouvez trouver ce code dans le dossier code-gps/pi.

😀 Votre programme pour le capteur GPS a été un succès !

Avertissement :
Ce document a été traduit à l'aide du service de traduction automatique Co-op Translator. Bien que nous nous efforcions d'assurer l'exactitude, veuillez noter que les traductions automatisées peuvent contenir des erreurs ou des inexactitudes. Le document original dans sa langue d'origine doit être considéré comme la source faisant autorité. Pour des informations critiques, il est recommandé de recourir à une traduction humaine professionnelle. Nous déclinons toute responsabilité en cas de malentendus ou d'interprétations erronées résultant de l'utilisation de cette traduction.