Track ME: Rastreador de Coche Prototipo con Arduino Mega 2560, GPS y GPRS
Componentes y materiales
| Componente | Cantidad | Notas |
|---|---|---|
| Arduino Mega 2560 | 1 | |
| Módulo GPS NEO 6 | 1 | Muy popular en eBay |
| Shield tarjeta SD (Adafruit) | 1 | Para almacenar logs |
| Shield GPRS Seeedstudio V2.0 | 1 | Comunicación GSM/GPRS |
| Cables jumper (genéricos) | 1 set | |
| Batería 9V | 1 | Alimentación |
| Caja/plástico | 1 | Carcasa |
Sobre el proyecto
Hace tiempo decidí construir un rastreador personal/para coche. Este fue mi primer prototipo en esa dirección.
El sistema es muy simple: Arduino Mega, GPS, Shield GPRS y tarjeta SD (opcional, pero la incluí para lanzar un reto a mis amigos en Facebook: llaman al sistema y reciben un SMS con mi posición o mi última posición conocida).
Funcionamiento
El sistema busca constantemente la posición actual. Si alguien llama al número de la tarjeta SIM, el sistema envía un SMS con la posición actual y un enlace a Google Maps. Ejemplo:
Ubicación de Hugo: Lat: 54.315010, Log: 10.130997. https://maps.google.com/maps?q=54.315010,+10.130997
Si el GPS no recibe posición, envía la última conocida:
No puedo localizar a Hugo. Última vez que le vi, estaba en: Lat: 54.315010, Log: 10.130997. https://maps.google.com/maps?q=54.315010,+10.130997
Fecha, hora, posición y estado del SMS se guardan en la tarjeta SD.
Componentes

Conectar los componentes
Como Arduino Mega usa diferente pinout, hay que recablear:
Shield SD (diseñado para Uno → Mega):
Pines SPI Arduino UNO → Arduino MEGA:
- MOSI: 11 → 51
- MISO: 12 → 50
- SCK: 13 → 52
- SS: 10 → 53

Shield GPRS:
- Configurar pines de comunicación a Software Serial en jumper J7 del shield.
- Conectar pines 7 y 8 del shield GPRS al Serial1 del Mega (pines 18 y 19).


Para detalles de tarjeta SIM en GPRS Shield, ver mi otro proyecto en Hackster.
GPS:
Conectado al Serial2 (pines 16 y 17) del Arduino Mega.

Alimentación del GPS tomada del pin 5V y GND del shield SD.
Alimentación:
Batería 9V al pin Vin o conector jack.




Código - Notas rápidas
Librería GPRS Shield: Requiere cambios para Arduino Mega:
- En
GSM.h: comentar#define UNOy descomentar#define MEGA - En
HWSerial.h: descomentar#define MEGA
Librería GPS: TinyGPS++
Lógica del programa:
- Rutinas de inicio: GPRS, GPS, tarjeta SD
- GPS intenta determinar satélites disponibles y coordenadas válidas
- Si llaman durante inicio: llamada rechazada automáticamente
- Si GPS tiene posición válida y >3 satélites: llamada entrante → SMS con posición actual + log en SD
- Si GPS tiene <3 satélites: llamada entrante → SMS con última posición conocida + log en SD
Pros y Contras
Contras (prototipo):
- Batería dura solo 1 hora. No implementé modos de ahorro energético. "Sleep Mode" es imprescindible para mejoras.
- Tamaño grande. Diseñé una placa nueva personalizada (ver imagen).

Por favor, escríbeme si encuentras errores o tienes sugerencias/mejoras/preguntas.
Gracias por leer.
Hugo Gomes
Código
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
#include "call.h"
#include <TinyGPS++.h>
// Para cambiar pines Software/Hardware Serial, usar líneas 27, 28 en GSM.cpp
// Para Arduino Mega definir MEGA en línea 5 de GSM.h
#include <SPI.h>
#include <SD.h>
const int chipSelect = 53; // Pin CS Mega
CallGSM call;
SMSGSM sms;
char number[20];
byte stat = 0;
int value = 0;
char value_str[5];
// Variables GPS
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);
// GPRS
Serial.print(F("Starting GSM..."));
if (gsm.begin(9600)) Serial.println(F("READY"));
else Serial.println(F("IDLE"));
// GPS
Serial.println(F("Starting GPS"));
Serial2.begin(9600); // Puerto serie 2 del Mega
// SD Card
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();
}
// Obtener posición del 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);
}
}
// Delay inteligente que "alimenta" al objeto GPS
static void smartDelay(unsigned long ms) {
unsigned long start = millis();
do {
while (Serial2.available()) gps.encode(Serial2.read());
} while (millis() - start < ms);
}
// Verificar llamada entrante
void Check_call() {
stat = call.CallStatusWithAuth(number, 0, 0);
if (stat == CALL_INCOM_VOICE_AUTH) {
delay(100);
call.HangUp(); // Rechazar llamada
Send_SMS();
}
}
// Enviar SMS con posición actual o última conocida
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);
} 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);
} else if (!one_point_true) {
Serial.println(F("No valid GPS point"));
return;
}
// Guardar en 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"));
}
}
Esquemas


Proceso de manufactura
- Construye un robot inteligente con Bridge Shield – Integración Raspberry Pi y Arduino
- Sistema de Iluminación DMX Controlado por Web – Controlador Maestro Arduino
- Construye un Spybot controlado por Bluetooth con Arduino
- UnifiedWater v1 – Kit completo de sensor de calidad de agua con Arduino
- Reloj HSV: Reloj Vibrante y Personalizable para Entusiastas de Arduino
- Robot Quitanieve Avanzado para Limpieza Invernal Eficiente
- Sistema de votación portátil con conectividad GSM
- Juego Arcade Whac-A-Mole DIY (Edición Botones) – Proyecto Arduino
- Jukebox Moderna: Reproductor Musical Raspberry Pi + Arduino con LEDs Reactivos
- Smartwatch Arduino DIY: Construye tu Propio Reloj Estilo Apple Watch
- Muestra Agradecimiento a Conductores Cortéses con Pantalla LED Programable