GPS-трекер

Проекты на Arduino и Slot Shield

Собери простой GPS-трекер, чтобы записывать свои путешествия и выкладывать их на Google Maps. Твои координаты и скорость будут определяться приёмником спутниковой навигации и раз в пять секунд записываться на microSD с помощью картридера. Запись трека включается и выключается светодиодной кнопкой.

Данные сохраняются в электронную таблицу dataGPS.csv, формат которой соответствует требованиям сервиса Google My Maps.

Видеоинструкция

Что потребуется

Как собрать

Установите Troyka Slot Shield на Iskra Neo

Переверните приёмник GPS/GLONASS на 180 градусов и вставьте в правый верхний слот.

Поверните светодиодную кнопку на 90 градусов против часовой стрелки и вставьте в правый нижний слот. Светодиод модуля будет загораться при включении записи.

Переверните картридер и вставьте его в нижний средний слот. Не забудьте отформатировать microSD карту в FAT32.

Импорт данных

Скопируйте файл dataGPS.csv с microSD на свой компьютер.

Зайдите на сервис Google My Maps и нажмите кнопку + создать новую карту в верхнем левом углу экрана.

Откроется карта со слоем, на который можно нанести собственные метки.

Нажмите кнопку импорт и выберите сохранённый файл dataGPS.csv

Укажите колонку таблицы с координатами — это столбец с названием Coordinates. Трекер пишет сначала широту, затем долготу.

Выберите данные, которые будут отображаться как названия маркеров. Вы можете выбрать дату и время создания метки, координаты метки или текущую скорость.

Трек готов. Расшарьте свою карту и поделитесь маршрутами путешествий с друзьями.

Скетч

Прошейте контроллер скетчем через Arduino IDE.

gps-tracker.ino
// библиотека для работы с устройствами по SPI
#include <SPI.h>
// библиотека для работы с SD-картой
#include <SD.h>
// библиотека для работы с GPS устройством
#include <TroykaGPS.h>
// создаём объект класса GPS и передаём в него объект Serial1 
GPS gps(Serial1);
// пин светодиода
#define LED_PIN           A0
// пин кнопки
#define BUTTON_PIN        13
// пин CS micro-sd карты
#define CHIP_SELECT_PIN   9
// интервал времени записи данных на карту
#define INTERVAL          5000
// задаём размер массива для времени, даты, широты и долготы
#define MAX_SIZE_MASS 16
// массив для хранения текущего времени
char time[MAX_SIZE_MASS];
// состояние записи
bool stateRec = false;
// запоминает текущее время
long startMillis = millis();
 
void setup()
{
  // открываем последовательный порт для мониторинга действий в программе
  Serial.begin(115200);
  // ждём, пока не откроется монитор последовательного порта
  // для того, чтобы отследить все события в программе
//  while (!Serial) {
//  }
  Serial.print("Serial init OK\r\n");
  // открываем Serial-соединение с GPS-модулем
  Serial1.begin(115200);
  // устанавливаем светодиод в режим выхода
  pinMode(LED_PIN, OUTPUT);
  // устанавливаем кнопку в режим входа
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  // выводим информацию об инициализации в Serial-порт
  Serial.println("Initializing SD card...");
  // инициализируем SD-карту
  while (!SD.begin(CHIP_SELECT_PIN)) {
    Serial.println("Card failed, or not present");
    delay(1000);
  }
  // выводим информацию в Serial-порт
  Serial.println("Card initialized");
  // создаём объект dataFile класса File для работы с файлами
  File dataFile = SD.open("dataGPS.csv", FILE_WRITE);
  // если файл существует
  if (dataFile) {
    // записываем название будущих данных на карту памяти
    dataFile.println("Time, Coordinates, Speed");
    // закрываем файл
    dataFile.close();
    Serial.println("Save OK");
  } else {
    Serial.println("Error opening test.csv");
  }
}
 
void loop()
{
  // Фиксируем нажатие кнопки
  if (!digitalRead(BUTTON_PIN)) {
    // меняем состояние «запись» / «не запись» на карту памяти 
    stateRec = !stateRec;
    // меняем состояние светодиода индикации
    digitalWrite(LED_PIN, stateRec);
  }
  // если пришли данные с gps-модуля
  if (gps.available()) {
    // считываем данные и парсим
    gps.readParsing();
    // проверяем состояние GPS-модуля
    switch(gps.getState()) {
      // всё OK
      case GPS_OK:
        Serial.println("GPS is OK");
        // если прошёл заданный интервал времени
        if (millis() - startMillis > INTERVAL && stateRec) {
          // сохраняем данные на карту памяти
          saveSD();
          // запоминаем текущее время
          startMillis = millis();
        }
        break;
      // ошибка данных
      case GPS_ERROR_DATA:
        Serial.println("GPS error data");
        break;
      // нет соединение со спутниками
      case GPS_ERROR_SAT:
        Serial.println("GPS no connect to satellites");
        break;
    }
  }
}
 
// функция сохарение данных на карту памяти
void saveSD() {
  File dataFile = SD.open("dataGPS.csv", FILE_WRITE);
  // если файл существует и открылся
  if (dataFile) {
    // считывает текущее время
    gps.getTime(time, MAX_SIZE_MASS);
    // записываем время на карту памяти
    dataFile.print("\"");
    dataFile.print(time);
    dataFile.print("\"");
    dataFile.print(",");
    dataFile.print("\"");
    // считываем и записывае координаты широты и долготы на карту памяти
    dataFile.print(gps.getLatitudeBase10(), 6);
    dataFile.print(",");
    dataFile.print(gps.getLongitudeBase10(), 6);
    dataFile.print("\"");
    dataFile.print(",");
    dataFile.print(gps.getSpeedKm());
    dataFile.println("km/h");
    dataFile.close();
    Serial.println("Save OK");
  } else {
    Serial.println("Error opening test.csv");
  }
}

Что дальше?

В машине трекер работает от встроеной USB-розетки. Если хотите сделать его более автономным, используйте Power Shield или аккумулятор «крона».

Хотите собрать другой девайс? Выберите будущее устройство из списка проектов на Slot Shield.

Часто задаваемые вопросы

Где скачать необходимые библиотеки и как их установить?