Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS
Компоненты и расходники
| Arduino Mega 2560 | × | 1 |
| GPS-модуль NEO-6M | × | 1 |
| SD-карта Shield (Adafruit) | × | 1 |
| GPRS Shield V2.0 (Seeedstudio) | × | 1 |
| Перемычки | × | 1 |
| Крона 9V | × | 1 |
| Корпус (пластиковый бокс) | × | 1 |
О проекте
Решил построить трекер для автомобиля/личного использования. Это первый прототип в этом направлении.
Система проста: Arduino Mega, GPS, GPRS Shield, SD-карта (опционально, для логирования и челленджа друзьям в Facebook — звонят на номер SIM и получают SMS с координатами).
Система постоянно ищет актуальную позицию. При входящем звонке на номер SIM-карты отправляется SMS с текущими координатами и ссылкой на Google Maps. Пример:
Hugo location is now: Lat: 54.315010, Log: 10.130997. https://maps.google.com/maps?q=54.315010,+10.130997
Если GPS не имеет фикса, отправляется последняя известная позиция:
I can not seem to find Hugo. Last time that I've saw him, was in: Lat: 54.315010, Log: 10.130997. https://maps.google.com/maps?q=54.315010,+10.130997
Дата, время, позиция и статус SMS записываются на SD-карту.
Компоненты
- 1× Arduino MEGA
- 1× GPRS Shield (можно другой GSM-шилд)
- 1× GPS (NEO-6, популярен на eBay)
- 1× SD Card Shield
- 1× Батарея 9V (Крона)
- 1× Пластиковый корпус
- Провода

Подключение компонентов
Arduino Mega имеет другую распиновку SPI, поэтому SD-шилд (расчитанный на Uno) требует переподключения:
| Arduino UNO SPI | Arduino MEGA SPI |
|---|---|
| MOSI — 11 | → 51 |
| MISO — 12 | → 50 |
| SCK — 13 | → 52 |
| SS — 10 | → 53 |

GPRS Shield: переключить джампер J7 на Software Serial. Соединить пины 7 и 8шилда с Serial1 Mega (пины 18 — TX, 19 — RX).


GPS подключается к Serial2 (пины 16 — TX, 17 — RX). Питание GPS берётся с 5V и GND SD-шилда.

Батарея 9V на Vin или джек питания.




Код — заметки
- Библиотека GPRS Shield: нужно в
GSM.hраскомментировать#define MEGA(закомментировать UNO). ВHWSerial.hтоже#define MEGA. - GPS: библиотека
TinyGPS++.
Логика работы: после инициализации (GPRS, GPS, SD) GPS ищет спутники и валидные координаты. Звонки в этот период отклоняются. При валидной позиции и ≥3 спутниках — отправляется SMS с текущими координатами. При <3 спутниках — последняя известная позиция. Все данные логируются на SD.
Плюсы и минусы прототипа
- Минус: батарея 9V живет ~1 час. Нет режима сна — обязательно добавить для следующей версии.
- Минус: габариты большие. Разработана новая компактная плата (фото ниже).

Пишите, если найдёте ошибки или есть идеи по улучшению.
Hugo Gomes
Код
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
#include "call.h"
#include <TinyGPS++.h>
// Для Mega: в GSM.cpp строки 27-28 менять пины Software/Hardware Serial
// В GSM.h: #define MEGA
#include <SPI.h>
#include <SD.h>
const int chipSelect = 53; // Mega CS pin
CallGSM call;
SMSGSM sms;
char number[20];
byte stat = 0;
int value = 0;
char value_str[5];
TinyGPSPlus gps;
const char *googlePrefix = "https://maps.google.com/maps?q=";
double Lat, Long;
int day, month, year, hour, minute, second;
int num_sat;
boolean one_point_true = false;
void setup() {
Serial.begin(9600);
Serial.print(F("Starting GSM..."));
if (gsm.begin(9600)) Serial.println(F("READY"));
else Serial.println(F("IDLE"));
Serial.println(F("Starting GPS"));
Serial2.begin(9600); // GPS на Serial2
Serial.print(F("Initializing SD card..."));
pinMode(53, OUTPUT);
if (!SD.begin(chipSelect)) {
Serial.println(F("Card failed, or not present"));
return;
}
Serial.println(F("card initialized."));
}
void loop() {
Get_GPS();
Check_call();
}
// Получение позиции от GPS
void Get_GPS() {
while (Serial2.available() > 0)
if (gps.encode(Serial2.read()))
num_sat = gps.satellites.value();
if (gps.location.isValid()) {
Lat = gps.location.lat();
Long = gps.location.lng();
if (Lat != 0 && Long != 0) one_point_true = true;
}
if (gps.date.isValid()) {
day = gps.date.day();
month = gps.date.month();
year = gps.date.year();
}
if (gps.time.isValid()) {
hour = gps.time.hour();
minute = gps.time.minute();
second = gps.time.second();
}
smartDelay(500);
if (millis() > 5000 && gps.charsProcessed() < 10) {
Serial.println(F("No GPS detected: check wiring."));
while (true);
}
}
// Умная задержка, кормящая GPS парсер
static void smartDelay(unsigned long ms) {
unsigned long start = millis();
do {
while (Serial2.available()) gps.encode(Serial2.read());
} while (millis() - start < ms);
}
// Проверка входящего вызова
void Check_call() {
stat = call.CallStatusWithAuth(number, 0, 0);
if (stat == CALL_INCOM_VOICE_AUTH) {
delay(100);
call.HangUp(); // сбрасываем вызов
Send_SMS();
}
}
// Отправка SMS с позицией
void Send_SMS() {
int error;
char Date[13];
sprintf(Date, "%02d/%02d/%04d ", day, month, year);
char time1[10];
sprintf(time1, "%02d:%02d:%02d ", hour, minute, second);
delay(100);
char lat_print[10], Long_print[10];
dtostrf(Lat, 5, 6, lat_print);
dtostrf(Long, 5, 6, Long_print);
if (num_sat >= 3 && one_point_true) {
char sms_OK[160];
sprintf(sms_OK, "Hugo location is now: Lat: %s, Log: %s. %s%s,+%s\n",
lat_print, Long_print, googlePrefix, lat_print, Long_print);
Serial.println(sms_OK);
error = sms.SendSMS(number, sms_OK);
delay(500);
Serial.println(error ? F("SMS OK") : F("SMS ERROR"));
} else if (num_sat < 3 && one_point_true) {
char sms_NOK[150];
sprintf(sms_NOK, "I can not seem to find Hugo. Last time that i've saw him, was in: Lat: %s, Log: %s. %s%s,+%s\n",
lat_print, Long_print, googlePrefix, lat_print, Long_print);
Serial.println(sms_NOK);
error = sms.SendSMS(number, sms_NOK);
Serial.println(error ? F("SMS OK") : F("SMS ERROR"));
} else {
Serial.println(F("No valid GPS point"));
}
// Лог на SD
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.print(Date); dataFile.print(" ");
dataFile.print(time1); dataFile.print(" ");
dataFile.print(number); dataFile.print(" ");
dataFile.print(lat_print); dataFile.print(", ");
dataFile.print(Long_print); dataFile.print(" ");
dataFile.print(error); dataFile.println();
dataFile.close();
} else {
Serial.println(F("error opening datalog.txt"));
}
}
Схемы
Производственный процесс
- Создание умного робота с Bridge Shield — интеграция Raspberry Pi и Arduino
- Веб-управляемая DMX-система освещения: Arduino Mega как мастер-контроллер
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- UnifiedWater v1: полный набор датчиков качества воды на Arduino MKR GSM
- HSV Clock: Яркие, настраиваемые часы для энтузиастов Arduino
- Продвинутый робот-снегоочиститель для эффективной зимней уборки
- Переносная система голосования с GSM-связью
- DIY аркадная игра Whac-A-Mole (кнопочная версия) — проект на Arduino
- Модерн-джукебокс: Raspberry Pi + Arduino, LED-визиализация музыки, 3D-корпус
- DIY Arduino Smartwatch: самодельные умные часы в стиле Apple Watch