Pages: [1]   Go Down
Author Topic: Velocità TinyGPS  (Read 447 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buongiorno a tutti,
Sto sviluppando un progetto come tesina per l'esame di maturità di quest'anno che lavora con il GPS per la rilevazione di alcuni dati.

Il progetto è testato e funzionante tranne per quello che riguarda la velocità.
Questa viene rilevata dal GPS (EM-406A montato su Shield GPS Sparkfun) con il quale mi interfaccio con la libreria TinyGPS. Tutti i dati che il GPS mi ritorna vanno bene a parte la velocità che rimane fissa a -1.00 Km/h.

Qualcuno sa quale può essere il motivo?

Il codice per la rilevazione dei dati è il seguente:
Code:
void getgps(TinyGPS &gps)
{
    visualizzadati();
    float latitudine, longitudine;                
    float velocita, altitudine;                  
    gps.f_get_position(&latitudine,&longitudine);
    lcd.print("Coord: ");                      
    lcd.print(latitudine,3);                      
    lcd.print(",");
    lcd.print(longitudine,3);
    lcd.setCursor(0,2);                          
    lcd.print("Alt(m): ");                      
    altitudine=gps.f_altitude();  
    lcd.print(altitudine);
    lcd.setCursor(0,3);
    velocita=gps.f_speed_kmph();
    lcd.print("Km/h: ");                          
    lcd.print(velocita);
}

PS: se per caso servisse, uso Arduino Mega e la comunicazione tra Shield GPS e Arduino avviene tramite i pin 0 e 1 quindi la seriale fisica classica
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho visto dal sorgente che la funzione dovrebbe restituire la costante GPS_INVALID_F_SPEED  nel caso di dati errati.
Code:
float TinyGPS::f_speed_kmph() 
{
  float sk = f_speed_knots();
  return sk == GPS_INVALID_F_SPEED ? GPS_INVALID_F_SPEED : _GPS_KMPH_PER_KNOT * f_speed_knots();
}

E guarda caso tale costante vale proprio -1.0:
Code:
const float TinyGPS::GPS_INVALID_F_SPEED = -1.0;

Se ricevi questo valore può darsi che ci sia qualche problema, altrimenti forse è il GPS che non funziona o che non è compatibile?
Hai provato anche a stampare sulla seriale il dato grezzo che ricevi
Logged


Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 26
Posts: 5491
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Finché il GPS non fa un fix manda delle stringhe incomplete. Quando invece riceve i dati vedrai che ti darà la velocità corretta... Puoi sempre provare, lo carichi in auto e ti fai portare in giro, se tutti i dati sono corretti e quello no allora il problema è un altro, la stessa cosa la faceva a me la scorsa settimana perché una libreria la gfx mi andava in conflitto... Perciò fai questa semplice prova prima di rimettere mano al codice...
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tutti gli altri dati sono funzionanti ed è quello che mi fa pensare. La prova del muovermi la ho già fatta visto che il progetto che sto sviluppando serve proprio per la rilevazione dei dati in moto. Nonostante questo mi ritorna sempre -1 anche su un giro di circa 5 Km.

Però problemi di GPS immagino non ce ne siano in quanto mi è capitato mentre il progetto non era ancora completo, e stavo provando i pezzi singolarmente, di vedere velocità come 0.54 Km/h. A volte, stando praticamente fermo ho visto anche velocità di 0.180 Km/h quindi immagino che non sia danneggiato il GPS.

Qualcuno ha qualche idea?
Logged

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 26
Posts: 5491
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Io nel mio GPS uso questo pezzetto di codice per visualizzare la velocità e funziona:
Code:
     lcd.setCursor(0, 3);
     lcd.print("VEL:");
     lcd.print((gps.f_speed_kmph()));
     lcd.setCursor(0, 4);
     lcd.print("ANGOLO:");
     lcd.print(gps.f_course());
Lo uso su un display grafico ma il concetto è lo stesso... prova a richiamare diretttamente il metodo dentro alla funzione anzichè richiamarlo, assegnarlo ad una varibile e poi visualizzarlo, occupi ram e flash inutilmente..
« Last Edit: June 14, 2013, 02:44:23 am by ratto93 » Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Io lo assegno ad una variabile in quanto lo stesso dato devo visualizzarlo sul display ma anche salvarlo su memoria SD.
Logged

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 26
Posts: 5491
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pure io ma non ha senso, richiama sempre la funzione, in questo modo non devi riscrivere la variabile ogni volta, vai semplicemente a prendere un valore già presente in ram, certo è che se ti trovi meglio così fai pure  smiley-wink
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Proverò a fare così... vedremo...
Ora ho provato a montare su un Arduino Uno la shield GPS e sono uscito sul terrazzo a camminare con il portatile.

Ho caricato l'esempio "test_with_GPS_device" e ho utilizzato la comunicazione Serial (quindi quella fisica) sia per i dati che provengono dal GPS sia per visualizzarli su monitor seriale. In effetti così va tutto...

Cosa potrei fare per far funzionare tutto anche sul progetto completo?
Logged

Pages: [1]   Go Up
Jump to: