mettere insieme un inesperto, un ls20031 ed un arduino...

ciao a tutti, mi chiamo Silvio e sono un giovane appassionato ecc.......... il solito insomma :D è da parecchio tempo che seguo il forum come ispirazione e tutorial per i miei semplici progetti arduino, ma questa volta non sono riuscito a trovare una soluzione, e mi sono impantanato. spero che almeno parlandone (...scrivendone..) con qualcuno riesca a chiarirmi le idee, che al momento sono inaspettatamente offuscate.

ma veniamo all'inizio, così posso meglio spiegarvi il "problema".

sto assemblando un cronometro gps, un semplice lap timer che ferma il tempo automaticamente quando, correndo in un circuito chiuso, si trovi a passare per il traguardo. è costituito da arduino duemilanove, un display grafico ks108 da 128x64, il modulo locosys ls20031 e due pulsanti per la navigazione nei menù. un supporto per la scheda sd potrebbe essere interessante, ma preferisco andare per gradi.

andiamo alla questione. con le poche conoscenze assimilate al corso di programmazione del primo anno di ingegneria, sono riuscito dopo parecchie ore a mettere assieme il display e creare un buon programmino per il cronometro, sono soddisfatto di questo. anche l'algoritmo per il cronometro funziona bene, fermando il tempo premendo il pulsante. ho fatto un video dove potete meglio vedere cosa deve fare il programma:

http://www.youtube.com/watch?v=AR3eRS4BX8s

noterete che per non avere problemi ho prefrito sviluppare il tutto senza il modulo gps, e simulare il passaggio sul traguardo semplicemente premendo il pulsante. ora però è arrivato il momento di aggiungerci la localizzazione automatica, e sono saltati fuori i problemi. nello specifico, ls20031 è dato come un modulo con frequenza che varia da 1 a 10Hz.

prodotto: http://www.sparkfun.com/products/8975 datasheet: http://www.sparkfun.com/datasheets/GPS/Modules/LS20030~3_datasheet_v1.2.pdf tutorial: http://www.sparkfun.com/tutorials/176

non sampendo come utilizzarlo, ho chiaramente seguito il tutorial della sparkfun, e tutto funziona alla grande. nel primo test infatti visualizzo sul monitor seriale tutti i dati NMEA, mentre nel secondo ogni 5 secondi mi restituisce tutti i dati elaborati grazie alle librerie newsoftserial e tinyGPS. il problema però, è che se io gli chiedo di restituirmi la posizione ogni decimo di secondo, lui me ne da 10 uguali, il che significa che è settato per comunicare a 1Hz. come posso fare allora a cambiare le impostazioni del modulo? sul sito del commerciante mi dicono di utilizzare il programma miniGPS che è davvero figo, ma non so come collegare il modulo al pc.

il mio obbiettivo è solo quello di avere la mia posizione (latitudine e longitudine) ad una frequenza di 10Hz, poi ce la dovrei fare a completare il programma. il problema è che mettendomi a cercare in rete ho trovato talmente tante informazioni da essere uscito di testa e non capire più nulla.

qualcuno parla di lentezza della libreria newsoftserial altri di tinygps poi si inizia a parlare di baud rate (a cosa mi serve cambiarlo, e come?) e la frequenza del modulo come la cambio?

lo so, ho tanta confusione in testa e probabilmente ho fatto il passo più lungo della gamba, ma come ne vengo fuori ora senza innervosirmi ancora di più?

grazie a tutti silvio

Purtroppo posso esserti solo di supporto morale :) ...quindi ti faccio i complimenti per quello che sei già riuscito a fare! Bel progetto!! Ce la farai! ;)

ti ringrazio, a volte un supporto morale può essere utile come uno tecnico. purtroppo queste cose non le ho studiate e non riesco a trovare una spiegazione semplice ma completa riguardo i moduli gps, quindi tutto si riduce a spezzoni di codice trovati qua e la, qualche spiegazione campata in aria, ed ecco che ti ritrovi a non capire più che cosa stai facendo.. =(

Guardando il datasheet allegato, una cosa che ho notato è che il tuo GPS esce con una seriale a livelli TTL, quindi se cerchi un modo per connetterlo al PC, potresti:

  • se hai un arduino duemilanove, togliere l'atmega così da sfruttare il chip FT232 da convertitore USB/TTL ed averesti il tuo modulino collegabile direttamente alla USB del tuo PC.
  • se non hai un arduino duemilanove ma una seriale sul PC comprarti un MAX232 e costruirti un piccolo convertitore RS232/TTL con pochi euro.
  • altrimenti se hai solo USB e non hai un duemilanove, valuta di comprare un modulino col chip FT232, tipo questo.

In questo modo dovresti riuscire ad accedere alla configurazione col programma di cui parlavi.

grazie Federico, speravo fosse possibile qualcosa del genere. il duemilanove ce l'ho, quindi se ho capito bene mi basta togliere il controllore e collegare il modulo a tx ed rx della scheda, giusto?

per quanto riguarda questo baud rate, da quel che ho potuto capire indica la velocità di trasmissione dei dati in modo seriale, è corretto? se si, come scelgo il giusto valore e cosa comporta? ho notato, seguendo la guida della sparkfun che utilizzando l'esempio "test_with_gps_device" della libreria tinyGPS devo modificare la riga:

nss.begin(4800);

in:

nss.begin(57600);

questo perchè, letteralmente, "il modulo ha una velocità di comunicazione più alta di altri moduli". ma perchè allora ho una velocità di aggiornamento così bassa, pur essendo dato per 10Hz?

ho bisogno di una velocità di aggiornamento piuttosto alta per 2 motivi principali:

1- il traguardo viene impostato dando due punti ai margini. per migliorare la precisione di questi vorrei fare una media di dieci posizioni. se però gli dico di prendere la posizione ogni decimo di secondo, in realtà lui mi restituisce sempre la stessa posizione. ecco perchè credo che sia impostato su 1Hz.

2-vorrei avere una precisione decente nella localizzazione del cronometro rispetto al traguardo, così da avere, almeno teoricamente, 1 decimo di imprecisione sul tempo.

ti ringrazio ancora per la disponibilità

guarda sul pdf che descrive il protocollo (http://www.sparkfun.com/datasheets/GPS/Modules/PMTK_Protocol.pdf) a pag 5 dove dice "Packet Type: 314 PMTK_API_SET_NMEA_OUTPUT" puoi settare la velocità di aggiornamento per ogni singola sentenza inviando l'apposito comando via seriale ;) da arduino con il serial monitor.

allora, sono appena arrivato a casa ed ho fatto qualche tentativo senza successo.

ho provato a togliere il controllore dalla scheda arduino, ho collegato il modulo agli rx e tx della scheda, connesso al pc ma il programma continua a non vederlo, pur lampeggiando il led che indica il fix.
i led tx ed rx della scheda non si illuminano, c’è solo power.

ho provato allora, su suggerimento di brainbooster, a dare un’occhiata alle sentenze da dare attraverso il monitor… c’ho capito nulla… :cold_sweat:

ho provato a togliere il controllore dalla scheda arduino, ho collegato il modulo agli rx e tx della scheda,

Giusto:
TX—>RX
RX<—TX

Sbagliato:
TX—>TX
RX<—RX

Ciao.

MauroTec:

ho provato a togliere il controllore dalla scheda arduino, ho collegato il modulo agli rx e tx della scheda,

Giusto:
TX—>RX
RX<—TX

Sbagliato:
TX—>TX
RX<—RX

Ciao.

si, ho collegato tx del modulo al pin 0 di arduino, ed rx al pin 1…
eppure nulla, il led del modulo lampeggia, lampeggia un secondo il led rx dell’arduino, ma poi nulla…

gnd deve essere in comune. se sei collegato via USB al PC il pin 0 e 1 sono già usati, quindi devi usare una libreria tipo softserial. Secondo me per test dovresti scriverti i vari comandi in sequenza magari sul blocco note e usare arduino da ponte tra PC e GPS, così fai copia incolla dei vari messaggi e vedi che succede. In teoria se il GPS funziona con una libreria, tanto vale modificarla aggiungendo il comando per portare il GPS a 10hz

bel programmino, anche curato nella grafica :-)

http://www.4dsystems.com.au/downloads/Software/GPS-Tool/

;)

rendersi la vita facile, configura tutto lui...

garinus: http://www.4dsystems.com.au/downloads/Software/GPS-Tool/

;)

rendersi la vita facile, configura tutto lui...

quel programmino ce l'ho e mi sembra comodissimo, ma come ho scritto non riesco a fargli vedere il modulo..

scusatemi, la mia unica base informatica è un corso di programmazione in C che ho fatto lo scorso anno all'università, non ho quindi grandi conoscenze in merito. sto facendo confusione, e per carattere quando non mi funziona qualcosa mi innervosisco facilmente, quindi ho deciso di ricominciare dall'inizio:

ho caricato questo codice:

void setup() {
  Serial.begin(57600);  
}

void loop() {
  if (Serial.available()) {
    Serial.print(Serial.read(), BYTE);
  }
}

una volta preso il segnale, dal monitor seriale leggo questi valori:

quindi dovrebbe essere tutto corretto. il passo successivo quale dev'essere? riguardando il datasheet ci sono talmente tante possibilità che non riesco a capire cosa davvero mi serva..

mi scuso ancora per l'insistenza e testardaggine

hai provato a seguire anche questo tutorial? http://diydrones.com/profiles/blogs/using-the-5hz-locosys-gps-with

per impostarlo devi mandagli tu dei comandi, devi quindi leggerti il protocollo per capire come devi completare il comando da dargli per settarlo a 10 hz.

si, avevo visto quel tutorial, ma non mi piace per nulla non essendoci alcuna spiegazione su quello che fa.
mi piacerebbe riuscire nel mio intento magari imparandoci anche qualcosa, e non seguire solo delle liste già fatte, che altrimenti poi non saprei più nemmeno come usare.
i comandi che da lui non sono riportati nel datasheet, quindi non so davvero cosa stia facendo.

in compenso poi da anche lui il comando 314, che da quanto ho capito setta gli intervalli di aggiornamento.

Packet Type: 314 PMTK_API_SET_NMEA_OUTPUT
Packet Meaning:
API_Set_NMEA_Out
Set NMEA sentence output frequencies.
DataField:
There are totally 17 data fields that present output frequencies for the 17 supported NMEA
sentences individually.
Supported NMEA Sentences
0 NMEA_SEN_GLL, // GPGLL interval - Geographic Position - Latitude longitude
1 NMEA_SEN_RMC, // GPRMC interval - Recommended Minimum Specific GNSS Sentence
2 NMEA_SEN_VTG, // GPVTG interval - Course Over Ground and Ground Speed
3 NMEA_SEN_GGA, // GPGGA interval - GPS Fix Data
4 NMEA_SEN_GSA, // GPGSA interval - GNSS DOPS and Active Satellites
5 NMEA_SEN_GSV, // GPGSV interval - GNSS Satellites in View
6 NMEA_SEN_GRS, // GPGRS interval - GNSS Range Residuals
7 NMEA_SEN_GST, // GPGST interval - GNSS Pseudorange Errors Statistics
13 NMEA_SEN_MALM, // PMTKALM interval - GPS almanac information
14 NMEA_SEN_MEPH, // PMTKEPH interval - GPS ephmeris information
15 NMEA_SEN_MDGP, // PMTKDGP interval - GPS differential correction information
16 NMEA_SEN_MDBG, // PMTKDBG interval – MTK debug information

Supported Frequency Setting
0 - Disabled or not supported sentence
1 - Output once every one position fix
2 - Output once every two position fixes
3 - Output once every three position fixes
4 - Output once every four position fixes
5 - Output once every five position fixes

Example:
$PMTK314,1,1,1,1,1,5,1,1,1,1,1,1,0,1,1,1,1*2C

This command set GLL output frequency to be outputting once every 1 position fix, and RMC to be
outputting once every 1 position fix, and so on.

You can also restore the system default setting via issue:
$PMTK314,-1*04

ora, suppongo che per avere una frequenza di 10Hz io debba dare il valore 1, ma a quale di queste?
gli unici dati che mi interessano sono ovviamente latitudine e longitudine

ce l’ho fatta!! XD XD

sono riuscito a far funzionare il programma minyGPS e quindi ad entrare nel menu di configurazione del modulo (decisamente più intuitivo).
c’è un menu a tendina per impostare la frequenza (di default era 1Hz come sospettavo), ma tra le opzioni arriva fino a 5.
se però ci scrivo sopra, accetta anche 10Hz, quindi ho impostato questo valore.

ho poi eliminato un po di informazioni di output, sperando di aver fatto una cosa giusta. mi sono ispirato alla guida di diydrones.com.
in base al datasheet, dovrei aver lasciato solo:

GPRMC interval - Recommended Minimum Specific GNSS Sentence
GPGGA interval - GPS Fix Data

ho fatto la scelta giusta?

qui ci sono le mie impostazioni correnti:

se le impostazioni sono settate correttamente, dovrò cominciare a studiare una strategia per decodificare queste informazioni, ma un passo alla volta…

grazie mille!

come hai collegato il modulino GPS al PC e quindi a minyGPS?

Packet Type: 314 PMTK_API_SET_NMEA_OUTPUT
Packet Meaning:
API_Set_NMEA_Out
Set NMEA sentence output frequencies.
DataField:
There are totally 17 data fields that present output frequencies for the 17 supported NMEA
sentences individually.
Supported NMEA Sentences
0 NMEA_SEN_GLL, // GPGLL interval - Geographic Position - Latitude longitude
1 NMEA_SEN_RMC, // GPRMC interval - Recommended Minimum Specific GNSS Sentence
2 NMEA_SEN_VTG, // GPVTG interval - Course Over Ground and Ground Speed
3 NMEA_SEN_GGA, // GPGGA interval - GPS Fix Data
4 NMEA_SEN_GSA, // GPGSA interval - GNSS DOPS and Active Satellites
5 NMEA_SEN_GSV, // GPGSV interval - GNSS Satellites in View
6 NMEA_SEN_GRS, // GPGRS interval - GNSS Range Residuals
7 NMEA_SEN_GST, // GPGST interval - GNSS Pseudorange Errors Statistics
13 NMEA_SEN_MALM, // PMTKALM interval - GPS almanac information
14 NMEA_SEN_MEPH, // PMTKEPH interval - GPS ephmeris information
15 NMEA_SEN_MDGP, // PMTKDGP interval - GPS differential correction information
16 NMEA_SEN_MDBG, // PMTKDBG interval – MTK debug information

Supported Frequency Setting
0 - Disabled or not supported sentence
1 - Output once every one position fix
2 - Output once every two position fixes
3 - Output once every three position fixes
4 - Output once every four position fixes
5 - Output once every five position fixes

Example:
$PMTK314,1,1,1,1,1,5,1,1,1,1,1,1,0,1,1,1,1*2C

This command set GLL output frequency to be outputting once every 1 position fix, and RMC to be
outputting once every 1 position fix, and so on.

You can also restore the system default setting via issue:
$PMTK314,-1*04

ok, ci siamo.(credo eh, mai usato un GPS)
allora analizziamo il comando:
ci sono 17 campi, uno per ogni tipologia di output del sensore. Se vai a vedere sul datasheet, ti accorgerai che ognuna delle tipologia di output altro non è che una stringa (quelle che leggi da seriale) e vedrai anche che ognuna di queste stringhe contiene determinati valori.
Ora, per ogni stringa puoi settare una diversa frequenza: CREDO che addirittura tu possa disabilitare le stringhe che non ti servono passandogli 0, così ogni volta che leggi la seriale avrai sicuramente una stringa utile.
mettiamo caso che i dati che ti servono siano nella stringa “NMEA_SEN_GLL”, il comando sarà:
$PMTK314,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*XX
Attento: *XX non fa parte del comando in sè ma è il codice di controllo. XX è un codice che si ottiene facendo qualche operazione matematica sulla stringa precedente ($PMTK314,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) ma non chiedermi quale, trovi tutto sicuramente nella libreria o nel datasheet.
Mi rimane un dubbio… sicuro che il " Supported Frequency Setting" lo devi mettere a 10 (io ho preso per scontato che sia giusto)? da quel che capisco da “Output once every one position fix” è che se metti 1 il GPS scrive a 10hz, se metti 2 a 5hz ecc…

Il fatto di poter eliminare le stringhe che non ti interessano è ottimo perché non è detto che lo scoccare dei 10hz ti trovi il dato, può esserci un pò di lag dettata dall’elaborazione sul GPS e dall’uso di differenti cristalli/oscillatori (esempio stupido: prendi 2 orologi, possono sembrare uguali a colpo d’occhio, ma già dopo qualche giorno troverai uno dei 2 perdere qualche secondo rispetto all’altro).
Quindi puoi aspettare la lettura della seriale, di un dato che sai che sta per arrivare, ad esempio così:

//arrivi che devi leggere il GPS e sai che il dato dovrebbe esserci/arrivare a microsecondi
while(Serial.avaiable <=0){
//non fare niente, in pratica perdi tempo finché non arriva qualche dato
//magari piuttosto che non fare niente controlla che non sei in questo while da troppo tempo, potrebbe voler dire che hai perso la comunicazione col GPS o roba simile
}
//ora hai almeno 1 bit disponibile sulla serial e puoi estrapolare i tuoi dati. se invece vuoi aspettare per esempio 15 bit metti 14 al posto dello 0 nel while

[quote author=Federico Vanzati link=topic=50545.msg360953#msg360953 date=1296509350] come hai collegato il modulino GPS al PC e quindi a minyGPS? [/quote]

ho ricollegato il controllore e caricato un rapido serial read.. non so perchè funziona nè come, ma va...

magari avevi sbagliato a impostare la frequenza della Serial, una volta ci ho perso quasi un'ora per sta bioata :drooling_face:

comunque, pensavo di aver risolto il problema ma invece non è cambiato nulla.

ho creato questo rapido codice che ogni decimo di secondo dovrebbe leggere la posizione, per dieci posizioni totali.
poi dovrebbe stamparle tutte sul display ad intervalli di due secondi.

for(int misura=0;misura<10;misura++){

gps.get_position(&lat, &lon);

latitudine[misura]=lat;
longitudine[misura]=lon;
delay(100);

}

for(int a=0; a<10; a++){
GLCD.GotoXY(0, 30);
GLCD.Puts("latitudine: ");
GLCD.print(latitudine[a]);
GLCD.GotoXY(0, 45);
GLCD.Puts(“longitudine:”);
GLCD.print(longitudine[a]);

delay(2000);
GLCD.ClearScreen();

}

ebbene, sono tutte uguali. =( =(