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.

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
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
Parametro | Specifiche |
---|---|
Tipo di ricevitore | 50 Canali GPS frequenza L1, C/A Code SBAS: WAAS, EGNOS, MSAS |
Time-To-First-Fix1 | Cold 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 navigazione | 5Hz |
Accuratezza posizione orizzontale | GPS: 2.5m SBAS: 2.0m SBAS + PPP: < 1 m (2D, R50) SBAS + PPP: < 2 m (3D, R50) |
Range di frequenza configurabile per Timepulse | 0.25 Hz fino a 1 kHz |
Accuratezza del segnale Timepulse | RMS: 30ns 99%: <60ns Granularità: 21ns Compensato: 15ns |
Accuratezza velocità | 0.1m/s |
Accuratezza direzione | 0.5 gradi |
Limiti operativi | Dinamica: =<4g Altitudine: 50.000 m Velocità: 500m/s |
Datasheet
Collegamenti Arduino UNO
Per connettere il dispositivo ad Arduino UNO userò la SoftwareSerial, e selezionerò i pin 2 e 3.
Il GY NEO 6M è tollerante a 5V, quindi il cablaggio è molto semplice.
Arduino UNO | NEO 6M |
---|---|
5V | VCC |
GND | GND |
2 | Tx |
3 | Rx |
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
Campo | Esempio | Commenti |
---|---|---|
Sentence ID | $GPRMC | |
UTC Time | 134800.00 | hhmmss.sss |
Status | A | A = Valido, V = Non valido |
Latitudine | 4322.44684 | ddmm.mmmm |
Indicatore N/S | N | N = Nord, S = Sud |
Longitudine | 01231.03213 | dddmm.mmmm |
Indicatore E/W | E | E = Est, W = Ovest |
Velocità su suolo | 1.314 | Nodi |
Direzione su suolo | Gradi | |
Data UTC | 141022 | GGMMAA |
Variazione magnetica | Gradi | |
Checksum | *72 | |
Terminatore | CR/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
Campo | Esempio | Commenti |
---|---|---|
Sentence ID | $GPVTG | |
Direzione | Direzione in gradi | |
Riferimento | T | T = Direzione vera |
Direzione | Direzione in gradi | |
Riferimento | M | M = Direzione magnetica |
Velocità | 1.314 | Velocità orizzontale |
Unità | N | N = Nodi |
Velocità | 2.434 | Velocità orizzontale |
Unità | K | K = KM/h |
Checksum | *25 | |
Terminatore | CR/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
Campo | Esempio | Commenti |
---|---|---|
Sentence ID | $GPGGA | |
UTC Time | 134800.00 | hhmmss.sss |
Latitudine | 4322.44684 | ddmm.mmmm |
Indicatore N/S | N | N = Nord, S = Sud |
Longitudine | 01231.03213 | dddmm.mmmm |
Indicatore E/W | E | E = Est, W = Ovest |
Fissaggio posizione | 1 | 0 = Non valido, 1 = Valido SPS, 2 = Valido DGPS, 3 = Valido PPS |
Satelliti usati | 04 | Satelliti in uso (0-12) |
HDOP | 4.83 | Diluizione orizzontale di precisione |
Altitudine | 434.4 | Altitudine in metri secondo l’ellissoide WGS-84 |
Unità altitudine | M | M = Metri |
Separazione dal geoide | 44.0 | Separazione dal geoide in metri secondo l’ellissoide WGS-84 |
Unità separazione | M | M = Metri |
Età DGPS | Età dei dati DGPS in secondi | |
ID stazione DGPS | ||
Checksum | *51 | |
Terminatore | CR/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
Campo | Esempio | Commenti |
---|---|---|
Sentence ID | $GPGSA | |
Modalità 1 | A | A = Auto 2D/3D, M = Forzato 2D/3D |
Modalità 2 | 3 | 1 = Nessun fix, 2 = 2D, 3 = 3D |
Satellite usato 1 | 30 | Satellite usato sul canale 1 |
Satellite usato 2 | 11 | Satellite usato sul canale 2 |
Satellite usato 3 | 09 | Satellite usato sul canale 3 |
Satellite usato 4 | 07 | Satellite 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 | |
PDOP | 5.80 | Diluizione di precisione posizione |
HDOP | 4.83 | Diluizione orizzontale di precisione |
VDOP | 3.22 | Diluizione verticale di precisione |
Checksum | *0E | |
Terminatore | CR/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
Campo | Esempio | Commenti |
---|---|---|
Sentence ID | $GPGSV | |
Numero di messaggi | 2 | Numero di messaggi nel messaggio completo (1-3) |
Numero sequenza | 2 | Numero sequenza di questa parte (1-3) |
Satelliti in vista | 07 | |
ID Satellite 1 | 14 | Range 1-32 |
Elevazione 1 | 23 | Elevazione in gradi (0-90) |
Azimut 1 | 159 | Azimut in gradi (0-359) |
SNR 1 | Rapporto segnale-rumore in dBHZ (0-99) | |
ID Satellite 2 | 20 | Range 1-32 |
Elevazione 2 | 65 | Elevazione in gradi (0-90) |
Azimut 2 | 267 | Azimut in gradi (0-359) |
SNR 2 | 19 | Rapporto segnale-rumore in dBHZ (0-99) |
ID Satellite 3 | 30 | Range 1-32 |
Elevazione 3 | 80 | Elevazione in gradi (0-90) |
Azimut 3 | 213 | Azimut in gradi (0-359) |
SNR 3 | 20 | Rapporto segnale-rumore in dBHZ (0-99) |
Checksum | *44 | |
Terminatore | CR/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
Campo | Esempio | Commenti |
---|---|---|
Sentence ID | $GPGLL | |
Latitudine | 4322.44684 | ddmm.mmmm |
Indicatore N/S | N | N = Nord, S = Sud |
Longitudine | 01231.03213 | dddmm.mmmm |
Indicatore E/W | E | E = Est, W = Ovest |
UTC Time | 134800.00 | hhmmss.sss |
Status | A | A = Valido, V = Non valido |
Checksum | *68 | |
Terminatore | CR/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.
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
- Arduino Programmazione remota/wireless
- BMP280, DHT11 and DHT22, DHT12, Dallas Temperature ds18b20, Thermistor
- Scheda di programmazione ATtiny (ArduinoUNO come ISP)
- Inviare email con esp8266 e Arduino (Libreria v1.x)
- Come usare la scheda SD con esp8266 e Arduino
- Ebyte LoRa E32 per Arduino, esp32 o esp8266 : WOR (wake on radio) del microcontrollore e uno shield per Arduino
- Gestire file JSON con Arduino, esp32 ed esp8266
- Come interfacciare Arduino, esp8266 o esp32 alla seriale RS-485
- Inviare email con allegati (libreria v2.x): Arduino Ethernet
- WebSocket
- Arduino AVR: binario compilato (.hex) da riga di comando o strumenti grafici
- Arduino: memoria SPI flash esterna veloce
- Accelerometro GY-291 ADXL345 i2c spi con interrupt per esp32, esp8266, stm32 e Arduino
- i2c Arduino: come creare una rete, parametri e scanner di indirizzi
- Magnetometro GY-273 QMC5883L clone HMC5883L per Arduino, esp8266 e esp32
- Debug remoto via WiFi di un Arduino con DT-06
- Programmare Arduino UNO da remoto via WiFi con il firmware ESP-Link su DT-06
- Introduzione alla Programmazione Remota dell’Arduino UNO r3 tramite WiFi con l’ESP8266
- Debug remoto via WiFi su Arduino utilizzando un ESP8266 (NodeMCU e ESP01) con firmware ESP-LINK
- Arduino: gestire il segnale GPS con GY NEO 6M e dispositivi simili