IniSat Modèle 1 Version 2 TP 5 : Station Sol Exo 1 : Enregistrement GPS sur carte SD Exo 2 : Mise en place d'un protocole de communication avec la station sol

Dependencies:   mbed

Committer:
Giamarchi
Date:
Tue May 31 13:40:28 2022 +0000
Revision:
0:798c7207505d
MAJ

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Giamarchi 0:798c7207505d 1 /* L80 QUECTEL GPS Module
Giamarchi 0:798c7207505d 2 * NMEA 0183 messages
Giamarchi 0:798c7207505d 3 */
Giamarchi 0:798c7207505d 4 #include "mbed.h"
Giamarchi 0:798c7207505d 5 #include <math.h>
Giamarchi 0:798c7207505d 6 // Commandes pour paramétrer le taux par seconde depuis chaque seconde (1 Hz) jusqu'à 10 fois par seconde (10Hz)
Giamarchi 0:798c7207505d 7 #define PMTK_SET_NMEA_UPDATE_1HZ "$PMTK220,1000*1F"
Giamarchi 0:798c7207505d 8 #define PMTK_SET_NMEA_UPDATE_5HZ "$PMTK220,200*2C"
Giamarchi 0:798c7207505d 9 #define PMTK_SET_NMEA_UPDATE_10HZ "$PMTK220,100*2F"
Giamarchi 0:798c7207505d 10
Giamarchi 0:798c7207505d 11 // Code pour sélection de trame unique
Giamarchi 0:798c7207505d 12 #define TRAME_RMC "$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"
Giamarchi 0:798c7207505d 13 #define TRAME_GGA "$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"
Giamarchi 0:798c7207505d 14 #define TRAME_RMC_GGA "$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28"
Giamarchi 0:798c7207505d 15 #define TRAME_ALL "$PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0*28"
Giamarchi 0:798c7207505d 16
Giamarchi 0:798c7207505d 17 #define Trame_TXT_On "$PQTXT,W,1,1*22"
Giamarchi 0:798c7207505d 18 #define Trame_TXT_Off "$PQTXT,W,0,1*23"
Giamarchi 0:798c7207505d 19
Giamarchi 0:798c7207505d 20 // Selection de trames
Giamarchi 0:798c7207505d 21 void Select_Trame(char* trame) {
Giamarchi 0:798c7207505d 22 printStr((char*) trame);
Giamarchi 0:798c7207505d 23 printStr((char*)"\r\n");
Giamarchi 0:798c7207505d 24 }
Giamarchi 0:798c7207505d 25
Giamarchi 0:798c7207505d 26 // Lecture des trames NMEA du GPS
Giamarchi 0:798c7207505d 27
Giamarchi 0:798c7207505d 28 char buffer[100];
Giamarchi 0:798c7207505d 29 uint8_t rx_ptr = 0;
Giamarchi 0:798c7207505d 30 uint8_t rx_ok = 0;
Giamarchi 0:798c7207505d 31
Giamarchi 0:798c7207505d 32 void Lect_GPS(void) {
Giamarchi 0:798c7207505d 33
Giamarchi 0:798c7207505d 34 while(!rx_ok) {
Giamarchi 0:798c7207505d 35
Giamarchi 0:798c7207505d 36 if (kbhit()) {
Giamarchi 0:798c7207505d 37 buffer[rx_ptr] = _getchar();
Giamarchi 0:798c7207505d 38
Giamarchi 0:798c7207505d 39 if((buffer[rx_ptr] == 0x0A) || (buffer[rx_ptr] == 0x0D)) // Test touche entrée en mode ASCII
Giamarchi 0:798c7207505d 40 {
Giamarchi 0:798c7207505d 41 buffer[rx_ptr] = 0; // Transforme le tableau en chaine de caractères
Giamarchi 0:798c7207505d 42 rx_ptr = 0;
Giamarchi 0:798c7207505d 43 rx_ok = 1; // Trame disponible pour décodage
Giamarchi 0:798c7207505d 44 // pc.printf("%s\n\r",buffer); // Echo
Giamarchi 0:798c7207505d 45 }
Giamarchi 0:798c7207505d 46 else {
Giamarchi 0:798c7207505d 47 rx_ptr++;
Giamarchi 0:798c7207505d 48 }
Giamarchi 0:798c7207505d 49 }
Giamarchi 0:798c7207505d 50 }
Giamarchi 0:798c7207505d 51 rx_ok = 0;
Giamarchi 0:798c7207505d 52 }
Giamarchi 0:798c7207505d 53
Giamarchi 0:798c7207505d 54 void GPS_Init(void) { // Bloquer les tickers pour envoyer une commande
Giamarchi 0:798c7207505d 55 rx_ok = 0;
Giamarchi 0:798c7207505d 56 Select_Trame((char*)Trame_TXT_Off);
Giamarchi 0:798c7207505d 57 Select_Trame((char*)TRAME_GGA);
Giamarchi 0:798c7207505d 58 }
Giamarchi 0:798c7207505d 59
Giamarchi 0:798c7207505d 60 struct gps {
Giamarchi 0:798c7207505d 61 char *trame; // $GPGGA
Giamarchi 0:798c7207505d 62 char *horaire; // 143512.000
Giamarchi 0:798c7207505d 63 char *lat;
Giamarchi 0:798c7207505d 64 char *ns;
Giamarchi 0:798c7207505d 65 char *longi;
Giamarchi 0:798c7207505d 66 char *ew;
Giamarchi 0:798c7207505d 67 char *fix; // 0 ou V -> pas de Fix >1 ou A -> Fix
Giamarchi 0:798c7207505d 68 char *nb_sat;
Giamarchi 0:798c7207505d 69 char *prec;
Giamarchi 0:798c7207505d 70 char *alt;
Giamarchi 0:798c7207505d 71 float latitude;
Giamarchi 0:798c7207505d 72 float longitude;
Giamarchi 0:798c7207505d 73 uint16_t altitude;
Giamarchi 0:798c7207505d 74 char fixe;
Giamarchi 0:798c7207505d 75 } gps;
Giamarchi 0:798c7207505d 76
Giamarchi 0:798c7207505d 77 // Décodage Trame NMEA GGA
Giamarchi 0:798c7207505d 78 void GPS_Decodage (void) {
Giamarchi 0:798c7207505d 79
Giamarchi 0:798c7207505d 80 if(buffer[0] == '$' && buffer[5] == 'A') {
Giamarchi 0:798c7207505d 81 // pc.printf("GPS: %s\n\r",buffer); // Echo
Giamarchi 0:798c7207505d 82
Giamarchi 0:798c7207505d 83 gps.trame = strtok(buffer, ",");
Giamarchi 0:798c7207505d 84 gps.horaire = strtok(NULL, ",");
Giamarchi 0:798c7207505d 85
Giamarchi 0:798c7207505d 86 gps.lat = strtok(NULL, ",");
Giamarchi 0:798c7207505d 87 gps.latitude = atof(gps.lat);
Giamarchi 0:798c7207505d 88 gps.ns = strtok(NULL, ",");
Giamarchi 0:798c7207505d 89 // if(gps.ns == "S") {
Giamarchi 0:798c7207505d 90 // gps.latitude *= -1.0;
Giamarchi 0:798c7207505d 91 // }
Giamarchi 0:798c7207505d 92 gps.longi = strtok(NULL, ",");
Giamarchi 0:798c7207505d 93 gps.longitude = atof(gps.longi);
Giamarchi 0:798c7207505d 94 gps.ew = strtok(NULL, ",");
Giamarchi 0:798c7207505d 95 // if(gps.ew == "W") {
Giamarchi 0:798c7207505d 96 // gps.longitude *= -1.0;
Giamarchi 0:798c7207505d 97 // }
Giamarchi 0:798c7207505d 98 gps.fix = strtok(NULL, ",");
Giamarchi 0:798c7207505d 99 gps.fixe = atoi(gps.fix);
Giamarchi 0:798c7207505d 100
Giamarchi 0:798c7207505d 101 gps.nb_sat = strtok(NULL, ",");
Giamarchi 0:798c7207505d 102 gps.prec = strtok(NULL, ",");
Giamarchi 0:798c7207505d 103 gps.alt = strtok(NULL, ",");
Giamarchi 0:798c7207505d 104 gps.altitude = atoi(gps.alt);
Giamarchi 0:798c7207505d 105
Giamarchi 0:798c7207505d 106 if(gps.fixe) {
Giamarchi 0:798c7207505d 107 // Conversion en degrée et minute pour Google Maps
Giamarchi 0:798c7207505d 108 float degrees = floor(gps.latitude / 100.0f);
Giamarchi 0:798c7207505d 109 float minutes = gps.latitude - (degrees * 100.0f);
Giamarchi 0:798c7207505d 110 gps.latitude = degrees + minutes / 60.0f;
Giamarchi 0:798c7207505d 111
Giamarchi 0:798c7207505d 112 degrees = floor(gps.longitude / 100.0f);
Giamarchi 0:798c7207505d 113 minutes = gps.longitude - (degrees * 100.0f);
Giamarchi 0:798c7207505d 114 gps.longitude = degrees + minutes / 60.0f;
Giamarchi 0:798c7207505d 115 }
Giamarchi 0:798c7207505d 116 }
Giamarchi 0:798c7207505d 117 }
Giamarchi 0:798c7207505d 118
Giamarchi 0:798c7207505d 119 void Envoi_GPS(void) {
Giamarchi 0:798c7207505d 120 if(gps.fixe) {
Giamarchi 0:798c7207505d 121 // pc.printf("GPS: %s\n\r",buffer);
Giamarchi 0:798c7207505d 122 // pc.printf("hms : %s\n",gps.horaire);
Giamarchi 0:798c7207505d 123 pc.printf("lat : %fN\n",gps.latitude);
Giamarchi 0:798c7207505d 124 pc.printf("long: %fE\n",gps.longitude);
Giamarchi 0:798c7207505d 125 pc.printf("alt : %d m\n",gps.altitude);
Giamarchi 0:798c7207505d 126 }
Giamarchi 0:798c7207505d 127 }
Giamarchi 0:798c7207505d 128 //==============================================================================
Giamarchi 0:798c7207505d 129 // Sélection de la trame GGA - Système de positionnement global des données fixées
Giamarchi 0:798c7207505d 130 // Exemple : $GPGGA,143512.000,4347.7852,N,00418.9704,E,1,7,1.29,28.9,M,49.4,M,,*60
Giamarchi 0:798c7207505d 131
Giamarchi 0:798c7207505d 132 // UTC Position 143512.000 hhmmss.sss
Giamarchi 0:798c7207505d 133 // Latitude 4347.7852 ddmm.mmmm
Giamarchi 0:798c7207505d 134 // N/S Indicator N N=Nord - S=Sud
Giamarchi 0:798c7207505d 135 // Longitude 00418.9704 ddmm.mmmm
Giamarchi 0:798c7207505d 136 // W/E Indicator E W=Ouest - E=Est
Giamarchi 0:798c7207505d 137 // Position Fix Indicator 1 0-invalid 1-Valid
Giamarchi 0:798c7207505d 138 // Satellites Used 7 de 0 à 12
Giamarchi 0:798c7207505d 139 // Précision 1.29 1-bon 9-mauvais
Giamarchi 0:798c7207505d 140 // Altitude 28.9 valeur
Giamarchi 0:798c7207505d 141 // Unité pour l'altitude M en mètre
Giamarchi 0:798c7207505d 142 // Autres informations
Giamarchi 0:798c7207505d 143 // Checksum *60
Giamarchi 0:798c7207505d 144 //==============================================================================
Giamarchi 0:798c7207505d 145 // Sélection de la trame GLL - Géographic position - Latitude/Longitude
Giamarchi 0:798c7207505d 146 // Exemple : $GPGLL,3723.2475, N, 12158.3416, W, 161229.487, A*2C
Giamarchi 0:798c7207505d 147 //==============================================================================
Giamarchi 0:798c7207505d 148 // Sélection de la trame RMC - Utilisation pour les navires
Giamarchi 0:798c7207505d 149 // Exemple : $GPRMC,141147.000,A,4347.7885,N,00418.9737,E,0.00,350.58,280621,,,A*6D
Giamarchi 0:798c7207505d 150
Giamarchi 0:798c7207505d 151 // UTC Position 141147.000 hhmmss.sss
Giamarchi 0:798c7207505d 152 // Fix Indicator A A-valid V-invalid
Giamarchi 0:798c7207505d 153 // Latitude 4347.7885 ddmm.mmmm
Giamarchi 0:798c7207505d 154 // N/S Indicator N N=Nord - S=Sud
Giamarchi 0:798c7207505d 155 // Longitude 00418.9737 ddmm.mmmm
Giamarchi 0:798c7207505d 156 // W/E Indicator E W=Ouest - E=Est
Giamarchi 0:798c7207505d 157 // Vitesse 0.00 en noeuds
Giamarchi 0:798c7207505d 158 // Route sur le fond 350.58 en degrés
Giamarchi 0:798c7207505d 159 // Date 280621 ddmmaa
Giamarchi 0:798c7207505d 160 // Autres informations
Giamarchi 0:798c7207505d 161 // Checksum *6D
Giamarchi 0:798c7207505d 162 //==============================================================================