Sommario:

Registratore GPS Arduino: 3 passaggi
Registratore GPS Arduino: 3 passaggi

Video: Registratore GPS Arduino: 3 passaggi

Video: Registratore GPS Arduino: 3 passaggi
Video: Usare un modulo GPS con Arduino - #145 2024, Novembre
Anonim
Registratore GPS Arduino
Registratore GPS Arduino
Registratore GPS Arduino
Registratore GPS Arduino

Ciao ragazzi, Sono super eccitato per i piccoli progetti che consentono alle persone di comprendere davvero molto di più della tecnologia che abbiamo in giro ogni giorno.

Questo progetto riguarda il breakout GPS e la registrazione SD. Ho imparato molto solo costruendo questa roba.

Ci sono molte nozioni che otterrai seguendo questo tutorial, e molte altre seguendo il link che fornisco per approfondire gli argomenti.

Allora, che cos'è? Semplice: è un localizzatore GPS che registra posizioni (anche con altitudine), velocità e data/ora su una microSD.

Di cosa avrai bisogno:

- Arduino Nano (in realtà ho usato un UNO per costruire lo schizzo, ma sono lo stesso!) - Breakout GPS definitivo di Adafruit - Breakout della scheda MicroSD - Strumenti di saldatura (tutto ciò di cui hai bisogno per la saldatura) - Universal Stripboard (ho usato a 5x7cm)- Fili

Tutti questi componenti sono piuttosto economici tranne il modulo GPS. Questo è di circa 30-40 dollari ed è la parte più costosa. Anche un nuovo saldatore potrebbe costare meno.

Esiste anche uno scudo Adafruit con moduli GPS e scheda SD insieme. Se vuoi usarlo, tieni presente che è fatto per Arduino UNO, quindi avrai bisogno di un UNO e non di un Nano. Non c'è differenza nello schizzo però.

Andiamo oltre…

Passaggio 1: collegamento dei componenti

Componenti di collegamento
Componenti di collegamento
Componenti di collegamento
Componenti di collegamento
Componenti di collegamento
Componenti di collegamento
Componenti di collegamento
Componenti di collegamento

Bene, dopo aver ottenuto i componenti, dovrai collegarli. Qui puoi trovare gli schemi fritzing che è abbastanza chiaro. Tuttavia, ecco anche il pinout:

Rottura MicroSD

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (se stai usando lo shield questo è integrato in D10)

Rottura GPS

Vin -> 5VGnn -> GnnRx -> D2Tx -> D3

Piccole note su quei moduli: quei due ragazzini stanno comunicando attraverso percorsi diversi con Arduino. Il GPS usa un seriale TTL, lo stesso che usiamo quando comunichiamo con Arduino tramite Serial Monitor, ecco perché dobbiamo dichiarare tramite una libreria un nuovo seriale (Tx e Rx) perché il GPS vuole usare il 9600 di default, e noi vuoi usarlo neanche tu. Il modulo GPS è sempre e costantemente in streaming di dati, se collegato. Questa è la parte difficile da affrontare, perché se leggiamo una frase e poi la stampiamo, potremmo perdere la successiva, anche quella necessaria. Dobbiamo tenerlo a mente durante la codifica!

La MicroSD comunica tramite SPI (Serial Peripheral Interface), un altro modo per comunicare con la scheda. Quel tipo di modulo usa sempre CLK sul D13, DO sul D12 e DI sul D11. A volte queste connessioni hanno nomi diversi come CLK = SCK o SCLK (Serial Clock), DO = DOUT, SIMO, SDO, SO, MTSR (tutti quelli indicano Master Output) e DI = SOMI, SDI, MISO, MRST (Master Input). Infine abbiamo il CS o SS che indica il pin dove inviamo ciò che vogliamo scrivere nella MicroSD. Se vuoi usare due diversi moduli SPI, devi solo differenziare questo pin per usarli entrambi. Ad esempio, schermo LCD E una MicroSd come quella che stiamo utilizzando. Dovrebbe funzionare anche utilizzando due LCD differenti collegati a CS differenti.

Salda queste parti insieme nella scheda e sei pronto per caricare lo schizzo!

Come puoi vedere nello schizzo, ho saldato alcuni connettori femmina dupont invece del componente diretto, questo perché in futuro potrei voler riutilizzare il componente o cambiarne uno.

Ho anche saldato il modulo GPS con i connettori nella direzione sbagliata, è stata colpa mia e non volevo, ma funziona e non voglio rischiare di romperlo cercando di dissaldare quei piccoli bastardi! Basta saldare nel modo giusto e tutto andrà bene!

