GPS ublox 6m per aerostato

Ciao a tutti :slight_smile:

Parto dall'inizio

Assieme ad un gruppo di amici, visto il Successo del lancio del precedente
pallone aerostatico ad elio, da noi progettato e costruito, stiamo progettando e realizzando un secondo aerostato.
Dato che alcuni sponsor si sono fatti avanti per finanziare in parte il lancio di
questo secondo pallone, ci stiamo dando da fare per fare le cose in grande :slight_smile:

Questo aerostato sarà dotato di sensori di temperatura, pressione, altezza e posizione più
telecamera in altissima definizione (4K).
Tutti i sensori sono gia stati acquistati, li stiamo programmando, ed i relativi codici saranno resi disponibili a tutti.

Il pallone ha un volume di 2100 m cubi e sarà riempito con elio, è stato progettato per superare i 40'000 m. (tutti i permessi e le normative, riguardanti l'occupazione di spazi aerei saranno rispettati)
Il progetto è ancora all'inizio, ma chiunque di voi è interessato a seguirne lo svolgimento,
partecipare alla realizzazione, sponsorizzare anche con un solo euro il progetto o è semplicemente curioso, trova tutte le informazioni a questa pagina:

apotatostory.com/airballoonstory/come-progettare-aerostato/uhab-oltre-i-40000-metri

Per visualizzare correttamente il link copiatelo nella barra in alto senza i due asterischi davanti e dietro

Ora passiamo alla domanda che volevo rivolgervi
Stiamo incontrando difficoltà con il GPS

Abbiamo installato la libreria tinyGPSplus
Il problema è che una volta collegato il tutto (3,3v, GND, RX al pin 15, TX pin 14) dopo un po il gps lampeggia (ho letto significa che ha trovato i satelliti) MA non comunica i dati al monitor seriale.
inizialmente era un problema di baud, infatti si leggevano simboli a caso, adesso invece comunica il corretto avvio del programma, ma poi tutti i valori sono uguali a 0
Abbiamo provato anche a usare diversi pin o a scambiare tx con rx ma niente da fare
Abbiamo testato anche altri codici trovati in reta ma niente.

Il codice pare corretto ma non capiamo quale sia il problema
Stiamo usando il seguente codice con un Arduino Mega 2560

Grazie a tutti coloro che vorranno aiutarci.

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
/*
   This sample code demonstrates just about every built-in operation of TinyGPS++ (TinyGPSPlus).
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/
static const int RXPin = 15, TXPin = 14;
static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

// For stats that happen every 5 seconds
unsigned long last = 0UL;

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

  Serial.println(F("KitchenSink.ino"));
  Serial.println(F("Demonstrating nearly every feature of TinyGPS++"));
  Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println();
}

void loop()
{
  // Dispatch incoming characters
  while (ss.available() > 0)
    gps.encode(ss.read());

  if (gps.location.isUpdated())
  {
    Serial.print(F("LOCATION   Fix Age="));
    Serial.print(gps.location.age());
    Serial.print(F("ms Raw Lat="));
    Serial.print(gps.location.rawLat().negative ? "-" : "+");
    Serial.print(gps.location.rawLat().deg);
    Serial.print("[+");
    Serial.print(gps.location.rawLat().billionths);
    Serial.print(F(" billionths],  Raw Long="));
    Serial.print(gps.location.rawLng().negative ? "-" : "+");
    Serial.print(gps.location.rawLng().deg);
    Serial.print("[+");
    Serial.print(gps.location.rawLng().billionths);
    Serial.print(F(" billionths],  Lat="));
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(" Long="));
    Serial.println(gps.location.lng(), 6);
  }

  else if (gps.date.isUpdated())
  {
    Serial.print(F("DATE       Fix Age="));
    Serial.print(gps.date.age());
    Serial.print(F("ms Raw="));
    Serial.print(gps.date.value());
    Serial.print(F(" Year="));
    Serial.print(gps.date.year());
    Serial.print(F(" Month="));
    Serial.print(gps.date.month());
    Serial.print(F(" Day="));
    Serial.println(gps.date.day());
  }

  else if (gps.time.isUpdated())
  {
    Serial.print(F("TIME       Fix Age="));
    Serial.print(gps.time.age());
    Serial.print(F("ms Raw="));
    Serial.print(gps.time.value());
    Serial.print(F(" Hour="));
    Serial.print(gps.time.hour());
    Serial.print(F(" Minute="));
    Serial.print(gps.time.minute());
    Serial.print(F(" Second="));
    Serial.print(gps.time.second());
    Serial.print(F(" Hundredths="));
    Serial.println(gps.time.centisecond());
  }

  else if (gps.speed.isUpdated())
  {
    Serial.print(F("SPEED      Fix Age="));
    Serial.print(gps.speed.age());
    Serial.print(F("ms Raw="));
    Serial.print(gps.speed.value());
    Serial.print(F(" Knots="));
    Serial.print(gps.speed.knots());
    Serial.print(F(" MPH="));
    Serial.print(gps.speed.mph());
    Serial.print(F(" m/s="));
    Serial.print(gps.speed.mps());
    Serial.print(F(" km/h="));
    Serial.println(gps.speed.kmph());
  }

  else if (gps.course.isUpdated())
  {
    Serial.print(F("COURSE     Fix Age="));
    Serial.print(gps.course.age());
    Serial.print(F("ms Raw="));
    Serial.print(gps.course.value());
    Serial.print(F(" Deg="));
    Serial.println(gps.course.deg());
  }

  else if (gps.altitude.isUpdated())
  {
    Serial.print(F("ALTITUDE   Fix Age="));
    Serial.print(gps.altitude.age());
    Serial.print(F("ms Raw="));
    Serial.print(gps.altitude.value());
    Serial.print(F(" Meters="));
    Serial.print(gps.altitude.meters());
    Serial.print(F(" Miles="));
    Serial.print(gps.altitude.miles());
    Serial.print(F(" KM="));
    Serial.print(gps.altitude.kilometers());
    Serial.print(F(" Feet="));
    Serial.println(gps.altitude.feet());
  }

  else if (gps.satellites.isUpdated())
  {
    Serial.print(F("SATELLITES Fix Age="));
    Serial.print(gps.satellites.age());
    Serial.print(F("ms Value="));
    Serial.println(gps.satellites.value());
  }

  else if (gps.hdop.isUpdated())
  {
    Serial.print(F("HDOP       Fix Age="));
    Serial.print(gps.hdop.age());
    Serial.print(F("ms Value="));
    Serial.println(gps.hdop.value());
  }

  else if (millis() - last > 5000)
  {
    Serial.println();
    if (gps.location.isValid())
    {
      static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
      double distanceToLondon =
        TinyGPSPlus::distanceBetween(
          gps.location.lat(),
          gps.location.lng(),
          LONDON_LAT, 
          LONDON_LON);
      double courseToLondon =
        TinyGPSPlus::courseTo(
          gps.location.lat(),
          gps.location.lng(),
          LONDON_LAT, 
          LONDON_LON);

      Serial.print(F("LONDON     Distance="));
      Serial.print(distanceToLondon/1000, 6);
      Serial.print(F(" km Course-to="));
      Serial.print(courseToLondon, 6);
      Serial.print(F(" degrees ["));
      Serial.print(TinyGPSPlus::cardinal(courseToLondon));
      Serial.println(F("]"));
    }

    Serial.print(F("DIAGS      Chars="));
    Serial.print(gps.charsProcessed());
    Serial.print(F(" Sentences-with-Fix="));
    Serial.print(gps.sentencesWithFix());
    Serial.print(F(" Failed-checksum="));
    Serial.print(gps.failedChecksum());
    Serial.print(F(" Passed-checksum="));
    Serial.println(gps.passedChecksum());

    if (gps.charsProcessed() < 10)
      Serial.println(F("WARNING: No GPS data.  Check wiring."));

    last = millis();
    Serial.println();
  }
}

suofford: Prima di tutto, nella sezione in lingua Inglese si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione ...

... poi, questo tuo thread viene solo temporaneamente chiuso in attesa che tu adempia a quanto a suo tempo richiesto QUI ....

... infine, quando ti sarai presentato come richiesto ed l thread verrà raperto, ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Grazie,

Guglielmo

P.S.: Nel caso non dovessi accorgermene, quando hai inserito la presentazione, avvertimi in MP che sblocco.

static const uint32_t GPSBaud = 9600;

Prova 4800.

Se non sbaglio era già 4800 ma restituiva simboli a caso, invece su 9600 comunica sul monitor seriale, ma non i dati gps.
Per eccesso di scrupoli stasera a casa faccio un'altra prova, invece mi rimane il dubbio di aver sbagliato qualcosa riguardo ai pin di collegamento (nel codice), perché che li collego o non li collego quello che mi mostra è sempre lo stesso, cioè valori pari a zero dove dovrebbero esserci le coordinate.

Ma lascia stare le coordinate, quelle dipendono dall'interpretazione di TinyGPS. Innanzitutto devi assicurarti che Arduino legga correttamente i dati NMEA dal GPS. Usa uno sketch di quelli che fanno mirror di una seriale su un'altra e vedi questo.

Nota che ci sono due seriali diverse, una tra Arduino e PC per il monitor e una tra Arduino e GPS per i dati NMEA. Non devono andare per forza alla stessa velocità, la prima solitamente si tiene a 9600 bps, mentre per la seconda mi pare che di default i GPS comunichino a 4800. Alcuni poi, tra cui il tuo, permettono di configurare un'altra velocità.

Niente, ho provato a cambiare i baud come mi dicevi, ma il risultato è questo

KitchenSink.ino
Demonstrating nearly every feature of TinyGPS++
Testing TinyGPS++ library v. 0.92

DIAGS Chars=0 Sentences-with-Fix=0 Failed-checksum=0 Passed-checksum=0
WARNING: No GPS data. Check wiring.

DIAGS Chars=0 Sentences-with-Fix=0 Failed-checksum=0 Passed-checksum=0
WARNING: No GPS data. Check wiring.

e va poi avanti a scrivere le due righe sopra ad ogni lettura
Può essere un problema di pin?
io ho collegato RX al pin 15 di arduino mega che è anche lui un RX
e TX al pin 14 che è un TX

Ho anche provato a scambiarli e non va comunque, sbaglio i pin? sbaglio altrove?

Prendi questo codice :

#include <SoftwareSerial.h>

#define  SS_RX 15            // RX PIN to receive  data
#define  SS_TX 14            // TX PIN to transmit data

SoftwareSerial ssSerial(SS_RX, SS_TX);

void setup()
{
  delay (2000);
  //
  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());
}

aggiusta le velocità nel codice, collega i pin così:

Arduino RX (15) <--- GPS TX
Arduino TX (14) ---> GPS RX
Arduino GND <--> GPS GND

Apri il monitor seriale, programmalo per inviare CR/LF alla fine e scrivi dei comandi AT ... il modulo DEVE risponderti altrimenti c'è un serio problema.

Guglielmo

Erm, gpb, la parte finale sui comandi AT non c'entra molto con un GPS. Diciamo che aprendo il terminale dovresti vedere subito le sentenze NMEA.

SukkoPera:
Erm, gpb, la parte finale sui comandi AT non c'entra molto con un GPS. Diciamo che aprendo il terminale dovresti vedere subito le sentenze NMEA.

Non so ... i miei SIM808 GPS/GSM se non gli mandi i comandi AT ... non ti mandano nulla ... credo dipenda quindi dal modulo che si usa ... ::slight_smile:

Guglielmo

Ah, gli u-blox non mi pare usino comandi AT, ma comunque di fabbrica dovrebbero sputare fuori NMEA appena accesi.

SukkoPera:
gli u-blox non mi pare usino comandi AT,

Infatti gli uBlox non usano comandi AT e appena accesi inviano sentenze NMEA sulla seriale, tipicamente a 19200 bps 5 Hz come default.
Un modo semplice per verificare se funzionano è collegarli ad un adattore USB UART e vedere con un qualunque programma emulazione terminale seriale cosa inviano, meglio ancora usare il loro software per la diagnostica e il setup disponibile sul sito del produttore.

Grazie per i suggerimenti, più tardi quando sarò a casa farò altre prove, intanto ho contattato anche il venditore che mi ha detto queste due cose su cui sinceramente vorrei dei chiarimenti perché mi suonano strane:
1- mi dice che può essere un problema di alimentazione, io lo sto alimentando a 3,3 e lui dice che probabilmente non sono sufficienti, e di collegarlo al 5v

2- dice anche che una volta agganciati i satelliti la luce blu diventa fissa, mentre in caso contrario lampeggia. A me invece non lampeggia (segno che sta cercando?) e poi dopo un tempo variabile di 1-5 minuti lampeggia (segno che ha trovato i satelliti suppongo).

Vi risultano queste due cose?
Grazie

Il modulo che stai usando, se è quello che si vede sul tuo sito, ha l'alimentazione a 5V, sopra la scheda c'è un regolatore a 3.3V, l'uart funziona con livelli di tensione a 3.3V, se alimenti la board a 3.3V c'è il reale rischio che la tensione sul modulo gps risulta inferiore a 2.7V, per via del drop out del regolatore, che è la tensione minima del gps.
Verifica con un multimetro la tensione di alimentazione del modulo gps, sul relativo pin del modulo, se alimentando a 3.3V è prossima, o peggio minore di 2.7V, allora dissalda il regolatore di tensione e bypassalo in modo da portare direttamente al modulo gps i 3.3V.
Comportamento del led, se non mi ricordo male lampeggia per un attimo quando dai tensione e poi rimane spento fino a che non aggancia almeno tre satelliti, il minimo per ottenere un fix, dopo di che comincia a lampeggiare ad 1 Hz, sono molti mesi che non uso più un NEO6, ora uso i NEO8, e potrei anche ricordarmi male.
In tutti casi, fix o meno, sulla seriale escono sempre le sentenze NMEA non appena alimenti il gps, se non c'è il fix tutti i valori sono a 0.

p.s.
Mai usata la Tinygps, preferisco acquisire direttamente le sentenze NMEA, quelle che mi interessano, e fare il relativo parsing per estrarre i dati da usare.
Sopratutto programmo il gps per inviare solo le sentenze NMEA che mi servono sul serio, invece di farle inviare tutte, in modo da limitare il carico tempo cpu per gestire la seriale, dato che le sentenze NMEA sono stringhe ascii l'invio di tutte quante sono diverse centinaia di caratteri da ricevere, fatto a 5-10 Hz può portare ad un pesante impegno del tempo cpu per ricevere e decodificare i dati.

TinyGPS è un'ottima libreria che funziona benissimo. Qua di sta parlando però di TinyGPS++, la sua versione a oggetti. È dello stesso autore, per cui mi aspetterei la stessa efficienza, ma non l'ho mai provata personalmente.

Astrobeed, posso collegarlo senza problemi al 5v se necessario
Usavo il 3,3 perchè non ero sicuro supportava i 5.
Consigli i 5v allora?

suofford:
Consigli i 5v allora?

L'alimentazione è prevista per i 5V, però i segnali TX e RX sono a 3.3V, per la connessione tra Tx del gps e Rx di Arduino non ci sono problemi, sei entro i limiti di tesione previsti per i livelli logici, per la connessione tra Tx di arduino e Rx del gps devi usare un partitore resistivo che riduce di 1/3 la tensione per portarla a max 3.3V, vanno bene due resistenze da 10k e 22k, la 22k in parallelo tra Rx del GPS e gnd, la 10k in serie tra Tx e Rx.

Sì, ma se non prevede di inviare comandi al modulo da Arduino, ma di ricevere solo, allora può direttamente fare a meno di collegare il TX di Arduino a RX GPS.

SukkoPera:
allora può direttamente fare a meno di collegare il TX di Arduino a RX GPS.

Se non collega il Tx di Arduino poi non può inviare comandi al modulo gps, non è indispensabile però può far comodo, p.e. selezionare quali sentenze NMEA vanno inviate tramite il comando "$PUBX".

ho eseguito lo sketch di guglielmo ma il monitor seriale risponde solo

--- Ports ready ---
l'ho anche alimentato a 5 v con le varie resistenze (ho usato 20k invece che 22) ma la risposta è sempre questa

DIAGS Chars=0 Sentences-with-Fix=0 Failed-checksum=0 Passed-checksum=0
WARNING: No GPS data. Check wiring.

non so che pensare, può essere difettoso?
mi sono perso qualcosa?

Vuoi deciderti a mettere un attimo da parte TinyGPS e a provare lo sketch che ti ha indicato gbp01 al post #6?

Prima di tutto devi assicurarti che i dati arrivino correttamente sulla seriale, POI ti occuperai di interpretarli con TinyGPS.