Inhoudsopgave:

Arduino GPS-logger: 3 stappen
Arduino GPS-logger: 3 stappen

Video: Arduino GPS-logger: 3 stappen

Video: Arduino GPS-logger: 3 stappen
Video: 🛰 GPS TRACKER С ОТПРАВКОЙ ДАННЫХ НА СЕРВЕР. АВТОНОМНЫЙ GPS НА ARDUINO. СВОИМИ РУКАМИ. 2024, Juli-
Anonim
Arduino GPS-logger
Arduino GPS-logger
Arduino GPS-logger
Arduino GPS-logger

Hallo jongens, Ik word super enthousiast van kleine projecten waarmee mensen veel meer kunnen begrijpen van de technologie die we elke dag hebben.

Dit project gaat over GPS-breakout en SD-logging. Ik heb veel geleerd door dit spul te bouwen.

Er zijn veel begrippen die je zult krijgen na deze tutorial, en nog veel meer door de link te volgen die ik geef om dieper in de onderwerpen te komen.

Dus, wat is dat? Simpel: is een GPS-tracker die posities (ook met hoogte), snelheid en datum/tijd registreert op een microSD.

Wat je nodig zult hebben:

- Arduino Nano (ik heb eigenlijk een UNO gebruikt om de schets te bouwen, maar ze zijn precies hetzelfde!)- Adafruit ultieme GPS-breakout- MicroSD-kaart breakout- Soldeergereedschap (alles wat je nodig hebt om te solderen)- Universal Stripboard a 5x7cm)- Draden

Al die componenten zijn vrij goedkoop, behalve de GPS-module. Dat is ongeveer 30-40 dollar en is het duurste onderdeel. Zelfs een nieuwe soldeerboutset kan minder kosten.

Bestaat ook een Adafruit-schild met GPS- en SD-kaartmodules samen. Als je het wilt gebruiken, houd er dan rekening mee dat het gemaakt is voor Arduino UNO, daarom heb je een UNO nodig en geen Nano. Er is echter geen verschil in de schets.

Laten we verder gaan…

Stap 1: Componenten aansluiten

Componenten aansluiten
Componenten aansluiten
Componenten aansluiten
Componenten aansluiten
Componenten aansluiten
Componenten aansluiten
Componenten aansluiten
Componenten aansluiten

Nadat je de componenten hebt gekregen, moet je ze aansluiten. Hier kun je de fritzing-schema's vinden die vrij duidelijk zijn. Hier is echter ook de pinout:

MicroSD-uitbraak

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (Als je het schild gebruikt, is dit ingebouwd in D10)

GPS-uitbraak

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

Kleine opmerkingen over die module: die twee kleine jongens communiceren via verschillende paden met de Arduino. De GPS gebruikt een TTL-serieel, dezelfde soort die we gebruiken wanneer we communiceren met Arduino via Serial Monitor, daarom moeten we via een bibliotheek een nieuwe seriële (Tx en Rx) declareren omdat GPS standaard de 9600 wil gebruiken, en we wil het ook gebruiken. De GPS-module is altijd en constant aan het streamen van gegevens, indien aangesloten. Dit is het lastige deel om mee om te gaan, want als we een zin lezen en dan afdrukken, kunnen we de volgende kwijtraken, dat is ook nodig. We moeten er rekening mee houden bij het coderen!

De MicroSD communiceert via SPI (Serial Peripheral Interface), een andere manier om met het bord te communiceren. Dat soort modules gebruiken altijd CLK op de D13, DO op de D12 en DI op de D11. Soms hebben die verbindingen een andere naam, zoals CLK = SCK of SCLK (Serial Clock), DO = DOUT, SIMO, SDO, SO, MTSR (al deze geven Master Output aan) en DI = SOMI, SDI, MISO, MRST (Master Input). Eindelijk hebben we de CS of SS die de pin aangeeft waar we naartoe sturen wat we in de MicroSD willen schrijven. Als u twee verschillende SPI-modules wilt gebruiken, hoeft u alleen maar onderscheid te maken tussen deze pin om ze allebei te kunnen gebruiken. Bijvoorbeeld een LCD-scherm EN een MicroSd zoals degene die we gebruiken. Het zou ook moeten werken met twee verschillende LCD's die op verschillende CS's zijn aangesloten.

Soldeer deze onderdelen aan elkaar in het bord en je bent helemaal klaar om de schets te uploaden!

Zoals je in de schets kunt zien, soldeer ik enkele vrouwelijke dupont-connectoren in plaats van de directe component, dat is omdat ik in de toekomst het onderdeel misschien wil hergebruiken of veranderen.

Ik heb ook de GPS-module gesoldeerd met de connectoren in de verkeerde richting, dat was mijn fout en ik wilde het niet, maar het werkt en ik wil niet het risico lopen hem kapot te maken als ik die kleine klootzakken probeer te desolderen! Gewoon op de juiste manier solderen en alles komt goed!

Hier een handige soldeervideo: Soldeergids voor beginnersEen video over desolder

Adafruit Youtube-kanaal, daar staan veel interessante dingen!

Als je soldeert, probeer dan precies de hoeveelheid metaal te gebruiken die je nodig hebt, anders krijg je een puinhoop. Wees niet bang om het te doen, begin misschien met iets dat niet zo duur is, en blijf dan verschillende dingen solderen. Het juiste materiaal maakt ook het verschil!

Stap 2: De schets

Eerst importeren we natuurlijk de bibliotheek en bouwen we hun objecten om mee te werken: SPI.h is voor communicatie met SPI-modules, SD is de MicroSD-bibliotheek en Adafruit_GPS is de bibliotheek van de GPS-module. SoftwareSerial.h is voor het maken van een seriële poort via software. De syntaxis is "mySerial(TxPin, RxPin);". Het GPS-object moet naar een serienummer worden verwezen (tussen haakjes). Hier zijn de links van de bibliotheken voor Adafruit GPS-breakout, de MicroSD-breakout (om een schoon werk te doen, moet u ook de SD formatteren met deze software van SD Association) en de Software Seriële bibliotheek (deze moet worden opgenomen in de IDE).

OPMERKING: ik had een probleem bij het toevoegen van veel informatie in één bestand of bij het gebruik van meer dan twee bestanden in de schets. Ik heb de SD niet geformatteerd met die software, misschien kan dat het probleem oplossen. Ook heb ik geprobeerd een andere sensor in het apparaat toe te voegen, een BMP280 (I2C-module), zonder enig succes. Het lijkt erop dat het gebruik van de I2C-module de schets gek maakt! Ik heb er al over gemaild op het Adafruit-forum, maar ik heb nog steeds geen antwoord gekregen.

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

Nu hebben we al onze variabelen nodig: de twee strings zijn voor het lezen van de twee zinnen die we nodig hebben om een heleboel nuttige informatie van de GPS te berekenen. De char is voor het opslaan van de zinnen voordat ze worden geparseerd, de drijvers zijn voor het berekenen van de coördinaten in graden (GPS verzendt gebruikscoördinaten in graden en minuten, we hebben ze in graden nodig om het in Google Earth te laten lezen). De chipSelect is de pin waar we de CS van de MicroSD-kaart in steken. In dit geval is dat D4, maar als je een SD-shield gebruikt, moet je D10 hier plaatsen. De bestandsvariabele is degene die de informatie van het bestand dat we tijdens de schets gebruiken opslaat.

Tekenreeks NMEA1;

Tekenreeks NMEA2; char c; vlotter graden; float gradenGeheel; vlotter decDec; int chipSelecteer = 4; Bestand mijnSensorData;

Nu declareren we een aantal functies om de schets wat eleganter en minder rommelig te maken:

Ze doen eigenlijk hetzelfde: NMEA-zinnen lezen. clearGPS() negeert drie zinnen en readGPS() slaat er twee op in de variabelen.

Laten we eens kijken hoe: Een while-lus controleert of er nieuwe NMEA-zinnen op de module staan en leest de GPS-stream totdat er een is. Als er een nieuwe zin is, zijn we uit de while-lus, waar de zin daadwerkelijk wordt gelezen, geparseerd en opgeslagen in de eerste NMEA-variabelen. We doen meteen hetzelfde voor de volgende, omdat de GPS constant streamt, het wacht niet tot we klaar zijn, we hebben geen tijd om het meteen af te drukken

Dit is erg belangrijk! Doe niets voordat je beide zinnen hebt opgeslagen, anders zou de tweede uiteindelijk beschadigd raken of gewoon verkeerd zijn.

Nadat we twee zinnen hebben, printen we ze in de serie om te controleren of het goed gaat.

ongeldig leesGPS() {

clearGPS(); while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); NMEA1=GPS.laatsteNMEA(); while(!GPS.newNMEAreceived()) { c=GPS.read(); } GPS.parse(GPS.lastNMEA()); NMEA2=GPS.laatsteNMEA(); Seriële.println(NMEA1); Seriële.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()); }

Welnu, nu we helemaal klaar zijn, kunnen we de setup () doorlopen:

Ten eerste: we openen de communicatie op Serial 115200 voor Arduino PC en op 9600 voor GPS-module Arduino. Ten tweede: we sturen drie commando's naar de GPS-module: de eerste is om de antenne-update af te sluiten, de tweede is om alleen RMC- en GGA-strings te vragen (we gaan alleen die gebruiken die alle informatie hebben die je ooit nodig zou hebben van a GPS), is de derde en laatste opdracht om de updatesnelheid in te stellen op 1HZ, voorgesteld door Adafruit.

