Innehållsförteckning:

Arduino GPS Logger: 3 steg
Arduino GPS Logger: 3 steg

Video: Arduino GPS Logger: 3 steg

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

Tjena, Jag blir superglad för små projekt som gör att människor faktiskt förstår mycket mer av den teknik som vi har runt vardagen.

Detta projekt handlar om GPS -utbrott och SD -loggning. Jag lärde mig mycket bara att bygga det här.

Det finns många föreställningar som du kommer att få efter den här självstudien, och mycket mer genom att följa länken som jag tillhandahåller för att bli djupare i ämnena.

Så vad är det? Enkelt: Är en GPS -tracker som loggar positioner (med höjd också), hastighet och datum/tid på en microSD.

Vad du kommer att behöva:

- Arduino Nano (jag använde faktiskt en UNO för att bygga skissen, men de är precis samma!)- Adafruit ultimata GPS-breakout- MicroSD-kortutbrott- Lödningsverktyg (allt du behöver för lödning)- Universal Stripboard (jag använde a 5x7cm)- Trådar

Alla dessa komponenter är ganska billiga förutom GPS -modulen. Det är ungefär 30-40 dollar och är den dyraste delen. Även ett nytt lödkolvset kan kosta mindre.

Finns också en Adafruit -sköld med GPS- och SD -kortmoduler tillsammans. Om du vill använda den, kom ihåg att den är gjord för Arduino UNO, därför behöver du en UNO och inte en Nano. Det är dock ingen skillnad på skissen.

Låt oss gå längre …

Steg 1: Ansluta komponenter

Anslutande komponenter
Anslutande komponenter
Anslutande komponenter
Anslutande komponenter
Anslutande komponenter
Anslutande komponenter
Anslutande komponenter
Anslutande komponenter

Tja, när du har fått komponenterna måste du ansluta dem. Här kan du hitta de fritzande scheman som är ganska tydliga. Men här är också pinout:

MicroSD -utbrott

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (Om du använder skärmen är denna inbyggd i D10)

GPS -utbrott

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

Små anteckningar om modulen: De två små pojkarna kommunicerar genom olika vägar med Arduino. GPS: n använder en TTL -serie, samma typ som vi använder när vi kommunicerar med Arduino via seriell bildskärm, varför vi måste förklara en ny serie (Tx och Rx) för ett bibliotek eftersom GPS vill använda 9600 som standard, och vi vill använda den heller. GPS -modulen strömmar alltid och ständigt data om den är ansluten. Detta är den knepiga delen att ta itu med, för om vi läser en mening och skriver ut den kan vi förlora nästa, det behövs också. Vi måste ha det i åtanke när vi kodar!

MicroSD kommunicerar via SPI (Serial Peripheral Interface), ett annat sätt att kommunicera med kortet. Den typen av modul använder alltid CLK på D13, DO på D12 och DI på D11. Ibland har dessa anslutningar ett annat namn som CLK = SCK eller SCLK (Serial Clock), DO = DOUT, SIMO, SDO, SO, MTSR (alla de indikerar Master Output) och DI = SOMI, SDI, MISO, MRST (Master Input). Slutligen har vi CS eller SS som anger stiftet där vi skickar det vi vill skriva i MicroSD. Om du vill använda två olika SPI -moduler måste du bara skilja denna pin för att kunna använda dem båda. Till exempel LCD -skärm OCH en MicroSd som den vi använder. Det bör också fungera med två olika LCD -skärmar anslutna till olika CS -enheter.

Löd ihop dessa delar i tavlan och du är redo att ladda upp skissen!

Som du kan se på skissen löd jag några dupont -honkontakter istället för den direkta komponenten, det beror på att jag i framtiden kanske vill återanvända komponenten eller ändra en.

Jag lödde också GPS -modulen med kontakterna i fel riktning, det var mitt fel och jag ville inte, men det fungerar och jag vill inte riskera att bryta det för att avlöda de små jävlarna! Löd bara på rätt sätt och allt kommer att bli bra!

Här lite användbar lödvideo: Lödguide för nybörjare En video om avlödning

Adafruit Youtube -kanal, många intressanta saker där!

När du löd, försök att använda bara den mängd metall du behöver, annars kommer du att göra en röra. Var inte rädd för att göra det, kanske börja med något som inte är så dyrt, och behåll lödning av olika saker. Rätt material gör också skillnaden!

Steg 2: Skissen

