Outils pour utilisateurs

Outils du site


tpethindus2

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
tpethindus2 [2018/06/28 11:15]
bvandepo
tpethindus2 [2019/04/03 10:09] (Version actuelle)
bvandepo
Ligne 1: Ligne 1:
 +
 +
 +
 +<ifauth @prof>
 +
 +====Solution pour le test de la fonction de parsing de flottants====
 +[[tpethindus2soluce]]
 + 
 +
 +
 +====Documentation module récepteur gps ublox neo 6M====
 +avec utilisation de librairie TinyGPS++: http://​gilles.thebault.free.fr/​spip.php?​article50
 +
 +
 +====Documentation module récepteur gps skm53====
 +http://​www.skylab.com.cn/​en/​productview-82.html
 +
 +
 +https://​www.nooelec.com/​files/​SKM53_Tutorial.pdf
 +
 +
 +====Format de trames NMEA 183====
 +https://​fr.wikipedia.org/​wiki/​NMEA_0183
 +
 +====Convertisseur LAT/LONG UTM====
 +https://​www.latlong.net/​lat-long-utm.html
 +
 +====Gestion de l'​heure====
 +http://​leapsecond.com/​java/​gpsclock.htm
 +
 +</​ifauth>​
 +
 +
 +
 {{http://​homepages.laas.fr/​bvandepo/​files/​iut/​tp_pic/​warning.jpeg}} {{http://​homepages.laas.fr/​bvandepo/​files/​iut/​tp_pic/​warning.jpeg}}
  
Ligne 54: Ligne 88:
 Nous utiliserons QTcreator pour développer les fonctions de Stream Parsing (décodage par flux) afin de disposer du Debugguer. Ceci permet de tester le programme en pas à pas tout en suivant l'​évolution de la valeur des différentes variables. Nous utiliserons QTcreator pour développer les fonctions de Stream Parsing (décodage par flux) afin de disposer du Debugguer. Ceci permet de tester le programme en pas à pas tout en suivant l'​évolution de la valeur des différentes variables.
  
-Dans un premier temps, vous devez créer un projet avec QTcreator. Pour cela lancer l'​outils (ALT+F2 et taper qtcreator). Ensuite, cliquer sur créer un projet, choisir "​Applications"​ et sélectionner "QT console Application"​ et cliquer sur choisir. Donner ensuite un nom au projet (choisir ​TPGPS et le placer dans votre dossier HOME/TPGPS) et cliquer sur "​Suivant","​Suivant"​ et "​Terminer"​. Dans le fichier **main.cpp** commenter les 2 lignes: ​+Dans un premier temps, vous devez créer un projet avec QTcreator. Pour cela lancer l'​outils (ALT+F2 et taper qtcreator). Ensuite, cliquer sur créer un projet, choisir "​Applications"​ et sélectionner "QT console Application"​ et cliquer sur choisir. Donner ensuite un nom au projet (saisir ​TPGPS et laisser l'​emplacement par défaut (votre dossier HOME/IUT/login/TPGPS) et cliquer sur "​Suivant","​Suivant"​ et "​Terminer"​. Dans le fichier **main.cpp** commenter les 2 lignes: ​
   //​QCoreApplication a(argc, argv);   //​QCoreApplication a(argc, argv);
   //return a.exec();   //return a.exec();
Ligne 125: Ligne 159:
 else if (c == ','​) ​ else if (c == ','​) ​
   {   {
-  while (*count > 0 && *dp_count > 0)  // équivalent à *val = *val/​(10^*count)+  while ((*count> 0 && ​(*dp_count> 0)  // équivalent à (*val(*val)/​(10^*count)
     {     {
     (*val) = (*val) / 10;     (*val) = (*val) / 10;
Ligne 136: Ligne 170:
   return 1;   return 1;
   }    } 
-else +else     // caractère non supporté dans un nombre
   {   {
-  (*count) = 0; // caractère non supporté dans un float+  (*count) = 0; 
   return -1;   return -1;
   }   }
Ligne 201: Ligne 235:
     return 0;     return 0;
     }     }
-  while (*count > 0 && *dp_count > 0)  // équivalent à *val = *val/​(10^*count)+  while ((*count> 0 && ​(*dp_count> 0)  // équivalent à *val = *val/​(10^*count)
     {     {
     (*val) = (*val) / 10;     (*val) = (*val) / 10;
Ligne 212: Ligne 246:
   return 1;   return 1;
   }    } 
-else +else  // caractère non supporté dans un float
   {   {
-  (*count) = 0; // caractère non supporté dans un float+  (*count) = 0;
   return -1;   return -1;
   }   }
Ligne 305: Ligne 339:
 else if (c == ','​) else if (c == ','​)
   {   {
-  while (*count > 0 && *dp_count > 0)  // équivalent à *val = *val/​(10^*count)+  while ((*count> 0 && ​(*dp_count> 0)  // équivalent à *val = *val/​(10^*count)
     {     {
     (*val) = (*val) / 10;     (*val) = (*val) / 10;
Ligne 424: Ligne 458:
 </​file> ​ </​file> ​
  
-{{http://​homepages.laas.fr/​bvandepo/​files/​iut/​tp_gps/​TODO.jpg}} ​ Insérer l'​appel de la fonction **parseHexField** dans la machine à états. Elle permet le décodage du checksum émis par le récepteur GPS. Celui ci doit être comparé avec le  checksum calculé de la trame en local (dans votre programme). Pour cela, il est nécessaire de réaliser la fonction XOR pour chaque caractère reçu (dans une variable préalablement initialisée à 0). Le checksum n'est calculé en local que entre le caractère '$ \textdollar $' (exclu) et le caractère '$ \ast $' (exclu). ​+{{http://​homepages.laas.fr/​bvandepo/​files/​iut/​tp_gps/​TODO.jpg}} ​ Insérer l'​appel de la fonction **parseHexField** dans la machine à états. Elle permet le décodage du checksum émis par le récepteur GPS. Celui ci doit être comparé avec le  checksum calculé de la trame en local (dans votre programme). Pour cela, il est nécessaire de réaliser la fonction XOR pour chaque caractère reçu (dans une variable préalablement initialisée à 0). Le checksum n'est calculé en local que entre le caractère '$ \textdollar $' (exclu) et le caractère '$ \ast $' (exclu). En cas de détection d'un problème au niveau de la somme de contrôle, la fonction parseGPS(...) devra retourner -2.
  
 Pour vérifier si votre programme est capable de détecter une erreur, changer à la main un caractère de la trame précédente définie dans le tableau de constante ou du code hexadécimal suivant le caractère '$ \ast $'. Pour vérifier si votre programme est capable de détecter une erreur, changer à la main un caractère de la trame précédente définie dans le tableau de constante ou du code hexadécimal suivant le caractère '$ \ast $'.
 Dans la boucle principale, ajouter l'​affichage du message suivant lorsque la machine à états a détecté une erreur au niveau de la somme de contrôle: Dans la boucle principale, ajouter l'​affichage du message suivant lorsque la machine à états a détecté une erreur au niveau de la somme de contrôle:
-  ​printf("​----------Trame erronée------------\n"​);​+        if (ret==-2) 
 +        { 
 +            ​printf("​----------Trame erronée ​au niveau du checksum-----------\n"​);​ 
 +        }
  
  
Ligne 690: Ligne 727:
         if (ret=-1)         if (ret=-1)
         {         {
-            printf("​----------Trame ​erronee------------\n"​);​+            printf("​----------Trame ​erronée------------\n"​);​ 
 +        } 
 +        if (ret==-2) 
 +        { 
 +            printf("​----------Trame erronée au niveau du checksum-----------\n"​);​
         }         }
     }     }
Ligne 733: Ligne 774:
  
 -------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------
-=====Exercice 5: Portage du code sur Arduino et simulation du module GPS avec le PC via Uart HARD=====+=====Exercice 5: Adaptation sous forme d'une librairie===== 
 +{{http://​homepages.laas.fr/​bvandepo/​files/​iut/​tp_gps/​TODO.jpg}} ​ Vous devez maintenant rendre votre fonction de décodage de trame GPS accessible sous forme d'une librairie. Pour cela, vous devez créer 2 fichiers dans le projet:  
 + 
 +  -Cliquer sur Fichier->​Nouveau fichier ou projet 
 +  -Choisir dans fichier et classes: "​C++"​ , puis dans la partie droite "C++ Class"​ 
 +  -Cliquer sur Suivant 
 +  -Dans la zone "Class name" saisir libgps 
 +  -Cliquer sur Suivant 
 +  -Cliquer sur Terminer 
 + 
 +Le fichier libgps.h doit contenir le prototype de la fonction de parsing, les inclusions et la définition de structure nécessaires. Vous pouvez supprimer la définition de la classe libgps qui a été faite automatiquement par l'​assistant. 
 + 
 +<file cpp libgps.h>​ 
 +#ifndef LIBGPS_H 
 +#define LIBGPS_H 
 + 
 + 
 +#include <​math.h>​ 
 +#include "​stdio.h"​ 
 + ​struct gps_data { 
 +    char valid ; //trame valide 
 +    float time ; //champ time de la trame 
 +    float lat ; //champ latitude de la trame 
 +    float lon ; //champ longitude de la trame 
 +    unsigned char received_checksum;​ 
 +}; 
 +char parseGPS(char c, struct gps_data * dataP) ; 
 +#endif // LIBGPS_H 
 + 
 +</​file>​ 
 + 
 +Dans le fichier libgps.cpp, vous déplacerez le code des fonctions (hormis la fonction main), la définition des variable utilisées par les fonctions. Vous y ajouterez également au début l'​inclusion du fichier libgps.h pour que les structures et inclusions de librairies soient connues lors de la compilation de libgps.cpp. Vous pouvez supprimer la définition du constructeur de la classe libgps qui a été faite automatiquement par l'​assistant. 
 + 
 +<file cpp libgps.cpp>​ 
 +#include "​libgps.h"​ 
 + 
 + char computed_checksum=0;​ // variable de calcul du checksum 
 + char parserState=0;​ //etat courant du parser 
 + ​unsigned char counter= 0; 
 + ​unsigned char dp_counter=0;​ 
 + #​define SYNC 0 
 + #​define HEADER 1 
 + #​define TIME 2 
 + #​define VALID 3 
 + #​define LAT 4 
 + #​define LAT_DIR 5 
 + #​define LONG 6 
 + #​define LONG_DIR 7 
 + #​define IGNORE 8 
 + #​define CHECKSUM 9 
 + char header[6]="​GPRMC";​ 
 + 
 + 
 +//​............ Compléter avec toutes les fonctions nécessaires 
 +</​file>​ 
 + 
 + 
 +Dans le fichier main.cpp, vous devrez ajouter #include "​libgps.h",​ et vous conserverez le main(), la déclaration des chaines de test et de la variable ​ gps_data gps_d; ​ Le code des fonctions de parsing doit quant à lui avoir été déplacé dans libgps.cpp. 
 + 
 +Exécuter le programme et vérifier qu'il fonctionne toujours correctement. 
 + 
 +  
 +{{http://​homepages.laas.fr/​bvandepo/​files/​iut/​tp_pic/​validation.png}} Une fois les réponses validées, mettre à jour le suivi de version en saisissant dans une console: 
 +  echo commence 
 +  cd ~/TPGPS 
 +  git add libgps.cpp libgps.h 
 +  git commit -a -m'​librairie'​ 
 +  gitk  
 +  echo fini 
 + 
 +-------------------------------------------------------------------------------------------------------- 
 + 
 + 
 +=====Exercice 6: Portage du code sur Arduino et simulation du module GPS avec le PC via Uart HARD===== 
 + 
 +Pour copier la librairie à un emplacement ou elle est utilisable par Arduino, saisir dans une console: 
 +  echo commence  
 +  mkdir -p ~/Arduino 
 +  mkdir -p ~/​Arduino/​libraries 
 +  mkdir -p ~/​Arduino/​libraries/​libgps 
 +  mkdir -p ~/​Arduino/​libraries/​libgps/​src 
 +  cp ~/​TPGPS/​libgps.* ~/​Arduino/​libraries/​libgps/​src 
 +  cd ~/​Arduino/​libraries/​libgps/​ 
 +  wget http://​homepages.laas.fr/​bvandepo/​files/​iut/​tp_gps/​library.properties 
 +  echo fini 
 +   
 +Ceci permet notamment de récupérer un fichier contenant des informations sur votre librairie dans  ~/​Arduino/​libraries/​libgps/​library.properties:​ 
 +<file txt library.properties>​ 
 +name=libgps 
 +version=1.0 
 +author=Vous 
 +maintainer=Vous 
 +sentence=Votre librairie GPS 
 +paragraph=blabla 
 +category=Uncategorized 
 +url=http://​homepages.laas.fr/​bvandepo/​wiki/​doku.php?​id=tpethindus2 
 +architectures=* 
 +</​file>​ 
 + 
 +Vous pouvez ensuite lancer l'IDE Arduino normalement et la librairie est utilisable grâce à un simple #include "​libgps.h"​ dans votre sketch.
  
 {{http://​homepages.laas.fr/​bvandepo/​files/​iut/​tp_gps/​TODO.jpg}} ​ Créer un sketch arduino qui communique à 9600 Bauds au format 8N1 sur l'Uart matériel. Ce programme doit traiter tous les caractères reçus (via la machine à états que vous venez de coder avec QT) et les renvoyer en écho. Copier et adapter le code QT dans le sketch arduino. Normalement,​ vous ne devriez avoir qu'à changer la partir lecture des caractères (depuis l'UART au lieu d'un tableau) et l'​affichage des résultats (Serial.println au lieu de printf). {{http://​homepages.laas.fr/​bvandepo/​files/​iut/​tp_gps/​TODO.jpg}} ​ Créer un sketch arduino qui communique à 9600 Bauds au format 8N1 sur l'Uart matériel. Ce programme doit traiter tous les caractères reçus (via la machine à états que vous venez de coder avec QT) et les renvoyer en écho. Copier et adapter le code QT dans le sketch arduino. Normalement,​ vous ne devriez avoir qu'à changer la partir lecture des caractères (depuis l'UART au lieu d'un tableau) et l'​affichage des résultats (Serial.println au lieu de printf).
Ligne 782: Ligne 922:
         if (ret==-1)         if (ret==-1)
         {         {
-          Serial.println("​----------Trame ​erronee------------"​); ​+          Serial.println("​----------Trame ​erronée------------"​); ​
         }         }
 +        if (ret==-2)
 +        {
 +            printf("​----------Trame erronée au niveau du checksum-----------\n"​);​
 +        }
 +
     }    ​     }    ​
                
Ligne 793: Ligne 938:
  
 -------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------
-=====Exercice ​6: Décodage de trame en provenance de l'uart soft de l'​arduino et du récepteur GPS=====+=====Exercice ​7: Décodage de trame en provenance de l'uart soft de l'​arduino et du récepteur GPS=====
  
  
Ligne 802: Ligne 947:
 Ce module récepteur GPS communique en simplex aux niveau RS232 à 4800 Bauds et au format 8N1. Sa documentation ​ est disponible ici: http://​homepages.laas.fr/​bvandepo/​files/​iut/​tp_gps/​French_Manuel_Hi203.pdf Ce module récepteur GPS communique en simplex aux niveau RS232 à 4800 Bauds et au format 8N1. Sa documentation ​ est disponible ici: http://​homepages.laas.fr/​bvandepo/​files/​iut/​tp_gps/​French_Manuel_Hi203.pdf
  
 +Vous pourrez configurer l'UART Hard à une vitesse de 115200Bauds pour ne pas ralentir l'​exécution de programme pendant l'​affichage du résultat du décodage.
  
 {{http://​homepages.laas.fr/​bvandepo/​files/​iut/​tp_pic/​validation.png}} {{http://​homepages.laas.fr/​bvandepo/​files/​iut/​tp_pic/​validation.png}}
Ligne 871: Ligne 1017:
 </​ifauth>​ </​ifauth>​
  
-====Conversion des angles en degrés====+=====Conversion des angles en degrés ​et exploitation des coordonnées=====
 Les valeurs numériques émises dans la trame GPRMC sont en degrés et minutes de degrés comme vu en TD. Les valeurs numériques émises dans la trame GPRMC sont en degrés et minutes de degrés comme vu en TD.
  
Ligne 879: Ligne 1025:
  
  
- + 
 +En sortant sur le parking avec un ordinateur portable et la carte Arduino+GPS,​ vous devriez obtenir: 
 + 
 +  $GPGGA,​151316.000,​4333.8221,​N,​00126.7960,​E,​0,​00,,,​M,,​M,,​*41 
 +  $GPGSA,​A,​1,,,,,,,,,,,,,,,​*1E 
 +  $GPGSV,​1,​1,​01,​31,​81,​300,​*40 
 +  $GPRMC,​151316.000,​V,​4333.8221,​N,​00126.7960,​E,,,​230318,,​*1D 
 +  Trame décodée 
 +  lat:​43.5636978149 
 +  lon:​1.4465999603 
 +  time:​151316.0000000000 
 +  valid:-1 
 +  ck:1D 
 + 
 +puis après 1 ou 2 minutes d'​attente:​ 
 +  $GPGGA,​163422.996,​4333.9147,​N,​00127.4247,​E,​1,​04,​01.9,​00163.0,​M,​48.5,​M,,​*66 
 +  $GPGSA,​A,​3,,,​21,,​14,​31,​12,,,,,,​04.6,​01.9,​04.1*0A 
 +  $GPGSV,​3,​1,​10,​29,​78,​044,​28,​25,​55,​079,,​21,​22,​174,​34,​16,​28,​286,​*7A 
 +  $GPGSV,​3,​2,​10,​14,​24,​244,​28,​31,​56,​295,​38,​12,​20,​090,​33,​02,​18,​051,​*71 
 +  $GPGSV,​3,​3,​10,​26,​18,​289,,​08,​10,​142,​*78 
 +  $GPRMC,​163422.996,​A,​4333.9147,​N,​00127.4247,​E,​000.0,​237.8,​120319,​000.7,​E*62 
 +  Trame décodée 
 +  lat:​43.5652503967 
 +  lon:​1.4570784568 
 +  time:​163422.9843750000 
 +  valid:1 
 +  ck:62 
 + 
 +   
 +En injectant ces coordonnées dans une URL de Google Maps au format: 
 +  https://​www.google.com/​maps/​@lat,​lon,​zoom 
 +on obtient: https://​www.google.com/​maps/​@43.5652503967,​1.4570784568,​20z 
 + 
  
 <ifauth @prof> <ifauth @prof>
tpethindus2.1530177353.txt.gz · Dernière modification: 2018/06/28 11:15 par bvandepo