Stap 1: De Arduino en Code
Ik heb een CAN-BUS-schild (van toen had mijn auto motor problemen en ik probeerde te doen van mijn eigen diagnose) en zag er een EM-406-aansluiting aansluiten in een standaardmodule van GPS. Ik bestelde een GPS-module van ebay (alle GPS modules EM-406 socket lijken hetzelfde) en aangesloten in een micro SD-kaart in de SD-aansluiting van het schild.
Het GPS-loggen om gemakkelijk te maken vond ik een uitstekende bibliotheek genaamd TinyGPS ++ waardoor dat ik hoef niet te besteden mijn tijd inzicht in de pakketten die worden verzonden vanaf de GPS-module!
Gebruik linux tools zoals GPS babel of online hulpmiddelen zoals GPS Visualizer de gegevens kunnen worden geconverteerd tussen de meeste standaard formaten, dus ik dacht dat ik zou stok met CSV dat zodat ik het omhoog kon open excel of matlab, maar kan nog steeds gemakkelijk converteren naar kml in Google Earth bekijken.
Ik heb ook de broncode die ik hieronder gebruikte, ik heb de seriële dumping spullen in voor foutopsporing (zodat u uw locatie vanaf uw laptop onmiddellijk zien kunt).
De LED's ingebouwd in het schild worden gebruikt om aan te geven wanneer de Raad zich, en de andere voor wanneer de GPS is vergrendeld.
#include <SPI.h> #include <SD.h> #include <TinyGPS++.h> #include <SoftwareSerial.h> const int LED1 = 7; const int LED2 = 8; const int chipSelect = 9; const int RXPin = 4; const int TXPin = 5; int GPSBaud = 4800; TinyGPSPlus gps; SoftwareSerial gpsSerial(RXPin, TXPin); void setup() { Serial.begin(9600); gpsSerial.begin(GPSBaud); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(chipSelect, OUTPUT); if (!SD.begin(chipSelect)) digitalWrite(LED1, LOW); else { Serial.println("SD Card Setup"); digitalWrite(LED1, HIGH); } } void loop() { while (gpsSerial.available() > 0) { if (gps.encode(gpsSerial.read())) { if (gps.location.isValid() && gps.time.isValid() && gps.date.isValid()) digitalWrite(LED2, HIGH); else digitalWrite(LED2, LOW); logInfo(); displayInfo(); } } } void logInfo() { if (gps.location.isValid() && gps.time.isValid() && gps.date.isValid()) { File dataFile = SD.open("gpslog.txt", FILE_WRITE); if (dataFile) { digitalWrite(LED1, HIGH); dataFile.print(gps.date.day()); dataFile.print(F("/")); dataFile.print(gps.date.month()); dataFile.print(F("/")); dataFile.print(gps.date.year()); dataFile.print(F(",")); if (gps.time.hour() < 10) dataFile.print(F("0")); dataFile.print(gps.time.hour()); dataFile.print(F(":")); if (gps.time.minute() < 10) dataFile.print(F("0")); dataFile.print(gps.time.minute()); dataFile.print(F(":")); if (gps.time.second() < 10) dataFile.print(F("0")); dataFile.print(gps.time.second()); dataFile.print(F(".")); if (gps.time.centisecond() < 10) dataFile.print(F("0")); dataFile.print(gps.time.centisecond()); dataFile.print(F(",")); dataFile.print(gps.location.lat(), 6); dataFile.print(F(",")); dataFile.print(gps.location.lng(), 6); dataFile.println(); dataFile.close(); } // if the file isn't open, pop up an error: else { digitalWrite(LED1, HIGH); Serial.println("error opening datalog.txt"); } } } void displayInfo() { Serial.print(F("Location: ")); if (gps.location.isValid()) { Serial.print(gps.location.lat(), 6); Serial.print(F(",")); Serial.print(gps.location.lng(), 6); } else { Serial.print(F("INVALID")); } Serial.print(F(" Date/Time: ")); if (gps.date.isValid()) { Serial.print(gps.date.day()); Serial.print(F("/")); Serial.print(gps.date.month()); Serial.print(F("/")); Serial.print(gps.date.year()); } else { Serial.print(F("INVALID")); } Serial.print(F(" ")); if (gps.time.isValid()) { if (gps.time.hour() < 10) Serial.print(F("0")); Serial.print(gps.time.hour()); Serial.print(F(":")); if (gps.time.minute() < 10) Serial.print(F("0")); Serial.print(gps.time.minute()); Serial.print(F(":")); if (gps.time.second() < 10) Serial.print(F("0")); Serial.print(gps.time.second()); Serial.print(F(".")); if (gps.time.centisecond() < 10) Serial.print(F("0")); Serial.print(gps.time.centisecond()); } else { Serial.print(F("INVALID")); } Serial.println(); }