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
gps.h@0:798c7207505d, 2022-05-31 (annotated)
- Committer:
- Giamarchi
- Date:
- Tue May 31 13:40:28 2022 +0000
- Revision:
- 0:798c7207505d
MAJ
Who changed what in which revision?
User | Revision | Line number | New 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 | //============================================================================== |