Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
gps.h
00001 /* L80 QUECTEL GPS Module 00002 * NMEA 0183 messages 00003 */ 00004 #include "mbed.h" 00005 #include <math.h> 00006 // Commandes pour paramétrer le taux par seconde depuis chaque seconde (1 Hz) jusqu'à 10 fois par seconde (10Hz) 00007 #define PMTK_SET_NMEA_UPDATE_1HZ "$PMTK220,1000*1F" 00008 #define PMTK_SET_NMEA_UPDATE_5HZ "$PMTK220,200*2C" 00009 #define PMTK_SET_NMEA_UPDATE_10HZ "$PMTK220,100*2F" 00010 00011 // Code pour sélection de trame unique 00012 #define TRAME_RMC "$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29" 00013 #define TRAME_GGA "$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29" 00014 #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" 00015 #define TRAME_ALL "$PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0*28" 00016 00017 #define Trame_TXT_On "$PQTXT,W,1,1*22" 00018 #define Trame_TXT_Off "$PQTXT,W,0,1*23" 00019 00020 // Selection de trames 00021 void Select_Trame(char* trame) { 00022 printStr((char*) trame); 00023 printStr((char*)"\r\n"); 00024 } 00025 00026 // Lecture des trames NMEA du GPS 00027 00028 char buffer[100]; 00029 uint8_t rx_ptr = 0; 00030 uint8_t rx_ok = 0; 00031 00032 void Lect_GPS(void) { 00033 00034 while(!rx_ok) { 00035 00036 if (kbhit()) { 00037 buffer[rx_ptr] = _getchar(); 00038 00039 if((buffer[rx_ptr] == 0x0A) || (buffer[rx_ptr] == 0x0D)) // Test touche entrée en mode ASCII 00040 { 00041 buffer[rx_ptr] = 0; // Transforme le tableau en chaine de caractères 00042 rx_ptr = 0; 00043 rx_ok = 1; // Trame disponible pour décodage 00044 // pc.printf("%s\n\r",buffer); // Echo 00045 } 00046 else { 00047 rx_ptr++; 00048 } 00049 } 00050 } 00051 rx_ok = 0; 00052 } 00053 00054 void GPS_Init(void) { // Bloquer les tickers pour envoyer une commande 00055 rx_ok = 0; 00056 Select_Trame((char*)Trame_TXT_Off); 00057 Select_Trame((char*)TRAME_GGA); 00058 } 00059 00060 struct gps { 00061 char *trame; // $GPGGA 00062 char *horaire; // 143512.000 00063 char *lat; 00064 char *ns; 00065 char *longi; 00066 char *ew; 00067 char *fix; // 0 ou V -> pas de Fix >1 ou A -> Fix 00068 char *nb_sat; 00069 char *prec; 00070 char *alt; 00071 float latitude; 00072 float longitude; 00073 uint16_t altitude; 00074 char fixe; 00075 } gps; 00076 00077 // Décodage Trame NMEA GGA 00078 void GPS_Decodage (void) { 00079 00080 if(buffer[0] == '$' && buffer[5] == 'A') { 00081 // pc.printf("GPS: %s\n\r",buffer); // Echo 00082 00083 gps.trame = strtok(buffer, ","); 00084 gps.horaire = strtok(NULL, ","); 00085 00086 gps.lat = strtok(NULL, ","); 00087 gps.latitude = atof(gps.lat); 00088 gps.ns = strtok(NULL, ","); 00089 // if(gps.ns == "S") { 00090 // gps.latitude *= -1.0; 00091 // } 00092 gps.longi = strtok(NULL, ","); 00093 gps.longitude = atof(gps.longi); 00094 gps.ew = strtok(NULL, ","); 00095 // if(gps.ew == "W") { 00096 // gps.longitude *= -1.0; 00097 // } 00098 gps.fix = strtok(NULL, ","); 00099 gps.fixe = atoi(gps.fix); 00100 00101 gps.nb_sat = strtok(NULL, ","); 00102 gps.prec = strtok(NULL, ","); 00103 gps.alt = strtok(NULL, ","); 00104 gps.altitude = atoi(gps.alt); 00105 00106 if(gps.fixe) { 00107 // Conversion en degrée et minute pour Google Maps 00108 float degrees = floor(gps.latitude / 100.0f); 00109 float minutes = gps.latitude - (degrees * 100.0f); 00110 gps.latitude = degrees + minutes / 60.0f; 00111 00112 degrees = floor(gps.longitude / 100.0f); 00113 minutes = gps.longitude - (degrees * 100.0f); 00114 gps.longitude = degrees + minutes / 60.0f; 00115 } 00116 } 00117 } 00118 00119 void Envoi_GPS(void) { 00120 00121 if(gps.fixe) { 00122 pc.printf("hms : %s\n",gps.horaire); 00123 pc.printf("lat : %f N\n",gps.latitude); 00124 pc.printf("long: %f E\n",gps.longitude); 00125 pc.printf("alt : %d m\n",gps.altitude); 00126 } 00127 else 00128 pc.printf("GPS: %s\n",buffer); 00129 } 00130 00131 void XBee_Envoi_GPS(void) { 00132 00133 if(gps.fixe) { 00134 xbee.printf("H%s\n",gps.horaire); 00135 xbee.printf("lat : %fN\n",gps.latitude); 00136 xbee.printf("long: %fE\n",gps.longitude); 00137 xbee.printf("#A%d\n",gps.altitude); 00138 00139 FILE *fp = fopen("/sd/gps_data.txt", "a"); 00140 fprintf(fp, "%.6f, %.6f, \n",gps.latitude,gps.longitude); 00141 fclose(fp); 00142 } 00143 else 00144 xbee.printf("GPS: %s\n\r",buffer); 00145 } 00146 //============================================================================== 00147 // Sélection de la trame GGA - Système de positionnement global des données fixées 00148 // Exemple : $GPGGA,143512.000,4347.7852,N,00418.9704,E,1,7,1.29,28.9,M,49.4,M,,*60 00149 00150 // UTC Position 143512.000 hhmmss.sss 00151 // Latitude 4347.7852 ddmm.mmmm 00152 // N/S Indicator N N=Nord - S=Sud 00153 // Longitude 00418.9704 ddmm.mmmm 00154 // W/E Indicator E W=Ouest - E=Est 00155 // Position Fix Indicator 1 0-invalid 1-Valid 00156 // Satellites Used 7 de 0 à 12 00157 // Précision 1.29 1-bon 9-mauvais 00158 // Altitude 28.9 valeur 00159 // Unité pour l'altitude M en mètre 00160 // Autres informations 00161 // Checksum *60 00162 //============================================================================== 00163 // Sélection de la trame GLL - Géographic position - Latitude/Longitude 00164 // Exemple : $GPGLL,3723.2475, N, 12158.3416, W, 161229.487, A*2C 00165 //============================================================================== 00166 // Sélection de la trame RMC - Utilisation pour les navires 00167 // Exemple : $GPRMC,141147.000,A,4347.7885,N,00418.9737,E,0.00,350.58,280621,,,A*6D 00168 00169 // UTC Position 141147.000 hhmmss.sss 00170 // Fix Indicator A A-valid V-invalid 00171 // Latitude 4347.7885 ddmm.mmmm 00172 // N/S Indicator N N=Nord - S=Sud 00173 // Longitude 00418.9737 ddmm.mmmm 00174 // W/E Indicator E W=Ouest - E=Est 00175 // Vitesse 0.00 en noeuds 00176 // Route sur le fond 350.58 en degrés 00177 // Date 280621 ddmmaa 00178 // Autres informations 00179 // Checksum *6D 00180 //==============================================================================
Generated on Mon Aug 15 2022 23:44:49 by
1.7.2