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å.

neo-7m - Page 1

Bilder

20180101_023026

20180128_013047

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.

Sendt av Kjetil Fjellheim