Dette er en test av NEO-7M GPS modul. Dette er en modul jeg skal bruke på hexpodden.
Arkitekturskisse
Modulen kommuniserer ved hjelp av UART. Standard hastighet er 9600 baud. Modulen bruker 3.3V som logikknivå.
Bilder
Datamottak
Når modulen slås på så starter den å sende med en gang. Under er meldinger som ble motatt. Meldingene som sendes er $ så meldingtype og så data kommaseparert.
$GPVTG,,,,,,,,,N*30 $GPGGA,,,,,,0,00,99.99,,,,,,*48 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,1,1,01,25,,,28*75 $GPGLL,,,,,,V,N*64 $GPRMC,,V,,,,,,,,,,N*53 $GPVTG,,,,,,,,,N*30 $GPGGA,,,,,,0,00,99.99,,,,,,*48 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGLL,,,,,,V,N*64 $GPRMC,,V,,,,,,,,,,N*53 $GPVTG,,,,,,,,,N*30 $GPGGA,,,,,,0,00,99.99,,,,,,*48 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGLL,,,,,,V,N*64 $GPRMC,,V,,,,,,,,,,N*53 $GPVTG,,,,,,,,,N*30 $GPGGA,,,,,,0,00,99.99,,,,,,*48 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGLL,,,,,,V,N*64 $GPRMC,,V,,,,,,,,,,N*53 $GPVTG,,,,,,,,,N*30 $GPGGA,,,,,,0,00,99.99,,,,,,*48 $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGLL,,,,,,V,N*64
$GPVTG,,T,,M,0.588,N,1.090,K,A*2E $GPGGA,203858.00,6025.56389,N,00511.21172,E,1,03,2.60,150.2,M,43.9,M,,*55 $GPGSA,A,2,31,03,06,,,,,,,,,,2.79,2.60,1.00*0D $GPGSV,3,1,10,02,30,102,,03,12,348,12,06,30,063,13,14,39,281,10*73 $GPGSV,3,2,10,19,12,043,12,22,08,329,09,24,22,147,,25,71,247,14*7E $GPGSV,3,3,10,29,28,196,,31,26,300,12*71 $GPGLL,6025.56389,N,00511.21172,E,203858.00,A,A*6F $GPRMC,203859.00,A,6025.56424,N,00511.21103,E,0.691,,010118,,,A*76 $GPVTG,,T,,M,0.691,N,1.280,K,A*26 $GPGGA,203859.00,6025.56424,N,00511.21103,E,1,03,2.60,150.6,M,43.9,M,,*56 $GPGSA,A,2,31,03,06,,,,,,,,,,2.79,2.60,1.00*0D $GPGSV,3,1,10,02,30,102,,03,12,348,13,06,30,063,14,14,39,281,11*74 $GPGSV,3,2,10,19,12,043,13,22,08,329,08,24,22,147,,25,71,247,15*7F $GPGSV,3,3,10,29,28,196,,31,26,300,13*70 $GPGLL,6025.56424,N,00511.21103,E,203859.00,A,A*68 $GPRMC,203900.00,V,,,,,,,010118,,,N*7C $GPVTG,,,,,,,,,N*30 $GPGGA,203900.00,,,,,0,00,99.99,,,,,,*6E $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 $GPGSV,3,1,10,02,30,102,,03,12,348,14,06,30,063,15,14,39,281,12*71 $GPGSV,3,2,10,19,12,043,14,22,08,329,08,24,22,147,,25,71,247,15*78 $GPGSV,3,3,10,29,28,196,,31,26,300,13*70 $GPGLL,,,,,203900.00,V,N*42 $GPRMC,203901.00,V,,,,,,,010118,,,N*7D $GPVTG,,,,,,,,,N*30
Tolkning
Melding: GPVTG
Beskrivelse: Kurs og hastighet.
Interessante felter:
- Retning (sann) – Retning i grader.
- Retning (magnetisk) – Retning i grader.
- Hastighet (knop) – Hastighet i knop.
- Hastighet (km/t) – Hastighet i km/t.
- Posisjon modus – N. Ugyldig, E. Estimert, A. Autonom GNSS, D. Differensiell GNSS
Eksempel:
Data | Kolonne | Eksempel 1 | Eksempel 2 |
Melding | 0 | GPVTG | GPVTG |
Retning (sann) | 1 | ||
Retning (magnetisk) | 3 | ||
Hastighet (knop) | 5 | 0.588 | |
Hastighet (km/t) | 7 | 1.090 | |
Posisjon modus | 9 | A |
Melding: GPGGA
Beskrivelse: Tid og posisjon, sammen med GPS-fikseringsrelaterte data.
Interessante felter:
- Tid – I format hhmmss.ss
- Breddegrad – I format ddmm.mmmm
- Nord/Sør – N. Nordlig, S. Sørlig.
- Lengdegrad – I format ddmm.mmmm
- Øst/Vest – E. Østlig, V. Vestlig.
- Kvalitet – 0. Ugyldig, 1. Standard gps(2D og 3D), 2. Differensiell gps , 6. Estimert
- Antall satelitter – Antall brukte satelitter
- Horisontal kvaltiet – Horisontal kvaltiet fra 0 – 99.99.
- Høyde over havet – Høde over havet i meter.
- Høyde over gjennomsnittlig havnivå – Høyde over gjennomsnittlig havnivå i meter.
Eksempel:
Data | Kolonne | Eksempel 1 | Eksempel 2 |
Melding | 0 | GPGGA | GPGGA |
Tid | 1 | 203858.00 | |
Breddegrad | 2 | 6025.56389 | |
Nord/Sør | 3 | N | |
Lengdegrad | 4 | 00511.21172 | |
Øst/Vest | 5 | E | |
Kvalitet | 6 | 0 | 1 |
Antall satellitter | 7 | 00 | 03 |
Horisontal kvalitet | 8 | 99.99 | 2.60 |
Høyde over havet | 9 | 150.2 | |
Høyde over gjennomsnittlig havnivå | 11 | 43.9 |
Melding: GPGSA
Beskrivelse: Beskriver satelitt informasjon.
Interessante felter:
- Op modus: A. Automatisk endre mellom 2D og 3D. M. Manuelt endre mellom 2D og 3D.
- Nav modus – 1. Ingen posisjon, 2. 2D posisjon, 3. 3D posisjon.
- PDOP – Posisjon presisjon
- HDOP – Horisontal presisjon
- VDOP – Vertikal presisjon
Eksempel:
Data | Kolonne | Eksempel 1 | Eksempel 2 |
Melding | 0 | GPGSA | GPGSA |
Op Modus | 1 | A | A |
Nav Modus | 2 | 1 | 2 |
PDOP | 15 | 99.99 | 9.45 |
HDOP | 16 | 99.99 | 5.17 |
VDOP | 17 | 99.99 | 7.91 |
Melding: GPGSV
Beskrivelse: Antall synlige satelitter og styrke. En enkelt melding kan inneholde informasjon for opptil fire satelitter. Denne meldingen kan også repeteres flere ganger for å gi informasjon om alle satelittene.
Melding: GPGLL
Beskrivelse: Breddegrad og lengdegrad, med tidspunkt og status.
Interessante felter:
- Breddegrad – I format ddmm.mmmm
- Nord/Sør – N. Nordlig, S. Sørlig.
- Lengdegrad – I format ddmm.mmmm
- Øst/Vest – E. Østlig, V. Vestlig.
- Tid – I format hhmmss.ss
- Status – V. Ugylidig, A. Gyldig.
Eksempel:
Data | Kolonne | Eksempel 1 | Eksempel 2 |
Melding | 0 | GPGLL | GPGLL |
Breddegrad | 1 | 6025.56389 | |
Nord/sør | 2 | N | |
Lengdegrad | 3 | 00511.21172 | |
Øst/Vest | 4 | E | |
Tid | 5 | 203858.00 | |
Status | 6 | V | A |
Melding: GPRMC
Beskrivelse: Anbefalte Minimumsdata.
Interessante felter:
- Tid – hhmmss.ss
- Status – V. Ikke gyldig, A. Data gyldig
- Breddegrad – I grader.
- Nord/Sør – N. Nordlig, S. Sørlig
- Lengdegrad – I grader-
- Øst/Vest – E. Øst, V. Vest.
- Hastighet – I knop.
- Retning – I grader
- Dato – Format ddmmyy.
Eksempel:
Data | Kolonne | Eksempel 1 | Eksempel 2 |
Melding | 0 | GPRMC | GPRMC |
Tid | 1 | 203858.00 | |
Status | 2 | A | |
Breddegrad | 3 | 6025.56389 | |
Nord/Sør | 4 | N | |
Lengdegrad | 5 | 00511.21172 | |
Øst/Vest | 6 | V | E |
Hastighet (knop) | 7 | 0.588 | |
Retning | 8 | ||
Dato | 9 | 010118 |
Meldinger
Slik meldingene er så holder det for øyeblikket å bruke GPRMC meldingene. Koden vil lete etter GPRMC melding, når melding blir mottatt så henter den hele meldingen. Dette vil kunne medføre flere oversendinger. Så lenge meldingen har status A(gyldig) så lagres lengdegrad og breddegrad i minnet.
Kode STM32
Dette er lagringsobjektet for GPS resultatet.
typedef enum { VALID, INVALID } statusEnum; struct GPSResult { char* latitude; char* latitudeNS; char* longitude; char* longitudeEW; statusEnum status; }; UART_HandleTypeDef gpsUart; #define GPS_BUFFER_SIZE 2000 #define BUFFER_READ_SIZE 300
GPS_BUFFER_SIZE er størrelsen på bufferet som lagres til vi får all nødvendig informasjon. BUFFER_READ_SIZE er størrelsen på bufferet vi leser hver gang.
void readCurrentGpsBuffer() { char gpsBuffer[GPS_BUFFER_SIZE] = {'\0'}; int gprmcCmdCompleted = 1; while (gprmcCmdCompleted) { char readBuffer[BUFFER_READ_SIZE] = {'\0'}; HAL_UART_Receive(&gpsUart, readBuffer, BUFFER_READ_SIZE, 1000); strcat(gpsBuffer, readBuffer); char* gprmcOccurance = strstr(gpsBuffer, "$GPRMC"); char* nextCmdReceived = strstr(gprmcOccurance, "\n"); if (gprmcOccurance != NULL && nextCmdReceived != NULL) { char* split = " "; int col = 0; while (split != NULL) { split = strtok(NULL, ","); if (col == 2) { if (strstr(split, "A") != NULL) { gpsResult.status = INVALID; return; } else { gpsResult.status = VALID; } } else if (col == 3) { gpsResult.latitude = split; } else if (col == 4) { gpsResult.latitudeNS = split; } else if (col == 5) { gpsResult.longitude = split; } else if (col == 6) { gpsResult.longitudeEW = split; } col++; } } } }
Denne koden leser inn GPS informasjon helt til en hel GPRMC melding er motatt. Når dette er gjort så lagres informasjonen til gps resultat objektet.
Du må være logget inn for å legge inn en kommentar.