Daarna zetten we pin D10 op OUTPUT, als en alleen als de CS-pin van je SD-model een andere is dan D10. Zet onmiddellijk daarna de CS op de SD-module op de chipSelect-pin.

We voeren de functies readGPS() uit die de cleanGPS() bevat.

Nu is het tijd om iets in de bestanden te schrijven! Als het bestand al op de SD-kaart staat, voeg dan een tijdstempel toe. Zo hoeven we niet elke keer de sessies bij te houden of de bestanden te wissen. Met een tijdstempel geschreven in de setup-functie, zijn we er zeker van dat we slechts één keer per sessie een scheiding in de bestanden toevoegen.

OPMERKING: de SD-bibliotheek is behoorlijk serieus over het openen en sluiten van het bestand elke keer! Houd het in gedachten en sluit het elke keer! Volg deze link voor meer informatie over de bibliotheek.

Oké, we zijn er helemaal klaar voor om de kern van het stream-en-loggedeelte van de schets te krijgen.

ongeldige setup() {

Serieel.begin(115200); GPS.begin (9600); //Stuur opdrachten naar de GPS-module GPS.sendCommand("$PGCMD, 33, 0*6D"); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); vertraging (1000); // alleen als de CS-pin van je SD-module niet op pin D10 zit

pinMode (10, UITGANG);

SD.begin(chipSelect); lees GPS(); if (SD.exists("NMEA.txt")) { mySensorData = SD.open("NMEA.txt", FILE_WRITE); mijnSensorData.println(""); mijnSensorData.print("*** "); mijnSensorData.print(GPS.dag); mijnSensorData.print("."); mijnSensorData.print(GPS.maand); mijnSensorData.print("."); mijnSensorData.print(GPS.jaar); mijnSensorData.print(" -- "); mijnSensorData.print(GPS.uur); mijnSensorData.print(":"); mijnSensorData.print(GPS.minuut); mijnSensorData.print(":"); mySensorData.print (GPS.seconden); mijnSensorData.println(" ***"); mijnSensorData.close(); } if (SD.exists("GPSData.txt")) { mySensorData = SD.open("GPSData.txt", FILE_WRITE); mijnSensorData.println(""); mijnSensorData.println(""); mijnSensorData.print("*** "); mijnSensorData.print(GPS.dag); mijnSensorData.print("."); mijnSensorData.print(GPS.maand); mijnSensorData.print("."); mijnSensorData.print(GPS.jaar); mijnSensorData.print(" -- "); mijnSensorData.print(GPS.uur); mijnSensorData.print(":"); mijnSensorData.print(GPS.minuut); mijnSensorData.print(":"); mySensorData.print (GPS.seconden); mijnSensorData.println(" ***"); mijnSensorData.close(); }}

Nu krijgen we de kern van de schets.

Het is super simpel, inderdaad.

We gaan de GPS stream uitlezen met de readGPS() functie, dan controleren we of we een fix hebben die gelijk is aan 1, dat wil zeggen dat we verbonden zijn met een satelliet. Als we het hebben, gaan we onze informatie in de bestanden schrijven. In het eerste bestand "NMEA.txt" schrijven we alleen de onbewerkte zinnen. In het tweede bestand, "GPDData.txt", voegen we de coördinaten (omgezet met de functies die we eerder zagen) en de hoogte toe. Die informatie is voldoende om een .kml-bestand te compileren om een pad op Google Earth te maken. Merk op dat we de bestanden elke keer sluiten als we ze openen om iets te schrijven!

lege lus() {

lees GPS(); // Condizione if che controlla se l'antenna ha segnale. Se si, procede con la scrittura dei dati. if(GPS.fix==1) {//Sla alleen gegevens op als we een oplossing hebben mySensorData = SD.open("NMEA.txt", FILE_WRITE); //Apre il-bestand per le frasi NMEA grezze mySensorData.println (NMEA1); //Schrijf prima NMEA sul-bestand mySensorData.println (NMEA2); //Scrive seconda NMEA sul-bestand mySensorData.close(); //Chiude-bestand!!

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

// Converteer e scrive naar longitudine convLong(); mijnSensorData.print(deg, 4); // Schrijf de coördinaat op in het gradi sul-bestand mySensorData.print(", "); // Schrijf een virgola per separare i dati Serial.print (deg); Serieel.print(", "); // Converteer e scrive la latitudine convLati(); mijnSensorData.print(deg, 4); // Schrijf de coördinaat op in het gradi sul-bestand mySensorData.print(", "); // Schrijf een virgola per separare i dati Serial.print (deg); Serieel.print(", "); // Scrive l'altitudine mySensorData.print(GPS.altitude); mijnSensorData.print(" "); Seriële.println(GPS.hoogte); mijnSensorData.close(); } }

Nu we allemaal klaar zijn, kun je de schets uploaden, het apparaat bouwen en ervan genieten!

Merk op dat je het moet gebruiken met de GPS-borad naar de hemel gericht om een fix=1 te krijgen, of je kunt er een externe antenne op aansluiten.

Houd er ook rekening mee dat als je een oplossing hebt, het rode lampje elke 15 seconden knippert, als je dat niet doet, veel sneller (een keer per 2-3 seconden).

Als je iets meer wilt weten over de NMEA-zinnen, volg dan gewoon de volgende stap van deze handleiding.

Stap 3: De NMEA-zinnen en het.kml-bestand

Het apparaat en de schets zijn compleet, ze werken prima. Houd er rekening mee dat om een oplossing te krijgen (om verbinding te maken met satellieten) de uitbraak naar de lucht moet zijn gericht.

Het kleine rode lampje knippert elke 15 seconden als je een oplossing hebt

Als je de NMEA-zinnen beter wilt begrijpen, kun je verder lezen.

In de schets gebruiken we slechts twee zinnen, de GGA en de RMC. Het zijn maar een paar zinnen die de GPS-module aan het streamen is.

Laten we eens kijken wat er in die string staat:

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

RMC = Aanbevolen Minimumzin C 123519 = Vaststelling genomen om 12:35:19 UTC A = Status A=actief of V=Nietig 4807.038, N = Breedtegraad 48 deg 07.038' N 01131.000, E = Lengtegraad 11 deg 31.000' E 022.4 = Snelheid over de grond in knopen 084.4 = Spoorhoek in graden True 230394 = Datum - 23 maart 1994 003.1, W = Magnetische Variatie *6A = De checksum data, begint altijd met *

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

GGA Global Positioning System Fixgegevens 123519 Fix genomen om 12:35:19 UTC 4807.038, N Breedtegraad 48 graden 07.038' N 01131.000, E Lengtegraad 11 graden 31.000' E 1 Fixkwaliteit: 0 = ongeldig; 1 = GPS-fix (SPS);2 = DGPS-fix; 3 = PPS-fix; 4 = Realtime kinematisch; 5 = Vlotter RTK; 6 = geschat (gegist bestek) (2,3 kenmerk); 7 = handmatige invoermodus; 8 = Simulatiemodus; 08 Aantal satellieten dat wordt gevolgd 0,9 Horizontale verdunning van positie 545,4, M Hoogte, Meters, boven gemiddeld zeeniveau 46,9, M Hoogte van geoïde (gemiddeld zeeniveau) boven WGS84 ellipsoïde (leeg veld) tijd in seconden sinds laatste DGPS-update (leeg veld) DGPS station ID nummer *47 de checksum data, begint altijd met *

Zoals je kunt zien, is er veel meer informatie dan wat je daar nodig hebt. Met behulp van de bibliotheek van Adafruit kun je er een aantal oproepen, zoals GPS.latitude of GPS.lat (breedtegraad en breedtegraad), of GPS.day/month/year/hour/minute/seconds/milliseconds… Kijk eens naar de Adafruit website om iets meer te weten. Is niet zo duidelijk, maar na enkele hints in de handleiding van de GPS-modules, zou je kunnen vinden wat je nodig hebt.

Wat kunnen we doen met de bestanden die we hebben? Eenvoudig: stel een kml-bestand samen om een pad op Google Earth te tonen. Om dit te doen, kopieer/plak je de code die je vindt via deze link (onder de paragraaf Pad), plaats je coördinaten uit het GPDData.txt-bestand tussen de tags, sla het bestand op met de extensie.kml en laad het op Google Earth.

OPMERKING: de.kml-opmaaktaal is eenvoudig, als u al weet wat een opmaaktaal is, neem dan de tijd om de vorige link en documentatie erin te lezen, het is echt interessant!

Het gebruik van de kml heeft alles te maken met het kennen van de tags en argumenten. Ik vond alleen de gids van Google, degene die ik eerder heb gelinkt en het essentiële onderdeel is om de stijl tussen de tags te definiëren en deze met een # teken te noemen wanneer het tijd is om de coördinaten te schrijven.

Het bestand dat ik in deze sectie heb toegevoegd, is een.kml waarin je gewoon je coördinaten kunt plakken. onthoud om te plakken met deze syntaxis: lengtegraad, breedtegraad, hoogte

Aanbevolen: