INHOUDSOPGAWE:

Arduino GPS -logger: 3 stappe
Arduino GPS -logger: 3 stappe

Video: Arduino GPS -logger: 3 stappe

Video: Arduino GPS -logger: 3 stappe
Video: Я вернул его домой. Немецкая овчарка по имени Дом 2024, Julie
Anonim
Arduino GPS logger
Arduino GPS logger
Arduino GPS logger
Arduino GPS logger

Hi ouens, Ek raak opgewonde oor klein projekte wat mense in staat stel om baie meer van die tegnologie wat ons daagliks het, te verstaan.

Hierdie projek handel oor GPS -uitbreek en SD -aanmelding. Ek het baie geleer deur hierdie dinge te bou.

Daar is baie idees wat u sal kry na hierdie tutoriaal, en nog baie meer na die skakel wat ek verskaf om dieper in die onderwerpe te gaan.

So, wat is dit? Eenvoudig: is 'n GPS -spoorsnyer wat posisies (met hoogte ook), spoed en datum/tyd op 'n microSD aanteken.

Wat u benodig:

- Arduino Nano (ek het eintlik 'n UNO gebruik om die skets te bou, maar dit is presies dieselfde!)- Adafruit se uiteindelike GPS-uitbraak- MicroSD-kaartuitbreek- Soldeergereedskap (alles wat u nodig het vir soldeer)- Universal Stripboard (ek het dit gebruik a 5x7cm)- drade

Al die komponente is redelik goedkoop, behalwe die GPS -module. Dit is ongeveer 30-40 dollar en is die duurste deel. Selfs 'n nuwe soldeerboutstel kan minder kos.

Bestaan ook 'n Adafruit -skild met GPS- en SD -kaartmodules saam. As u dit wil gebruik, moet u onthou dat dit vir Arduino UNO gemaak is, daarom benodig u 'n UNO en nie 'n Nano nie. Daar is egter geen verskil in die skets nie.

Kom ons gaan verder …

Stap 1: Verbind komponente

Verbindende komponente
Verbindende komponente
Verbindende komponente
Verbindende komponente
Verbindende komponente
Verbindende komponente
Verbindende komponente
Verbindende komponente

Nadat u die komponente gekry het, moet u dit koppel. Hier kan u die skitterende sketse vind wat redelik duidelik is. Hier is egter ook die punt:

MicroSD -uitbreek

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (as u die skild gebruik, is dit ingeboude D10)

GPS -uitbraak

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

Klein aantekeninge oor die module: Die twee seuntjies kommunikeer op verskillende maniere met die Arduino. Die GPS gebruik 'n TTL Serial, dieselfde soort as wat ons gebruik as ons met Arduino kommunikeer via Serial Monitor, waarom ons deur 'n biblioteek 'n nuwe reeks (Tx en Rx) moet verklaar omdat GPS standaard die 9600 wil gebruik, en ons wil dit ook gebruik. Die GPS -module stroom altyd en voortdurend data, as dit ingeprop word. Dit is die moeilike deel om te hanteer, want as ons 'n sin lees en dit dan druk, kan ons die volgende een verloor, dit is ook nodig. Ons moet dit in gedagte hou wanneer ons kodeer!

Die MicroSD kommunikeer via SPI (Serial Peripheral Interface), 'n ander manier om met die bord te kommunikeer. Die soort modules gebruik altyd CLK op die D13, DO op die D12 en DI op die D11. Soms het die verbindings 'n ander naam, soos CLK = SCK of SCLK (Serial Clock), DO = DOUT, SIMO, SDO, SO, MTSR (almal dui op Master Output) en DI = SOMI, SDI, MISO, MRST (Master Input). Uiteindelik het ons die CS of SS wat die pen aandui waarheen ons stuur wat ons in die MicroSD wil skryf. As u twee verskillende SPI -modules wil gebruik, moet u hierdie pen slegs onderskei om albei te gebruik. Byvoorbeeld, LCD -skerm EN 'n MicroSd soos die een wat ons gebruik. Dit moet ook werk met twee verskillende LCD's wat aan verskillende CS's gekoppel is.

Soldeer hierdie deel saam in die bord en u is gereed om die skets op te laai!

Soos u in die skets kan sien, soldeer ek 'n paar dupont -vroulike verbindings in plaas daarvan die direkte komponent, dit is omdat ek in die toekoms die komponent wil hergebruik of een wil verander.

Ek het ook die GPS -module met die verbindings in die verkeerde rigting gesoldeer, dit was my skuld en ek wou nie, maar dit werk, en ek wil nie waag om dit te breek nie, om die klein bastards te ontsout! Soldeer net op die regte manier, en alles sal regkom!

Hier is 'n paar nuttige soldeervideo's: Soldeergids vir beginners 'n Video oor desolder

Adafruit Youtube -kanaal, baie interessante dinge daar!

As u soldeer, probeer om net die hoeveelheid metaal wat u benodig, te gebruik, anders gaan u gemors. Moenie bang wees om dit te doen nie, begin miskien met iets wat nie so duur is nie, en hou aan om verskillende dinge te soldeer. Die regte materiaal maak ook die verskil!

Stap 2: Die skets

Eerstens invoer ons natuurlik die biblioteek en bou ons hul voorwerpe om mee te werk: SPI.h is vir kommunikasie met SPI -modules, SD is die MicroSD -biblioteek en Adafruit_GPS is die biblioteek van die GPS -module. SoftwareSerial.h is vir die skep van 'n seriële poort via sagteware. Die sintaksis is "mySerial (TxPin, RxPin);". Die GPS -voorwerp moet op 'n reeks (tussen hakies) gewys word. Hier is die skakels van die biblioteke vir Adafruit GPS -uitbraak, die MicroSD -uitbraak (om 'n skoon werk te doen, moet u ook die SD formateer met hierdie sagteware van SD -vereniging) en die Seriële sagteware -biblioteek (dit moet by die IDE ingesluit word).

LET WEL: Ek het 'n probleem ondervind toe ek baie inligting in een lêer wou byvoeg of meer as twee lêers in die skets wou gebruik. Ek het nie die SD met die sagteware geformateer nie, miskien kan dit die probleem oplos. Ek het ook probeer om 'n ander sensor by te voeg, 'n BMP280 (I2C -module), sonder enige sukses. Dit lyk asof die gebruik van die I2C -module die skets mal maak! Ek het al daaroor gepraat in die Adafruit -forum, maar ek het nog steeds geen antwoord gekry nie.

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

Nou het ons al ons veranderlikes nodig: Die twee snare is vir die lees van die twee sinne wat ons nodig het om 'n klomp nuttige inligting uit die GPS te bereken. Die kar is 'n voorraad om die sinne voor te ontleed, die vlotte is om die koördinate in grade te bereken (GPS stuur gebruikskoördinate in grade en minute, ons benodig dit in grade om dit in Google Earth te laat lees). Die chipSelect is die pen waar ons die CS van die MicroSD -kaart aansluit. In hierdie geval is dit D4, maar as u 'n SD -skild gebruik, moet u D10 hier plaas. Die veranderlike lêer is die een wat die inligting van die lêer wat ons tydens die skets gebruik, sal stoor.

Snaar NMEA1;

Snaar NMEA2; char c; float deg; dryf degWhole; float degDec; int chipSelect = 4; Lê mySensorData;

Nou verklaar ons 'n paar funksies om die skets 'n bietjie meer elegant en minder morsig te maak:

Hulle doen basies dieselfde: lees NMEA -sinne. clearGPS () ignoreer drie sinne en readGPS () stoor twee daarvan in die veranderlikes.

Kom ons kyk hoe: 'n Terwyl lus beheer of daar nuwe NMEA -sinne op die module is en die GPS -stroom lees totdat daar een is. As 'n nuwe sin daar is, is ons uit die tyd -lus, waar die sin eintlik gelees, ontleed en in die eerste NMEA -veranderlikes opgeneem word. Ons doen onmiddellik dieselfde vir die volgende een, want die GPS stroom voortdurend, dit wag nie vir ons om gereed te wees nie; ons het nie tyd om dit onmiddellik af te druk nie

Dit is baie belangrik! Moenie iets doen voordat u albei sinne in voorraad het nie, anders kan die tweede uiteindelik korrup wees of net verkeerd wees.

Nadat ons twee sinne gekry het, druk ons dit in die reeks om te sien of dit goed gaan.

leegte readGPS () {

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

Nou dat ons klaar is, kan ons deur die opstelling () kom:

Eerstens: ons open kommunikasie op Serial 115200 vir Arduino PC en op 9600 vir GPS -module Arduino. Tweedens: ons stuur drie opdragte na die GPS -module: die eerste is om die opdatering van die antenna af te sluit, die tweede is om slegs RMC- en GGA -string te vra (ons gaan slegs dié gebruik, met al die inligting wat u ooit benodig 'n GPS), is die derde en laaste opdrag om die opdateringsnelheid op 1HZ in te stel, voorgestel deur Adafruit.

Daarna stel ons die pen D10 op UITGANG, as, en slegs as, die SD -pen van u SD -model is anders as D10. Stel die CS onmiddellik daarna op die SD -module op die chipSelect pin.

Ons gebruik die funksies readGPS () wat die cleanGPS () insluit.

Nou is dit tyd om iets in die lêers te skryf! Voeg 'n tydstempel by as die lêer reeds op die Sd -kaart is. Op hierdie manier hoef ons nie elke keer die sessies by te hou of die lêers uit te vee nie. Met 'n tydstempel wat binne die opstellingsfunksie geskryf is, sal ons sekerlik net een keer per sessie 'n skeiding in die lêers byvoeg.

LET WEL: Die SD -biblioteek is redelik ernstig om die lêer elke keer oop te maak en toe te maak! Hou dit in gedagte en maak dit elke keer toe! Volg die skakel om meer te wete te kom oor die biblioteek.

Ok, ons is regtig gereed om die kern van die stroom-en-log-deel van die skets te kry.

ongeldige opstelling () {

Serial.begin (115200); GPS.begin (9600); // Stuur opdragte na die GPS -module GPS.sendCommand ("$ PGCMD, 33, 0*6D"); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); vertraging (1000); // slegs as die CS -pen van u SD -module nie op pen D10 is nie

pinMode (10, UITGANG);

SD.begin (chipSelect); readGPS (); as (SD.exists ("NMEA.txt")) {mySensorData = SD.open ("NMEA.txt", FILE_WRITE); mySensorData.println (""); mySensorData.print ("***"); mySensorData.print (GPS.day); mySensorData.print ("."); mySensorData.print (GPS.maand); mySensorData.print ("."); mySensorData.print (GPS.year); mySensorData.print (" -"); mySensorData.print (GPS.uur); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.sekondes); mySensorData.println ("***"); mySensorData.close (); } as (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.maand); mySensorData.print ("."); mySensorData.print (GPS.year); mySensorData.print (" -"); mySensorData.print (GPS.uur); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.sekondes); mySensorData.println ("***"); mySensorData.close (); }}

Nou kry ons die kern van die skets.

Dit is inderdaad super eenvoudig.

Ons gaan die GPS -stroom met die readGPS () -funksie lees, as wat ons beheer as ons 'n oplossing gelyk aan 1 het, dit wil sê dat ons met 'n satelliet e verbind is. As ons dit kry, gaan ons ons inligting in die lêers skryf. In die eerste lêer "NMEA.txt" skryf ons slegs die rou sinne. In die tweede lêer, "GPDData.txt", voeg ons die koördinate by (omgeskakel met die funksies wat ons voorheen gesien het) en die hoogte. Hierdie inligting is genoeg om 'n.kml -lêer saam te stel om 'n pad op Google Earth te skep. Let daarop dat ons die lêers elke keer as ons dit oopmaak, toemaak om iets te skryf!

leemte -lus () {

readGPS (); // Condizione if che controlla se l'antenna ha segnale. Se si, procede con la scrittura dei dati. if (GPS.fix == 1) {// Stoor slegs data as ons 'n oplossing het mySensorData = SD.open ("NMEA.txt", FILE_WRITE); // Apre il file for le frasi NMEA grezze mySensorData.println (NMEA1); // Scrive prima NMEA sul file mySensorData.println (NMEA2); // Scrive seconda NMEA sul file mySensorData.close (); // Chiude -lêer !!

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

// Converte e scrive la longitudine convLong (); mySensorData.print (grade, 4); // Skep die koördinaat in 'n groter lêer mySensorData.print (","); // Scrive una virgola per separare in data Serial.print (deg); Serial.print (","); // Converte e scrive la latitudine convLati (); mySensorData.print (grade, 4); // Skep die koördinaat in 'n groter lêer 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 (); }}

Noudat ons klaar is, kan u die skets oplaai, die toestel bou en dit geniet!

Let daarop dat u dit moet gebruik met die GPS -borad wat na die lug kyk om 'n oplossing = 1 te kry, of u kan 'n eksterne antenna daaraan koppel.

Hou ook in gedagte dat die rooi lig elke 15 sekondes flikker, as u dit nie regkry nie, baie vinniger (een keer elke 2-3 sekondes).

As u meer wil leer oor die NMEA -sinne, volg die volgende stap van hierdie gids.

Stap 3: Die NMEA -sinne en die.kml -lêer

Die toestel en die skets is volledig, dit werk goed. Hou in gedagte dat die uitbreek die lug in die gesig staar om 'n oplossing te kry (om 'n verbinding met satelliete te hê).

Die klein rooi liggie flikker elke 15 sekondes as u 'n oplossing kry

As u die NMEA -sinne beter wil verstaan, kan u verder lees.

In die skets gebruik ons slegs twee sinne, die GGA en die RMC. Dit is slegs 'n paar sinne wat die GPS -module stroom.

Kom ons kyk wat in die string is:

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

RMC = Aanbevole Minimum sin C 123519 = Oplossing geneem om 12:35:19 UTC A = Status A = aktief of V = Nietig 4807.038, N = Breedtegraad 48 grade 07.038 'N 01131.000, E = Lengtegraad 11 deg 31.000' E 022.4 = Spoed oor die grond in knope 084.4 = Spoorhoek in grade Waar 230394 = Datum - 23 Maart 1994 003.1, W = Magnetiese variasie *6A = Die kontrolesom data, begin altyd met *

$ 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 = invalid; 1 = GPS fix (SPS); 2 = DGPS fix; 3 = PPS -regstelling; 4 = Kinematiese intydse tyd; 5 = Float RTK; 6 = geskat (dooie afrekening) (2.3 funksie); 7 = Handmatige invoermodus; 8 = Simulasie -modus; 08 Aantal satelliete wat gevolg word 0,9 Horisontale verdunning van posisie 545,4, M Hoogte, meters, bo die gemiddelde seevlak 46,9, M Hoogte van geoïde (gemiddelde seevlak) bo WGS84 ellipsoïde (leë veld) tyd in sekondes sedert die laaste DGPS -opdatering (leë veld) DGPS -stasie -ID -nommer *47 die kontrolesom -data, begin altyd met *

Soos u kan sien, is daar baie meer inligting wat u benodig. Deur die Adafruit -biblioteek te gebruik, kan u sommige van hulle bel, soos GPS.latitude of GPS.lat (breedtegraad en lat halfrond), of GPS.day/month/year/hour/minute/seconds/milliseconds… Kyk na die Adafruit webwerf om meer te weet. Dit is nie so duidelik nie, maar na 'n paar wenke in die gids vir die GPS -modules kan u vind wat u nodig het.

Wat kan ons doen met lêers wat ons het? Maklik: stel 'n kml -lêer saam om 'n pad op Google Earth te wys. Om dit te kan doen, kopieer/verby die kode wat u vind na hierdie skakel (onder die paragraafpad), plaas u koördinate van die GPDData.txt -lêer tussen die etikette, stoor die lêer met die.kml -uitbreiding en laai dit op Google aarde.

OPMERKING: Die.kml -opmaaktaal is eenvoudig; as u reeds weet wat 'n opmaaktaal is, hou u tyd om die vorige skakel en dokumentasie binne te lees, dit is eintlik interessant!

Die gebruik van die kml is alles oor die kenmerke en argumente daarvan. Ek vind slegs die gids van Google, die een wat ek voorheen gekoppel het, en die belangrikste is om die styl tussen die etikette te definieer en dit met 'n # -teken te noem wanneer dit tyd is om die koördinate te skryf.

Die lêer wat ek in hierdie afdeling bygevoeg het, is 'n.kml waarin u net u koördinate kan plak. hou in gedagte om met hierdie sintaksis te plak: lengtegraad, breedtegraad, hoogte

Aanbeveel: