Arduino: gestione del segnale GPS con GY NEO 6M e moduli compatibili


È arrivato il momento per me (e anche per te) di esplorare il Global Position System per gestire un sistema di tracciamento o un sistema per ritrovare un oggetto smarrito.

Arduino: manage GPS signal with GY NEO 6M and similar devices
Arduino: gestire il segnale GPS con GY NEO 6M e dispositivi simili

A questo scopo, esamineremo un modulo ampiamente utilizzato chiamato GY-NEO-6M.

You can find here GY-NEO-6M/F7M/8M V2

GY-NEO-6M

GY NEO 6m v2 gps sensor
GY NEO 6m v2 gps sensor

Neo 6m è un semplice ricevitore GPS che utilizza un’interfaccia UART per comunicare con il microcontrollore. Questo semplifica molto l’interoperabilità e l’utilizzo.

Specifiche

ParametroSpecifiche
Tipo di ricevitore50 Canali
GPS frequenza L1, C/A Code SBAS: WAAS, EGNOS, MSAS
Time-To-First-Fix1Cold Start: 27s
Warm Start: 27s
Hot Start: 1s
Aided Starts: <3s
SensibilitàTracking & Navigazione: -161 dBm
Riacquisizione: -160 dBm
Cold Start (senza assistenza): -147 dBm
Hot Start: -156 dBm
Frequenza massima di aggiornamento navigazione5Hz
Accuratezza posizione orizzontaleGPS: 2.5m
SBAS: 2.0m
SBAS + PPP: < 1 m (2D, R50)
SBAS + PPP: < 2 m (3D, R50)
Range di frequenza configurabile per Timepulse0.25 Hz fino a 1 kHz
Accuratezza del segnale TimepulseRMS: 30ns
99%: <60ns
Granularità: 21ns
Compensato: 15ns
Accuratezza velocità0.1m/s
Accuratezza direzione0.5 gradi
Limiti operativiDinamica: =<4g
Altitudine: 50.000 m
Velocità: 500m/s

Datasheet

No online PDF viewer installed. Download!

Collegamenti Arduino UNO

Per connettere il dispositivo ad Arduino UNO userò la SoftwareSerial, e selezionerò i pin 2 e 3.

Arduino UNO wiring GPS NEO 6M
Collegamenti Arduino UNO con GPS NEO 6M

Il GY NEO 6M è tollerante a 5V, quindi il cablaggio è molto semplice.

Arduino UNONEO 6M
5VVCC
GNDGND
2Tx
3Rx

Esempio senza libreria

Per recuperare i dati non serve alcuna libreria: il dispositivo trasmette continuamente i dati tramite l’interfaccia UART.

#include 

// Scegli due pin di Arduino da usare per la SoftwareSerial
int RXPin = 2;
int TXPin = 3;

// Il baud rate predefinito di NEO-6M è 9600
int GPSBaud = 9600;

// Crea una software serial chiamata "gpsSerial"
SoftwareSerial gpsSerial(RXPin, TXPin);

void setup()
{
  // Avvia la seriale hardware di Arduino a 9600 baud
  Serial.begin(9600);

  // Avvia la software serial con il baud rate predefinito del GPS
  gpsSerial.begin(GPSBaud);
}

void loop()
{
  // Mostra le informazioni quando una nuova frase è disponibile
  while (gpsSerial.available() > 0)
    Serial.write(gpsSerial.read());
}

Il risultato è questo flusso di dati.

$GPRMC,,V,,,,,,,,,,N*53
$GPVTG,,,,,,,,,N*30
$GPGGA,,,,,,0,00,99.99,,,,,,*48
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30 
$GPGSV,1,1,00*79
$GPGLL,,,,,,V,N*64
[...]
$GPRMC,133655.00,V,,,,,,,141022,,,N*7E
$GPVTG,,,,,,,,,N*30
$GPGGA,133655.00,,,,,0,00,99.99,,,,,,*61
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$GPGSV,1,1,03,07,,,20,09,,,27,11,,,27*76
$GPGLL,,,,,133655.00,V,N*4D
[...]
$GPRMC,134800.00,A,4322.44684,N,01231.03213,E,1.314,,141022,,,A*72
$GPVTG,,T,,M,1.314,N,2.434,K,A*25
$GPGGA,134800.00,4322.44684,N,01231.03213,E,1,04,4.83,434.4,M,44.0,M,,*51
$GPGSA,A,3,30,11,09,07,,,,,,,,,5.80,4.83,3.22*0E
$GPGSV,2,1,07,02,19,301,16,07,62,054,21,09,31,088,18,11,26,234,17*76
$GPGSV,2,2,07,14,23,159,,20,65,267,19,30,80,213,20*44
$GPGLL,4322.44684,N,01231.03213,E,134800.00,A,A*68
$GPRMC,134801.00,A,4322.44750,N,01231.03222,E,1.472,,141022,,,A*7E 
$GPVTG,,T,,M,1.472,N,2.725,K,A*21 
$GPGGA,134801.00,4322.44750,N,01231.03222,E,1,04,4.83,435.6,M,44.0,M,,*59 
$GPGSA,A,3,30,11,09,07,,,,,,,,,5.80,4.83,3.22*0E
$GPGSV,2,1,07,02,19,301,17,07,62,054,22,09,31,088,20,11,26,234,17*7F
$GPGSV,2,2,07,14,23,159,,20,65,267,20,30,80,213,20*4E
$GPGLL,4322.44750,N,01231.03222,E,134801.00,A,A*63

Il dispositivo può impiegare molto tempo a ottenere il segnale, ed è preferibile metterlo in un ambiente esterno.

Fai attenzione a questi dati; sono grezzi ma molto semplici da trasferire, quindi faremo alcuni esperimenti in futuro.

Output del dispositivo

Qui andremo a capire le frasi NMEA-0183 trasmesse dai ricevitori GPS. Lo standard NMEA fornisce un’ampia gamma di frasi, ma molte si riferiscono a dispositivi non GPS, e altre sono correlate al GPS ma usate raramente. Normalmente raccomandiamo l’uso della modalità NMEA per le nuove applicazioni GPS, per garantire la massima compatibilità con tutti i ricevitori GPS. La maggior parte dei ricevitori GPS ha anche una modalità binaria, ma di solito è meglio riservarla ad applicazioni che ne richiedono l’uso, ad esempio quelle che necessitano di aggiornamenti di posizione superiori a una volta al secondo.

$GPRMC Sentence (Posizione e tempo)

Dati GNSS minimi consigliati

Esempio (segnale non acquisito): $GPRMC,133655.00,V,,,,,,,141022,,,N*7E
Esempio (segnale acquisito): $GPRMC,134800.00,A,4322.44684,N,01231.03213,E,1.314,,141022,,,A*72

CampoEsempioCommenti
Sentence ID$GPRMC 
UTC Time134800.00hhmmss.sss
StatusAA = Valido, V = Non valido
Latitudine4322.44684ddmm.mmmm
Indicatore N/SNN = Nord, S = Sud
Longitudine01231.03213dddmm.mmmm
Indicatore E/WEE = Est, W = Ovest
Velocità su suolo1.314Nodi
Direzione su suoloGradi
Data UTC141022GGMMAA
Variazione magnetica Gradi
Checksum*72 
TerminatoreCR/LF 

$GPVTG Sentence (Direzione su suolo)

Direzione su suolo e velocità su suolo

Esempio (segnale non acquisito): $GPVTG,,,,,,,,,N*30
Esempio (segnale acquisito): $GPVTG,,T,,M,1.314,N,2.434,K,A*25

CampoEsempioCommenti
Sentence ID$GPVTG 
DirezioneDirezione in gradi
RiferimentoTT = Direzione vera
Direzione Direzione in gradi
RiferimentoMM = Direzione magnetica
Velocità1.314Velocità orizzontale
UnitàNN = Nodi
Velocità2.434Velocità orizzontale
UnitàKK = KM/h
Checksum*25 
TerminatoreCR/LF 

$GPGGA Sentence (Dati di fissaggio)

Dati di posizionamento del sistema globale

Esempio (segnale non acquisito): $GPGGA,,,,,,0,00,99.99,,,,,,*48
Esempio (segnale acquisito): $GPGGA,134800.00,4322.44684,N,01231.03213,E,1,04,4.83,434.4,M,44.0,M,,*51

