Problemi con modulo gps

Buongiorno a tutti, come alcuni di voi sapranno sto cercando di creare un GPS che in relazione a coordinate date indichi la direzione da seguire per raggiungere tale punto attraverso un modulo bussola.

Non so se questa sia la strada giusta ma sto procedendo step by step, ovvero prima comprendo il funzionamento dei singoli moduli e successivamente li metto in relazione tra loro.

Finalmente è arrivato da Aliexpress il modulo GPS e sto cercando di decodificare i dati che arrivano attraverso la libreria TinyGPS.h.

Il modello che ho acquistato è il seguente :link

Ho provato differenti sketch ma riesco a leggere sul seriale solo dati “puri” senza riuscire a codificarli.
Di seguito gli sketch che sono riuscito a trovare online.

//SKETCH UNO

#include <SoftwareSerial.h>
#include <TinyGPS.h>

float lat = 0.0;
float lon = 0.0;

SoftwareSerial gpsSerial (3,4);  // 3: RX, 4: TX

TinyGPS gps;

void setup() {
  Serial.begin(9600);
  gpsSerial.begin(9600);
  Serial.println ("GPS PRONTO");

}

void loop() {
  while(gpsSerial.available()){
    char c = gpsSerial.read();
    Serial.print(c);

    if (gps.encode(c)){
      gps.f_get_position(&lat, &lon);

      Serial.print(lat);
      Serial.print(" ");
      Serial.println(lon);
    }
 } 
 delay (1000);
}
// SKETCH DUE

#include <SoftwareSerial.h>
#include <TinyGPS.h>

long latitude, longitude;
unsigned long idadeInfo;

SoftwareSerial gpsSerial(3, 4); // RX, TX
TinyGPS gps;

void setup() {
   gpsSerial.begin(9600);
   Serial.begin(9600);
   Serial.println("GPS PRONTO");
}

void loop() {
  bool ricevuto = false;

  while (gpsSerial.available()) {
     char c = gpsSerial.read();
     ricevuto = gps.encode(c);
  }

  if (ricevuto) {
     Serial.println("----------------------------------------");
     
     gps.get_position(&latitude, &longitude, &idadeInfo);     

     if (latitude != TinyGPS::GPS_INVALID_F_ANGLE) {
        Serial.print("Latitude: ");
        Serial.println(float(latitude) / 100000, 6);
     }

     if (longitude != TinyGPS::GPS_INVALID_F_ANGLE) {
        Serial.print("Longitude: ");
        Serial.println(float(longitude) / 100000, 6);
     }

     if (idadeInfo != TinyGPS::GPS_INVALID_AGE) {
        Serial.print("Idade da Informacao (ms): ");
        Serial.println(idadeInfo);
     }
     }
     }

Il problema è che in entrambi i sketch mi legge e mi stampa "c" ma quando gli chiedo di decodificarlo col comando gps.encode (c) non mi stampa nulla. Ho provato ad inserire un else dopo "if gps.encode (c)" e risponde sempre l'else, quindi suppongo non decodifichi.

Il modulo GPS credo funzioni perché ho attaccato tx e rx sui pin 0 e 1 e quando fixa mi tira fuori anche la posizione.

Vi ringrazio in anticipo per la pazienza
Silvio

Premesso che al 99% QUELLO è un falso NEO-6M (... prova a leggere QUESTO mio vecchio thread) dato che NON è nenache marchiato u-blox ... comunque ... su che Arduino lo stai provando?

Guglielmo

gpb01:
Premesso che al 99% QUELLO è un falso NEO-6M (... prova a leggere QUESTO mio vecchio thread) dato che NON è nenache marchiato u-blox ... comunque ... su che Arduino lo stai provando?

Guglielmo

Ciao Guglielmo e grazie per la risposta

in realtà è marchiato U-blox ma connettendolo ai pin 0 e 1 non esce nulla riguardo al produttore (come ho visto nel tuo post), ho come la sensazione che non sia affatto originale può rappresentare un grande problema?

Riguardo la tua domanda sto usando un elegoo uno r3.

Come detto è al 99% un falso ... c'è solo la speranza che almeno detro ci sia un GPS ...
... collegalo ai pin 10 ed 11 in questo modo

pin 10 Arduino <--- TX GPS
pin 11 Arduino ---> RX GPS
GND Arduino <---> GND GPS
5V Arduino ------> 5V GPS

e poi usi il programma il seguente programma di prova con cui puoi veder sul monitor sreiale cosa arriva ...

#include <SoftwareSerial.h>

#define  SS_RX 10            // RX PIN to receive  data
#define  SS_TX 11            // TX PIN to transmit data

SoftwareSerial ssSerial(SS_RX, SS_TX);

void setup()
{
  delay (500);
  //
  Serial.begin(9600);        // Initialize USB Serial port
  ssSerial.begin(9600);      // Initialize SoftwareSerial port
  //
  Serial.println("--- Ports ready ---");
  Serial.println("");
}

void loop()
{
  if (ssSerial.available() > 0) Serial.write(ssSerial.read());
  if (Serial.available() > 0) ssSerial.write(Serial.read());
}

... sperando che il modulo lavori a 9600 baud.

Guglielmo

Buongiorno, ho utilizzato il codice che mi hai inviato e questo è il risultato:

--- Ports ready ---

$GPRMC,113828.00,A,4143.45423,N,01217.37512,E,0.298,,181120,,,A*78
$GPVTG,,T,,M,0.298,N,0.552,K,A*22
$GPGGA,113828.00,4143.45423,N,01217.37512,E,1,08,0.97,2.4,M,43.8,M,,*53
$GPGSA,A,3,30,02,03,05,07,09,06,04,,,,,1.70,0.97,1.39*0A
$GPGSV,3,1,09,02,36,294,34,03,13,123,16,04,30,064,25,05,11,307,30*7B
$GPGSV,3,2,09,06,48,229,38,07,65,168,35,09,66,038,30,26,01,027,*75
$GPGSV,3,3,09,30,38,196,35*40
$GPGLL,4143.45423,N,01217.37512,E,113828.00,A,A*69

Ho utilizzato l'ultimo valore $GPGLL su freenmea ed effettivamente mi tira fuori l'esatta posizione.

Mi chiedo perché non riesca a codificarli con la libreria TinyGPS.

Bene, anche se non sappiamo COSA c'è dentro, almeno sappiamo che è un modulino GPS :smiley: :smiley: :smiley:

I dati sono corretti e sono giustamente in formato NMEA ora ...
sicuro dei collegameti che avevi fatto prima? Perché, nell'esempio che vedo nella libreria trovo:

SoftwareSerial ss(4, 3);

.... mentre tu usi i pin al contrario.

Ricorda che il primo è il pin su cui Arduino riceve, quindi va al TX del GPS, il secondo è quello su cui Arduino tramette e va al RX del GPS.

Prova con l'esempio che danno loro "simple_test.ino" e vedi se va ...

Guglielmo

Buongiorno! i collegamenti erano già stati fatti come mi hai indicato, ieri sera ho riprovato e mentre il primo sketch mi continua a dare problemi tirando fuori valori completamente sballati lo sketch due mi restituisce valori di lat e lon giusti. Credo che l'errore fosse molto banale, ovvero quando ho provato il secondo sketch il modulino gps non stava fixando perché non ero più in balcone.

Ti ringrazio molto per l'aiuto.

Non so se sia il caso di continuare su questa discussione o nella precedente, ma ora mi sto orientando sul calcolo della direzione tra due punti geografici e cercando un pò online ho trovato e sistemato questo sketch:

#include <SoftwareSerial.h>

SoftwareSerial gpsSerial (3,4);  // 3: RX, 4: TX
float lat = 42.9532000;
float lon = 10.6845600;
float lat2 = 49.17021;
float lon2 = -9.7425;
float teta1 = radians(lat);
float teta2 = radians(lat2);
float delta1 = radians(lat2-lat);
float delta2 = radians(lon2-lon);
float y = sin(delta2) * cos(teta2);
float x = cos(teta1)*sin(teta2) - sin(teta1)*cos(teta2)*cos(delta2);
float brng = atan2(y,x);
float brng1 = degrees(brng);// radians to degrees
float brng2 = ( ((int)brng1 + 360) % 360 );


void setup() {
Serial.begin(9600);
gpsSerial.begin(9600);
Serial.print("Heading GPS: ");
Serial.println(brng2);

return brng;

}

I due punti geografici sono stati presi a caso per verificare se la direzione calcolata fosse giusta tramite questo sito.

Il problema è che questo sketch ha una percentuale bassa di errore per distanze inferiori ai 3/400 km (ad occhio e croce sbaglia di uno due gradi che per il mio progetto sono più che accettabili) mentre all'aumentare della distanza aumenta e non di poco la percentuale di errore.

Come ho già detto nella presentazione non sono molto pratico di arduino e di programmazione ma sto cercando di imparare, credo però che la formula stessa sia sbagliata perché sul sito che ho indicato mi sembra che la formula per calcolare una direzione esatta tra due punti sia totalmente diversa. Qualcuno mi sa indicare uno sketch migliore?

Vi ringrazio molto come al solito.

hasjed:
... Non so se sia il caso di continuare su questa discussione o nella precedente ...

Direi che questa è conclusa ed il problema risolto ...
... tornerei nell'altra per tutto quello che invece riguarda i calcoli e le formule :slight_smile:

Guglielmo