GPS - come posso leggere quello che scorre nel monitor seriale?

ragazzi, non riesco a risolvere questo problema: ho arduino uno e la shield adafruit ultimate gps logger. il progettino prevede anche un altro paio di sensori, uno dei quali usa la software serial, per mandare i dati all'arduino. quindi mi pare di aver capito che non posso usare la software serial anche per il gps, poichè posso leggere solo una serial alla volta. infatti con il codice scritto originariamente, potevo vedere correttamente o un sensore, o l'altro, a seconda di quale facevo partire per primo.
ok,, questa l'ho capita, quindi mi è stato consigliato di mettere il gps in modalità direct connect e usare la software serial per l'altro sensore.
ok... resetto il convertitore seriale, mediante upload di sketch vuoto, quindi sposto lo switch su direct e magicamente appaiono le stringhe GPGGA e GPRMC sul monitor seriale, mentre sul display lcd appaiono correttamente i valori letti dagli altri sensori, quindi sento che sono ad un passo dalla soluzione, poichè in un modo o nell'altro "vedo tutto"! il problema è che ora vorrei catturare alcuni campi della stringa GPGGS dal monitor seriale e visualizzarli nel display, ovvero scriverli sulla sd, come già riesco a fare per i valori degli altri sensori. ma non riesco a capire come intercettare le stringhe in modalità direct...! :frowning:
ho privato a rimettere lo switch su software serial e cambiare il codice, utilizzando quindi la soft.ser sui pin 7 e 8 (default della shield) e a visualizzare sul monitor seriale quello che la seriale così creata riceve e tutto funziona. riesco anche ad isolare i campi interessati mediante le funzioni della classe String.
però devo impostarlo su direct connect, altrimenti non funziona il resto...
mi è stato suggerito di leggere quello che scorre allo stesso modo, semplicemente sostituendo SoftwareSerial con Serial, ma non funziona! già se faccio if (Serial.available()) non ho alcun risultato, come se non fosse available nulla, sebbene vedo correttamente le stringhe sul monitor seriale!

spero di essermi spiegato!

Ma in modalità direct, come leggi i dati dal GPS ? Con quale comando ? Senza un pò di info o il codice non mi pare si capisca molto.

Puoi usare tranquillamente più softwareSerial, purché, con l'apposito comando, selezioni DA QUALE vuoi ricevere ...
... quando interrogherai i tuoi sensori selezionerai la SoftwareSerial a cui sono collegati e quando dovrai leggere i dati del GPS selezionerai l'altra.

Un esempio d'uso di due SoftwareSerial è disponibile QUI .

Ovviamente, devi scrivere il programma e programmare il GPS ed i sensori in modo che sia tu ad interrogare e NON i device ad inviare autonomamente, quando gli pare, i dati.

Ah ... se usi la vera seriale per una qualsiasi "cosa" ne PERDI l'uso con il monitor seriale dato che, il monitor seriale (tramite l'adattatore USB) e la qualsiasi "cosa" che colleghi sulla vera seriale, vanno in conflitto tra di loro e quindi NON è fattibile.

Guglielmo

gpb01:
Ah ... se usi la vera seriale per una qualsiasi "cosa" ne PERDI l'uso con il monitor seriale dato che, il monitor seriale (tramite l'adattatore USB) che la qualsiasi "cosa" che colleghi vanno in conflitto tra di loro.

In alcuni casi particolari, il gps è uno di questi, è possibile usare la seriale hardware con un device e per il monitor seriale, questo perché il gps normalmente è un device che invia sulla seriale i suoi dati a cadenza fissa, di default una volta al secondo, quindi va ad impegnare solo l'Rx di Arduino.
L'invio di dati verso il pc impegna solo il Tx di arduino pertanto se non è necessario inviare comandi ad Arduino diventa possibile collegare il GPS e continuare ad inviare informazioni verso il pc, però per poter programmare Arduino è indispensabile scollegare, o spegnere, il GPS in quanto servono sia Tx che Rx, in alternativa usare un programmatore hardware se sono disponibili i relativi pin.
Ovviamente la velocità del monitor seriale deve essere la stessa di quella usata dal GPS, tutti i GPS moderni permettono di regolare a piacere la velocità di trasmissione dati quindi è possibile impostarla ben più veloce dei 4800 bps canonici.
La UART degli Atmega è full duplex pertanto può ricevere e trasmettere dati in simultanea, a differenza della soft serial che può fare solo una cosa per volta, con tutti i limiti che questo impone.
Soluzione migliore usare un ATmega 328PB che dispone di due UART, da poco è possibile usarlo con l'IDE di Arduino. :slight_smile:

