Rastreador GPS para Coche Fiable con Mapa en Tiempo Real en Thinger.io
Componentes y suministros
| Arduino Leonardo | ×1 | (serial hardware dedicado) |
| Placa desarrollo SIM900 | ×1 | |
| Módulo GPS u-blox NEO-6M | ×1 | |
| Antena GPS | ×1 | |
| Resistencia 220 Ω | ×2 | |
| LED (genérico) | ×2 | |
| Placa soldable 7×5 cm | ×1 | (para LEDs; opcional) |
| Módulo step-down 12V a 5V | ×1 | (alimentación desde batería/coche) |
| Lector tarjeta SD Adafruit | ×1 | (5V compatible) |
| Tarjeta microSD | ×1 |
Herramientas y máquinas necesarias
- Soldador (genérico)
Aplicaciones y servicios online
- Plataforma Thinger.io (IoT gratis con dashboards)
Sobre este proyecto
Empezó como "idea de rastreador GPS" y terminó como "rastreador GPS multipropósito". Mi primer proyecto, curva de aprendizaje empinada; ¡acepto sugerencias y mejoras!
Va en el coche con estas funciones:
- Rastrea coordenadas GPS y envía última posición conocida a dashboard Thinger.io cada 2 min (mapa). Usa HTTP POST.
- Responde a comandos SMS con enlace Google Maps a posición actual o última conocida.
- Envía SMS cada XX km (recordatorio vaciar cárter de aceite cada 4000 km). Funciona como "odómetro" software configurable.
Aprende rápido las limitaciones de memoria del Arduino; optimicé código y usé librerías ligeras.
Componentes clave
- NEO-6M GPS: popular, barato en eBay. Comunicación: serial hardware.
- Antena GPS: las baratas de eBay daban mala recepción; mejor una de calidad.
- SIM900: GSM/GPRS. También sirve SIM800 (sin garantía). Comunicación: serial software.
- Arduino Leonardo: necesario por tener serial hardware dedicado (necesitamos dos seriales: GPS y SIM900). UNO obligaría a desconectar GPS para programar y no tendrías monitor serie.
- Lector SD Adafruit: 5V compatible (fácil SPI). Otras más baratas pueden valer. Advertencia: verifica que soporte 5V; si no, dañarás la electrónica. Comunicación: SPI.
- LEDs y resistencias: indicadores estado (alimentación y fix GPS).
- SIM con datos (sin PIN).
- Caja 3D imprimible (STLs adjuntos).
Librerías necesarias
- NeoGPS (gestor biblioteca Arduino IDE): GPS ligero, poca RAM. Más info: github.com/SlashDevin/NeoGPS
- Time (Paul Stoffregen): conversión zona horaria UTC. GitHub: PaulStoffregen/Time
- PetitFS (greiman): lectura/escritura SD FAT ultraligera. GitHub: greiman/PetitFS
¿Por qué no la librería Thinger.io?
Aunque es fácil y está en el IDE, consume ~80% flash en Leonardo, sin espacio para el resto. Usamos HTTP POST directo.
Comandos SMS
Todos en mayúsculas:
- POS: coordenadas + enlace Google Maps (o última conocida si no hay fix).
- GETKM: distancia acumulada desde último reset.
- RESETKM: pone contador a 0.
Configurar NeoGPS
Modifica GPSPort.h en la librería (ruta instalación):
#ifndef GPSport_h #define GPSport_h #define gpsPort Serial1 #define GPS_PORT_NAME "Serial1" #define DEBUG_PORT Serial #endif
Define el serial al GPS. Para Mega: Serial2, Serial3, etc.
Nota sobre precisión: GPS no es exacto para acumular distancia; deriva aunque estés parado. Para esta app la precisión es secundaria. El software solo suma distancia para movimientos >10 m en 15 s (derivas menores se ignoran). Distancia en línea recta; la real depende de curvas. Muestreo cada 15 s (reducible para más precisión).
Configurar PetitFS
Librería FAT ultraligera con restricciones: no crea archivos, no expande, no actualiza timestamp, no anexa (reescribe entero), un solo archivo abierto. ¿Por qué usarla? Tamaño: la librería SD estándar ocupa ~12% más. Con sus rarezas, hace lo que necesitamos: leer/escribir un valor.
Modificaciones en librería:
pffArduino.h:SD_CS_PIN = 10(pin SS SPI).pffconf.h: desactiva_USE_DIR,_USE_LSEEK,_FS_FAT12,_FS_FAT16(pon 0) para ahorrar espacio. Sketch final usa ~96% flash.pff.cpp: añade tipo retornoFRESULTa función que da error primera compilación.
Preparar tarjeta SD (formato FAT32 con "SD Card Formatter" oficial). Crea dist.txt y settings.txt en la tarjeta antes de usarla (la librería es muy exigente con formato). Usa los archivos adjuntos del proyecto (ya tienen formato correcto). dist.txt = distancia acumulada (ej. "0"). settings.txt = distancia trigger notificación SMS (en metros).
Preparar placa SIM900
- Alimentación externa: Arduino no da suficiente corriente (picos 2A). Usa fuente 5V-9V DC ≥2A (jack 5.5 mm).
- Selector fuente: junto al jack, mueve slider a externa.
- Selector serial: jumpers en posición Software Serial.
- Encendido por software: suelda jumper R13. Pin #9 SIM900 → pin #7 Arduino (ver esquema). Si prefieres botón manual, elimina función
SIM900power(). - Quita PIN de la SIM (desde un móvil).
- Firmware SIM900 ≥ B10 (¡crítico!). Versiones < B10 no soportan header HTTP "Content-type: application/json" y el POST falla. Verifica con
AT+CGMR. Mi versión original B01 la actualicé a B10. Guía: "SIM900 firmware update - ACOPTEX".
Ajustes de código
- Cambia APN (proveedor) en
connectGPRS():AT+SAPBR=3,1,"APN","TeleXXX"→ tu APN. - Modifica URL Thinger.io en
postDataThinger()(tu bucket + token). - Zona horaria:
#define UTC_OFFSET 1(UTC+1). - Distancia trigger SMS y texto en
loop()(por defecto 4000 km, "Empty catchtank!"). - Teléfono notificación:
#define DEFAULT_NUMBER "+4712345678". - Descomenta
while (!Serial);ensetup()para debug (comenta antes de alimentar externo).
Integración Thinger.io
- Crea cuenta, "bucket" (base de datos) y "device" HTTP.
- En device → callback → settings: "write bucket" apunta a tu bucket.
- En device → callback → overview: anota method URL y authorization header (string largo sin "Bearer").
- En código, reemplaza URL y authorization key en
postDataThinger(). Cambia https:// a https:// (SIM900 no soporta SSL). Thinger.io acepta sin SSL. - Si todo va bien, monitor serie muestra
+HTTPACTION: 1,200,0(OK).400= error (URL, auth, firmware). - Dashboard Thinger.io: widget mapa usando el bucket como fuente.
¿Más datos? Añade campos al JSON en sprintf(httpContent...): {"longitude":%s,"latitude":%s,"date":"%s %s"}. Sintaxis estricta.
Caja 3D
STLs adjuntos: tapa alta (más espacio, agujeros cerrados → taladrar 3 mm tras imprimir), tapa compacta, base con recortes conectores, trabas SIM900 (con y sin agujeros). Imprime 0.2 mm sin soportes. Tornillos M3. Placa LEDs (7×5 cm) y GPS en tapa superior; usa separadores pequeños. Placa MPU pegada con cola caliente en base.
Conexión a batería/coche
Muchas formas; mi solución: conectado a circuito "mechero" que se enciende/apaga con el coche (no drena batería parado). Si quieres online siempre, cablea a batería o pon power bank intermedio. No muestro cableado exacto (varía por coche). Usé step-down "barato" 12V→5V (9-20V entrada) con 2 USB hembra; Arduino y SIM900 cada uno en un USB. Consumo ~110 mAh en actividad GSM (más en mala cobertura).
Problemas conocidos
- Si SMS llega mientras se procesa HTTP POST a Thinger.io, el comando se pierde (no hay respuesta). Reenvía segundos después. Sin workaround actual.
- Si Arduino arranca sin cobertura, no reconecta al recuperar red (solo conecta en inicio). Pendiente de mejora.
Código principal (GPS_tracker_Leonardo_v2.ino)
Incluye: NeoGPS, GPSport, TimeLib, PetitFS. Define pines SIM900 (TX=8, RX=9, PWR=7), UTC_OFFSET, número por defecto. Variables: SMS, ubicación, distancia, tiempo. setup(): pines, seriales, init SD, enciende SIM900, configura GSM/GPRS. loop(): lee GPS, actualiza distancia cada 15s (si >10m y <10km), escribe SD y POST Thinger cada 2 min, check trigger SMS, procesa SMS entrantes (POS, GETKM, RESETKM). Funciones auxiliares: SIM900power(), updateSIM900(), extractSenderNumber(), sendSMS(), connectGPRS(), postDataThinger(), initializeSD(), updateTime().
Piezas personalizadas y cajas
STLs: tapa alta, tapa compacta, base, trabas SIM900. Archivos dist.txt y settings.txt para SD.
Esquemático
Esquema de conexiones completo.
Proceso de manufactura
- Fabricación de Tablas de Planchar: Diseño, Materiales y Proceso Productivo
- Construcción y Diseño de Tablas de Surf: De Raíces Polinesias a la Innovación Moderna
- Integración de datos de sensores en Raspberry Pi: Guía práctica
- Dominando la Placa PSoC 6 Pioneer con Shield IoT Add-On: Guía para Desarrolladores
- Los Riesgos de Conducir con Poco Refrigerante (Anticongelante) en el Motor
- Aprovechando Sistemas de Integración Internos para Manufactura de Precisión
- Raspberry Pi presenta MCU RP2040 y placa Pico de $4
- Seguimiento de Activos Exterior GPS: Tendencias, Desafíos y Tecnologías Emergentes
- Dominando la función map() de Python: sintaxis, ejemplos y mejores prácticas
- HashMap en Java: Guía completa con ejemplos prácticos
- Acelere la Reutilización de Fármacos contra COVID-19 con BIOVIA Living Map