Construye un Notificador de Destino GPS con Arduino UNO y Módulo NEO‑6M
Componentes y materiales
- Arduino UNO ×1
- Módulo GPS NEO‑6M ×1 (antena externa, EEPROM integrado, interfaz RS232 TTL, 3‑5 V, baudios por defecto 9600, frases NMEA estándar)
- LED genérico ×1
- Driver de motor dual H‑Bridge L293D (Texas Instruments) ×1
- Motor vibrador de disco (Solar Cockroach, Brown Dog Gadgets) ×1
- Protoboard Snap‑able (SparkFun) ×1
- Batería 9 V ×1
- Conector 9 V a jack barrel ×1
- Caja de proyecto ×1
- Cables jumper ×1
Herramientas necesarias
- Soldador
- Pelacables
Aplicaciones y servicios online
- Arduino IDE
Sobre el proyecto
Introducción: El problema y la solución
Los atascos de tráfico son una gran pérdida de tiempo y es imposible predecir con exactitud la duración de un trayecto. Este problema me afectó personalmente al mudarme a una ciudad hace dos meses: cada día pasaba más de dos horas atrapado en congestión (uso transporte público). Decidí aprovechar ese tiempo para crear algo útil: un notificador de destino que avisa cuando estás cerca de tu parada mediante un LED o una vibración.
La lógica es sencilla: obtienes la latitud y longitud de tu destino, calculas la distancia desde tu posición actual y, al estar dentro de un rango definido, activas el indicador.
Captura de latitud y longitud
Conecta el módulo NEO‑6M al Arduino UNO:
- VCC → VIN (5 V)
- GND → GND
- TX del GPS → Pin RX definido por SoftwareSerial (p. ej. pin 4)
- RX del GPS → Pin TX definido por SoftwareSerial (p. ej. pin 3)
Usa la librería TinyGPS++ para leer las coordenadas. El siguiente sketch muestra latitud y longitud en el monitor serie a 9600 baudios:
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
void setup() {
Serial.begin(9600);
ss.begin(GPSBaud);
}
void loop() {
while (ss.available() > 0) {
gps.encode(ss.read());
if (gps.location.isUpdated()) {
Serial.print("Latitud= ");
Serial.print(gps.location.lat(), 6);
Serial.print(" Longitud= ");
Serial.println(gps.location.lng(), 6);
}
}
}
Nota: La primera fijación puede tardar unos minutos; el LED del módulo parpadea cuando recibe señal.
Notificador de destino con LED
Una vez conocidas las coordenadas del destino, se calcula la distancia con TinyGPSPlus::distanceBetween(). Si la distancia (en km) es menor al umbral (ej. 0,05 km = 50 m), se enciende el LED del pin 13.
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
unsigned long last = 0UL;
int ledPin = 13;
void setup() {
Serial.begin(115200);
ss.begin(GPSBaud);
pinMode(ledPin, OUTPUT);
}
void loop() {
while (ss.available() > 0) gps.encode(ss.read());
if (gps.location.isUpdated()) {
Serial.print(F(" Lat="));
Serial.print(gps.location.lat(), 6);
Serial.print(F(" Long="));
Serial.println(gps.location.lng(), 6);
} else if (millis() - last > 5000) {
if (gps.location.isValid()) {
static const double Dest_LAT = 18.786254, Dest_LON = 73.880798; // Cambia a tus coordenadas
double distanceToDest = TinyGPSPlus::distanceBetween(gps.location.lat(), gps.location.lng(), Dest_LAT, Dest_LON);
Serial.print(F("Distancia a destino = "));
Serial.print(distanceToDest / 1000, 6);
if (distanceToDest / 1000 < 0.050000) digitalWrite(ledPin, HIGH);
else digitalWrite(ledPin, LOW);
}
if (gps.charsProcessed() < 10) Serial.println(F("AVISO: Sin datos GPS. Revisa conexiones."));
last = millis();
}
}
Versión final con motor vibrador
Para una notificación táctil, se usa el driver L293D para controlar un pequeño motor vibrador. Conexiones clave del L293D:
- 5 V → Enable 1, Vs, Vss
- Pines digitales 6 y 7 → Input 1 e Input 2
- GND Arduino → Ambos pines GND del mismo lado del L293D
- Output 1 y Output 2 → Bornes del motor
El código es idéntico al anterior, pero en lugar del LED se activan los pines 6 y 7 para hacer vibrar el motor:
// ... mismas includes y configuración ...
int motorpin1 = 6;
int motorpin2 = 7;
void setup() {
// ...
pinMode(motorpin1, OUTPUT);
pinMode(motorpin2, OUTPUT);
}
void loop() {
// ... mismo bucle ...
if (distanceToDest / 1000 < 0.050000) {
digitalWrite(motorpin1, LOW);
digitalWrite(motorpin2, HIGH); // Vibración
} else {
digitalWrite(motorpin1, HIGH);
digitalWrite(motorpin2, HIGH); // Parado
}
}
¡Disfruta construyendo tu propio notificador de destino!
Código completo
Read_Lat_Lng.ino– Captura de coordenadasDestination_notifier_LED.ino– Notificación por LEDDestination_notifier_motor.ino– Notificación por motor vibrador
Esquemas (Fritzing)
read_lat_lng_l3VSL54w0k.fzzdestination_notifier_led_c7qaqTImXg.fzzdestination_notifier_motor_fGc8OV6Y0w.fzz
Proceso de manufactura
- Proyecto Dados Digitales Arduino: Construye tu Propio Generador de Números Aleatorios con LCD
- Generador de Ondas JX – Oscilador DDS Compatible con Arduino con Pantalla OLED
- Construye un Iron Man animado con Arduino: componentes, sensores y guía paso a paso
- Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
- Construye un Brazo Robótico Impreso en 3D Controlado por Arduino – Guía Paso a Paso
- Conectar Arduino Mega a módulo GPS NEO‑6M: Guía paso a paso
- Controlador de Humidificador DIY con Arduino y Relé: Configuración Segura de Alto Voltaje
- Módulo GPS u-blox LEA‑6H 02: Guía de integración con Arduino y Python
- Pong Neón en Matriz NeoPixel con Arduino Nano
- Construye un volante joystick personalizado con Arduino para gaming
- Construye un Receptor FM Potente con Arduino y Módulo TEA5767