CampoEsempioCommenti
Sentence ID$GPGGA
UTC Time134800.00hhmmss.sss
Latitudine4322.44684ddmm.mmmm
Indicatore N/SNN = Nord, S = Sud
Longitudine01231.03213dddmm.mmmm
Indicatore E/WEE = Est, W = Ovest
Fissaggio posizione10 = Non valido, 1 = Valido SPS, 2 = Valido DGPS, 3 = Valido PPS
Satelliti usati04Satelliti in uso (0-12)
HDOP4.83Diluizione orizzontale di precisione
Altitudine434.4Altitudine in metri secondo l’ellissoide WGS-84
Unità altitudineMM = Metri
Separazione dal geoide 44.0Separazione dal geoide in metri secondo l’ellissoide WGS-84
Unità separazioneMM = Metri
Età DGPS Età dei dati DGPS in secondi
ID stazione DGPS 
Checksum*51 
TerminatoreCR/LF 

$GPGSA Sentence (Satelliti attivi)

GNSS DOP e satelliti attivi

Esempio (segnale non acquisito): $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
Esempio (segnale acquisito): $GPGSA,A,3,30,11,09,07,,,,,,,,,5.80,4.83,3.22*0E

CampoEsempioCommenti
Sentence ID$GPGSA 
Modalità 1AA = Auto 2D/3D, M = Forzato 2D/3D
Modalità 231 = Nessun fix, 2 = 2D, 3 = 3D
Satellite usato 130Satellite usato sul canale 1
Satellite usato 211Satellite usato sul canale 2
Satellite usato 309Satellite usato sul canale 3
Satellite usato 407Satellite usato sul canale 4
Satellite usato 5 Satellite usato sul canale 5
Satellite usato 6 Satellite usato sul canale 6
Satellite usato 7 Satellite usato sul canale 7
Satellite usato 8 Satellite usato sul canale 8
Satellite usato 9 Satellite usato sul canale 9
Satellite usato 10 Satellite usato sul canale 10
Satellite usato 11 Satellite usato sul canale 11
Satellite usato 12 Satellite usato sul canale 12
PDOP5.80Diluizione di precisione posizione
HDOP4.83Diluizione orizzontale di precisione
VDOP3.22Diluizione verticale di precisione
Checksum*0E 
TerminatoreCR/LF 

$GPGSV Sentence (Satelliti visibili)

Satelliti GNSS in vista

Esempio (segnale non acquisito): $GPGSV,1,1,03,07,,,20,09,,,27,11,,,27*76
Esempio (segnale acquisito): $GPGSV,2,2,07,14,23,159,,20,65,267,19,30,80,213,20*44

CampoEsempioCommenti
Sentence ID$GPGSV 
Numero di messaggi2Numero di messaggi nel messaggio completo (1-3)
Numero sequenza2Numero sequenza di questa parte (1-3)
Satelliti in vista07 
ID Satellite 114Range 1-32
Elevazione 123Elevazione in gradi (0-90)
Azimut 1159Azimut in gradi (0-359)
SNR 1Rapporto segnale-rumore in dBHZ (0-99)
ID Satellite 220Range 1-32
Elevazione 265Elevazione in gradi (0-90)
Azimut 2267Azimut in gradi (0-359)
SNR 219Rapporto segnale-rumore in dBHZ (0-99)
ID Satellite 330Range 1-32
Elevazione 380Elevazione in gradi (0-90)
Azimut 3213Azimut in gradi (0-359)
SNR 3 20Rapporto segnale-rumore in dBHZ (0-99)
Checksum*44 
TerminatoreCR/LF 

$GPGLL Sentence (Posizione)

Posizione geografica – latitudine / longitudine

Esempio (segnale non acquisito): $GPGLL,,,,,,V,N*64
Esempio (segnale acquisito): $GPGLL,4322.44684,N,01231.03213,E,134800.00,A,A*68

CampoEsempioCommenti
Sentence ID$GPGLL
Latitudine4322.44684ddmm.mmmm
Indicatore N/SNN = Nord, S = Sud
Longitudine01231.03213dddmm.mmmm
Indicatore E/WEE = Est, W = Ovest
UTC Time134800.00hhmmss.sss
StatusAA = Valido, V = Non valido
Checksum*68 
TerminatoreCR/LF 

Esempi di output

All’inizio si riceve un messaggio come questo

$GPRMC,,V,,,,,,,,,,N*53
$GPVTG,,,,,,,,,N*30 
$GPGGA,,,,,,0,00,99.99,,,,,,*48
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$GPGSV,1,1,00*79
$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
$GPGSV,1,1,00*79 
$GPGLL,,,,,,V,N*64

Il dispositivo non lampeggia, segno che non è stato trovato alcun satellite.

Dopo un po’, probabilmente, l’output cambia in questo modo.

$GPRMC,133049.00,V,,,,,,,141022,,,N*75
$GPVTG,,,,,,,,,N*30
$GPGGA,133049.00,,,,,0,00,99.99,,,,,,*6A
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$GPGSV,1,1,01,07,,,22*7F
$GPGLL,,,,,133049.00,V,N*46

Compaiono nuovi dati 133049.00. Se controlli nelle tabelle, scopri che è l’ora UTC (13:30:49.000) e 141022 la data (14/10/2022).

Il passo successivo è iniziare a ricevere alcune informazioni GPS come queste.

$GPRMC,133534.00,V,,,,,,,141022,,,N*7A
$GPVTG,,,,,,,,,N*30 
$GPGGA,133534.00,,,,,0,00,99.99,,,,,,*65
$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
$GPGSV,1,1,02,07,,,21,09,,,23*77
$GPGLL,,,,,133534.00,V,N*49

Nella frase GPGSV, puoi vedere che sono stati trovati due satelliti.

Quindi, quando troviamo un numero sufficiente di satelliti, possiamo recuperare alcune informazioni di posizionamento.

$GPRMC,133719.00,V,,,,,,,141022,,,N*77
$GPVTG,,,,,,,,,N*30 
$GPGGA,133719.00,,,,,0,03,4.50,,,,,,*5A
$GPGSA,A,1,07,11,09,,,,,,,,,,4.61,4.50,1.00*0D
$GPGSV,2,1,05,07,66,057,16,09,34,085,28,11,29,237,28,14,19,161,*78 
$GPGSV,2,2,05,20,64,278,19*49
$GPGLL,,,,,133719.00,V,N*44

E così, dopo un po’, arriva un set completo di informazioni.

$GPRMC,134800.00,A,4322.44684,N,01231.03213,E,1.314,,141022,,,A*72
$GPVTG,,T,,M,1.314,N,2.434,K,A*25
$GPGGA,134800.00,4322.44684,N,01231.03213,E,1,04,4.83,434.4,M,44.0,M,,*51
$GPGSA,A,3,30,11,09,07,,,,,,,,,5.80,4.83,3.22*0E
$GPGSV,2,1,07,02,19,301,16,07,62,054,21,09,31,088,18,11,26,234,17*76
$GPGSV,2,2,07,14,23,159,,20,65,267,19,30,80,213,20*44
$GPGLL,4322.44684,N,01231.03213,E,134800.00,A,A*68

$GPRMC,134801.00,A,4322.44750,N,01231.03222,E,1.472,,141022,,,A*7E 
$GPVTG,,T,,M,1.472,N,2.725,K,A*21 
$GPGGA,134801.00,4322.44750,N,01231.03222,E,1,04,4.83,435.6,M,44.0,M,,*59 
$GPGSA,A,3,30,11,09,07,,,,,,,,,5.80,4.83,3.22*0E
$GPGSV,2,1,07,02,19,301,17,07,62,054,22,09,31,088,20,11,26,234,17*7F
$GPGSV,2,2,07,14,23,159,,20,65,267,20,30,80,213,20*4E
$GPGLL,4322.44750,N,01231.03222,E,134801.00,A,A*63

Libreria

Come al solito, ci sono molte librerie per fare il parsing delle frasi GPS, ma una delle più utilizzate è certamente TinyGPSPlus.

Arduino GPS: TinyGPSPlus library manager
Arduino GPS: TinyGPSPlus library manager

Esempio di base

Ecco l’esempio “classico” per recuperare le informazioni più importanti dal dispositivo utilizzando la libreria TinyGPSPlus.

#include 
#include 
/*
   Questo esempio dimostra l'utilizzo normale di un oggetto TinyGPSPlus.
   Richiede l'uso di SoftwareSerial e presuppone che tu abbia
   un dispositivo GPS seriale a 9600 baud collegato ai pin 4(rx) e 3(tx).
*/
static const int RXPin = 2, TXPin = 3;
static const uint32_t GPSBaud = 9600;

// Oggetto TinyGPSPlus
TinyGPSPlus gps;

// Collegamento seriale verso il GPS
SoftwareSerial ss(RXPin, TXPin);

void setup()
{
  Serial.begin(9600);
  ss.begin(GPSBaud);

  Serial.println(F("FullExample.ino"));
  Serial.println(F("Un esempio esteso di molte funzionalità interessanti di TinyGPSPlus"));
  Serial.print(F("Test della libreria TinyGPSPlus v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println(F("by Mikal Hart"));
  Serial.println();
  Serial.println(F("Sats HDOP  Latitude   Longitude   Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum"));
  Serial.println(F("           (deg)      (deg)       Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail"));
  Serial.println(F("----------------------------------------------------------------------------------------------------------------------------------------"));
}

void loop()
{
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;

  printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
  printFloat(gps.hdop.hdop(), gps.hdop.isValid(), 6, 1);
  printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
  printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
  printInt(gps.location.age(), gps.location.isValid(), 5);
  printDateTime(gps.date, gps.time);
  printFloat(gps.altitude.meters(), gps.altitude.isValid(), 7, 2);
  printFloat(gps.course.deg(), gps.course.isValid(), 7, 2);
  printFloat(gps.speed.kmph(), gps.speed.isValid(), 6, 2);
  printStr(gps.course.isValid() ? TinyGPSPlus::cardinal(gps.course.deg()) : "*** ", 6);

  unsigned long distanceKmToLondon =
    (unsigned long)TinyGPSPlus::distanceBetween(
      gps.location.lat(),
      gps.location.lng(),
      LONDON_LAT,
      LONDON_LON) / 1000;
  printInt(distanceKmToLondon, gps.location.isValid(), 9);

  double courseToLondon =
    TinyGPSPlus::courseTo(
      gps.location.lat(),
      gps.location.lng(),
      LONDON_LAT,
      LONDON_LON);

  printFloat(courseToLondon, gps.location.isValid(), 7, 2);

  const char *cardinalToLondon = TinyGPSPlus::cardinal(courseToLondon);

  printStr(gps.location.isValid() ? cardinalToLondon : "*** ", 6);

  printInt(gps.charsProcessed(), true, 6);
  printInt(gps.sentencesWithFix(), true, 10);
  printInt(gps.failedChecksum(), true, 9);
  Serial.println();

  smartDelay(1000);

  if (millis() > 5000 && gps.charsProcessed() < 10)
    Serial.println(F("Nessun dato GPS ricevuto: controlla i collegamenti"));
}

// Questa versione personalizzata di delay() garantisce che l'oggetto gps
// continui a ricevere dati.
static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . e -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i 0)
    sz[len-1] = ' ';
  Serial.print(sz);
  smartDelay(0);
}

