Cuprins:

Arduino GPS Logger: 3 pași
Arduino GPS Logger: 3 pași

Video: Arduino GPS Logger: 3 pași

Video: Arduino GPS Logger: 3 pași
Video: Arduino в космосе. Часть 3. Запускаем платы в стратосферу. С GPRS-шилдом, GPS-трекером и DS18b20 2024, Iulie
Anonim
Arduino GPS Logger
Arduino GPS Logger
Arduino GPS Logger
Arduino GPS Logger

Salut baieti, Mă simt foarte plăcut pentru mici proiecte care permit oamenilor să înțeleagă de fapt mult mai mult din tehnologia pe care o avem în fiecare zi.

Acest proiect este despre funcționarea GPS și înregistrarea SD. Am învățat multe doar construind aceste lucruri.

Există o mulțime de noțiuni pe care le veți câștiga în urma acestui tutorial și multe altele urmând linkul pe care vi-l ofer pentru a vă aprofunda subiectele.

Deci, ce este asta? Simplu: Este un tracker GPS care înregistrează pozițiile (și cu altitudinea), viteza și data / ora pe un microSD.

Ce vei avea nevoie:

- Arduino Nano (de fapt, am folosit un UNO pentru a construi schița, dar sunt la fel!) - Adafruit Ultimate GPS Breakout - MicroSD Card Breakout - Instrumente de lipit (tot ce veți avea nevoie pentru lipire) - Universal Stripboard (am folosit a 5x7cm) - Sârme

Toate aceste componente sunt destul de ieftine, cu excepția modulului GPS. Adică aproximativ 30-40 de dolari și este cea mai scumpă parte. Chiar și un nou set de fier de lipit ar putea costa mai puțin.

Există, de asemenea, un scut Adafruit cu module GPS și card SD împreună. Dacă doriți să-l utilizați, rețineți că este conceput pentru Arduino UNO, prin urmare veți avea nevoie de UNO și nu de Nano. Totuși, nu există nicio diferență în schiță.

Să mergem mai departe …

Pasul 1: Conectarea componentelor

Conectarea componentelor
Conectarea componentelor
Conectarea componentelor
Conectarea componentelor
Conectarea componentelor
Conectarea componentelor
Conectarea componentelor
Conectarea componentelor

Ei bine, după ce veți obține componentele, va trebui să le conectați. Aici puteți găsi schemele interesante care sunt destul de clare. Cu toate acestea, aici este și pinout-ul:

Breakout MicroSD

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (Dacă utilizați scutul, acesta este încorporat în D10)

GPS breakout

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

Micile note despre modulul respectiv: cei doi băieți comunică prin căi diferite cu Arduino. GPS-ul folosește un serial TTL, de același tip pe care îl folosim atunci când comunicăm cu Arduino prin intermediul monitorului serial, de aceea trebuie să declarăm printr-o bibliotecă un nou serial (Tx și Rx) deoarece GPS vrea să folosească implicit 9600 și vreau să-l folosim. Modulul GPS transmite mereu și constant date, dacă este conectat. Aceasta este partea dificilă de tratat, deoarece dacă citim o propoziție și o imprimăm, am putea pierde următoarea, și aceasta este necesară. Trebuie să-l avem în vedere atunci când codificăm!

MicroSD comunică prin SPI (Serial Peripheral Interface), un alt mod de a comunica cu placa. Acest tip de modul utilizează întotdeauna CLK pe D13, DO pe D12 și DI pe D11. Uneori, acele conexiuni au nume diferite, cum ar fi CLK = SCK sau SCLK (Serial Clock), DO = DOUT, SIMO, SDO, SO, MTSR (toate acestea indică Master Output) și DI = SOMI, SDI, MISO, MRST (Master Input). În cele din urmă avem CS sau SS care indică pinul către care trimitem ceea ce dorim să scriem în MicroSD. Dacă doriți să utilizați două module SPI diferite, trebuie doar să diferențiați acest pin pentru a le utiliza pe amândouă. De exemplu, ecran LCD ȘI un MicroSd ca cel pe care îl folosim. Ar trebui să funcționeze și folosind două LCD-uri diferite conectate la CS-uri diferite.

Lipiți această parte împreună în tablă și sunteți gata să încărcați schița!

După cum puteți vedea în schiță, am lipit niște conectori feminini dupont în loc de componenta directă, asta pentru că, în viitor, aș putea dori să refolosesc componenta sau să o schimb.

De asemenea, am lipit modulul GPS cu conectorii în direcția greșită, asta a fost vina mea și nu am vrut, dar funcționează și nu vreau să risc să-l rupem încercând să-i desoldăm pe ticăloșii aceia mici! Doar lipiți în modul corect și totul va fi bine!

Iată câteva videoclipuri utile pentru lipire: Ghid de lipire pentru începători Un videoclip despre desoldare

Canal Youtube Adafruit, o mulțime de lucruri interesante acolo!

Când lipiți, încercați să utilizați doar cantitatea de metal de care aveți nevoie, altfel veți face o mizerie. Nu vă fie frică să faceți acest lucru, poate începeți cu ceva care nu este atât de scump și decât să păstrați diferite lucruri de lipit. Materialul potrivit face, de asemenea, diferența!

Pasul 2: Schița

Mai întâi, desigur, importăm biblioteca și construim obiectele lor pentru a lucra cu: SPI.h este pentru comunicarea cu modulele SPI, SD este biblioteca MicroSD și Adafruit_GPS este biblioteca modulului GPS. SoftwareSerial.h este pentru crearea unui port serial prin intermediul software-ului. Sintaxa este „mySerial (TxPin, RxPin);”. Obiectul GPS trebuie să fie îndreptat către un serial (între paranteze). Iată linkurile bibliotecilor pentru Adafruit GPS Breakout, MicroSD Breakout (pentru a face o treabă curată, trebuie să formatați și SD cu acest software din asociația SD) și Librărie serială software (ar trebui să fie inclusă în IDE).

NOTĂ: M-am confruntat cu unele probleme atunci când încercam să adaug multe informații într-un singur fișier sau când foloseam mai mult de două fișiere în schiță. Nu am formatat SD-ul cu acel software, poate că asta ar putea rezolva problema. De asemenea, am încercat să adaug un alt senzor în dispozitiv, un BMP280 (modul I2C), fără niciun succes. Se pare că folosirea modulului I2C face ca schița să devină nebună! Am aflat deja despre asta în forumul Adafruit, dar încă nu am primit niciun răspuns.

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

Acum avem nevoie de toate variabilele noastre: Cele două șiruri sunt pentru citirea celor două propoziții de care avem nevoie pentru a calcula o grămadă de informații utile de pe GPS. Caracterul este pentru stocul frazelor înainte de a le analiza, plutitoarele sunt pentru calcularea coordonatelor în grade (GPS trimite coordonatele de utilizare în grade și minute, avem nevoie de ele în grade pentru a permite citirea în Google Earth). ChipSelect este pinul în care conectăm CS-ul cardului MicroSD. În acest caz este D4, dar dacă utilizați un scut SD, va trebui să puneți D10 aici. Variabila fișier este cea care va stoca informațiile fișierului pe care îl folosim în timpul schiței.

Șir NMEA1;

Șir NMEA2; char c; float deg; plutitor deg Întreg; float degDec; int chipSelect = 4; Înregistrați MySensorData;

Acum declarăm câteva funcții pentru a face schița puțin mai elegantă și mai puțin dezordonată:

Aceștia fac practic același lucru: citirea propozițiilor NMEA. clearGPS () ignoră trei propoziții și readGPS () salvează două dintre ele în variabile.

Să vedem cum: O buclă while controlează dacă există noi propoziții NMEA pe modul și citesc fluxul GPS până când există una. Când există o propoziție nouă, ieșim din bucla while, unde propoziția este de fapt citită, analizată și stocată în primele variabile NMEA. Facem imediat același lucru pentru următorul, deoarece GPS-ul este în continuu streaming, nu așteaptă să fim gata, nu avem timp să îl imprimăm imediat

Este foarte important! Nu faceți nimic înainte de a stoca ambele propoziții, altfel a doua ar fi în cele din urmă coruptă sau pur și simplu greșită.

După ce am primit două propoziții, le tipărim în serial pentru a controla că merge bine.

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 ()); }

Ei bine, acum că suntem pregătiți, putem trece prin setup ():

În primul rând: deschidem comunicarea pe Serial 115200 pentru Arduino PC și pe 9600 pentru modulul GPS Arduino. În al doilea rând: trimitem trei comenzi către modulul GPS: prima este să închideți actualizarea antenei, a doua este pentru a cere doar șiruri RMC și GGA (vom folosi doar cele care au toate informațiile de care ați avea nevoie vreodată) a GPS), a treia și ultima comandă este să setați rata de actualizare la 1 HZ, sugerată de Adafruit.

După aceea, setăm pinul D10 la OUTPUT, dacă și numai dacă pinul CS al modelului dvs. SD este altul decât D10. Imediat după aceea, setați CS pe modulul SD de pe chip Selectați pinul.

Rulăm funcțiile readGPS () care includ cleanGPS ().

Acum este timpul să scrieți ceva în fișiere! Dacă fișierul se află deja pe cardul Sd, adăugați un marcaj de timp pe ele. În acest fel, nu trebuie să ținem evidența sesiunilor sau să ștergem fișierele de fiecare dată. Cu un timestamp scris în funcția de configurare, suntem siguri că adăugăm o separare în fișiere o singură dată pe sesiune.

NOTĂ: Biblioteca SD este destul de serioasă despre deschiderea și închiderea fișierului de fiecare dată! Păstrați-l în minte și închideți-l de fiecare dată! Pentru a afla despre bibliotecă, urmați acest link.

Ok, suntem cu toții pregătiți să obținem nucleul părții stream-and-log din schiță.

configurare nulă () {

Serial.begin (115200); GPS.begin (9600); // Trimiteți comenzi către modulul GPS GPS.sendCommand („$ PGCMD, 33, 0 * 6D”); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); întârziere (1000); // numai dacă pinul CS al modulului SD nu este pe pinul D10

pinMode (10, OUTPUT);

SD.begin (chipSelect); readGPS (); 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.month); mySensorData.print ("."); mySensorData.print (GPS.an); mySensorData.print ("-"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.secunde); 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.month); mySensorData.print ("."); mySensorData.print (GPS.an); mySensorData.print ("-"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.secunde); mySensorData.println ("***"); mySensorData.close (); }}

Acum primim nucleul schiței.

Este foarte simplu, într-adevăr.

Vom citi fluxul GPS cu funcția readGPS (), decât vom controla dacă avem o remediere egală cu 1, înseamnă că suntem conectați cu un satelit e. Dacă am obținut-o, vom scrie informațiile noastre în fișiere. În primul fișier „NMEA.txt”, scriem doar propozițiile brute. În al doilea fișier, „GPDData.txt”, adăugăm coordonatele (convertite cu funcțiile pe care le-am văzut înainte) și altitudinea. Aceste informații sunt suficiente pentru a compila un fișier.kml pentru a crea o cale pe Google Earth. Rețineți că închidem fișierele de fiecare dată când le-am deschis pentru a scrie ceva!

bucla nulă () {

readGPS (); // Condizione if che controla se l'antenna ha segnale. Se si, procede cu scrittura dei dati. if (GPS.fix == 1) {// Salvați datele numai dacă avem o soluție 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 (); // fișier 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.altitude); mySensorData.close (); }}

Acum că am terminat, puteți încărca schița, construiți dispozitivul și bucurați-vă de el!

Rețineți că trebuie să-l utilizați cu borad-ul GPS orientat spre cer pentru a obține o soluție = 1 sau puteți conecta o antenă externă la acesta.

De asemenea, rețineți că, dacă aveți o soluție, lumina roșie clipește la fiecare 15 secunde, dacă nu, mult mai repede (o dată la 2-3 secunde).

Dacă doriți să aflați ceva mai multe despre propozițiile NMEA, urmați pasul următor al acestui ghid.

Pasul 3: Sentințele NMEA și fișierul.kml

Dispozitivul și schița sunt complete, funcționează bine. Rețineți că, pentru a obține o soluție (pentru a avea o conexiune cu sateliții), izbucnirea ar trebui să fie orientată spre cer.

Lumina roșie mică clipește la fiecare 15 secunde când ai remediat

Dacă doriți să înțelegeți mai bine propozițiile NMEA, puteți citi mai departe.

În schiță folosim doar două propoziții, GGA și RMC. Sunt doar câteva dintre propozițiile pe care le transmite modulul GPS.

Să vedem ce este în acele șiruri:

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

RMC = Frază minimă recomandată C 123519 = Fixare luată la 12:35:19 UTC A = Stare A = activă sau V = Vid 4807.038, N = Latitudine 48 deg 07.038 'N 01131.000, E = Longitudine 11 deg 31.000' E 022.4 = Viteză deasupra solului în noduri 084.4 = Unghiul de urmărire în grade Adevărat 230394 = Data - 23 martie 1994 003.1, W = Variația magnetică * 6A = Datele de sumă de verificare încep întotdeauna cu *

$ GPGGA, 123519, 4807.038, N, 01131.000, E, 1, 08, 0.9, 545.4, M, 46.9, M,, * 47

GGA Global Positioning System Fix Data 123519 Fix luate la 12:35:19 UTC 4807.038, N Latitudine 48 deg 07.038 'N 01131.000, E Longitudine 11 deg 31.000' E 1 Calitate fix: 0 = invalid; 1 = GPS fix (SPS); 2 = DGPS fix; 3 = remedierea PPS; 4 = Cinematică în timp real; 5 = Float RTK; 6 = estimat (calcul) (caracteristică 2.3); 7 = Mod de introducere manuală; 8 = Mod de simulare; 08 Numărul de sateliți urmăriți 0,9 Diluare orizontală a poziției 545,4, Altitudine M, Metri, peste nivelul mediu al mării 46,9, M Înălțimea geoidului (nivelul mediu al mării) deasupra timpului elipsoidului WGS84 (câmp gol) în secunde de la ultima actualizare DGPS (câmp gol)) Numărul de identificare al stației DGPS * 47 datele de sumă de control, încep întotdeauna cu *

După cum puteți vedea, există mult mai multe informații decât cele de care aveți nevoie acolo. Folosind biblioteca Adafruit, puteți apela unele dintre ele, cum ar fi GPS.latitude sau GPS.lat (latitudine și lat emisferă) sau GPS.day/month/year/hour/minute/seconds/milliseconds… Aruncați o privire la Adafruit site-ul web pentru a ști ceva mai mult. Nu este atât de clar, dar urmând câteva indicii din ghidul modulelor GPS, ați putea găsi ceea ce aveți nevoie.

Ce putem face cu fișierele pe care le avem? Ușor: compilați un fișier kml pentru a afișa o cale pe Google Earth. Pentru a face acest lucru, trebuie doar să copiați / să treceți codul pe care îl veți găsi urmând acest link (sub paragraful Căi), puneți coordonatele din fișierul GPDData.txt între etichete, salvați fișierul cu extensia.kml și încărcați-l pe Google Earth.

NOTĂ: Limbajul de marcare.kml este simplu, dacă știți deja ce este un limbaj de marcare, păstrați-vă timpul pentru a citi link-ul anterior și documentația din interior, este de fapt interesant!

Folosind kml este vorba despre cunoașterea etichetelor și argumentelor sale. Am găsit doar ghidul de la Google, cel pe care l-am legat anterior și partea esențială este de a defini stilul dintre etichete și de a-l apela cu semnul # când este timpul să scriu coordonatele.

Fișierul pe care l-am adăugat în această secțiune este un.kml în care puteți să lipiți coordonatele. rețineți că lipiți cu această sintaxă: longitudine, latitudine, altitudine

Recomandat: