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:

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á.

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 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í:
$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:
#define gpsSerial Serial1
#define RX_PIN D7
#define TX_PIN D6
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:
while (gpsSerial.available() > 0) {
if (gps.encode(gpsSerial.read())) {
displayLocationInfo();
}
}
Y la línea que separa un proyecto confiable de uno que muestra basura:
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
- USB del computador: lo más simple para desarrollar.
- 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.
- 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

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:
- Al encender: latitud y longitud "Invalid", cero satélites, hora 00:00:00.
- 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).
- Después llegó la fecha.
- 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.


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.

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.

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.

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
- Tutorial original (inglés): I Built the Smallest GPS Tracker; Tracks on Google Maps Satellite, No SIM Card, de Shahzada Fahad en Electronic Clinic. Esta versión está basada en él; ahí están el código completo de las tres etapas y la app.
- Librería TinyGPSPlus: github.com/mikalhart/TinyGPSPlus
- Librería de la OLED: Adafruit SSD1306 en GitHub
- Documentación del XIAO ESP32-C3: wiki de Seeed Studio
Versión chilena con componentes en stock local.