static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  if (!d.isValid())
  {
    Serial.print(F("********** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d ", d.month(), d.day(), d.year());
    Serial.print(sz);
  }

  if (!t.isValid())
  {
    Serial.print(F("******** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
    Serial.print(sz);
  }

  printInt(d.age(), d.isValid(), 5);
  smartDelay(0);
}

static void printStr(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i

L’output iniziale è questo.

An extensive example of many interesting TinyGPSPlus features
Testing TinyGPSPlus library v. 1.0.2
by Mikal Hart

Sats HDOP  Latitude   Longitude   Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum
           (deg)      (deg)       Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail
---------------------------------------------------------------------------------------------------------------------------------------- 
0    100.0  ********** *********** **** 00/00/2000 00:00:00 561  ****** ****** ***** ***   ******** ****** ***   225   0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 640  ****** ****** ***** ***   ******** ****** ***   387   0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 717  ****** ****** ***** ***   ******** ****** ***   549   0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 796  ****** ****** ***** ***   ******** ****** ***   711   0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 873  ****** ****** ***** ***   ******** ****** ***   873   0         0         
0    100.0  ********** *********** **** 00/00/2000 00:00:00 952  ****** ****** ***** ***   ******** ****** ***   1070  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 54   ****** ****** ***** ***   ******** ****** ***   1313  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 132  ****** ****** ***** ***   ******** ****** ***   1521  0         0         
0    100.0  ********** *********** **** 00/00/2000 00:00:00 187  ****** ****** ***** ***   ******** ****** ***   1683  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 266  ****** ****** ***** ***   ******** ****** ***   1845  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 344  ****** ****** ***** ***   ******** ****** ***   2007  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 421  ****** ****** ***** ***   ******** ****** ***   2169  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 501  ****** ****** ***** ***   ******** ****** ***   2331  0         0         
0    100.0  ********** *********** **** 00/00/2000 00:00:00 578  ****** ****** ***** ***   ******** ****** ***   2493  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 657  ****** ****** ***** ***   ******** ****** ***   2655  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 735  ****** ****** ***** ***   ******** ****** ***   2817  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 813  ****** ****** ***** ***   ******** ****** ***   2979  0         0         
0    100.0  ********** *********** **** 00/00/2000 00:00:00 891  ****** ****** ***** ***   ******** ****** ***   3141  0         0         
0    100.0  ********** *********** **** 00/00/2000 00:00:00 968  ****** ****** ***** ***   ******** ****** ***   3354  0         0         
0    100.0  ********** *********** **** 00/00/2000 00:00:00 72   ****** ****** ***** ***   ******** ****** ***   3598  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 151  ****** ****** ***** ***   ******** ****** ***   3805  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 206  ****** ****** ***** ***   ******** ****** ***   3983  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 284  ****** ****** ***** ***   ******** ****** ***   4153  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 360  ****** ****** ***** ***   ******** ****** ***   4323  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 438  ****** ****** ***** ***   ******** ****** ***   4493  0         0         
0    100.0  ********** *********** **** 00/00/2000 00:00:00 518  ****** ****** ***** ***   ******** ****** ***   4655  0         0         
0    100.0  ********** *********** **** 00/00/2000 00:00:00 595  ****** ****** ***** ***   ******** ****** ***   4817  0         0         
0    100.0  ********** *********** **** 00/00/2000 00:00:00 674  ****** ****** ***** ***   ******** ****** ***   4979  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 751  ****** ****** ***** ***   ******** ****** ***   5141  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 830  ****** ****** ***** ***   ******** ****** ***   5303  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 907  ****** ****** ***** ***   ******** ****** ***   5465  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 1010 ****** ****** ***** ***   ******** ****** ***   5703  0         0        
0    100.0  ********** *********** **** 00/00/2000 00:00:00 91   ****** ****** ***** ***   ******** ****** ***   5939  0         0         

Quando la data viene recuperata.

0    100.0  ********** *********** **** 10/19/2022 10:42:50 224  ****** ****** ***** ***   ******** ****** ***   16039 0         0        
0    100.0  ********** *********** **** 10/19/2022 10:42:51 168  ****** ****** ***** ***   ******** ****** ***   16059 0         0        
0    100.0  ********** *********** **** 10/19/2022 10:42:52 382  ****** ****** ***** ***   ******** ****** ***   16079 0         0        
0    100.0  ********** *********** **** 10/19/2022 10:42:53 462  ****** ****** ***** ***   ******** ****** ***   16100 0         0         
0    100.0  ********** *********** **** 10/19/2022 10:42:54 539  ****** ****** ***** ***   ******** ****** ***   16120 0         0        
0    100.0  ********** *********** **** 10/19/2022 10:42:55 617  ****** ****** ***** ***   ******** ****** ***   16140 0         0        
0    100.0  ********** *********** **** 10/19/2022 10:42:56 693  ****** ****** ***** ***   ******** ****** ***   16160 0         0        
0    100.0  ********** *********** **** 10/19/2022 10:42:57 610  ****** ****** ***** ***   ******** ****** ***   16181 0         0        
0    100.0  ********** *********** **** 10/19/2022 10:42:58 850  ****** ****** ***** ***   ******** ****** ***   16202 0         0        
0    100.0  ********** *********** **** 10/19/2022 10:42:59 927  ****** ****** ***** ***   ******** ****** ***   16224 0         0        
0    100.0  ********** *********** **** 10/19/2022 10:43:01 32   ****** ****** ***** ***   ******** ****** ***   16254 0         0         
0    100.0  ********** *********** **** 10/19/2022 10:43:02 113  ****** ****** ***** ***   ******** ****** ***   16281 0         0        
0    100.0  ********** *********** **** 10/19/2022 10:43:03 32   ****** ****** ***** ***   ******** ****** ***   16294 0         0         

E infine, quando i dati GPS vengono effettivamente recuperati.

5    1.5   43.374248  12.517117   762  10/19/2022 12:13:56 878  420.50 328.72 0.02  NNW   1309     318.10 NW    15926 1924      0        
5    1.5   43.374248  12.517118   1    10/19/2022 12:13:58 16   420.40 328.72 0.33  NNW   1309     318.10 NW    15932 1927      0        
5    1.5   43.374248  12.517124   42   10/19/2022 12:13:59 171  420.10 328.72 0.57  NNW   1309     318.10 NW    15938 1930      0         
5    1.5   43.374248  12.517124   178  10/19/2022 12:14:00 308  419.90 328.72 0.28  NNW   1309     318.10 NW    15944 1932      0        
5    1.5   43.374248  12.517126   294  10/19/2022 12:14:01 410  419.70 328.72 0.30  NNW   1309     318.10 NW    15949 1934      0        
5    1.5   43.374244  12.517125   361  10/19/2022 12:14:02 477  419.60 328.72 0.15  NNW   1309     318.10 NW    15953 1936      0         
5    1.5   43.374244  12.517123   440  10/19/2022 12:14:03 555  419.60 328.72 0.54  NNW   1309     318.10 NW    15958 1938      0        
5    1.5   43.374244  12.517125   514  10/19/2022 12:14:04 630  419.30 328.72 0.06  NNW   1309     318.10 NW    15962 1940      0         
5    1.5   43.374244  12.517127   592  10/19/2022 12:14:05 708  419.10 328.72 0.15  NNW   1309     318.10 NW    15967 1942      0        
5    1.5   43.374244  12.517127   670  10/19/2022 12:14:06 784  419.20 328.72 0.11  NNW   1309     318.10 NW    15972 1944      0        
5    1.5   43.374244  12.517127   748  10/19/2022 12:14:07 863  419.30 328.72 0.28  NNW   1309     318.10 NW    15976 1946      0         
5    1.5   43.374244  12.517126   873  10/19/2022 12:14:08 1001 419.40 328.72 0.20  NNW   1309     318.10 NW    15982 1949      0         
5    1.5   43.374244  12.517127   17   10/19/2022 12:14:10 154  419.50 328.72 0.30  NNW   1309     318.10 NW    15988 1952      0        
5    1.5   43.374244  12.517125   167  10/19/2022 12:14:11 296  419.50 328.72 0.46  NNW   1309     318.10 NW    15994 1954      0         
5    1.5   43.374244  12.517127   294  10/19/2022 12:14:12 408  419.30 328.72 0.07  NNW   1309     318.10 NW    15999 1956      0        
5    1.5   43.374244  12.517127   344  10/19/2022 12:14:13 460  419.30 328.72 0.15  NNW   1309     318.10 NW    16004 1958      0        
5    1.5   43.374244  12.517130   425  10/19/2022 12:14:14 541  419.10 328.72 0.19  NNW   1309     318.10 NW    16008 1960      0        
5    1.5   43.374244  12.517133   504  10/19/2022 12:14:15 618  418.80 328.72 0.41  NNW   1309     318.10 NW    16013 1962      0        

Esempio semplificato

Un altro sketch semplice potrebbe essere questo, che recupera solo le informazioni di base.

#include "Arduino.h"
#include "SoftwareSerial.h"
#include 

static const int RXPin = 2, TXPin = 3;
static const uint32_t GPSBaud = 9600;

// Oggetto TinyGPSPlus
TinyGPSPlus gps;

// Connessione seriale al dispositivo GPS
SoftwareSerial gpsSerial(RXPin, TXPin);

//La funzione setup viene chiamata una volta all'avvio dello sketch
void setup()
{
	Serial.begin(9600);
	Serial.println(PSTR("\nOne Wire Half Duplex Serial Tester"));
	gpsSerial.begin(9600, EspSoftwareSerial::SWSERIAL_8N1, 18, 18, false, 256);
	gpsSerial.enableIntTx(false);

}

void loop()
{
	  while (gpsSerial.available())     // controlla la presenza di dati GPS
	  {
	    // Serial.write(gpsSerial.read());
	    // Serial.println(gpsSerial.read());
	    if (gps.encode(gpsSerial.read()))   // codifica i dati GPS
	    {
	      Serial.print("SATS: ");
	      Serial.println(gps.satellites.value());
	      Serial.print("LAT: ");
	      Serial.println(gps.location.lat(), 6);
	      Serial.print("LONG: ");
	      Serial.println(gps.location.lng(), 6);
	      Serial.print("ALT: ");
	      Serial.println(gps.altitude.meters());
	      Serial.print("SPEED: ");
	      Serial.println(gps.speed.mps());

	      Serial.print("Date: ");
	      Serial.print(gps.date.day()); Serial.print("/");
	      Serial.print(gps.date.month()); Serial.print("/");
	      Serial.println(gps.date.year());

	      Serial.print("Hour: ");
	      Serial.print(gps.time.hour()); Serial.print(":");
	      Serial.print(gps.time.minute()); Serial.print(":");
	      Serial.println(gps.time.second());
	      Serial.println("---------------------------");
	      delay(4000);
	    }
	    //else {
	    //   Serial.println("ERROR!");
	    //}
	  }
}

Il risultato è questo.

---------------------------
SATS: 0
LAT: 0.000000
LONG: 0.000000
ALT: 0.00
SPEED: 0.00
Date: 0/0/2000
Hour: 0:0:0
---------------------------
SATS: 0
LAT: 0.000000
LONG: 0.000000
ALT: 0.00
SPEED: 0.00
Date: 0/0/2000
Hour: 0:0:0
---------------------------

Quando acquisisce le coordinate.

--------------------------- 
SATS: 8 
LAT: 43.374256 
LONG: 12.517083 
ALT: 411.30 
SPEED: 0.04
Date: 16/4/2024 
Hour: 7:26:39 
--------------------------- 
SATS: 8 
LAT: 43.374256 
LONG: 12.517083 
ALT: 411.30 
SPEED: 0.04
Date: 16/4/2024 
Hour: 7:26:39 
--------------------------- 

Grazie

  1. Arduino Programmazione remota/wireless
  2. BMP280, DHT11 and DHT22, DHT12, Dallas Temperature ds18b20, Thermistor
  3. Scheda di programmazione ATtiny (ArduinoUNO come ISP)
  4. Inviare email con esp8266 e Arduino (Libreria v1.x)
  5. Come usare la scheda SD con esp8266 e Arduino
  6. Ebyte LoRa E32 per Arduino, esp32 o esp8266 : WOR (wake on radio) del microcontrollore e uno shield per Arduino
  7. Gestire file JSON con Arduino, esp32 ed esp8266
  8. Come interfacciare Arduino, esp8266 o esp32 alla seriale RS-485
  9. Inviare email con allegati (libreria v2.x): Arduino Ethernet
  10. WebSocket
  11. Arduino AVR: binario compilato (.hex) da riga di comando o strumenti grafici
  12. Arduino: memoria SPI flash esterna veloce
  13. Accelerometro GY-291 ADXL345 i2c spi con interrupt per esp32, esp8266, stm32 e Arduino
  14. i2c Arduino: come creare una rete, parametri e scanner di indirizzi
  15. Magnetometro GY-273 QMC5883L clone HMC5883L per Arduino, esp8266 e esp32
  16. Debug remoto via WiFi di un Arduino con DT-06
  17. Programmare Arduino UNO da remoto via WiFi con il firmware ESP-Link su DT-06
  18. Introduzione alla Programmazione Remota dell’Arduino UNO r3 tramite WiFi con l’ESP8266
  19. Debug remoto via WiFi su Arduino utilizzando un ESP8266 (NodeMCU e ESP01) con firmware ESP-LINK
  20. Arduino: gestire il segnale GPS con GY NEO 6M e dispositivi simili

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *