Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

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

Track ME : Traceur voiture Arduino Mega 2560 avec GPS et GPRS

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 UNOArduino MEGA
MOSI - 1151
MISO - 1250
SCK - 1352
SS - 1053
Track ME : Traceur voiture Arduino Mega 2560 avec GPS et GPRS

Shield GPRS

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

Track ME : Traceur voiture Arduino Mega 2560 avec GPS et GPRS

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

Track ME : Traceur voiture Arduino Mega 2560 avec GPS et GPRS

Module GPS

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

Track ME : Traceur voiture Arduino Mega 2560 avec GPS et GPRS

Alimentation

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

Track ME : Traceur voiture Arduino Mega 2560 avec GPS et GPRS

Code - Notes importantes

Bibliothèque GPRS : Modifications nécessaires pour Arduino Mega :

  1. Dans GSM.h : commenter #define UNO, décommenter #define MEGA
  2. 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) :

Track ME : Traceur voiture Arduino Mega 2560 avec GPS et GPRS

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

Track ME : Traceur voiture Arduino Mega 2560 avec GPS et GPRS
Track ME : Traceur voiture Arduino Mega 2560 avec GPS et GPRS

Processus de fabrication

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