Ecco alcuni utili video di saldatura: Guida alla saldatura per principiantiUn video sulla dissaldatura

Canale Youtube di Adafruit, ci sono un sacco di cose interessanti!

Quando saldi, cerca di usare solo la quantità di metallo di cui hai bisogno, altrimenti farai un disastro. Non aver paura di farlo, magari inizia con qualcosa di non così costoso, e poi continua a saldare cose diverse. Anche il materiale giusto fa la differenza!

Passaggio 2: lo schizzo

Per prima cosa, ovviamente, importiamo la libreria e costruiamo i loro oggetti con cui lavorare: SPI.h è per comunicare con i moduli SPI, SD è la libreria MicroSD e Adafruit_GPS è la libreria del modulo GPS. SoftwareSerial.h serve per creare una porta seriale tramite software. La sintassi è "mySerial(TxPin, RxPin);". L'oggetto GPS deve essere puntato su un seriale (tra parentesi). Ecco i collegamenti delle librerie per il breakout GPS Adafruit, il breakout MicroSD (per fare un lavoro pulito dovresti anche formattare la SD con questo software dall'associazione SD) e il Libreria software seriale (dovrebbe essere inclusa nell'IDE).

NOTA: ho riscontrato qualche problema durante il tentativo di aggiungere molte informazioni in un file o utilizzando più di due file nello schizzo. Non ho formattato la SD con quel software, forse questo potrebbe risolvere il problema. Inoltre, ho provato ad aggiungere un altro sensore nel dispositivo, un BMP280 (modulo I2C), senza alcun successo. Sembra che l'uso del modulo I2C faccia impazzire lo schizzo! L'ho già chiesto nel forum di Adafruit, ma non ho ancora ricevuto risposta.

#include "SPI.h"#include "SD.h"#include "Adafruit_GPS.h"#include "SoftwareSerial.h" SoftwareSerial mySerial(3, 2); Adafruit_GPS GPS(&mySerial);

Ora abbiamo bisogno di tutte le nostre variabili: le due stringhe servono per leggere le due frasi di cui abbiamo bisogno per calcolare una serie di informazioni utili dal GPS. Il char serve per immagazzinare le frasi prima di analizzarle, i float servono per calcolare le coordinate in gradi (l'invio GPS usa le coordinate in gradi e minuti, ci servono in gradi per leggere in google earth). Il chipSelect è il pin dove colleghiamo il CS della scheda MicroSD. In questo caso è D4, ma se stai usando uno shield SD, dovrai mettere D10 qui. La variabile File è quella che conserverà le informazioni del file che stiamo usando durante lo sketch.

Stringa NMEA1;

Stringa NMEA2; carattere c; grado di galleggiamento; float degWhole; float degDec; int chipSelect = 4; File mySensorData;

Ora stiamo dichiarando un paio di funzioni per rendere lo schizzo un po' più elegante e meno disordinato:

Fanno praticamente la stessa cosa: leggono le frasi NMEA. clearGPS() sta ignorando tre frasi e readGPS() ne sta salvando due nelle variabili.

Vediamo come: Un ciclo while controlla se ci sono nuove frasi NMEA sul modulo e legge il flusso GPS finché non ce n'è una. Quando c'è una nuova frase, siamo fuori dal ciclo while, dove la frase viene effettivamente letta, analizzata e immagazzinata nelle prime variabili NMEA. Facciamo subito lo stesso per il prossimo, perché il GPS è in continuo streaming, non aspetta che siamo pronti, non abbiamo tempo per stamparlo subito

Questo è molto importante! Non fare nulla prima di aver memorizzato entrambe le frasi, altrimenti la seconda potrebbe essere corrotta o semplicemente sbagliata.

Dopo aver ottenuto due frasi, le stampiamo nel seriale per controllare che vadano bene.

void readGPS() {

clearGPS(); while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); NMEA1=GPS.lastNMEA(); while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); NMEA2=GPS.lastNMEA(); Serial.println(NMEA1); Serial.println(NMEA2); } void clearGPS() { while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA());w while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); }

Bene, ora che siamo a posto, possiamo passare attraverso il setup():

Primo: apriamo la comunicazione su Seriale 115200 per PC Arduino e su 9600 per modulo GPS Arduino. Secondo: inviamo tre comandi al modulo GPS: il primo è per chiudere l'aggiornamento dell'antenna, il secondo è per chiedere solo la stringa RMC e GGA (useremo solo quelli, che hanno tutte le informazioni di cui avresti bisogno da un GPS), il terzo e ultimo comando è quello di impostare la frequenza di aggiornamento a 1HZ, suggerito da Adafruit.

Successivamente impostiamo il pin D10 su OUTPUT, se, e solo se, il pin CS del tuo modello SD è diverso da D10. Immediatamente dopo, impostare il CS sul modulo SD sul pin chipSelect.

Eseguiamo le funzioni readGPS() che includono cleanGPS().

Ora è il momento di scrivere qualcosa nei file! Se il file è già nella scheda SD, aggiungi un timestamp su di essi. In questo modo non dobbiamo tenere traccia delle sessioni o cancellare i file ogni volta. Con un timestamp scritto all'interno della funzione di configurazione, siamo sicuri di aggiungere una separazione nei file solo una volta per sessione.

NOTA: la libreria SD è piuttosto seria nell'aprire e chiudere il file ogni volta! Tienilo a mente e chiudilo ogni volta! Per conoscere la libreria segui questo link.

Ok, siamo davvero pronti per ottenere il nucleo della parte stream-and-log dello sketch.

void setup() {

Serial.begin(115200); GPS.begin(9600); //Invia comandi al modulo GPS GPS.sendCommand("$PGCMD, 33, 0*6D"); GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); ritardo(1000); //solo se il pin CS del modulo SD non è sul pin D10

pinMode(10, USCITA);

SD.begin(chipSelect); leggiGPS(); if (SD.exists("NMEA.txt")) { mySensorData = SD.open("NMEA.txt", FILE_WRITE); mySensorData.println(""); mySensorData.print("*** "); mySensorData.print(GPS.day); mySensorData.print("."); mySensorData.print(GPS.mese); mySensorData.print("."); mySensorData.print(GPS.year); mySensorData.print(" -- "); mySensorData.print(GPS.hour); mySensorData.print(:"); mySensorData.print(GPS.minute); mySensorData.print(:"); mySensorData.print(GPS.secondi); mySensorData.println(" ***"); mySensorData.close(); } if (SD.exists("GPSData.txt")) { mySensorData = SD.open("GPSData.txt", FILE_WRITE); mySensorData.println(""); mySensorData.println(""); mySensorData.print("*** "); mySensorData.print(GPS.day); mySensorData.print("."); mySensorData.print(GPS.mese); mySensorData.print("."); mySensorData.print(GPS.year); mySensorData.print(" -- "); mySensorData.print(GPS.hour); mySensorData.print(:"); mySensorData.print(GPS.minute); mySensorData.print(:"); mySensorData.print(GPS.seconds); mySensorData.println(" ***"); mySensorData.close(); }}

Ora stiamo ottenendo il nucleo dello schizzo.

È semplicissimo, davvero.

Andremo a leggere lo stream GPS con la funzione readGPS(), poi controlleremo se abbiamo un fix uguale a 1, che significa che siamo connessi con un satellite. Se l'abbiamo ottenuto, scriveremo le nostre informazioni nei file. Nel primo file "NMEA.txt", scriviamo solo le frasi grezze. Nel secondo file, "GPDData.txt", aggiungiamo le coordinate (convertite con le funzioni che abbiamo visto prima) e l'altitudine. Queste informazioni sono sufficienti per compilare un file.kml per creare un percorso su Google Earth. Nota che chiudiamo i file ogni volta che lo apriamo per scrivere qualcosa!

