gps data logger

Discussione in 'Tutorials - Elettronica' iniziata da wrighizilla, 13 Maggio 2021.

  1. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    ok avete seguito lo schema e saldato i fili di tutti i pezzi..
    avete il gps pronto per la prima accensione.
    appena acceso vedrete scritto sul display "TUO NOME" > GPS >OK > ottenete la pagina dei dati tutti a zero
    se rimane piantato 15 secondi con scritto SD significa che non avete inserito la scheda sd nello slot.

    a questo punto potete personalizzare la presentazione cancellando i caratteri di tuo nome e mettendoci scritto quello che volete.. rispettate il numero massimo di caratteri e compilate per vedere se avete esagerato, se i caratteri sono troppi avrete errori arancioni di memoria
    potete modificare nello sketch sia il campo "TUO NOME" che quello "GPS" sono solo testo a piacere colorato in azzurro tra le "".
    salvate il vostro sketch definitivo personalizzato, meglio se fate una copia per i vostri esperimenti salvandolo con nome.

    un altro campo che potete modificare è l'allarme autovelox che adesso troverete impostato a 0,1 lo riconoscete dalle note a margine in grigio" // speed limit value" se lo lasciate a zero il led si accenderà a 0,0 -0,1 kmh in pratica vi dirà quando avrete raggiunto il fix dei satelliti e il gps indica un movimento.
    impostato a 0,0 sarà sempre acceso durante il fix, impostato a 0,1 si spegne dopo un pochino che siete fermi e si riaccende appena vi muoverete di nuovo.
    lo potete impostare anche a 50,0kmh ma nel nostro caso non serve a nulla.

    nel resto dello sketch non serve cambiare niente.

    uscite in giardino o in ogni caso col cielo a vista, il gps in casa non funziona e molto male alla finestra.
    aspettate 1-3 minuti per ottenere il primo fix.
    camminate e vedete che succede, alcuni dati arriveranno in seguito come l'altitudine e i satelliti (almeno questo accade con i miei 2 gps)
    se la prima altitudine è sballata (e capita perchè il fix dell'altitudine richiede almeno 4 satelliti per avere un fix 3D) resettate la nano col pulsante reset, si resetterà solo la nano ma non il modulo che manterrà il fix, i dati in arrivo adesso saranno più veloci ad arrivare e stavolta giusti perchè il fix sarà un pezzo avanti.
    il discorso può variare anche in base alle nuvole, col brutto tempo il fix arriva in ritardo.

    se avete fortuna il gps funzionerà perfettamente senza dover intervenire sui settaggi del modulo ublox.
     
  2. rider56

    rider56 Mercante RC

    Messaggi:
    6.441
    "Mi Piace" ricevuti:
    1.128
    Sesso:
    Maschio
    Località:
    Genova
    Assolutamente si:clap::clap:pensare che quando aveva detto che era semplice ci avevo quasi creduto:rofl::rofl:... Se lui in un anno ha imparato tutto questo per me si merita una laurea "honoris causa". io purtroppo neanche in tutta la vita :cry:..sono limitato in queste nozioni scientifiche e dopo un po' il cervello smette di funzionare
     
  3. SniperRC

    SniperRC Diligentia Vis Celeritas Photo_Pro Self-Editor

    Messaggi:
    11.911
    "Mi Piace" ricevuti:
    5.124
    Località:
    Brianza
    Mi aggrego e quoto tutto! :clap::clap::clap::clap::clap::clap:

    E aggiungo un mega grazie per condividere così precisamente mettendo a disposizione di tutti la sua sapienza!! :onore::onore::onore:
    Il vero senso di un Forum! :clap::clap::nice::+1::+1:
     
  4. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    veniamo ad ublox center..

    scaricate ublox center https://www.u-blox.com/en/product/u-center
    alimentate il gps e collegate la usb alla porta del modulo (questo vale ovviamente solo se avete un modulo con la usb)
    aprite il programma e andate nel menu "receiver" > connection > com selezionate la com.. stesso discorso di arduino = non la com 1, ne troverete una diversa.. com 8, com 11 etc..

    adesso andate nel menu "view" > configuration view
    prima di uscire da ogni singola operazione di configurazione premete "SEND" ve lo ricorderà comunque se non lo avete fatto.

    modificate i seguenti campi come da esempio

    questo primo potrebbe non regiostrarlo, dipende dal tipo di modulo ma se rientrando nel config lo ritrovate a zero è irrilevante.

    [​IMG]

    questo di default sara a 1000 potere alzare il "measurement period" fino a 100 ma se ricevete troppi errori portatelo a 500
    io l'ho indicato a 200 sul mio funziona bene.

    [​IMG]

    questo setup indica il tipo di uso e la qualità del fix.
    pedestrian va bene per il nostro uso modellistico
    il fix 3D only potete provarci, sarebbe più preciso specialmente per l'altitudine ma se impiegate 10 minuti per avere un fix vi merita lasciarlo auto 2d/3d

    [​IMG]

    sulla porta potete provare ad alzare il valore da 9600 a 19200 ma ovviamente dovrete anche modificare lo stesso dato nelle 2 linee dello sketch che fanno riferimento al baudrate ( #define GPS_baud 9600); / Serial.begin(9600); ) e ricaricare lo sketch nella nano.

    io l'ho lasciato di default a 9600 perchè a 19200 non so perchè il gps corre troppo.. mi segna più strada di quanta ne sto facendo davvero.
    ad ogni modo questo è lo screenshot serve solo uart1 e anche qui va premuto "send" ma ormai avrete imparato.

    [​IMG]

    il setup più importante è questo: nav messages

    nav-SVINFO è l'unico che avrà valore 5

    [​IMG]

    tutti gli altri hanno tutti valore 1
    metto solo un esempio che vale per tutti ma dovrete abilitare i seguenti:
    nav-DOP
    nav-SOL
    time-GPS
    time-UTC
    nav-VELNED
    nav-POSLLH

    [​IMG]

    a questo punto salvate in CFG la vostra configurazione
    in cfg trovate anche il reset alle impostazioni di default nel caso vogliate ripristinare e ricominciare un nuovo setup (revert to default configuration)
    inviate Send e uscite da ublox.

    [​IMG]

    se tutto ha fatto il suo dovere non ci tornate più sopra.
    se poi ne sapete più di me o fate nuove scoperte parliamone più che volentieri..
    ho piacere di imparare e correggere quanto più sia possibile sia sul modulo che sullo sketch.

    per adesso end of story..
    se ne riparla se qualche ardito sperimentatore se lo costruisce.
     
  5. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    [QUOTE="rider56, post: 1366301, member: 3145". io purtroppo neanche in tutta la vita :cry:..sono limitato in queste nozioni scientifiche[/QUOTE]

    ti scoraggi con davvero poco credimi.. è una cazzata!!
    basta leggere e seguire gli esempi.
    senza arduino in mano è arabo e lo capisco bene.. con arduino attaccato cambia tutto perchè vedi le cose che accadono.
    gli errori si risolvono e con le spiegazioni che ho scritto è probabile che neanche dovrai chiedere nulla.
    il setup del modulo basta copiare.

    una pappa cotta più di così sarebbe pappa scotta.
    mi fai arrivare a casa i pezzi e ti spedisco indietro un gps testato dentro uno scatolino a fiori. :D

    quanto alla sapienza andateci piano ve lo dico.. è meglio.
    nella scala della sapienza da 1 a 100 adesso sto a 4.
    fidatevi è così.
     
  6. arringhio

    arringhio Mercante RC Photo_Pro

    Messaggi:
    839
    "Mi Piace" ricevuti:
    373
    Sesso:
    Maschio
    Località:
    Milano
    Leggerti è molto semplice e pare facile da realizzare.
    Dispensatore di scimmie........................
    :monkey::monkey::monkey::monkey::monkey::monkey::monkey::monkey::monkey::monkey::monkey::monkey::monkey::monkey:
     
  7. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    ho appena fatto una interessante modifica:
    pessima foto ma si capisce..

    [​IMG]

    ho tolto dal display il dato del conteggio satelliti SA che oltre a fare qualche capriccio era divertente come guardare la vernice che si asciuga.
    l'ho sostituito con un più interessante orologio conta tempo.
    non è proprio un orologio, indica il tempo di durata che è intercorso tra un reset e l'altro, oppure il tempo che il gps è rimasto acceso durante la girata.
    ad ogni modo è interessante per sapere i tempi di percorrenza senza mettersi a fare i conti sul dato "Hr" che riporta l'orario GPS_TIME come un comune orologio.

    sulla SD è nata una nuova dicitura in legenda che si chiama (Tm) nel quale questo nuovo dato viene scritto oltre all'angolo in basso a sinistra del display.

    Sat ovvero il conteggio dei satelliti è finito scritto solo su SD dove a questo punto sono raccolti 12 dati diversi.

    data.println("Da Hr Tm La Lo At Am Km Di Ve He Sa" );

    manca giusto la velocità massima ma non ce la metto, non serve a nulla scritta su SD e va a pesare ulteriormente sul programma..

    ovviamente per scrivere questo orologio ho dovuto eliminare la presentazione iniziale..
    adesso il gps si accende e va subito ai dati sul display, se invece manca la SD nella slot si pianta 10 secondi con scritto SD nel mezzo del display prima di andare alla pagina dei dati. .

    nella foto 0:2:45 è il tempo che il GPS è rimasto acceso in questo test, 2 minuti e 45 secondi.

    gli altri dati li conoscete, He la bussola in gradi, Al altitudine, Am altitudine massima, le 2 velocità istantanea e massima, i Km percorsi e la Di distanza aerea.

    leggermente da verificare nel senso che non so ancora cosa succede a 59 minuti e 59 secondi ma presumo scatti l'ora senza problemi..

    questo è lo sketch col crono, se vedete le differenze con lo sketch precedente capite come funziona.

    https://pastebin.com/JBCRmhBc


    questo è ciò che si vede sulla SD. adesso in casa tutti dati sono a zero meno che il nuovo timer che inizia a conteggiare i secondi, gli altri dati arrivano dopo il fix dei satelliti e le colonne si adattano.

    [​IMG]
     
    Last edited: 24 Maggio 2021
    A ktm piace questo elemento.
  8. arringhio

    arringhio Mercante RC Photo_Pro

    Messaggi:
    839
    "Mi Piace" ricevuti:
    373
    Sesso:
    Maschio
    Località:
    Milano
    Ho comprato la scheda nano compatibile...
    Ora inizia l'avventure.
    Ho scaricato i driver e devo caricarli sul pc (spero di non fare casini).
    Poi devo studiare...
     
  9. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    la scheda nano da sola può servirti per verificare se riesci a completare il caricamento dello sketch arrivando in fondo senza messaggi arancioni.
    sarebbe già un bel passo avanti visto che avrai da installare le librerie e selezionare tipo di scheda, porta com e processore
    senza collegarci il resto dei pezzi non potrai fare altro almeno sul progetto del gps
     
    A arringhio piace questo elemento.
  10. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    la prossima settimana andrò a fare una girata di qualche giorno e mi porterò dietro il gps a batterie.
    l'intenzione è quella di partire da firenze e arrivare a Premilcuore passando basso dalle sorgenti del fiume Arno (Castagno d'Andrea) e tornare risalendo a San benedetto in alpe, cascata dell'Acquacheta.
    arrivare a Premilcuore sarebbe metà della girata che vorrebbe fare mia figlia in Agosto per arrivare a Cesenatico a piedi da Firenze.
    così vedrò in anteprima dove andrà e che storia possa essere attraversare l'appenino a piedi in 7 giorni.
    io non andrò a Cesenatico, arrivato a Premilcuore tornerò indietro fino al passo della Futa dove prenderemo l'autobus per tornare a Firenze anche perchè non abbiamo 7 giorni e ci sta di dover tornare anche prima.
    il gps lo porterò con me per accenderlo e fare i fix lungo il percorso, mi segnerò delle note su un taccuino per poi a casa ricostruire la sequenza di fix ottenuti, eventuali fonti, bivacchi e bivi incontrati lungo il percorso.
    in pratica lo accenderò solo nei punti d'interesse per rilevare le coordinate e l'altitudine, mi annoto il fix e poi lo spengo.

    inoltre voglio costruire un gps fisso anche per il secondo camion tamiya g6-01 visto che lo userò per tutte le prossime girate urbane.
    pensavo di usare il più scarso ed economico gps con usb che ci sia su ebay giusto per provare come funziona.
    in teoria sarebbe un neo6m, dovrebbe andare bene.

    https://www.ebay.it/itm/122894158216?ssPageName=STRK:MEBIDX:IT&_trksid=p2060353.m1438.l2649

    il display SH1106 ce l'ho, mi manca anche una nano v3 e una schedina per leggere le micro SD
    a breve compro il gps che potrebbe arrivare a metà luglio, quando arriverà farò delle foto passo passo della costruzione.
     
  11. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    eccoci quà.. sono tornato da una epica avventura di 5 giorni a giro per i boschi
    siamo partiti a piedi da Fiesole e siamo arrivati sul monte Falterona.
    vi spiego come ho impiegato il GPS..
    non potendo tenerlo acceso fisso per tutto il viaggio ho fatto dei fix in varie parti de percorso, in genere la sera quando montavamo la tenda
    ovvero mi sono limitato ad attendere il fix per registrare la latitudine e longitudine e poi l'ho spento il GPS.
    alcune volte ha registrato anche l'altitudine che è un dato che arriva un pochino in ritardo ma non ho sprecato tempo se non ero interessato a sapere la quota.

    questo è lo screen del report dopo che ho pulito tutte le linee inutili prima dei fix
    ho lasciato la legenda per ciascun fix e se volete provare a vedere come funziona su google maps vi allego anche il file dal quale potete copincollare le 2 cellette delle coordinate in google maps..
    [​IMG]

    leggendo il file direttamente su google drive cambia un pochino la formattazione ma è utilizzabile, basta togliere ";" tra le 2 coordinate..

    https://docs.google.com/document/d/1o6wvPtFqE5pxkHZxspr69wNfrCG2VEEOW18hAL2NKDo/edit?usp=sharing

    in sostanza mettendo le cooordinate in google maps, al secondo fix 43.807697 11.296434 sono all'inizio del sentiero

    [​IMG]

    e così via per tutte le tappe..

    [​IMG]

    oppure in google My Maps si può creare tutto il percorso del viaggio che abbiamo fatto.

    [​IMG]

    [​IMG]

    non so se funziona ma questo è il viaggio salvato

    https://www.google.com/maps/d/viewe...ll=43.871893342762675,11.540504260438945&z=13
     
    A arringhio e ktm piace questo messaggio.
  12. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    ho preso questo modulo gps molto cinese e economico, vi saprò dire come funziona. https://www.ebay.it/itm/124763018109?var=425765605854
    dovrà diventare il gps fisso del secondo camioncino Tamiya Dynahead e vorrei costruirlo sommariamente identico all'altro gps piccolo con micro sd e display 1.3'' pollici.
     
    A ktm piace questo elemento.
  13. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    qualora voleste ribaltare il testo sul display questo è il codice.

    ho dovuto ribaltare perchè avevo un display già incollato dentro la scatola ma al contrario rispetto al verso corretto per leggerlo..
    invece che scollarlo ho invertito il testo e ho imparato una cosa nuova.
    la linea che inverte è // oled.displayRemap(true); // la trovate poche linee sotto "void setup"


    Codice:
    #include <SPI.h>
    #include <SD.h>
    #include <Wire.h>
    #include "SSD1306Ascii.h"
    #include "SSD1306AsciiWire.h"
    #include <NMEAGPS.h>
    #include <NeoSWSerial.h>
    #define I2C_ADDRESS 0x3C
    #define RST_PIN -1
    #define MAX_CHARS 24
    #define RX_pin 5
    #define TX_pin 4
    #define SHOW_INTERVAL 1
    #define GPS_baud 9600
    SSD1306AsciiWire oled;
    NMEAGPS gps;
    gps_fix fix;
    float odo, Speed, alt, Dist, head, maxs = 0, Am = 0;
    unsigned int  Sat = 0;
    unsigned long tmp, var = 0;
    int secondi, minuti = 0, ore = 0, fct = 2, fcl = 1;
    NeoGPS::Location_t    lastLoc, base;
    bool stScan = true, lastLocOK = false;
    static NeoSWSerial gpsPort(RX_pin, TX_pin);
    static constexpr int INITIAL_SHOW  = (2 * SHOW_INTERVAL) - 1;
    int show          = INITIAL_SHOW;
    const int   LED_PIN  = 3;
    const float SPEED_LIMIT = 0.1; // speed limit value
    void disp(int c, int r)
    {
      oled.clear();
      oled.setCursor(c, r);
    }
    void setup() {
    
      pinMode (LED_PIN, OUTPUT);
      Serial.begin(9600);
      gpsPort.begin(GPS_baud);
      Wire.begin();
      oled.begin(&SH1106_128x64, I2C_ADDRESS);
      oled.setFont(ZevvPeep8x16);
      oled.displayRemap(true);
      disp(15, 2);
      oled.println("LOGGER GPS");
      delay(2000);
     
      oled.clear();
    
      const int cs_sd = 2;
      if (!SD.begin (cs_sd)) {
        oled.clear();
        disp(65, 2);
        oled.print("SD");//if you read this mean SD is not present
        delay(10000);
        oled.clear();
        return;
      }
    
      File data = SD.open("L.csv", FILE_WRITE);
      data.println("");
      data.println("Da Hr Tm La Lo At Am Km Di Ve He Sa" );
      data.close();
    }
    void loop() {
      tmp = (millis() / 1000);
      secondi = tmp - (var * 10) + fct;
      if (secondi > 60) {
        secondi = secondi - 60;
      }
      if (secondi == 60) {
        minuti = minuti + 1;
        var = var + 6;
      }
      if (((minuti == 10) || (minuti == 20) || (minuti == 30) || (minuti == 40) || (minuti == 50) || (minuti == 60)) && (secondi == 1))   {
        fct = fct + fcl;
      }
      if (minuti >= 60) {
        minuti = 0;
        ore = ore + 1;
      }
      if (ore >= 24) {
        ore = 0;
      }
      if (gps.available( gpsPort )) {
        gps_fix fix = gps.read();
        show = (show + 1) % SHOW_INTERVAL;
        if (fix.valid.speed && (fix.speed_kph() > SPEED_LIMIT)) {
          digitalWrite( LED_PIN, HIGH );
        } else {
          digitalWrite( LED_PIN, LOW );
        }
        if (fix.valid.location) {
          if (lastLocOK) {
            odo += fix.location.DistanceKm( lastLoc );
            Speed = fix.speed_kph();
          }
          lastLoc   = fix.location;
          lastLocOK = true;
          if (stScan) {
            stScan = false;
            base   = fix.location;
          } else {
            Dist = ( fix.location.DistanceKm( base ) );
          }
        }
        if ( Speed > maxs)          maxs = Speed;
        if (fix.valid.heading )     head = fix.heading() ;
        if (fix.valid.satellites )  Sat = fix.satellites ;
        if (fix.valid.altitude)     alt = fix.altitude();
        if ( alt > Am)              Am = alt;
        if (show == 0) {
          char displayBufffer[MAX_CHARS];
          oled.setCursor(0, 0);
          snprintf(displayBufffer, MAX_CHARS, "Km:%2d.%1d",  (int)odo, (int)(odo * 100) % 100);
          oled.println(displayBufffer);
          oled.setCursor(65, 0);
          snprintf(displayBufffer, MAX_CHARS, "Di:%2d.%1d",  (int)Dist, (int)(Dist * 100) % 100);
          oled.println(displayBufffer);
          snprintf(displayBufffer, MAX_CHARS, "Ve:%2d.%1d", (int)Speed, (int)(Speed * 10) % 10);
          oled.println(displayBufffer);
          oled.setCursor(65, 2);
          snprintf(displayBufffer, MAX_CHARS, "Al:%2d.%1d", (int)alt, (int)(alt * 100) % 100);
          oled.println(displayBufffer);
     
          snprintf(displayBufffer, MAX_CHARS, "Vm:%2d.%1d", (int)maxs, (int)(maxs * 10) % 10);
          oled.println(displayBufffer);
          oled.setCursor(65, 4);
          snprintf(displayBufffer, MAX_CHARS, "Am:%2d.%1d", (int)Am, (int)(Am * 100) % 100);
          oled.println(displayBufffer);
          snprintf(displayBufffer, MAX_CHARS, "%d:%d:%d ", (int)ore, (int)minuti, (int)secondi);
          oled.println(displayBufffer);
          oled.setCursor(65, 6);
          snprintf(displayBufffer, MAX_CHARS, "He:%2d.%1d", (int)head, (int)(head * 100) % 100);
          oled.println(displayBufffer);
        }
        File data = SD.open("L.csv", FILE_WRITE);
        data.print(fix.dateTime.hours + 2);
        data.print(":");
        data.print(fix.dateTime.minutes);
        data.print(" ");
        data.print(fix.dateTime.date);
        data.print("/");
        data.print(fix.dateTime.month);
        data.print(" ");
        data.print(ore);
        data.print(":");
        data.print(minuti);
        data.print(":");
        data.print(secondi);
        data.print(" ");
        data.print(fix.latitude(), 6);
        data.print(" ");
        data.print(fix.longitude(), 6);
        data.print(" ");
        data.print(alt);
        data.print(" ");
        data.print(Am);
        data.print(" ");
        data.print(odo);
        data.print(" ");
        data.print(Dist);
        data.print(" ");
        data.print(Speed);
        data.print(" ");
        data.print(head);
        data.print(" ");
        data.print(Sat);
        data.println();
        data.close();
      }
    }
    
     
  14. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    il modulo gps cinese del post 32 non è ancora arrivato..
    per togliermi un dubbio ho preso un gps senza porta usb, il più economico e comune di tutti.
    questo https://www.ebay.it/itm/113164265454?hash=item1a591da7ee:g:WdMAAOSwUf5bVezC preso qui in Italia da questo venditore.
    si trova in Cina a 4 euro ma avevo premura di costruirlo e togliermi anche un grosso dubbio.

    il dubbio è se la porta usb fosse o meno fondamentale (e non lo è). la questione è nata discutendo su altri lidi dove questi gps super economici vengono considerati limitati rispetto a quelli con porta usb e possibilità di cambiare baud e altri settaggi tramite programma dedicato ublox center..
    torno adesso da un giro di prova e funziona benissimo senza fare proprio nulla.
    inj questo caso mi sono limitato a caricare il programma del codice sulla scheda nano v3, saldare i fili e accenderlo all'aperto.
    il nuovo ha preso il fix forse meglio e in meno tempo dei 3 gps che ho, funziona benissimo e anche le distanze percorse e i dati corrispondono a quello da passeggio a batterie.

    quindi un doveroso errata corrige: va bene un qualsiasi gps neo6m anche senza porta usb, dimenticate i settaggi con ublox center, funziona tutto alla prima solo saldando i fili.

    le foto del nuovo gps per il secondo camion dynakong.


    [​IMG]

    il display ha un vetro con cornice di metallo. pulsante reset in basso per poterlo premere facilmente.
    led per indicare il fix e presa di alimentazione 5-9v
    in questo caso ho riciclato una scheda per la lettura di SD standard. è più grande ma ho trovato lo spazio.
    la scheda per micro sd è in viaggio insieme al gps cinese che si fa attendere e quindi ho messo quello che avevo.

    [​IMG]


    [​IMG]

    [​IMG]


    ripeto lo schema di montaggio anche perchè l'ho usato per cablare e l'ho ricontrollato.
    tutti i componenti del nuvo gps sono alimentati a 3.3v eccetto la scheda nano v3 che è alimentata tramite VIN diretttamente dalla batteria del modello (presa bec rossa)
    questo significa che il modulo gps, il modulo lettore sd e il display sono tutti alimentati assieme dal piedino 3.3v della nano, ho usato la sd card come contattiera per collegare assieme l'alimentazione di tutti i pezzi
    il piedino 5 volt non l'ho utilizzato, ovvero tutto identico allo schema qui sotto.

    [​IMG]

    i componenti di questo ultimo gps sono (link presi a caso, cercate il negozio migliore )
    display oled sh1106 1,3'' bianco https://www.ebay.it/itm/293982468694?hash=item4472b87a56:g:37cAAOSwGcBgFShc
    arduino nano v3 328 https://www.ebay.it/itm/114379336293?hash=item1aa18a2a65:g:EGQAAOSwcONfHVe1
    modulo gps https://www.ebay.it/itm/154542441365?hash=item23fb728395:g:VygAAOSwzl5gXB1e
    SD reader standard https://www.ebay.it/itm/124246820057?hash=item1cedb004d9:g:DbQAAOSwmfhX3Omw

    una scatolina di plastica, un pulsante n/a un led, una resistenza da 560 Ohm per il led, una presa di alimentazione, un vetrino protettivo, filo sottile meglio se colorato, giusto per evitare errori di saldatura.

    il codice caricato è quello del post precedente. se avete necessità di ribaltare lo schermo leggete il post e aggungete o eliminate la stringa remap.
     
    Last edited: 2 Agosto 2021
    A (marzo) e arringhio piace questo messaggio.
  15. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    Un nuovo codice che ho controllato adesso e funziona perfettamente.
    in questa versione ho tolto l'altitudine massima raggiunta perchè tanto rende troppo spesso errori.
    I motivi sono vari, l'altitudine ha bisogno di un fix 3d tridimensionale e non sempre si può ottenere, dipende dal tempo atmosferico e dal primo fix che registra.
    In sostanza basta un dato errato per un attimo, una galleria, uno sbalzo qualsiasi e viene registrata fissa indelebile una altitudine sbagliata che, nel caso sia alta e insuperabile da un dato affidabile resta lì sul display per tutta la girata.
    In questo modo ho liberato un campo dati dal display che ho usato per visualizzare la bussola sotto forma di rosa dei venti in lettere.
    Ovvero adesso all'accensione del gps ci saranno 2 campi "He:" uno che esprime il dato in gradi e lo registra anche su scheda SD e un secondo campo dati "He:" che riporta la lettera della direzione bussola "N, NE, E, SE, S, SO, O, NO
    Questo nuovo dato non sono stato ad aggiungerlo alla scheda SD ma se vi piace di più potere scambiarlo voi alla fine dello sketch cambiando la linea data.print(h); con data.print(bussola); io preferisco sempre vedere i gradi che sono più precisi, le lettere non sono altro che una torta divisa in 8 fette da 45° quindi il range è molto più approssimativo.
    Sul display invece si leggono entrambi i dati per avere subito ben chiara la direzione nella quale stiamo andando
    Se vedete bene nel codice ho dovuto togliere qualche lettera alla legenda della scheda SD siamo precisissimi con la memoria ormai e salvo non cambiare tipo di scheda con una più grande Arduino UNO non c'è più spazio. ad ogni modo ho riportato la lista scritta delle funzioni visualizzate.
    questo è il codice, basta caricarlo nella nano e funziona subito. chiaramente dovete caricare prima anche le 2 librerie dello schermo oled e del gps da gestione librerie.
    Ho aggiunto qualche nota didattica se volete capire e studiare un pochino cosa succede nel listato programma.
    Una volta copiato su Arduino ide le note le vedrete in grigio chiaro. sono testi di sola lettura contrassegnati dalle // iniziali.
    Lo schema elettrico è sempre il solito, a breve mi arriverà un oled e costruirò il mio quarto gps, magari vi metto qualche foto ma ormai costruirli è lavoro di un oretta compreso sagomare la scatola.

    Codice:
    #include <SPI.h> //libreria SPI
    #include <SD.h>  //libreria SD
    #include <Wire.h>
    #include "SSD1306Ascii.h" //libreria oled
    #include "SSD1306AsciiWire.h"
    #include <NMEAGPS.h>
    #include <NeoSWSerial.h> //libreria gps
    #define I2C_ADDRESS 0x3C // indirizzo oled
    #define RST_PIN -1
    #define MAX_CHARS 24
    
    #define RX_pin 5
    #define TX_pin 4
    #define SHOW_INTERVAL 1
    #define GPS_baud 9600
    SSD1306AsciiWire oled;
    NMEAGPS gps;
    gps_fix fix;
    float  odo, Speed, alt, Dist, h, maxs = 0;
    
    char bussola [3]; //  2 caratteri lettere punti cardinali
    
    unsigned long tmp, var = 0;
    int secondi, minuti = 0, ore = 0, fct = 2, fcl = 1;
    NeoGPS::Location_t    lastLoc, base;
    bool stScan = true, lastLocOK = false;
    
    static NeoSWSerial gpsPort(RX_pin, TX_pin);
    static constexpr int INITIAL_SHOW  = (2 * SHOW_INTERVAL) - 1;
    int show          = INITIAL_SHOW;
    const int   LED_PIN  = 3;
    const float SPEED_LIMIT = 0.1; // autovelox potete decidere la velocità che accenderà il led  0,1 vi dice appena avrete ottenuto il fix
    void disp(int c, int r)
    {
      oled.clear();
      oled.setCursor(c, r);
    }
    void setup() {
     
      pinMode (LED_PIN, OUTPUT);
      Serial.begin(9600);
      gpsPort.begin(GPS_baud);
      Wire.begin();
      oled.begin(&SH1106_128x64, I2C_ADDRESS); //linea per oled 128x64 da 1.3 pollici sh 1106 se avete un oled piccolo da 0,96 va cambiata.
      oled.setFont(ZevvPeep8x16); // tipo di carattere del display il più grande che ho trovato
      oled.displayRemap(true);//reverse display nel caso vediate lo schermo ribaltato togliere questa linea
     
      oled.clear();
    
      const int cs_sd = 2;
      if (!SD.begin (cs_sd)) {
        oled.clear();
        disp(65, 2);
        oled.print("SD");// se leggete SD per 10 secondi avete dimenticato di inserire la scheda SD
        delay(10000); // attesa per avvertire che manca la SD
        oled.clear();
        return;
      }
    
      File data = SD.open("L.csv", FILE_WRITE); //file L.csv che si legge con office
      data.println("");
      data.println("D  H  T  La  Lo  K  D  A  V  B" ); //legenda della SD  D=data, H=ora, T=durata della girata, La=latitudine, Lo=longitudine, K=km percorsi,
      // D=distanza in linea d'aria dal punto iniziale di fix, A=altitudine, V=velocità, B=gradi bussola
      data.close();
    }
    void loop() {
    // orologio e data
      tmp = (millis() / 1000);
      secondi = tmp - (var * 10) + fct;
      if (secondi > 60) {
        secondi = secondi - 60;
      }
      if (secondi == 60) {
        minuti = minuti + 1;
        var = var + 6;
      }
      if (((minuti == 10) || (minuti == 20) || (minuti == 30) || (minuti == 40) || (minuti == 50) || (minuti == 60)) && (secondi == 1))   {
        fct = fct + fcl;
      }
      if (minuti >= 60) {
        minuti = 0;
        ore = ore + 1;
      }
      if (ore >= 24) {
        ore = 0;
      }
      if (gps.available( gpsPort )) {
        gps_fix fix = gps.read();
        show = (show + 1) % SHOW_INTERVAL;
        if (fix.valid.speed && (fix.speed_kph() > SPEED_LIMIT)) {
          digitalWrite( LED_PIN, HIGH );
        } else {
          digitalWrite( LED_PIN, LOW );
           }
        if (fix.valid.location) {
          if (lastLocOK) {
            odo += fix.location.DistanceKm( lastLoc );
            Speed = fix.speed_kph();
          }
          lastLoc   = fix.location;
          lastLocOK = true;
          if (stScan) {
            stScan = false;
            base   = fix.location;
          } else {
            Dist = ( fix.location.DistanceKm( base ) );
          }
        }
     
        if ( Speed > maxs)          maxs = Speed;
        if (fix.valid.heading )     h = fix.heading() ;
     
        if (fix.valid.altitude) {
            alt = fix.altitude();
       
        }
        // punti cardinali gradi bussola  (float h) convertiti in lettere (bussola)
            if ((h > 338 && h < 360) || (h > 0 && h < 22)) {
           strcpy ( bussola, "N ") ;
        }
    
        if (h > 23 && h < 67) {
         strcpy  ( bussola, "NE") ;
        }
        if (h > 68 && h < 112) {
        strcpy  ( bussola, "E ") ;
        }
        if (h > 113 && h < 157) {
         strcpy  ( bussola, "SE") ;
        }
        if (h > 158 && h < 202) {
         strcpy  ( bussola, "S ") ;
        }
        if (h > 203 && h < 247) {
         strcpy  ( bussola, "SO") ;
        }
        if (h > 248 && h < 292) {
         strcpy  ( bussola,"O ") ;
        }
        if (h > 293 && h < 337) {
         strcpy  ( bussola, "NO") ;
        }
    
        if (show == 0) {
          char displayBufffer[MAX_CHARS];
     
          oled.setCursor(0, 0);
          snprintf(displayBufffer, MAX_CHARS, "Km:%2d.%1d",  (int)odo, (int)(odo * 100) % 100); //display chilometri percorsi Km
          oled.println(displayBufffer);
          oled.setCursor(65, 0);
          snprintf(displayBufffer, MAX_CHARS, "Di:%2d.%1d",  (int)Dist, (int)(Dist * 100) % 100); //display distanza lineare dal fix
          oled.println(displayBufffer);
          snprintf(displayBufffer, MAX_CHARS, "Ve:%2d.%1d", (int)Speed, (int)(Speed * 10) % 10); // display velocità dinamica
          oled.println(displayBufffer);
          oled.setCursor(65, 2);
          snprintf(displayBufffer, MAX_CHARS, "Vm:%2d.%1d", (int)maxs, (int)(maxs * 10) % 10); //display velocità massima raggiunta
          oled.println(displayBufffer);
          snprintf(displayBufffer,MAX_CHARS, "Al:%2d.%1d", (int)alt, (int)(alt * 100) % 100); // display altitudine
          oled.println(displayBufffer);
          oled.setCursor(65, 4);
          snprintf(displayBufffer, MAX_CHARS, "He:%s\n",bussola);  // display punti cardinali bussola in lettere
          oled.println(displayBufffer);
          snprintf(displayBufffer, MAX_CHARS, "%d:%d:%d ", (int)ore, (int)minuti, (int)secondi); // display  orologio durata della girata
          oled.println(displayBufffer);
          oled.setCursor(65, 6);
          snprintf(displayBufffer, MAX_CHARS, "He:%2d.%1d", (int)h, (int)(h * 100) % 100); // display  gradi bussola
          oled.println(displayBufffer);
        }
        File data = SD.open("L.csv", FILE_WRITE); // scrittura del file L.csv su SD potete anche scrivere un txt cambiando csv con txt
       // di seguito tutte le variabili che vengono scritte sulla SD, se cambiate ordine cambiatelo anche nella legenda
        data.print(fix.dateTime.hours + 2);
        data.print(":");
        data.print(fix.dateTime.minutes);
        data.print("  ");
        data.print(fix.dateTime.date);
        data.print("/");
        data.print(fix.dateTime.month);
        data.print("  ");
        data.print(ore);
        data.print(":");
        data.print(minuti);
        data.print(":");
        data.print(secondi);
        data.print("  ");
        data.print(fix.latitude(), 6);
        data.print("  ");
        data.print(fix.longitude(), 6);
        data.print("  ");
       
        data.print(odo);
        data.print("  ");
        data.print(Dist);
        data.print("  ");
        data.print(alt);
        data.print("  ");
        data.print(Speed);
        data.print("  ");
        data.print(h);
        data.print("  ");
     
        data.close();
      }
    }
    
     
    Last edited: 31 Agosto 2021
    A ktm piace questo elemento.
  16. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    nuovo codice molto simile al precedente ma con alcuni miglioramenti.
    questo codice calcola i punti cardinali consumando meno memoria e mi ha permesso di ripristinare la presentazione iniziale.
    inoltre ho aggiunto nuovamente tutte le lettere alla legenda sulla SD e ho potuto aggiungere la colonna "Co"compass e He heading in modo da poter scrivere sia i gradi che i punti cardinali del tragitto effettuato sul file L.csv
    sempre su SD ho ripristinato anche la conta dei satelliti.
    sul display la situazione è invariata, ho giusto chiamato "Co" i gradi bussola e "He" la direzione cardinale.
    alla presentazione ho potuto mettere 2 linee di testo e ho aggiunto la spiegazione nel caso la vogliate personalizzare.

    Codice:
    #include <SPI.h>
    #include <SD.h>
    #include <Wire.h>
    #include "SSD1306Ascii.h"
    #include "SSD1306AsciiWire.h"
    #include <NMEAGPS.h>
    #include <NeoSWSerial.h>
    
    #define I2C_ADDRESS 0x3c
    #define RST_PIN -1
    #define MAX_CHARS 24
    #define RX_pin 5
    #define TX_pin 4
    #define SHOW_INTERVAL 1
    #define GPS_baud 9600
    SSD1306AsciiWire oled;
    NMEAGPS gps;
    gps_fix fix;
    float odo, Speed, alt, Dist, head, maxs = 0;
    unsigned int  Sat = 0;
    unsigned long tmp, var = 0;
    int secondi, minuti = 0, ore = 0, fct = 2, fcl = 1;
    NeoGPS::Location_t    lastLoc, base;
    bool stScan = true, lastLocOK = false;
    bool altOK = false;
    bool Satok = false;
    static NeoSWSerial gpsPort(RX_pin, TX_pin);
    static constexpr int INITIAL_SHOW  = (2 * SHOW_INTERVAL) - 1;
    int show          = INITIAL_SHOW;
    const int   LED_PIN  = 3;
    const float SPEED_LIMIT = 0.1; // speed limit value
    
    void disp(int c, int r) {
      oled.clear();
      oled.setCursor(c, r);
    }
    
    const char* strBussola[8] = {"N ", "NE", "E ", "SE", "S ", "SO", "O ", "NO"};
    int index;
    
    int trovaIndice(float angolo) {
      int _index;
      for (_index = 0; _index < 8; _index++) {
        float angoloDirezione = _index * 45.0 + 22.50;
        float angoloMin = angoloDirezione - 22.50;
        float angoloMax = angoloDirezione + 22.50;
        if (angolo >= angoloMin && angolo <= angoloMax)
          return _index;
      }
      return _index;
    }
    
    void setup() {
      pinMode (LED_PIN, OUTPUT);
      Serial.begin(9600);
      gpsPort.begin(GPS_baud);
      Wire.begin();
      oled.begin(&SH1106_128x64, I2C_ADDRESS);
      oled.setFont(ZevvPeep8x16);
      //oled.displayRemap(true); // inversione dello schermo display
      disp(15, 2);// 15 distanza laterale 2 numero di linea
      oled.println(F("IL TUO NOME"));// max12 caratteri
      delay(2500);// tempo di visualizzazione della presentazione tuo nome
       disp(24, 3);
      oled.println(F("GPS LOGGER"));
      delay(2500);
      oled.clear();
      const int cs_sd = 2;
      if (!SD.begin (cs_sd)) {
        oled.clear();
        disp(40, 2);
        oled.print("NO SD"); // scheda SD assente
        delay(10000);// tempo di visualizzazione SD assente
        oled.clear();
      }
      File data = SD.open("L.csv", FILE_WRITE);
      data.println("");
      data.println(F("Da Hr Tm La Lo At Km Di Ve Co He Sa" ));
      data.close();
    }
    
    void loop() {
      tmp = (millis() / 1000);
      secondi = tmp - (var * 10) + fct;
      if (secondi > 60) {
        secondi = secondi - 60;
      }
      if (secondi == 60) {
        minuti = minuti + 1;
        var = var + 6;
      }
      if (((minuti == 10) || (minuti == 20) || (minuti == 30) || (minuti == 40) || (minuti == 50) || (minuti == 60)) && (secondi == 1))   {
        fct = fct + fcl;
      }
      if (minuti >= 60) {
        minuti = 0;
        ore = ore + 1;
      }
      if (ore >= 24) {
        ore = 0;
      }
      if (gps.available( gpsPort )) {
        gps_fix fix = gps.read();
        show = (show + 1) % SHOW_INTERVAL;
        if (fix.valid.speed && (fix.speed_kph() > SPEED_LIMIT)) {
          digitalWrite( LED_PIN, HIGH );
        } else {
          digitalWrite( LED_PIN, LOW );
        }
        if (fix.valid.location) {
          if (lastLocOK) {
            odo += fix.location.DistanceKm( lastLoc );
            Speed = fix.speed_kph();
          }
          lastLoc   = fix.location;
          lastLocOK = true;
          if (stScan) {
            stScan = false;
            base   = fix.location;
          } else {
            Dist = ( fix.location.DistanceKm( base ) );
          }
        }
        if ( Speed > maxs)          maxs = Speed;
        if (fix.valid.satellites ) {
          Sat = fix.satellites ;
          Satok = true;
        }
    
    
        if (fix.valid.heading ) {
          head = fix.heading() ;
          index = trovaIndice(head);
        }
    
        if (fix.valid.altitude) {
          alt = fix.altitude();
          altOK = true;
        }
    
        if (show == 0) {
          char displayBufffer[MAX_CHARS];
          oled.setCursor(0, 0);
          snprintf(displayBufffer, MAX_CHARS, "Km:%2d.%1d",  (int)odo, (int)(odo * 100) % 100);
          oled.println(displayBufffer);
          oled.setCursor(65, 0);
          snprintf(displayBufffer, MAX_CHARS, "Di:%2d.%1d",  (int)Dist, (int)(Dist * 100) % 100);
          oled.println(displayBufffer);
          snprintf(displayBufffer, MAX_CHARS, "Ve:%2d.%1d", (int)Speed, (int)(Speed * 100) % 100);
          oled.println(displayBufffer);
          oled.setCursor(65, 2);
          snprintf(displayBufffer, MAX_CHARS, "Al:%2d.%1d", (int)alt, (int)(alt * 100) % 100);
          oled.println(displayBufffer);
    
          snprintf(displayBufffer, MAX_CHARS, "Vm:%2d.%1d", (int)maxs, (int)(maxs * 100) % 100);
          oled.println(displayBufffer);
          oled.setCursor(65, 4);
          snprintf(displayBufffer, MAX_CHARS, "He: %s\n", (strBussola[index]));
          oled.println(displayBufffer);
          snprintf(displayBufffer, MAX_CHARS, "%d:%d:%d ", (int)ore, (int)minuti, (int)secondi);
          oled.println(displayBufffer);
          oled.setCursor(65, 6);
          snprintf(displayBufffer, MAX_CHARS, "Co:%2d.%1d", (int)head, (int)(head * 100) % 100);
          oled.println(displayBufffer);
        }
        File data = SD.open("L.csv", FILE_WRITE);
        data.print(fix.dateTime.hours + 2);
        data.print(":");
        data.print(fix.dateTime.minutes);
        data.print(" ");
        data.print(fix.dateTime.date);
        data.print("/");
        data.print(fix.dateTime.month);
        data.print(" ");
        data.print(ore);
        data.print(":");
        data.print(minuti);
        data.print(":");
        data.print(secondi);
        data.print(" ");
        data.print(fix.latitude(), 6);
        data.print(" ");
        data.print(fix.longitude(), 6);
        data.print(" ");
        data.print(alt);
        data.print(" ");
    
        data.print(odo);
        data.print(" ");
        data.print(Dist);
        data.print(" ");
        data.print(Speed);
        data.print(" ");
        data.print(head);
        data.print(" ");
        data.print(strBussola[index]);
        data.print(" ");
        data.print(Sat);
        data.println();
        data.close();
      }
    }
    
     
  17. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    ah.. dimenticavo..
    ho una versione che sto usando per fare trekking che ha 4 batterie mini stilo interne e anche la presa per poterla collegare al camioncino.
    la cosa buona è che quando cambio la batteria al modello posso accendere le stilo e non perdo i dati, fatto il cambio batteria spengo la parte di alimentazione interna per non avere 2 alimentazioni assieme.
    non sono stato a fare un circuito di esclusione tanto non succede nulla per poco tempo anche se un po' di corrente rientra tra le stilo ma se lo volete migliorare..
    la cosa meno buona è che il gps diventa grosso come un pacchetto di sigarette.
    ad ogni modo la modifica rispetto allo schema è semplicissima, ho aggiunto un interruttore slide.
    quando lo porto in tasca sta acceso delle ore mentre sul camion no alimento dalla presa direttamente con la batteria 2s del camioncino.
    lo uso per fare di confronti tra il gps piccolo montato fisso sul camion e quello portatile a batterie , a volte mi è servito per controllare se ci sono errori comuni e discrepanze tra i due.

    [​IMG]
     
    A ktm piace questo elemento.
  18. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    insomma questo gps cinese con usb dal costo di 5 euro è stato tolto da ebay è forse il miglior modulo che abbia provato in vita mia.
    funziona molto meglio anche del blasonato drotek originale ublox che considero il mio migliore.
    prende bene l'altitudine ed è veloce nel fare il fix.
    accendendo assieme i miei 3 gps arriva a dare i dati dopo circa 1 minuto e 10-20 secondi prima degli altri.
    ora però è sparito, il negozio dal quale l'avevo linkato non c'è più. forse era troppo buono ed economico.
    somiglia a questo https://www.ebay.it/itm/265009640582?hash=item3db3ce3486:g:OMIAAOSwkgVhLDeF e su un lato ha scritto hw 623

    se per futuri acquisti lo volete confrontare ho salvato al foto, sappiate che io l'ho pagato 5,13 euro spedito giusto per regolarvi sul prezzo che adesso così basso non trovo più da nessuna parte.

    [​IMG]
     
    A ktm piace questo elemento.
  19. ktm

    ktm degustatore di casoncelli

    Messaggi:
    3.653
    "Mi Piace" ricevuti:
    585
    Sesso:
    Maschio
    Località:
    Rogno (BG)
    rimango sempre stupito dal costo di questi componenti...
     
  20. wrighizilla

    wrighizilla Mercante RC

    Messaggi:
    648
    "Mi Piace" ricevuti:
    491
    Località:
    Firenze
    si ma alla fine un gps come quelli che ho costruito un pochino di costo lo richiede.. mediamente stando bassi con componenti cinesi che magari impiegano un mese per arrivare 25-30 euro si spendono.
    anche considerando un modulo gps intorno ai 5-7 euro e un display oled da 1.3'' che più o meno costa uguale. nano v3 328 da 5 euro e schedina lettore di SD da 2 euro. un pulsante, un led, una resistenza, e una scatolina di plastica.
    diciamo che se trovi tutto con spedizione gratuita dalla Cina e col prezzo più basso puoi cavartela con 20-22 euro ma se lo vuoi fare subito e compri i pezzi in Europa o peggio in Italia spendi anche 40-50 euro.
    avevo anche valutato di costruirli per chi non si ritiene capace di montarlo da solo ma sarebbe proprio volontariato gratuito considerato che poi altri 5 euro se li prenderebbe la posta, quindi ho deciso che è meglio aiutare con dovizia di particolari piuttosto che mettersi a costruirli.

    oggi ho testato il gps in autostrada con l'ultimo sketch aggiornato superando 130kmh e 100km di percorrenza, più che altro una verifica sui numeri riportati sul display e posso essere sicuro che fino a 999kmh e 999km percorsi non si accavallano i risultati.
     
  1. Questo sito utilizza i cookies per personalizzare i contenuti, la navigazione e la tua esperienza nell'utilizzo del forum; inoltre se decidi di registrarti, vengono utilizzati per mantenerti loggato
    Continuando ad utilizzare il sito, acconsenti all'utilizzo dei cookies.
    Nascondi Avviso