МИСТЕЦТВО
КРАСА ТА ЗДОРОВ'Я
РЕМЕСЛО
КУЛЬТУРА ТА ІСТОРІЯ
РОЗВАГИ
СЕРЕДОВИЩЕ
ЇЖА ТА НАПІЇ
ЗБОРНА ІНЖЕНЕРІЯ
НАУК
СПОРТ
ТЕХНОЛОГІЯ
НОСИМО
GPS Position Logger
Ed

Створено

Ed

14. серпень 2026FI
3
0
0
0
0

GPS Position Logger

A logger that writes where it has been to a microSD card. The GPS shield kit carries an EM-506 receiver that emits standard NMEA sentences over serial; the sketch keeps only the lines that carry a valid fix and appends them as CSV. It is the same logging pattern as the data-logging thermometer with position substituted for temperature, so the two share a card format and a workflow. A cold receiver with no stored almanac can take several minutes to reach its first fix, and it needs sky — it will not fix indoors.
Середній
3 hours

Інструкції

1

Solder the GPS shield headers

The kit contains the shield, an EM-506 receiver with its interface cable, and R3 headers. Solder the headers to the shield.

Матеріали для цього кроку:

SparkFun GPS Shield KitSparkFun GPS Shield Kit1 набір

Необхідні інструменти ({count})

Ryobi ONE+ RSI18-0 Cordless Soldering IronRyobi ONE+ RSI18-0 Cordless Soldering Iron
2

Stack both shields and check for pin clashes

Plug the EM-506 into the shield's connector, then stack GPS shield and microSD shield on the Uno.

  1. GPS shield: receiver on D2/D3 with its switch in the DLINE position.
  2. microSD shield: SPI on D11/D12/D13, card select on D8.
Those two sets do not overlap, which is why the pair can stack. Always check this before powering any two shields together — a clash shows up as one board mysteriously not working.

Матеріали для цього кроку:

microSD ShieldmicroSD Shield1 штука
Arduino Uno R3 SMDArduino Uno R3 SMD1 штука
3

Power, and read raw NMEA before parsing anything

USB-B from the computer while testing; 7–12 V on the barrel jack once it runs standalone.

Before writing any parser, print the receiver's output straight through and look at it. You should see comma-separated sentences beginning with $.

Sentences arriving with empty position fields mean the receiver is alive and talking but has no fix yet. That is the normal cold-start state — not a fault.

Матеріали для цього кроку:

USB-B CableUSB-B Cable1 штука
4

Upload the logging sketch

No GPS library needed — the sketch reads NMEA directly, so nothing is hidden behind an abstraction. SD and SPI ship with the IDE. Format the card FAT32 first.

gps_logger.inoarduino
// GPS Position Logger
// EM-506 on the GPS shield (D2/D3, DLINE) -> Uno -> microSD Shield (CS D8)
// Appends one CSV line per VALID fix: utc,latitude,longitude
//
// Parses $GPRMC directly rather than using a GPS library, so every field
// is visible. RMC layout:
//   $GPRMC,utc,status,lat,N/S,lon,E/W,speed,course,date,...
//   field:  1   2      3   4    5   6
// status 'A' = valid fix, 'V' = warning (no fix). Only 'A' is logged.

#include <SoftwareSerial.h>
#include <SPI.h>
#include <SD.h>

const int  GPS_RX_PIN = 2;    // Arduino receives <- GPS TX
const int  GPS_TX_PIN = 3;    // Arduino transmits -> GPS RX (unused here)
const long GPS_BAUD   = 4800; // EM-506 factory default
const int  SD_CS_PIN  = 8;
const char LOG_FILE[] = "gpslog.csv";

SoftwareSerial gps(GPS_RX_PIN, GPS_TX_PIN);

char    sentence[100];
uint8_t idx = 0;

void setup() {
  Serial.begin(9600);
  gps.begin(GPS_BAUD);

  if (!SD.begin(SD_CS_PIN)) {
    Serial.println(F("SD init failed: card absent, not FAT32, or wrong CS pin"));
    while (true) { }
  }
  if (!SD.exists(LOG_FILE)) {
    File f = SD.open(LOG_FILE, FILE_WRITE);
    if (f) { f.println(F("utc,latitude,longitude")); f.close(); }
  }
  Serial.println(F("waiting for a fix -- this needs open sky"));
}

// Returns a pointer to comma-separated field n (0 = the sentence type).
char *field(char *s, uint8_t n) {
  uint8_t seen = 0;
  if (n == 0) return s;
  for (char *p = s; *p; p++) {
    if (*p == ',') {
      seen++;
      if (seen == n) return p + 1;
    }
  }
  return NULL;
}

void handleSentence(char *s) {
  if (strncmp(s, "$GPRMC", 6) != 0) return;   // only RMC carries the status flag

  char *status = field(s, 2);
  if (!status || *status != 'A') {            // 'V' = no fix yet
    Serial.println(F("...no fix"));
    return;
  }

  char *utc = field(s, 1);
  char *lat = field(s, 3);
  char *ns  = field(s, 4);
  char *lon = field(s, 5);
  char *ew  = field(s, 6);
  if (!utc || !lat || !ns || !lon || !ew) return;

  File f = SD.open(LOG_FILE, FILE_WRITE);
  if (!f) { Serial.println(F("could not open log file")); return; }

  // Fields are still comma-terminated in place; print up to the next comma.
  for (char *p = utc; *p && *p != ','; p++) { f.print(*p); Serial.print(*p); }
  f.print(',');  Serial.print(',');
  for (char *p = lat; *p && *p != ','; p++) { f.print(*p); Serial.print(*p); }
  f.print(*ns);  Serial.print(*ns);
  f.print(',');  Serial.print(',');
  for (char *p = lon; *p && *p != ','; p++) { f.print(*p); Serial.print(*p); }
  f.println(*ew); Serial.println(*ew);

  f.close();     // close == flush, one fix at most lost on a power cut
}

void loop() {
  while (gps.available()) {
    char c = gps.read();
    if (c == '\n') {
      sentence[idx] = '\0';
      handleSentence(sentence);
      idx = 0;
    } else if (c != '\r' && idx < sizeof(sentence) - 1) {
      sentence[idx++] = c;
    }
  }
}
5

Take it outside for the first fix

Put the unit under open sky, powered, and leave it. Watch for the fix indicator before judging the build.

Testing a GPS receiver indoors and concluding it is broken is the single most common failure in this project. A cold start with no stored almanac legitimately takes minutes.

Матеріали

4

Необхідні інструменти

1
Орієнтовна сума
$101.00

CC0 Суспільне надбання

Це креслення випущено під ліцензією CC0. Ви можете вільно копіювати, змінювати, поширювати та використовувати цю роботу для будь-яких цілей без запиту дозволу.

Підтримайте мейкера, купуючи продукти через його креслення, де він отримує Комісію мейкера встановлену вендорами, або створіть нову ітерацію цього креслення та включіть його як зв'язок у власне креслення для розподілу доходу.

Обговорення

(0)

Увійти щоб приєднатися до обговорення

Завантаження коментарів...