Track ME : Traceur voiture Arduino Mega 2560 avec GPS et GPRS
Composants et fournitures
| Arduino Mega 2560 | × | 1 |
| Module GPS NEO 6 | × | 1 |
| Shield carte SD Adafruit | × | 1 |
| Shield GPRS Seeedstudio V2.0 | × | 1 |
| Fils de connexion (jumpers) | × | 1 |
| Batterie 9V | × | 1 |
| Boîtier plastique | × | 1 |
À propos du projet
Il y a quelque temps, j'ai décidé de construire un traceur voiture/personnel. Voici mon premier prototype dans cette direction.
Le système est très simple : un Arduino Mega, un GPS, un shield GPRS et un shield carte SD (optionnel, inclus pour un défi entre amis : ils appellent le système et reçoivent un SMS avec ma position ou ma dernière position connue).
Le système recherche en permanence la position actuelle. Si quelqu'un appelle le numéro de la carte SIM, le système envoie un SMS avec la position actuelle et un lien Google Maps. Exemple :
Hugo location is now: Lat: 54.315010, Log: 10.130997. https://maps.google.com/maps?q=54.315010,+10.130997
Si le GPS ne reçoit pas de position, le système envoie la dernière position connue :
I can not seem to find Hugo. Last time that I've saw him, was in: Lat: 54.315010, Log: 10.130997. https://maps.google.com/maps?q=54.315010,+10.130997
La date, l'heure, la position et le statut SMS sont stockés sur la carte SD.
Composants détaillés
- 1× Arduino MEGA
- 1× Shield GPRS (autres shields GSM compatibles possibles)
- 1× GPS (NEO 6, très populaire sur eBay)
- 1× Shield carte SD
- 1× Batterie 9V
- 1× Boîtier plastique
- Quelques fils

Connexion des composants
L'Arduino Mega ayant un brochage différent, des recâblages sont nécessaires.
Shield carte SD (conçu pour Arduino Uno)
Les pins SPI Uno (10-13) doivent être redirigés vers les pins SPI Mega :
| Arduino UNO | Arduino MEGA |
|---|---|
| MOSI - 11 | 51 |
| MISO - 12 | 50 |
| SCK - 13 | 52 |
| SS - 10 | 53 |

Shield GPRS
Configurer les pins de communication sur Software Serial via le jumper J7 du shield.

Relier pins 7 et 8 du shield GPRS au Serial1 de l'Arduino Mega (pins 18 et 19).

Module GPS
Connecté au Serial2 (pins 16 et 17) de l'Arduino Mega. Alimentation 5V et GND prises sur le shield SD.

Alimentation
Batterie 9V sur pin Vin ou prise jack d'alimentation.

Code - Notes importantes
Bibliothèque GPRS : Modifications nécessaires pour Arduino Mega :
- Dans
GSM.h: commenter#define UNO, décommenter#define MEGA - Dans
HWSerial.h: décommenter#define MEGA
Bibliothèque GPS : TinyGPS++
Logique du programme : Après initialisation (GPRS, GPS, carte SD), le GPS détermine le nombre de satellites et une position valide. Si appel pendant cette phase → rejeté. Si position valide + >3 satellites + appel → SMS avec position actuelle + stockage SD. Si <3 satellites + appel → SMS avec dernière position connue + stockage SD.
Avantages et inconvénients
Inconvénients (prototype) :
- Autonomie batterie : ~1 heure seulement (pas de gestion d'énergie, mode veille indispensable pour améliorer)
- Taille encombrante → conception d'un nouveau PCB en cours

Merci pour votre lecture. N'hésitez pas à signaler erreurs ou suggérer des améliorations.
Hugo Gomes
Code source complet
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
#include "call.h"
#include <TinyGPS++.h>
// Pour changer pins Software/Hardware Serial, voir lignes 27-28 dans GSM.cpp
// Pour Arduino Mega : définir MEGA ligne 5 dans GSM.h
#include <SPI.h>
#include <SD.h>
const int chipSelect = 53; // Pin CS Mega
CallGSM call;
SMSGSM sms;
char number[20];
byte stat = 0;
int value = 0;
char value_str[5];
// Variables GPS
TinyGPSPlus gps;
const char *googlePrefix = "https://maps.google.com/maps?q=";
double Lat, Long;
int day, month, year, hour, minute, second;
int num_sat;
boolean one_point_true = false;
void setup() {
Serial.begin(9600);
Serial.print(F("Starting GSM..."));
if (gsm.begin(9600)) Serial.println(F("READY"));
else Serial.println(F("IDLE"));
Serial.println(F("Starting GPS"));
Serial2.begin(9600); // Port série GPS
Serial.print(F("Initializing SD card..."));
pinMode(53, OUTPUT);
if (!SD.begin(chipSelect)) {
Serial.println(F("Card failed, or not present"));
return;
}
Serial.println(F("card initialized."));
}
void loop() {
Get_GPS();
Check_call();
}
// Récupération position GPS
void Get_GPS() {
while (Serial2.available() > 0)
if (gps.encode(Serial2.read()))
num_sat = gps.satellites.value();
if (gps.location.isValid()) {
Lat = gps.location.lat();
Long = gps.location.lng();
if (Lat != 0 && Long != 0) one_point_true = true;
}
if (gps.date.isValid()) {
day = gps.date.day();
month = gps.date.month();
year = gps.date.year();
}
if (gps.time.isValid()) {
hour = gps.time.hour();
minute = gps.time.minute();
second = gps.time.second();
}
smartDelay(500);
if (millis() > 5000 && gps.charsProcessed() < 10) {
Serial.println(F("No GPS detected: check wiring."));
while (true);
}
}
// Délai intelligent qui "nourrit" l'objet GPS
static void smartDelay(unsigned long ms) {
unsigned long start = millis();
do {
while (Serial2.available()) gps.encode(Serial2.read());
} while (millis() - start < ms);
}
// Vérification appel entrant
void Check_call() {
stat = call.CallStatusWithAuth(number, 0, 0);
if (stat == CALL_INCOM_VOICE_AUTH) {
delay(100);
call.HangUp(); // Rejeter l'appel
Send_SMS();
}
}
// Envoi SMS position actuelle ou dernière connue
void Send_SMS() {
int error;
char Date[13];
sprintf(Date, "%02d/%02d/%04d ", day, month, year);
char time1[10];
sprintf(time1, "%02d:%02d:%02d ", hour, minute, second);
delay(100);
char lat_print[10], Long_print[10];
dtostrf(Lat, 5, 6, lat_print);
dtostrf(Long, 5, 6, Long_print);
if (num_sat >= 3 && one_point_true) {
char sms_OK[160];
sprintf(sms_OK, "Hugo location is now: Lat: %s, Log: %s. %s%s,+%s\n", lat_print, Long_print, googlePrefix, lat_print, Long_print);
Serial.println(sms_OK);
error = sms.SendSMS(number, sms_OK);
delay(500);
Serial.println(error == 0 ? F("SMS ERROR") : F("SMS OK"));
} else if (num_sat < 3 && one_point_true) {
char sms_NOK[150];
sprintf(sms_NOK, "I can not seem to find Hugo. Last time that i've saw him, was in: Lat: %s, Log: %s. %s%s,+%s\n", lat_print, Long_print, googlePrefix, lat_print, Long_print);
Serial.println(sms_NOK);
error = sms.SendSMS(number, sms_NOK);
Serial.println(error == 0 ? F("SMS ERROR") : F("SMS OK"));
} else if (!one_point_true) {
Serial.println(F("No valid GPS point"));
}
// Sauvegarde sur carte SD
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.print(Date); dataFile.print(" "); dataFile.print(time1); dataFile.print(" ");
dataFile.print(number); dataFile.print(" "); dataFile.print(lat_print); dataFile.print(", ");
dataFile.print(Long_print); dataFile.print(" "); dataFile.print(error); dataFile.println();
dataFile.close();
} else {
Serial.println(F("error opening datalog.txt"));
}
}
Schémas


Processus de fabrication
- Construire un robot intelligent avec le Bridge Shield – Intégration Raspberry Pi & Arduino
- Système d'éclairage DMX piloté par web – Contrôleur maître Arduino
- Construire un Spybot Arduino piloté par Bluetooth
- UnifiedWater v1 – Kit complet de capteur de qualité d'eau Arduino
- Horloge HSV : Un Garde-Temps Vibrant et Personnalisable pour Passionnés d'Arduino
- Robot Chasse-Neige Avancé : Déneigement Autonome Télécommandé (Arduino + PS2)
- Système de vote portable avec connectivité GSM
- Jeu Whac-A-Mole DIY (Version Boutons) – Projet Arduino
- Jukebox moderne : Lecteur de musique Raspberry Pi & Arduino avec LED