gpb01:
Un esempio d'uso di due SoftwareSerial è disponibile QUI .
Guglielmo

Hai visto alla pagina che c'e' un piccolo errore nella descrizione del programma ? Dice che nell'esempio usa i pin 2,3,4,5 ma poi nel codice usa 8,9,10,11 :slight_smile:
Come e a chi si segnalano questi refusi ?

P.S. ma cos'e' questo direct mode ?

intanto grazie a tutti!
lo so che usando RX e TX perdo il monitor per il debug, ma combino lo stesso, perchè visualizzo quello che mi serve su un lcd 20x4, quindi ok!
per quanto riguarda la domanda "come leggo il gps in direct", uso uno sketch trovato in rete:

if (Serial.available()) {
    //leggo la prima riga
    char c = Serial.read();
    if (c != '\n') {
      NMEA += c;
    }
    else {
      index = 0;
      campo = 0;
      if (NMEA.substring(0, 6) == "$GPGGA")
      {
        while (posizione_delimitatore != -1)
        {
          posizione_delimitatore = NMEA.indexOf(",", index);

          switch (campo)
          {
            case 2: lcd.setCursor(0, 1); lcd.print(NMEA.substring(index, posizione_delimitatore)); break;
            case 4: lcd.setCursor(0, 2); lcd.print(NMEA.substring(index, posizione_delimitatore)); break;
            case 9: lcd.setCursor(0, 3); lcd.print(NMEA.substring(index, posizione_delimitatore)); break;
          }

          index = posizione_delimitatore;
          index++;
          campo++;
        }
      }
      NMEA = "";
    }
  }

il problema è che così facendo sul display non appare nulla!
mentre se sposto lo switch su software serial e sostituisco Serial con mySerial (creato mediante SoftwareSerial mySerial (8,7)), allora tutto funziona.

nid69ita:
P.S. ma cos'e' questo direct mode ?

il direct mode è una modalità della shield adafruit. in pratica si collega ai pin 0 e 1 e sputa fuori in automatico le stringhe. poi ci si deve arrangiare a leggerle. però è più affidabile (mi è stato così detto) e certamente non richiede l'uso di librerie. quindi più "leggero".

Non puoi leggere i dati in directMode perche sono invertiti i pin RX e TX.

// Connect GPS RX (data into GPS) to Digital 0
// Connect GPS TX (data out from GPS) to Digital 1

Infatti per leggerli da PC i piedini RX e TX sono su RX e TX del micro.
Per leggerli dal micro li devi invertire. Come tral'altro spiegato per la Leonardo
--> Direct Connect | Adafruit Ultimate GPS Logger Shield | Adafruit Learning System

PaoloP:
Non puoi leggere i dati in directMode perche sono invertiti i pin RX e TX.Infatti per leggerli da PC i piedini RX e TX sono su RX e TX del micro.
Per leggerli dal micro li devi invertire. Come tral'altro spiegato per la Leonardo
--> Direct Connect | Adafruit Ultimate GPS Logger Shield | Adafruit Learning System

ma questa procedura dei pin incrociati non vale solo per il leonardo?
infatri io vedo perfettamente le stringhe sul monitor seriale in direct mode, anche senza i jumper descritti nell'articolo (che avevo già visto!).

Infatti, ma solo sul monitor, ovvero verso PC. Se provi a leggere da seriale, ovvero verso Arduino non leggi niente.
Se li scambi, non leggi su monitor ma leggi da Arduino.

PaoloP, forse non ho capito bene cosa intendi, però ho fatto le seguenti prove, per testare tute le combinazioni:

configurazione fissa in tutte e 3 le prove: arduino uno con montata a castello la shield gps adafruit ultimate logger.

conf 1: RX e TX della shield scollegati;
conf 2: RX shield <-> RX arduino (pin 0) e TX shield <-> TX arduino (pin 1);
conf 3: RX shield <-> TX arduino e TX shield <-> RX arduino;

in tutti e 3 i casi, vedo scorrere le stringhe sul monitor, ma non leggo niente con Serial.read();

dove sbaglio?!?

arduale:
il problema è che così facendo sul display non appare nulla!
mentre se sposto lo switch su software serial e sostituisco Serial con mySerial (creato mediante SoftwareSerial mySerial (8,7)), allora tutto funziona.

Non stò capendo bene dove hai problemi. Ritorniamo al punto di partenza.
La Serial in Arduino Uno è la seriale fisica, quindi i pin 0 e 1 (RX/TX) ma è anche la USB
La SoftwareSerial invece la imposti tu su ALTRI due pin, che NON siano 0 e 1.
Se poi leggi da mySerial con read() e usi la Serial.print() logicamente leggi da SoftwareSerial sui pin impostati e stampi su USB.

certo, nel caso dello switch su SoftwareSerial, definisco una SoftwareSerial mySerial (8, 7) sui pin 7 e 8 e leggo le stringe con mySerial.read().
e tutto funziona.

quando invece sposto lo switch su "direct", de ho ben capito, il flusso dati dal gps dovrebbe essere diretto alla setiale hardware, quindi andrà letto con Serial.read(). però così non funziona...

arduale:
certo, nel caso dello switch su SoftwareSerial, definisco una SoftwareSerial mySerial (8, 7) sui pin 7 e 8 e leggo le stringe con mySerial.read().
e tutto funziona.

quando invece sposto lo switch su "direct", de ho ben capito, il flusso dati dal gps dovrebbe essere diretto alla setiale hardware, quindi andrà letto con Serial.read(). però così non funziona...

Probabilmente non puoi usare il cavo usb (seriale hardware) e il gps su pin 0 e 1 perchè sono sugli stessi pin.
Per usare il gps in direct NON usare il cavo usb. Prova a scaricare lo sketch e poi a provare ma senza il cavo usb collegato

gpb01:
Ah ... se usi la vera seriale per una qualsiasi "cosa" ne PERDI l'uso con il monitor seriale dato che, il monitor seriale (tramite l'adattatore USB) e la qualsiasi "cosa" che colleghi sulla vera seriale, vanno in conflitto tra di loro e quindi NON è fattibile.

... che è quello che avevo detto io.

Astro ha spiegato che, sotto certe condizioni, è possibile ... ma non so se quella scheda/GPS le rispetta.

Guglielmo

nid69ita:
Probabilmente non puoi usare il cavo usb (seriale hardware) e il gps su pin 0 e 1 perchè sono sugli stessi pin.
Per usare il gps in direct NON usare il cavo usb. Prova a scaricare lo sketch e poi a provare ma senza il cavo usb collegato

niente... non funzione nemmeno con il cavo usb scollegato (alimentazione con batteria 12 v).

altri suggerimenti?

Ho provato anche impostando 2 software serial, facendole partire entrambe e mettendole in ascolto una alla volta mediante mySerial1.listen().
Nemmeno questo funziona.
Appena riesco ad accendere il PC incollo il codice, così si capisce meglio quello che ho fatto.

arduale:
Ho provato anche impostando 2 software serial, facendole partire entrambe e mettendole in ascolto una alla volta mediante mySerial1.listen(). Nemmeno questo funziona.

Evidentemente stai sbagliando qualche cosa dato che le due SoftwareSerial funzionano sicuramente.
Mi raccomando ...

TX GPS ---> pin RX Arduino
RX GPS <--- pin TX Arduino

... altrimenti non ti funzionerà mai nulla :wink:

Guglielmo

gpb01:
Mi raccomando ...

TX GPS ---> pin RX Arduino
RX GPS <--- pin TX Arduino

... altrimenti non ti funzionerà mai nulla :wink:

Guglielmo

Grazie.
Ma se uso le SoftwareSerial devo lo stesso fare i ponticelli?
Oppure basta montare la scheda a castello?

arduale:
Ma se uso le SoftwareSerial devo lo stesso fare i ponticelli?

Dalla descrizione su Adafruit mi sembra che quei ponticelli siano necessari solo il modo "direct" ...
... tu dovresti avere il GPS TX sul pin 8 ed il GPS RX sul pin 7 quindi ... "SoftwareSerial mySerial(8, 7);"

Guglielmo