Construire un Notificateur de Destination GPS avec Arduino UNO et Module NEO‑6M
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino UNO | 1 |
| Module GPS NEO-6M | 1 |
| LED (générique) | 1 |
| Pilote de moteur double pont en H L293D (Texas Instruments) | 1 |
| Moteur vibrant disque (Solar Cockroach) | 1 |
| Plaque d'essai modulable (SparkFun Snappable Protoboard) | 1 |
| Batterie 9V | 1 |
| Connecteur 9V vers Jack Barrel | 1 |
| Boîtier de projet | 1 |
| Fils de connexion (jumper wires) | 1 jeu |
Outils et machines nécessaires
- Fer à souder
- Dénudeur de fils
Applications et services en ligne
- Arduino IDE
À propos du projet
Introduction : Le problème et la solution
Les embouteillages représentent une perte de temps considérable. Il est impossible de prédire avec exactitude la durée d'un trajet. Confronté à ce problème lors de mon installation en ville il y a deux mois, je passais plus de deux heures par jour bloqué dans les bouchons. J'ai alors cherché à exploiter ce temps de manière productive.
En utilisant les transports en commun, j'ai imaginé un dispositif qui m'alerterait à l'approche de ma destination, me permettant de vaquer à d'autres occupations (lecture, formation en ligne, planification) sans risquer de rater mon arrêt.
J'ai donc conçu un notificateur de destination basé sur Arduino et un module GPS. Le principe est simple : lorsque l'on se trouve à proximité d'une destination programmée (définie par ses coordonnées GPS), le dispositif déclenche une alerte visuelle (LED) ou tactile (moteur vibrant).
La logique repose sur le calcul de la distance entre la position actuelle et la destination cible. Si cette distance tombe en dessous d'un seuil défini, la notification s'active.
Composants principaux et câblage
Module GPS NEO-6M
Ce module dispose d'une antenne externe et d'une EEPROM intégrée. Caractéristiques :
- Interface : RS232 TTL
- Alimentation : 3V à 5V
- Baudrate par défaut : 9600 bps
- Compatibilité phrases NMEA standard
Câblage NEO-6M vers Arduino UNO :
| Pin NEO-6M | Pin Arduino |
|---|---|
| VCC | VIN (5V) |
| RX | TX logiciel (pin 3 dans l'exemple) |
| TX | RX logiciel (pin 4 dans l'exemple) |
| GND | GND |
Pilote moteur L293D
Le L293D est un circuit intégré 16 broches capable de piloter deux moteurs DC simultanément dans les deux sens. Il convertit un signal de commande faible (sortie Arduino) en signal de puissance pour le moteur.
Bibliothèque TinyGPS++
Cette bibliothèque simplifie l'extraction des données GPS (position, date, heure, vitesse, cap, altitude, nombre de satellites, HDOP) à partir des trames NMEA.
Étape 1 : Capturer la latitude et la longitude de la destination
Avant de programmer le notificateur, il faut relever les coordonnées exactes de la destination. Utilisez le code ci-dessous pour afficher les coordonnées GPS sur le moniteur série.
Code de capture des coordonnées (Read_Lat_Lng.ino)
#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(F("Latitude= "));
Serial.print(gps.location.lat(), 6);
Serial.print(F(" Longitude= "));
Serial.println(gps.location.lng(), 6);
}
}
}
Note : Installez la bibliothèque TinyGPS++ via le gestionnaire de bibliothèques de l'IDE Arduino. Laissez le module GPS acquérir les satellites (la LED du module clignote dès la fixation).
Étape 2 : Notificateur par LED
Ce prototype allume une LED (broche 13) lorsque la distance à la destination est inférieure à 50 mètres (seuil modifiable).
Code notificateur LED (Destination_notifier_LED.ino)
#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;
const int ledPin = 13;
// Coordonnées de destination (à remplacer par les vôtres)
static const double Dest_LAT = 18.786254;
static const double Dest_LON = 73.880798;
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()) {
double distanceToDest = TinyGPSPlus::distanceBetween(
gps.location.lat(), gps.location.lng(),
Dest_LAT, Dest_LON
);
Serial.print(F("Distance à destination = "));
Serial.print(distanceToDest / 1000.0, 6);
Serial.println(F(" km"));
// Seuil : 0.050 km = 50 mètres
if (distanceToDest / 1000.0 < 0.050) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
if (gps.charsProcessed() < 10)
Serial.println(F("ATTENTION : Pas de données GPS. Vérifiez le câblage."));
last = millis();
}
}
Étape 3 : Version finale avec moteur vibrant
Pour une alerte discrète (idéal dans les transports), le moteur vibrant remplace la LED. Le L293D pilote le moteur via deux broches de commande (6 et 7).
Câblage du L293D pour le moteur vibrant
- 5V → Enable 1, Vs, Vss (broches 1, 8, 9, 16)
- Arduino Pin 6 → Input 1 (broche 2)
- Arduino Pin 7 → Input 2 (broche 7)
- GND Arduino → GND L293D (broches 4, 5, 12, 13)
- Output 1 (broche 3) & Output 2 (broche 6) → Bornes du moteur
Code notificateur moteur (Destination_notifier_motor.ino)
#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;
const int motorPin1 = 6;
const int motorPin2 = 7;
static const double Dest_LAT = 18.786254;
static const double Dest_LON = 73.880798;
void setup() {
Serial.begin(115200);
ss.begin(GPSBaud);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, 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()) {
double distanceToDest = TinyGPSPlus::distanceBetween(
gps.location.lat(), gps.location.lng(),
Dest_LAT, Dest_LON
);
Serial.print(F("Distance à destination = "));
Serial.print(distanceToDest / 1000.0, 6);
Serial.println(F(" km"));
if (distanceToDest / 1000.0 < 0.050) {
// Activation moteur (sens unique)
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
} else {
// Arrêt moteur
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, HIGH);
}
}
if (gps.charsProcessed() < 10)
Serial.println(F("ATTENTION : Pas de données GPS. Vérifiez le câblage."));
last = millis();
}
}
Schémas Fritzing
Trois fichiers Fritzing sont fournis pour le câblage :
read_lat_lng.fzz– Capture des coordonnéesdestination_notifier_led.fzz– Version LEDdestination_notifier_motor.fzz– Version moteur vibrant
Bon bricolage !
Processus de fabrication
- Dé numérique Arduino sur écran LCD 16x2 – Générateur aléatoire à bouton poussoir
- JX Wave Generator – Générateur DDS compatible Arduino avec affichage OLED
- Construire un Iron Man animé avec Arduino : capteurs, sons et relais
- Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
- Construire un bras robotique 3D fonctionnel piloté par Arduino – Guide pas à pas
- Connecter un module GPS NEO‑6M à l'Arduino Mega : Guide pas à pas
- Contrôleur d'humidificateur DIY avec Arduino et relais – Installation haute tension sécurisée
- Module GPS u-blox LEA‑6H 02 : guide d'intégration Arduino et Python
- Jeu Pong sur Matrice NeoPixel avec Arduino Nano