Först importerar vi naturligtvis biblioteket och bygger deras objekt att arbeta med: SPI.h är för kommunikation med SPI -moduler, SD är MicroSD -biblioteket och Adafruit_GPS är biblioteket för GPS -modulen. SoftwareSerial.h är för att skapa en seriell port via programvara. Syntaxen är "mySerial (TxPin, RxPin);". GPS -objektet måste pekas på en serie (inom parentes). Här är bibliotekens länkar för Adafruit GPS -breakout, MicroSD -breakout (för att göra ett rent jobb bör du också formatera SD med denna programvara från SD -förening) och Programvara Seriellt bibliotek (det bör ingå i IDE).

OBS: Jag stötte på ett problem när jag försökte lägga till mycket information i en fil eller använda mer än två filer i skissen. Jag formaterade inte SD: n med den programvaran, kanske kan det lösa problemet. Jag försökte också lägga till en annan sensor i enheten, en BMP280 (I2C -modul), utan framgång. Det verkar som att använda I2C -modul gör skissen galen! Jag visste redan om det i Adafruit -forumet, men jag fick fortfarande inget svar.

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

Nu behöver vi alla våra variabler: De två strängarna är för att läsa de två meningarna som vi behöver för att beräkna en massa användbar information från GPS: en. Rödingen är för att lagra meningarna innan de analyseras, flottörerna är för att beräkna koordinaterna i grader (GPS -skicka använder koordinater i grader och minuter, vi behöver dem i grader för att läsa i google earth). ChipSelect är stiftet där vi ansluter CS för MicroSD -kortet. I det här fallet är D4, men om du använder en SD -sköld måste du lägga D10 här. Filvariabeln är den som lagrar informationen om filen vi använder under skissen.

Sträng NMEA1;

String NMEA2; röding c; float deg; flyta degWhole; float degDec; int chipSelect = 4; Fila mySensorData;

Nu deklarerar vi ett par funktioner för att göra skissen lite mer elegant och mindre rörig:

De gör i princip samma sak: läser NMEA -meningar. clearGPS () ignorerar tre meningar och readGPS () sparar två av dem i variablerna.

Låt oss se hur: En stund -slinga styr om det finns nya NMEA -meningar på modulen och läser GPS -strömmen tills det finns en. När en ny mening är där är vi ute medan loop, där meningen faktiskt läses, analyseras och lagras i de första NMEA -variablerna. Vi gör omedelbart samma sak för nästa, eftersom GPS: n ständigt strömmar, den väntar inte på att vi ska vara klara, vi har inte tid att skriva ut den direkt

Det här är väldigt viktigt! Gör inget innan du lagrar båda meningarna, annars skulle den andra så småningom bli skadad eller bara fel.

Efter att vi fått två meningar skriver vi ut dem i serien för att kontrollera att det går bra.

void readGPS () {

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

Tja, nu när vi är klara kan vi komma igenom installationen ():

Först: vi öppnar kommunikation på Serial 115200 för Arduino PC och på 9600 för GPS -modul Arduino. För det andra: vi skickar tre kommandon till GPS -modulen: den första är att stänga av antennuppdateringen, den andra är för att bara fråga RMC- och GGA -sträng (vi kommer bara att använda dem som har all information du någonsin skulle behöva från a GPS), är det tredje och sista kommandot att ställa in uppdateringshastigheten till 1 HZ, föreslagen av Adafruit.

Därefter ställer vi in stiftet D10 på OUTPUT, om och bara om din SD -modellens CS -pin är annan än D10. Omedelbart efter, se ställ in CS på SD -modulen på chipSelect pin.

Vi kör funktionerna readGPS () som inkluderar cleanGPS ().

Nu är det dags att skriva något i filerna! Om filen redan finns på Sd -kortet, lägg till en tidsstämpel på dem. På så sätt behöver vi inte hålla koll på sessionerna eller radera filerna varje gång. Med en tidsstämpel skriven inom installationsfunktionen är vi säkra på att bara lägga till en separation i filerna bara en gång per session.

OBS: SD -biblioteket är ganska seriöst med att öppna och stänga filen varje gång! Tänk på det och stäng det varje gång! För att lära dig mer om biblioteket, följ den här länken.

Ok, vi är verkligen redo att få kärnan i strömmen och logga delen av skissen.

void setup () {

Serial.begin (115200); GPS.start (9600); // Skicka kommandon till GPS -modulen GPS.sendCommand ("$ PGCMD, 33, 0*6D"); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); fördröjning (1000); // endast om SD -modulens CS -pin inte finns på pin 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.year); mySensorData.print (" -"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.seconds); 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.year); mySensorData.print (" -"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.seconds); mySensorData.println ("***"); mySensorData.close (); }}

Nu får vi kärnan i skissen.

Det är superenkelt, verkligen.

Vi kommer att läsa GPS -strömmen med funktionen readGPS (), än vi kontrollerar om vi har en fix som är lika med 1, det betyder att vi är anslutna till en satellit e. Om vi fick det kommer vi att skriva våra uppgifter i filerna. I den första filen "NMEA.txt" skriver vi bara de råa meningarna. I den andra filen, "GPDData.txt", lägger vi till koordinaterna (konverterade med de funktioner vi såg tidigare) och höjden. Den informationen räcker för att sammanställa en.kml -fil för att skapa en sökväg på Google Earth. Observera att vi stänger filerna varje gång vi öppnade dem för att skriva något!

void loop () {

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

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

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

Nu när vi alla är klara kan du ladda upp skissen, bygga enheten och njuta av den!

Observera att du måste använda den med GPS -borad mot himlen för att få en fix = 1, eller så kan du ansluta en extern antenn till den.

Tänk också på att den röda lampan blinkar var 15: e sekund, om du inte gör det, mycket snabbare (en gång var 2-3: e sekund).

Om du vill lära dig något mer om NMEA -meningarna följer du bara nästa steg i den här guiden.

Steg 3: NMEA -meningarna och.kml -filen

Enheten och skissen är färdiga, de fungerar bra. Tänk på att för att fixa (för att ha en anslutning till satelliter) bör utbrottet vända mot himlen.

Den lilla röda lampan blinkar var 15: e sekund när du har fixat

Om du vill förstå NMEA -meningarna bättre kan du läsa vidare.

I skissen använder vi bara två meningar, GGA och RMC. De är bara några av meningarna som GPS -modulen strömmar.

Låt oss se vad som finns i strängen:

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

RMC = Rekommenderad Minsta mening C 123519 = Fixad vid 12:35:19 UTC A = Status A = aktiv eller V = Ogiltig 4807.038, N = Latitud 48 grader 07.038 'N 01131.000, E = Longitud 11 grader 31.000' E 022.4 = Hastighet över marken i knop 084.4 = Spårvinkel i grader Sant 230394 = Datum - 23 mars 1994 003.1, W = Magnetisk variation *6A = Kontrollsummadata, börjar 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 togs vid 12:35:19 UTC 4807.038, N Latitud 48 grader 07.038 'N 01131.000, E Longitud 11 grader 31.000' E 1 Fixkvalitet: 0 = ogiltig; 1 = GPS -fix (SPS); 2 = DGPS -fix; 3 = PPS fix; 4 = Kinematisk i realtid; 5 = Float RTK; 6 = uppskattad (dödräkning) (2,3 funktion); 7 = Manuellt inmatningsläge; 8 = Simuleringsläge; 08 Antal satelliter som spåras 0,9 Horisontell utspädning av position 545,4, M höjd, mätare, över medelhavsnivå 46,9, M höjd på geoid (medelhavsnivå) över WGS84 ellipsoid (tomt fält) tid i sekunder sedan senaste DGPS -uppdatering (tomt fält)) DGPS -stationens ID -nummer *47 kontrollsummadata, börjar alltid med *

Som du kan se finns det mycket mer information om vad du behöver där. Med hjälp av Adafruit -biblioteket kan du ringa några av dem, till exempel GPS.latitude eller GPS.lat (latitud och lat hemisphere) eller GPS.day/month/year/hour/minute/seconds/milliseconds… Ta en titt till Adafruit webbplats för att veta något mer. Är inte så tydligt, men efter några tips i GPS -modulernas guide kan du hitta det du behöver.

Vad kan vi göra med filer vi har? Enkelt: kompilera en kml -fil för att visa en sökväg på Google Earth. För att göra det, bara kopiera/förbi koden som du hittar efter denna länk (under stycket Sökväg), placera dina koordinater från filen GPDData.txt mellan taggarna, spara filen med.kml -tillägg och ladda den på Google Earth.

OBS:.kml -markeringsspråket är enkelt, om du redan vet vad ett markeringsspråk är, behåll din tid att läsa den tidigare länken och dokumentationen inuti, det är faktiskt intressant!

Att använda kml handlar om att känna till dess taggar och argument. Jag hittade bara guiden från Google, den jag länkade tidigare och den väsentliga delen är att definiera stilen mellan taggarna och kalla den med # -tecken när det är dags att skriva koordinaterna.

Filen jag lade till i det här avsnittet är en.kml där du bara kan klistra in dina koordinater. tänk på att klistra in med denna syntax: longitud, latitud, höjd

Rekommenderad: