Un rastreador GPS no necesita chip SIM, plan de datos ni WiFi para saber dónde está: los satélites transmiten todo el tiempo y cualquier receptor con línea de vista al cielo puede calcular su posición gratis. Lo que sí necesitas es entender qué entrega un módulo GPS, cómo leerlo sin errores y cómo llevar esos datos a una pantalla o a tu celular. Esta guía lo arma en tres etapas con el mismo cableado de principio a fin: primero los datos en una pantalla OLED, después por Bluetooth Low Energy al teléfono y por último sobre un mapa.

Sirve como base para un rastreador de bicicleta, de auto, de mascota o un registrador de rutas de trekking. Al terminar vas a saber cablear un GPS por UART, decodificar las frases NMEA con TinyGPSPlus, distinguir un dato válido de uno basura, aprovechar la hora UTC que entrega el satélite y entender por qué un GPS a veces tarda minutos en "enganchar" y otras veces un par de segundos.

Etapa 1: el GPS habla, la OLED muestra

Por qué estas tres piezas

El proyecto original, de Shahzada Fahad en Electronic Clinic, usa tres componentes elegidos por tamaño y consumo:

Montaje compacto con el Seeed XIAO ESP32-C3 apilado sobre el módulo GPS GP-02

Seeed Studio XIAO ESP32-C3. Un procesador RISC-V de 32 bits a 160 MHz con WiFi y Bluetooth Low Energy integrados, más chico que un pulgar. Para este proyecto tiene dos ventajas concretas: trae el BLE que usa la etapa 2 sin módulos extra, y tiene un cargador de baterías de litio integrado, así que una LiPo de 3,7 V soldada a los pads de la parte inferior se carga por el mismo USB-C. Expone UART, I²C y SPI, que es todo lo que se necesita acá.

Seeed Studio XIAO ESP32-C3 con su conector U.FL para antena

Pantalla OLED SSD1306 de 0,96". Va por I²C (solo dos cables de datos) y consume unos 20 mA, varias veces menos que una LCD con retroiluminación. Es una herramienta de desarrollo: te muestra al instante si el GPS ya tiene posición, sin computador ni monitor serie. En un rastreador a batería que debe durar días, la sacas.

Módulo de pantalla OLED SSD1306 de 0,96 pulgadas con interfaz I2C

Módulo GPS GP-02 de AI Thinker. El autor probó antes NEO-6M, NEO-M8N y otros, y este lo sorprendió por su sensibilidad. Según su hoja de datos:

  • Tamaño del chip: 10,3 × 9,9 mm, con front end de RF, procesador de banda base y CPU RISC de 32 bits en una sola pieza.
  • Arranque en frío: menos de 32 s. Arranque en caliente: 1 s.
  • Sensibilidad de seguimiento: -162 dBm.
  • Precisión de posición: menos de 2 m. Precisión de velocidad: menos de 0,1 m/s. Hasta 5 actualizaciones por segundo.
  • Consumo: 23 mA en operación, 5 mA en reposo y 8 µA en standby.
  • Alimentación: 2,7 a 3,6 V, compatible directo con los 3,3 V del XIAO, sin conversor de nivel.
  • Multiconstelación: recibe GPS (EE. UU.) y BeiDou (China) a la vez. Más satélites a la vista significa posición más rápida y estable entre edificios o bajo árboles.

¿Qué significa -162 dBm? Es una potencia de unos 6 × 10⁻²⁰ W, absurdamente baja. La señal GPS llega a la superficie con unos -130 dBm a cielo abierto; cada pared o losa de hormigón le quita entre 10 y 20 dB. Un receptor que sigue funcionando a -162 dBm tiene unos 30 dB de margen para perder: eso explica que pueda mantener posición bajo techo, aunque le cueste más conseguirla.

Los pines del GP-02 y la batería de respaldo

La placa del GP-02 tiene seis pines:

  • N/F: control de apagado, con pull up interno. Se deja sin conectar.
  • RX: recibe comandos desde el ESP32.
  • TX: envía los datos GPS al ESP32.
  • GND: tierra.
  • VCC: alimentación a 3,3 V.
  • PPS: un pulso por segundo sincronizado con la hora GPS. No se usa acá, pero es muy útil para aplicaciones de tiempo preciso.

En la placa hay además una batería de respaldo chiquita, y es la razón de que el GPS enganche rápido después de la primera vez. Sin ella, cada encendido es un arranque en frío: el módulo no sabe la hora, ni dónde está, ni qué satélites tiene encima, y tiene que descargar el almanaque y las efemérides desde cero (la transmisión es lentísima, 50 bits por segundo, y una efeméride completa tarda unos 30 s en llegar). Con la batería, la memoria interna conserva la última hora, posición y órbitas, y el siguiente encendido es un arranque en caliente de 2 a 3 s.

Cableado

Este cableado es el mismo para las tres etapas: no cambia ni un cable.

Componente Pin del componente Pin del XIAO ESP32-C3
OLED SSD1306 VCC 3V3
OLED SSD1306 GND GND
OLED SSD1306 SDA D4
OLED SSD1306 SCL D5
GPS GP-02 VCC 3V3
GPS GP-02 GND GND
GPS GP-02 TX D7 (RX del ESP32)
GPS GP-02 RX D6 (TX del ESP32)

El error que más tiempo hace perder: TX y RX van cruzados. El que habla (TX del GPS) se conecta con el que escucha (RX del ESP32), y al revés. Si los conectas derecho, no llega ningún dato y nada te avisa por qué.

Entorno y librerías

El autor usó Arduino IDE 2.3.6 con el paquete de placas ESP32 2.0.11 y recomienda esas versiones, porque otras pueden dar errores inesperados. Instala desde el gestor de librerías TinyGPSPlus y las librerías de la OLED (Adafruit SSD1306 y Adafruit GFX).

Lo que hace el código

Un GPS no entrega números limpios: manda frases NMEA, texto plano a 9600 baudios que se ve así:

Text
$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W

Esa frase dice, en orden: hora UTC 12:35:19, estado A (válido), latitud 48° 07,038' N, longitud 11° 31,000' E, velocidad 22,4 nudos, rumbo 84,4°, fecha 23-03-1994 y declinación magnética 3,1° W. Fíjate que la latitud viene en grados y minutos decimales, no en grados decimales: 4807.038 son 48 grados más 7,038 minutos, o sea 48,1173°. Ese es exactamente el tipo de conversión que TinyGPSPlus hace por ti, junto con validar la suma de verificación de cada frase.

La comunicación con el GPS usa el UART por hardware del ESP32-C3, con nombres para el puerto y los pines:

C++
#define gpsSerial Serial1
#define RX_PIN D7
#define TX_PIN D6
C++
gpsSerial.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN);

9600 baudios es la velocidad de fábrica del GP-02 y SERIAL_8N1 es el formato estándar: 8 bits de datos, sin paridad, 1 bit de parada. Usar Serial1 (UART por hardware) en vez de un puerto serie por software importa: el hardware recibe los bytes en paralelo con tu programa y no los pierde aunque el loop esté ocupado dibujando en la pantalla.

El corazón del programa le pasa a TinyGPSPlus cada carácter que llega, uno por uno, y actualiza la pantalla cuando se completa una frase:

C++
while (gpsSerial.available() > 0) {
  if (gps.encode(gpsSerial.read())) {
    displayLocationInfo();
  }
}

Y la línea que separa un proyecto confiable de uno que muestra basura:

C++
if (gps.location.isValid()) {
  display.println(gps.location.lat(), 6);
}

Recién encendido, el GPS manda frases aunque todavía no tenga posición, con coordenadas vacías o en cero. Sin este chequeo verías coordenadas falsas y pensarías que algo está roto. Con él, la pantalla dice "Invalid" hasta tener un fix confirmado. El 6 del println son los decimales: 6 decimales de grado equivalen a unos 11 cm en latitud, más que suficiente para la precisión real de 2 m.

Además de las coordenadas, TinyGPSPlus entrega gps.speed.kmph(), gps.altitude.meters(), gps.satellites.value() y la hora y fecha (gps.time.hour(), gps.date.day(), etc.). La hora es un regalo que poca gente aprovecha: los satélites llevan relojes atómicos, así que tienes hora UTC exacta sin internet, sin NTP y sin módulo RTC. Para un registrador de datos es oro. Ojo con la altitud: la que calcula un GPS es varias veces menos precisa que la horizontal, así que no esperes centímetros.

Cómo alimentarlo

  1. USB del computador: lo más simple para desarrollar.
  2. Batería LiPo soldada a los pads del XIAO: la opción para un rastreador de bolsillo. El XIAO la carga solo cuando conectas el USB-C. Una LiPo chica de 200 mAh basta para pruebas; con OLED y GPS encendidos (unos 60 a 80 mA en total contando el ESP32) dura del orden de dos a tres horas.
  3. Fuente externa: el autor usó una placa de desarrollo propia con un regulador de 5 V y 3 A que acepta de 9 a 28 V, alimentada con un pack de litio 4S para las pruebas en terreno.

Prueba bajo techo y al aire libre

Rastreador GPS mostrando en la pantalla OLED el estado del GPS en tiempo real

La primera prueba del autor fue en un primer piso, sin ventanas y con solo la losa del techo encima. Lo que se vio en la pantalla es una buena lección de cómo funciona un GPS:

  1. Al encender: latitud y longitud "Invalid", cero satélites, hora 00:00:00.
  2. Primero apareció la hora UTC, todavía sin posición ni satélites contados. Para la hora basta con decodificar la señal de un satélite; para la posición hacen falta al menos cuatro (tres coordenadas más el error del reloj del receptor).
  3. Después llegó la fecha.
  4. A los tres minutos aproximadamente, fix válido con cuatro satélites, y al rato subió a cinco.

Al aire libre, después de cortar la alimentación por completo, la hora y la fecha aparecieron en dos segundos y el fix llegó casi de inmediato gracias a la batería de respaldo (arranque en caliente). Con unos segundos más el conteo subió a 14, después a 16 y terminó en 19 satélites.

Prueba de bloqueo de antena

Con 19 satélites, el autor tapó la antena con la mano: no cambió nada. Con una olla de acero encima, bajó a 18 y 17 y volvió a 19. Dada vuelta hacia el suelo, osciló entre 18 y 17. Al volverla a su posición, 19 otra vez.

Prueba de recepción GPS tapando la antena con una olla de acero

Prueba del GPS con la antena dada vuelta, apuntando lejos del cielo

Que la olla no corte la señal no es magia: una olla apoyada no es una jaula de Faraday cerrada, y las señales de 1,5 GHz entran por los bordes y se reflejan en el entorno. Lo importante de la prueba es otra cosa: el conteo de satélites es tu indicador de salud. Dentro de una casa de dos pisos el módulo mantuvo 11 satélites, bajaba al tapar la antena con la mano y se recuperaba al destaparla. En terreno, edificios y árboles te van a hacer exactamente eso.

Etapa 2: los datos al celular por Bluetooth Low Energy

Mismo hardware, mismo cableado; solo cambia el programa. El ESP32 se anuncia por BLE con el nombre GPS_TRACKER y, una vez por segundo, arma un texto con latitud, longitud, velocidad y altitud separadas por comas (algo como 24.860734,67.001136,8.2,34.7) y lo envía al teléfono como notificación de una característica BLE.

¿Por qué notificaciones y no que el teléfono pregunte? Porque con notify el teléfono se suscribe una vez y el ESP32 empuja el dato cuando lo tiene, sin ida y vuelta. Es más rápido y consume menos en ambos lados. Un detalle a cuidar: el tamaño de un paquete BLE por defecto deja 20 bytes útiles; el ejemplo de arriba tiene 28 caracteres, así que funciona solo porque el teléfono negocia un MTU más grande al conectarse. Si alguna app recibe el texto cortado, ese es el motivo.

Interfaz de la app móvil mostrando los datos GPS en vivo del rastreador

Con la app Android del autor, la prueba caminando, corriendo y en auto mostró la posición actualizándose en tiempo real. En el auto comparó la velocidad del GPS contra el velocímetro.

Comparación de la velocidad medida por el GPS con el velocímetro del auto

Si haces la misma comparación, no te extrañes de que el velocímetro marque algo más: los fabricantes los calibran para que nunca muestren menos que la velocidad real, y la del GPS (calculada por efecto Doppler, no derivando posiciones) suele ser la más exacta de las dos.

Etapa 3: la ruta sobre un mapa

La tercera etapa lleva las coordenadas a un mapa en el teléfono, en dos versiones:

  • Gratis: sin API key, sin cuenta de facturación y sin cobros mensuales, ideal para partir.
  • Con imagen satelital de Google Maps: calles, edificios y terreno reales. Requiere crear una API key en Google Cloud, y el tutorial original muestra el proceso paso a paso.

Lectura de altitud en vivo del rastreador GPS durante la prueba en una azotea

El autor también llevó el rastreador a una azotea y a un cerro a un kilómetro de su casa para ver subir la altitud en tiempo real. La configuración de la app y de la API key no alcanzó a llegar completa a esta versión: para esa parte sigue la sección final del artículo original (enlazado en Recursos).

Si vas a usar la API de Google, restringe la clave a tu app (por nombre de paquete y huella del certificado) antes de compilarla: una API key de Maps sin restricciones dentro de un APK se puede extraer, y el cobro va a tu cuenta.

Variantes y mejoras

  • Una prueba en ruta chilena con registro a microSD. Agrega un módulo microSD por SPI y guarda cada segundo una línea CSV con hora UTC, latitud, longitud, velocidad y satélites. Recorre un tramo conocido (por ejemplo, un trayecto en auto por una autopista urbana con túneles, o una subida a un cerro de tu ciudad) y después abre el CSV en Google My Maps o en uMap de OpenStreetMap. Vas a ver exactamente dónde se pierde la señal y cuánto tarda en recuperarse al salir de un túnel.
  • Bajar el consumo para que dure días. Saca la OLED, pon el ESP32-C3 en deep sleep entre envíos y usa el pin N/F del GP-02 para mandarlo a standby (8 µA) cuando no lo necesites. Gracias a la batería de respaldo, cada despertar es un arranque en caliente de pocos segundos. Con una lectura cada cinco minutos, una LiPo de 1000 mAh pasa de horas a días.
  • Sin teléfono cerca: LoRa. Si quieres seguir algo que se aleja (un auto, una bicicleta en un cerro), reemplaza el BLE por un módulo LoRa en la banda AU915, la que corresponde en Chile. Con antenas decentes alcanza kilómetros sin SIM ni cobertura celular.

Personalización para Chile

En Chile puedes armar este rastreador con componentes de MechatronicStore. Busca en el catálogo:

  • Seeed Studio XIAO ESP32-C3: la placa del proyecto, con BLE y cargador LiPo integrados.
  • Módulo GPS: si no encuentras el GP-02 de AI Thinker, el NEO-6M (u-blox) es la alternativa clásica y funciona con exactamente el mismo cableado, la misma velocidad de 9600 baudios y la misma librería TinyGPSPlus. Es menos sensible que el GP-02 y solo recibe la constelación GPS, así que bajo techo le va a costar más: haz las pruebas cerca de una ventana o al aire libre. Muchas versiones traen también batería de respaldo y antena cerámica externa.
  • Pantalla OLED 0.96" SSD1306 I2C: la pantalla de la etapa 1.
  • Batería LiPo 3.7V: para el rastreador portátil, soldada a los pads del XIAO.
  • Jumpers macho hembra y protoboard: para el cableado de prueba antes de soldar todo en un montaje compacto.

Si en el tutorial original usan la placa de desarrollo propia del autor (con XIAO ESP32-C3 y ESP32-C6), no la necesitas: el XIAO solo, cableado como en la tabla de arriba, cumple la misma función.

Recursos

Versión chilena con componentes en stock local.