ciclo vuoto() {

leggi GPS(); // Condizione if che controlla se l'antenna ha segnale. Se si, procede con la scrittura dei dati. if(GPS.fix==1) { //Salva i dati solo se abbiamo un fix mySensorData = SD.open("NMEA.txt", FILE_WRITE); //Apre il file per le frasi NMEA grezze mySensorData.println(NMEA1); //Scrive prima NMEA sul file mySensorData.println(NMEA2); //Scrive seconda NMEA sul file mySensorData.close(); //File Chiude!!

mySensorData = SD.open("GPSData.txt", FILE_WRITE);

// Converte e scrive la longitudine convLong(); mySensorData.print(deg, 4); // Scrive le coordinate in gradi sul file mySensorData.print(", "); // Scrive una virgola per separare i dati Serial.print(deg); Serial.print(", "); // Converte e scrive la latitudine convLati(); mySensorData.print(deg, 4); // Scrive le coordinate in gradi sul file mySensorData.print(", "); // Scrive una virgola per separare i dati Serial.print(deg); Serial.print(", "); // Scrive l'altitudine mySensorData.print(GPS.altitude); mySensorData.print(" "); Serial.println(GPS.altitudine); mySensorData.close(); } }

Ora che abbiamo finito, puoi caricare lo schizzo, costruire il dispositivo e divertirti!

Si noti che è necessario utilizzarlo con la scheda GPS rivolta verso il cielo per ottenere un fix=1, oppure è possibile collegarvi un'antenna esterna.

Inoltre, tieni presente che se hai una correzione, la luce rossa lampeggia ogni 15 secondi, in caso contrario, molto più velocemente (una volta ogni 2-3 secondi).

Se vuoi saperne di più sulle frasi NMEA, segui il passaggio successivo di questa guida.

Passaggio 3: le frasi NMEA e il file.kml

Il dispositivo e lo schizzo sono completi, funzionano bene. Tieni presente che per ottenere una correzione (per avere una connessione con i satelliti) il breakout dovrebbe essere rivolto verso il cielo.

La piccola luce rossa lampeggia ogni 15 secondi quando hai una correzione

Se vuoi capire meglio le frasi NMEA, puoi leggere oltre.

Nello schizzo usiamo solo due frasi, la GGA e la RMC. Sono solo un paio delle frasi che il modulo GPS sta trasmettendo.

Vediamo cosa c'è in quelle stringhe:

$GPRMC, 123519, A, 4807.038, N, 01131.000, E, 022.4, 084.4, 230394, 003,1, W*6A

RMC = Frase minima consigliata C 123519 = Correzione eseguita alle 12:35:19 UTC A = Stato A=attivo o V=Vuoto 4807.038, N = Latitudine 48 gradi 07.038' N 01131.000, E = Longitudine 11 gradi 31.000' E 022.4 = Velocità sul terreno in nodi 084.4 = Angolo di traccia in gradi Vero 230394 = Data - 23 marzo 1994 003.1, W = Variazione magnetica *6A = I dati di checksum iniziano sempre con *

$GPGGA, 123519, 4807.038, N, 01131.000, E, 1, 08, 0.9, 554,4, M, 46,9, M,, *47

GGA Global Positioning System Fix Data 123519 Fix preso alle 12:35:19 UTC 4807.038, N Latitudine 48 gradi 07.038' N 01131.000, E Longitudine 11 gradi 31.000' E 1 Qualità correzione: 0 = non valido; 1 = punto GPS (SPS);2 = punto DGPS; 3 = correzione PPS; 4 = Cinematica in tempo reale; 5 = Float RTK; 6 = stimato (stima) (funzione 2.3); 7 = Modalità inserimento manuale; 8 = Modalità simulazione; 08 Numero di satelliti tracciati 0.9 Diluizione orizzontale della posizione 554,4, M Altitudine, Metri, sopra il livello medio del mare 46,9, M Altezza del geoide (livello medio del mare) sopra l'ellissoide WGS84 (campo vuoto) tempo in secondi dall'ultimo aggiornamento DGPS (campo vuoto) Numero identificativo della stazione DGPS *47 i dati del checksum, iniziano sempre con *

Come puoi vedere, ci sono molte più informazioni di quelle di cui hai bisogno lì. Usando la libreria di Adafruit, puoi chiamarne alcuni, come GPS.latitude o GPS.lat (latitudine ed emisfero lat), o GPS.day/mese/anno/ora/minuti/secondi/millisecondi… Dai un'occhiata ad Adafruit sito web per saperne di più. Non è così chiaro, ma seguendo alcuni suggerimenti nella guida dei moduli GPS, potresti trovare quello che ti serve.

Cosa possiamo fare con i file che abbiamo? Facile: compila un file kml per mostrare un percorso su Google Earth. Per farlo basta copiare/incollare il codice che trovi seguendo questo link (sotto il paragrafo Path), inserisci tra i tag le tue coordinate dal file GPDData.txt, salva il file con estensione.kml e caricalo su Google Earth.

NOTA: Il linguaggio di markup.kml è semplice, se sai già cos'è un linguaggio di markup, prenditi il tuo tempo per leggere il link precedente e la documentazione all'interno, è davvero interessante!

Usare kml significa conoscere i suoi tag e argomenti. Ho trovato solo la guida di Google, quella che ho linkato prima e l'essenziale è definire lo stile tra i tag e chiamarlo con il segno # quando è il momento di scrivere le coordinate.

Il file che ho aggiunto in questa sezione è un.kml in cui puoi semplicemente incollare le tue coordinate. tieni presente di incollare con questa sintassi: longitudine, latitudine, altitudine

Consigliato: