Innholdsfortegnelse:

Arduino GPS -logger: 3 trinn
Arduino GPS -logger: 3 trinn

Video: Arduino GPS -logger: 3 trinn

Video: Arduino GPS -logger: 3 trinn
Video: LDmicro 21: настройка режима C и Arduino Mega (программирование микроконтроллера с помощью LDmicro) 2024, Juli
Anonim
Arduino GPS -logger
Arduino GPS -logger
Arduino GPS -logger
Arduino GPS -logger

Hei folkens, Jeg blir veldig spent på små prosjekter som lar folk faktisk forstå mye mer av teknologien vi har rundt hverdagen.

Dette prosjektet handler om GPS -breakout og SD -logging. Jeg lærte mye bare å bygge disse tingene.

Det er mange forestillinger du vil få etter denne opplæringen, og mye mer ved å følge lenken jeg gir for å komme dypere inn i temaene.

Så hva er det? Enkel: Er en GPS -tracker som registrerer posisjoner (med høyde også), hastighet og dato/tid på et microSD.

Dette trenger du:

- Arduino Nano (jeg brukte faktisk en UNO for å bygge skissen, men de er akkurat det samme!)- Adafruit ultimate GPS breakout- MicroSD-kort breakout- Loddeverktøy (alt du trenger for lodding)- Universal Stripboard (jeg brukte a 5x7cm)- Ledninger

Alle disse komponentene er ganske billige bortsett fra GPS -modulen. Det er omtrent 30-40 dollar og er den dyreste delen. Selv et nytt loddejern sett kan koste mindre.

Det finnes også et Adafruit -skjold med GPS- og SD -kortmoduler sammen. Husk at den er laget for Arduino UNO, så du trenger en UNO og ikke en Nano. Det er imidlertid ingen forskjell på skissen.

La oss gå videre …

Trinn 1: Koble til komponenter

Koble til komponenter
Koble til komponenter
Koble til komponenter
Koble til komponenter
Koble til komponenter
Koble til komponenter
Koble til komponenter
Koble til komponenter

Etter at du har fått komponentene, må du koble dem til. Her kan du finne fritzing -skjemaene som er ganske klare. Men her er også pinout:

MicroSD -utbrudd

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (Hvis du bruker skjoldet er dette innebygd i D10)

GPS -utbrudd

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

Små notater om modulen: De to små guttene kommuniserer gjennom forskjellige stier med Arduino. GPS -en bruker en TTL -serie, samme type som vi bruker når vi kommuniserer med Arduino via Serial Monitor, hvorfor vi gjennom et bibliotek må erklære en ny serie (Tx og Rx) fordi GPS ønsker å bruke 9600 som standard, og vi vil bruke den heller. GPS -modulen streamer alltid og konstant data, hvis den er plugget. Dette er den vanskelige delen å håndtere, for hvis vi leser en setning og skriver den ut, kan vi miste den neste, det er også nødvendig. Vi må huske det når vi koder!

MicroSD kommuniserer via SPI (Serial Peripheral Interface), en annen måte å kommunisere med kortet. Slike moduler bruker alltid CLK på D13, DO på D12 og DI på D11. Noen ganger har disse tilkoblingene et annet navn som CLK = SCK eller SCLK (Serial Clock), DO = DOUT, SIMO, SDO, SO, MTSR (alle de indikerer Master Output) og DI = SOMI, SDI, MISO, MRST (Master Input). Til slutt har vi CS eller SS som angir pinnen hvor vi sender det vi vil skrive i MicroSD. Hvis du vil bruke to forskjellige SPI -moduler, må du bare differensiere denne pinnen for å bruke dem begge. For eksempel LCD -skjerm OG en MicroSd som den vi bruker. Det bør også fungere ved bruk av to forskjellige LCD -skjermer koblet til forskjellige CS -er.

Lodd denne delen sammen i brettet, og du er klar til å laste opp skissen!

Som du kan se på skissen, lodder jeg noen dupont -hunkontakter i stedet for den direkte komponenten, det er fordi jeg i fremtiden kanskje vil bruke komponenten på nytt eller endre en.

Jeg loddet også GPS -modulen med kontaktene i feil retning, det var min feil, og jeg ville ikke, men det fungerer, og jeg vil ikke risikere å ødelegge det for å desolde de små jævlene! Bare loddetinn på riktig måte, så går alt bra!

Her noen nyttige loddevideoer: Loddeguide for nybegynnere En video om avlodding

Adafruit Youtube -kanal, mange interessante ting der!

Når du lodder, prøv å bruke bare mengden metall du trenger, ellers kommer du til å gjøre rot. Ikke vær redd for å gjøre det, kanskje begynn med noe som ikke er så dyrt, og beholde loddetinn forskjellige ting. Riktig materiale gjør også forskjellen!

Trinn 2: Skissen

Først, selvfølgelig, importerer vi biblioteket og bygger objektene de skal jobbe med: SPI.h er for kommunikasjon med SPI -moduler, SD er MicroSD -biblioteket og Adafruit_GPS er biblioteket til GPS -modulen. SoftwareSerial.h er for å lage en seriell port via programvare. Syntaksen er "mySerial (TxPin, RxPin);". GPS -objektet må pekes på en serie (i parentes). Her er bibliotekets lenker for Adafruit GPS -breakout, MicroSD -breakout (for å gjøre en ren jobb bør du også formatere SD -en med denne programvaren fra SD -foreningen) og Programvareseriebibliotek (det bør inkluderes i IDE).

MERK: Jeg møtte et problem da jeg prøvde å legge til mye informasjon i en fil eller ved å bruke mer enn to filer i skissen. Jeg formaterte ikke SD med den programvaren, kanskje det kunne løse problemet. Jeg prøvde også å legge til en annen sensor i enheten, en BMP280 (I2C -modul), uten hell. Det virker som om bruk av I2C -modul gjør skissen gal! Jeg visste allerede om det i Adafruit -forumet, men jeg fikk fortsatt ikke noe svar.

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

Nå trenger vi alle våre variabler: De to strengene er for å lese de to setningene vi trenger for å beregne en haug med nyttig informasjon fra GPS -en. Røyen er for lager setningene før du analyserer dem, flyterne er for å beregne koordinatene i grader (GPS sender brukskoordinater i grader og minutter, vi trenger dem i grader for la lesingen i google earth). ChipSelect er pinnen der vi kobler CS -en til MicroSD -kortet. I dette tilfellet er D4, men hvis du bruker et SD -skjold, må du sette D10 her. Filvariabelen er den som vil lagre informasjonen til filen vi bruker under skissen.

String NMEA1;

String NMEA2; røye c; flyte deg; flyte degHele; flyte degDec; int chipSelect = 4; Fil mySensorData;

Nå erklærer vi et par funksjoner for å gjøre skissen litt mer elegant og mindre rotete:

De gjør i utgangspunktet det samme: å lese NMEA -setninger. clearGPS () ignorerer tre setninger og readGPS () lagrer to av dem i variablene.

La oss se hvordan: En stund -sløyfe kontrollerer om det er nye NMEA -setninger på modulen og leser GPS -strømmen til det er en. Når en ny setning er der, er vi ute mens loop, hvor setningen faktisk blir lest, analysert og lagret i de første NMEA -variablene. Vi gjør det samme umiddelbart for den neste, fordi GPS -en stadig strømmer, den venter ikke på at vi skal være klare, vi har ikke tid til å skrive den ut umiddelbart

Dette er veldig viktig! Ikke gjør noe før du lager begge setningene, ellers vil den andre til slutt bli ødelagt eller bare feil.

Etter at vi fikk to setninger, skriver vi dem ut i serien for å kontrollere at det går bra.

void readGPS () {

clearGPS (); mens (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); NMEA1 = GPS.lastNMEA (); mens (! 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 ()); mens (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); w mens (! GPS.newNMEA mottatt ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); }

Vel, nå som vi er klare, kan vi komme oss gjennom oppsettet ():

Først: vi åpner kommunikasjon på Serial 115200 for Arduino PC og på 9600 for GPS -modul Arduino. For det andre: Vi sender tre kommandoer til GPS -modulen: den første er å stenge antenneoppdateringen, den andre er for å spørre bare RMC- og GGA -streng (vi kommer til å bruke bare de som har all informasjonen du trenger fra en GPS), er den tredje og siste kommandoen å sette oppdateringshastigheten til 1HZ, foreslått av Adafruit.

Etter det setter vi pin D10 til OUTPUT, hvis, og bare hvis, SD -modellens CS -pin er en annen enn D10. Umiddelbart etterpå, sett CS på SD -modulen på chipSelect pin.

Vi kjører funksjonene readGPS () som inkluderer cleanGPS ().

Nå er det på tide å skrive noe i filene! Hvis filen allerede er på Sd -kortet, legg til et tidsstempel på dem. På denne måten trenger vi ikke å holde oversikt over øktene eller slette filene hver gang. Med et tidsstempel skrevet i oppsettfunksjonen, er vi sikker på å bare legge til en separasjon i filene bare én gang per økt.

MERK: SD -biblioteket er ganske seriøst med å åpne og lukke filen hver gang! Husk det og lukk det hver gang! Følg denne lenken for å lære om biblioteket.

Ok, vi er egentlig klare til å få kjernen i strøm-og-logg-delen av skissen.

ugyldig oppsett () {

Serial.begin (115200); GPS.begynner (9600); // Send kommandoer til GPS -modulen GPS.sendCommand ("$ PGCMD, 33, 0*6D"); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); forsinkelse (1000); // bare hvis SD -modulens CS -pin ikke er på pin D10

pinMode (10, OUTPUT);

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

Nå får vi kjernen i skissen.

Det er superenkelt, faktisk.

Vi kommer til å lese GPS -strømmen med readGPS () -funksjonen, enn vi kontrollerer om vi har en løsning lik 1, det vil si at vi er koblet til en satellitt e. Hvis vi får det, skal vi skrive informasjonen vår i filene. I den første filen "NMEA.txt" skriver vi bare de rå setningene. I den andre filen, "GPDData.txt", legger vi til koordinatene (konvertert med funksjonene vi så før) og høyden. Denne informasjonen er nok til å kompilere en.kml -fil for å lage en bane på Google Earth. Vær oppmerksom på at vi lukker filene hver gang vi åpnet den for å skrive noe!

void loop () {

readGPS (); // Condizione if che controlla se l'antenna ha segnale. Se si, procede con la scrittura dei dati. if (GPS.fix == 1) {// Lagre bare data hvis vi har en løsning 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 (); // Chiude -fil !!

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

// Converte e scrive la longitudine convLong (); mySensorData.print (grader, 4); // Skrive koordinaten i gradi sul -filen mySensorData.print (","); // Scrive una virgola per separare in data Serial.print (deg); Serial.print (","); // Converte e scrive la latitudine convLati (); mySensorData.print (grader, 4); // Skrive koordinaten i gradi sul -filen mySensorData.print (","); // Scrive una virgola per separare in data Serial.print (deg); Serial.print (","); // Scrive l'altitudine mySensorData.print (GPS.altitude); mySensorData.print (""); Serial.println (GPS.altitude); mySensorData.close (); }}

Nå som vi alle er ferdige, kan du laste opp skissen, bygge enheten og nyte den!

Vær oppmerksom på at du må bruke den med GPS -boraden mot himmelen for å få en løsning = 1, eller du kan koble en ekstern antenne til den.

Husk også at hvis det er fikset, blinker det røde lyset hvert 15. sekund, hvis du ikke gjør det, mye raskere (en gang hvert 2-3 sekund).

Hvis du vil lære noe mer om NMEA -setningene, følger du bare neste trinn i denne guiden.

Trinn 3: NMEA -setningene og.kml -filen

Enheten og skissen er komplett, de fungerer fint. Husk at for å få en løsning (for å ha forbindelse med satellitter) bør utbruddet vende mot himmelen.

Det lille røde lyset blinker hvert 15. sekund når du får en løsning

Hvis du vil forstå NMEA -setningene bedre, kan du lese videre.

I skissen bruker vi bare to setninger, GGA og RMC. De er bare et par av setningene som GPS -modulen streamer.

La oss se hva som er i denne strengen:

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

RMC = Anbefalt Minimumssetning C 123519 = Løsning tatt kl. 12:35:19 UTC A = Status A = aktiv eller V = Ugyldig 4807.038, N = Breddegrad 48 grader 07.038 'N 01131.000, E = Lengdegrad 11 grader 31.000' E 022.4 = Hastighet over bakken i knop 084.4 = Sporvinkel i grader True 230394 = Dato - 23. mars 1994 003.1, W = Magnetisk variasjon *6A = Kontrollsumdata, begynner alltid med *

$ 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 taken at 12:35:19 UTC 4807.038, N Latitude 48 deg 07.038 'N 01131.000, E Longitude 11 deg 31.000' E 1 Fix quality: 0 = ugyldig; 1 = GPS fix (SPS); 2 = DGPS fix; 3 = PPS fix; 4 = Kinematisk sanntid; 5 = Float RTK; 6 = estimert (død beregning) (2,3 funksjon); 7 = Manuell inndatamodus; 8 = Simuleringsmodus; 08 Antall satellitter som spores 0,9 Horisontal fortynning av posisjon 545,4, M Høyde, meter, over gjennomsnittlig havnivå 46,9, M Høyde på geoid (gjennomsnittlig havnivå) over WGS84 ellipsoid (tomt felt) tid i sekunder siden siste DGPS -oppdatering (tomt felt) DGPS -stasjons ID -nummer *47 kontrollsumdata, begynner alltid med *

Som du kan se, er det mye mer informasjon om hva du trenger der. Ved å bruke Adafruit -biblioteket kan du ringe noen av dem, for eksempel GPS.latitude eller GPS.lat (latitude og lat hemisphere), eller GPS.day/month/year/hour/minute/seconds/milliseconds… Ta en titt til Adafruit nettsted for å vite noe mer. Er ikke så tydelig, men etter noen tips i GPS -modulens guide kan du finne det du trenger.

Hva kan vi gjøre med filer vi har? Enkelt: kompiler en kml -fil for å vise en bane på Google Earth. For å gjøre det, bare kopier/forbi koden du finner ved å følge denne lenken (under avsnittsstien), legg koordinatene fra GPDData.txt -filen mellom taggene, lagre filen med.kml -forlengelsen og last den på Google Earth.

MERK:.kml -kodespråket er enkelt. Hvis du allerede vet hva et kodespråk er, behold tiden din til å lese den forrige lenken og dokumentasjonen inne, det er faktisk interessant!

Å bruke kml handler om å kjenne tagger og argumenter. Jeg fant bare guiden fra Google, den jeg lenket til før, og den viktigste delen er å definere stilen mellom taggene og kalle den med # -tegn når det er på tide å skrive koordinatene.

Filen jeg la til i denne delen er en.kml der du bare kan lime inn koordinatene dine. husk å lime inn med denne syntaksen: lengdegrad, breddegrad, høyde

Anbefalt: