BTS Mesure BTS Mesure
Présentation2014CapteursModulationTyponsArduinoDémodulationApp InventorCourbesVidéos
 
PrésentationSimulationGSMGPSSDCapteursFinal

Présentation

Nous allons utiliser le même capteur GPS que l'année dernière : le GPS MTK3339 à 66 Canaux Adafruit

Nous l'avons déjà utilisé pour le projet Ballon Sonde M2C3T1 2014, il est capable de prendre des mesures jusqu'à une altitude supérieure à 32 km.
  • We have received reports that it works up to ~32Km altitude (the GPS theoretically does not have a limit until 40Km)

  • Nous avions déjà présenté sa programmation sur le site stl.janetti.perso.sfr.fr

    Nous allons encore utiliser la bibliothèque Tiny GPS pour extraire automatiquement les coordonnées GPS à partir des trames NMEA reçues :
    $GPGGA,064036.289,4836.5375,N,00740.9373,E,1,04,3.2,200.2,M,,,,0000*0E
    $GPGGA       : Type de trame064036.289   : Trame envoyée à 06h40m36,289s (heure UTC)
    4836.5375,N  : Latitude 48,608958° Nord = 48°36'32.25" Nord
    00740.9373,E : Longitude 7,682288° Est = 7°40'56.238" Est
    1            : Type de positionnement (le 1 est un positionnement GPS)
    04           : Nombre de satellites utilisés pour calculer les coordonnées
    3.2          : Précision horizontale ou HDOP (Horizontal dilution of precision)
    200.2,M      : Altitude 200,2, en mètres
    ,,,,,0000    : D'autres informations peuvent être inscrites dans ces champs
    *0E          : Somme de contrôle de parité, un simple XOR sur les caractères précédents

    Analyse du signal sortant de TX

    Rappel sur la liaison UART : consulter la page TP Arduino/UART.

    Un capteur GPS UART utilise principalement 4 pattes :

    • VIN : alimentation + 5 V ;
    • GND : la masse ;
    • Rx : pour la réception de donnée, facultatif si on utilise les paramètres par défaut du GPS ;
    • Tx : transmission des données GPS, par défaut 9600 bit/s, rafraichissement  des coordonnées 1 Hz (1 fois par seconde).

    Nous avons alimenté un capteur GPS entre GND et VIN=5V. Puis nous avons relié sa patte TX à notre analyseur logique  pour obtenir ce signal :

    Notre GPS transmet sans arrêt des trames GPS sur sa sortie UART Tx à 9600 bauds. une nouvelle trame est émise toutes les secondes. Voici un zoom sur un début de transmission :

    Dans une liaison UART pour transmettre un carctère Ascii (codé sur 1 octet) il faut  : 1 bit de start puis le code ASCII sur 8 bits (1 octet)  et un bit de stop soit 10 bits.
    Une liaison 9600 bit/s (baudrate) transmet donc 960 caractères par seconde.

    Une trame dure entre :

    •  0,4278 s * 960 caractères/s = 411 caractères

    • 0,2472 s * 960 caractères/s = 237 caractères

    Le buffer standard de la liaison série d'un Arduino est de 64 caractères : c'est insuffisant. Par conséquent pour être sûr de lire une trame complète il faudra scruter le port série durant 1s.

    Le sous programme acquisition GPS

    Il faut d'abord importer la bibliothèque Tiny GPS que vous pouvez télécharger en cliquant sur le lien.

    Pour importer : Croquis/Importer bibliothèque/Ajpouter bibliothèque  puis Téléchargements/TinyGPS.zip

    La première partie du programme est à placer dans l'entête, puis le sous programme à la fin...

    Pensez à initialiser la liaison série dans le setup : Sgps.begin(9600);

    
    /* 1) Zone 1 : les déclarations */
    // 1.a) Les bibliothèques et création d'objets  
    #include <TinyGPS.h>
    TinyGPS gps;      // création de l'objet gps
    
    // 1.b) Les Constantes et #define 
    #define Sgps Serial3
    
    // 1.c) Les variables globales
    word N1,E1,Alti;
    float N,E,Vitesse
    
    
    /* 4) Zone 4 : les sous programmes (ou fonctions) */
    void acquisitionGPS()      // durée d'exécution environ 1100 ms
    {  // Variables locales
      unsigned long t1, fix_age;
      int annee;
      byte  c,mois, jour, heure,minutes, seconde, iemes;
      
      t1=millis();
      while (millis()-t1<1100)      // On scrute durant 1,1 s la liaison UART du GPS
      {  
        if (Sgps.available()){
          c = Sgps.read();  
          // Sdebug.write(c);      // permet de voir les trames GPS brutes  
          gps.encode(c);          // On envoie chaque caratère reçu à la bibliothèque Tiny GPS
        }
      // Retour des coordonnées par la bibliothèque Tiny GPS
      
      gps.f_get_position(&N, &E);    // Les pointeurs &N et &E sont les coordonnées GPS
      
      Alti = gps.f_altitude();         // +/- altitude en mètres
      Vitesse = gps.f_speed_mps();
      
      gps.crack_datetime(&annee, &mois, &jour, &heure, &minutes, &seconde, &iemes, &fix_age);
      Date =String(jour) + "/" + String(mois) + "/" + String(annee) + " "+ String (heure+2) + ":" + String (minutes) + ":" + String (seconde);
      
      N1=(N-40.0)*10000.0;
      /* word permet de coder un nombre entier jusqu'à 65535
       Pour cela nous allons enlever 40° à N et le multiplier par 10000 pour garder 4 chiffres après la vigule
       Ainsi nous pouvons coder N de 40° (N1=0) à 46,5535 (N1=65535)
       Ce qui couvre la zone probable de vol */
      E1=E*10000;
      /* De même pour E de 0° (E1=0) à 6,5535° */
    };