|

Rastreador vehicular con Arduino usando GPS y GSM

Por Saddam 

Vehicle Tracking System using GPS and Arduino

En nuestro artículo anterior aprendimos sobre “cómo conectar un módulo GPS con la computadora y cómo hacer un reloj actualizado por GPS”. En este proyecto damos un paso más con el GPS y vamos a rastrear un vehículo usando GPS y GSM. Este sistema de rastreo vehicular también puede usarse como sistema de alerta de detección de accidentes, sistema de rastreo de soldados y muchos más, con solo hacer algunos cambios en el hardware y el software.

El rastreo de un vehículo es un proceso en el que ubicamos la posición del vehículo en forma de latitud y longitud (coordenadas GPS). Las coordenadas GPS son el valor de una ubicación. Este sistema es muy eficiente para aplicaciones al aire libre.

Este tipo de proyecto de sistema de rastreo vehicular se usa ampliamente para rastrear taxis, vehículos robados, autobuses escolares, etc.

Componentes necesarios:

  • Arduino
  • Módulo GSM
  • Módulo GPS
  • LCD 16×2
  • Fuente de alimentación
  • Cables de conexión
  • Potenciómetro de 10 K

El módulo GPS y su funcionamiento:

GPS significa Sistema de Posicionamiento Global (Global Positioning System) y se usa para detectar la latitud y la longitud de cualquier ubicación en la Tierra, con la hora UTC exacta (Tiempo Universal Coordinado). El módulo GPS es el componente principal en nuestro proyecto de rastreo vehicular. Este dispositivo recibe las coordenadas del satélite cada segundo, junto con la fecha y la hora.

GPS module SKG13BL

El módulo GPS envía los datos relacionados con la posición de rastreo en tiempo real, y envía muchos datos en formato NMEA (vea la captura de pantalla abajo). El formato NMEA consta de varias sentencias, de las cuales solo necesitamos una. Esta sentencia comienza con $GPGGA y contiene las coordenadas, la hora y otra información útil. Este GPGGA se refiere a los datos de posición fija del Sistema de Posicionamiento Global (Global Positioning System Fix Data). Conoce más sobre cómo leer datos GPS y sus cadenas aquí.

Podemos extraer las coordenadas de la cadena $GPGGA contando las comas en la cadena. Supongamos que encuentras la cadena $GPGGA y la guardas en un arreglo: la latitud se encuentra después de dos comas y la longitud después de cuatro comas. Ahora estas latitud y longitud pueden colocarse en otros arreglos.

GPS-module data in arduino serial monitor

A continuación se muestra la cadena $GPGGA, junto con su descripción:

$GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,,*47

$GPGGA,HHMMSS.SSS,latitude,N,longitude,E,FQ,NOS,HDP,altitude,M,height,M,,checksum data

IdentificadorDescripción
$GPGGADatos de posición fija del Sistema de Posicionamiento Global
HHMMSS.SSSHora en formato horas, minutos, segundos y milisegundos.
LatitudeLatitud (coordenada)
NDirección N=Norte, S=Sur
LongitudeLongitud (coordenada)
EDirección E=Este, W=Oeste
FQDatos de calidad de la fijación (Fix Quality)
NOSNúmero de satélites en uso
HPDDilución horizontal de la precisión
AltitudeAltitud sobre el nivel del mar
MMetros
HeightAltura
ChecksumDatos de suma de comprobación

Explicación del circuito:

Las conexiones del circuito de este proyecto de sistema de rastreo vehicular son sencillas. Aquí el pin Tx del módulo GPS se conecta directamente al pin digital número 10 del Arduino. Usando la librería Software Serial habilitamos la comunicación serial en los pines 10 y 11, hacemos que sean Rx y Tx respectivamente y dejamos libre el pin Rx del módulo GPS. De forma predeterminada, los pines 0 y 1 del Arduino se usan para la comunicación serial, pero usando la librería SoftwareSerial podemos habilitar la comunicación serial en otros pines digitales del Arduino. Se usa una alimentación de 12 voltios para energizar el módulo GPS.

Arduino based Vehicle Tracker using GPS and GSM circuit diagram

Los pines Tx y Rx del módulo GSM se conectan directamente a los pines Rx y Tx del Arduino. El módulo GSM también se alimenta con 12v. Los pines de datos D4, D5, D6 y D7 de una LCD opcional se conectan a los pines número 5, 4, 3 y 2 del Arduino. Los pines de comando RS y EN de la LCD se conectan a los pines número 2 y 3 del Arduino, y el pin RW se conecta directamente a tierra. También se usa un potenciómetro para ajustar el contraste o el brillo de la LCD.

Explicación del funcionamiento:

En este proyecto se usa el Arduino para controlar todo el proceso junto con un receptor GPS y un módulo GSM. El receptor GPS se usa para detectar las coordenadas del vehículo, y el módulo GSM se usa para enviar las coordenadas al usuario por SMS. También se usa una LCD 16×2 opcional para mostrar mensajes de estado o coordenadas. Hemos usado el módulo GPS SKG13BL y el módulo GSM SIM900A.

GPS and GSM based Vehicle Tracking System Block Diagram

Cuando el hardware está listo después de programarlo, podemos instalarlo en nuestro vehículo y encenderlo. Luego solo necesitamos enviar un SMS, “Track Vehicle”, al sistema colocado en nuestro vehículo. También podemos usar algún prefijo (#) o sufijo (*) como #Track Vehicle*, para identificar correctamente el inicio y el final de la cadena, tal como hicimos en estos proyectos: Automatización del hogar basada en GSM y tablero de anuncios inalámbrico

El mensaje enviado lo recibe el módulo GSM conectado al sistema, que envía los datos del mensaje al Arduino. El Arduino lo lee y extrae el mensaje principal del mensaje completo. Luego lo compara con el mensaje predefinido en el Arduino. Si hay coincidencia, el Arduino lee las coordenadas extrayendo la cadena $GPGGA de los datos del módulo GPS (el funcionamiento del GPS se explicó arriba) y las envía al usuario mediante el módulo GSM. Este mensaje contiene las coordenadas de la ubicación del vehículo.

Explicación de la programación:

En la parte de programación, primero incluimos las librerías y definimos los pines para la LCD y la comunicación serial por software. También definimos algunas variables con arreglos para almacenar datos. La librería Software Serial se usa para habilitar la comunicación serial en los pines 10 y 11.

#include<LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

#include <SoftwareSerial.h>
SoftwareSerial gps(10,11); // RX, TX
char str[70];
String gpsString="";
... ....
.... ....

Aquí el arreglo str[70] se usa para almacenar el mensaje recibido del módulo GSM y gpsString se usa para almacenar la cadena GPS. char *test=”$GPGGA” se usa para comparar la cadena correcta que necesitamos para las coordenadas.

Después hemos inicializado la comunicación serial, la LCD y los módulos GSM y GPS en la función setup, y mostramos un mensaje de bienvenida en la LCD.

void setup()
{
  lcd.begin(16,2);
  Serial.begin(9600);
  gps.begin(9600);

  lcd.print("Vehicle Tracking");
  lcd.setCursor(0,1);
  ... ....
  .... ....

En la función loop recibimos el mensaje y la cadena GPS.

void loop()
{
  serialEvent();
  if(temp)
  {
    get_gps();
    tracking();
  }
}

Las funciones void init_sms y void send_sms() se usan para inicializar y enviar el mensaje. Usa un número de celular válido de 10 dígitos en la función init_sms.  

La función void get_gps() se ha usado para extraer las coordenadas de la cadena recibida.

La función void gpsEvent() se usa para recibir los datos GPS en el Arduino.

La función void serialEvent() se usa para recibir el mensaje del GSM y comparar el mensaje recibido con el mensaje predefinido (Track Vehicle).

void serialEvent()
{
  while(Serial.available())
  {
    if(Serial.find("Track Vehicle"))
    {
      temp=1;
      break;
    }
    ... ....
    .... ...

La función de inicialización ‘gsm_init() se usa para inicializar y configurar el módulo GSM. Primero se comprueba si el módulo GSM está conectado o no, enviándole el comando ‘AT’. Si se recibe la respuesta OK, significa que está listo. El sistema sigue comprobando el módulo hasta que esté listo o hasta recibir ‘OK’. Luego se desactiva el ECO enviándole el comando ATE0; de lo contrario, el módulo GSM haría eco de todos los comandos. Finalmente se comprueba la disponibilidad de red mediante el comando ‘AT+CPIN?’: si la tarjeta insertada es una SIM y el PIN está presente, da la respuesta +CPIN: READY. Esto también se comprueba repetidamente hasta encontrar la red. Esto se entiende claramente en el video de abajo.

Consulta todas las funciones anteriores en la sección de código a continuación.

#include<LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

#include <SoftwareSerial.h>
SoftwareSerial gps(10,11); // RX, TX

//String str=””;
char str[70];
String gpsString=””;

char *test=”$GPGGA”;

String latitude=”No Range      “;
String longitude=”No Range     “;

int temp=0,i;
boolean gps_status=0;

void setup() 
{
  lcd.begin(16,2);
  Serial.begin(9600);
  gps.begin(9600);

  lcd.print(“Vehicle Tracking”);
  lcd.setCursor(0,1);
  lcd.print(”    System      “);
  delay(2000);
  gsm_init();
  lcd.clear();
  Serial.println(“AT+CNMI=2,2,0,0,0”);
  lcd.print(“GPS Initializing”);
  lcd.setCursor(0,1);
  lcd.print(”  No GPS Range  “);
  get_gps();
  delay(2000);
  lcd.clear();
  lcd.print(“GPS Range Found”);
  lcd.setCursor(0,1);
  lcd.print(“GPS is Ready”);
  delay(2000);
  lcd.clear();
  lcd.print(“System Ready”);
  temp=0;
}

void loop()
{
  serialEvent();
  if(temp)
  {
    get_gps();
    tracking();
  }
}

void serialEvent()
{
  while(Serial.available())
  {
    if(Serial.find(“Track Vehicle”))
    {
      temp=1;
      break;
    }
    else
    temp=0;
  }
}

void gpsEvent()
{
  gpsString=””;
  while(1)
  {
   while (gps.available()>0)            //checking serial data from GPS
   {
    char inChar = (char)gps.read();
     gpsString+= inChar;                    //store data from GPS into gpsString
     i++;
     if (i < 7)                      
     {
      if(gpsString[i-1] != test[i-1])         //checking for $GPGGA sentence
      {
        i=0;
        gpsString=””;
      }
     }
    if(inChar==’\r’)
    {
     if(i>65)
     {
       gps_status=1;
       break;
     }
     else
     {
       i=0;
     }
    }
  }
   if(gps_status)
    break;
  }
}

void gsm_init()
{
  lcd.clear();
  lcd.print(“Finding Module..”);
  boolean at_flag=1;
  while(at_flag)
  {
    Serial.println(“AT”);
    while(Serial.available()>0)
    {
      if(Serial.find(“OK”))
      at_flag=0;
    }
    
    delay(1000);
  }

  lcd.clear();
  lcd.print(“Module Connected..”);
  delay(1000);
  lcd.clear();
  lcd.print(“Disabling ECHO”);
  boolean echo_flag=1;
  while(echo_flag)
  {
    Serial.println(“ATE0”);
    while(Serial.available()>0)
    {
      if(Serial.find(“OK”))
      echo_flag=0;
    }
    delay(1000);
  }

  lcd.clear();
  lcd.print(“Echo OFF”);
  delay(1000);
  lcd.clear();
  lcd.print(“Finding Network..”);
  boolean net_flag=1;
  while(net_flag)
  {
    Serial.println(“AT+CPIN?”);
    while(Serial.available()>0)
    {
      if(Serial.find(“+CPIN: READY”))
      net_flag=0;
    }
    delay(1000);
  }
  lcd.clear();
  lcd.print(“Network Found..”);
  delay(1000);
  lcd.clear();
}

void get_gps()
{
   gps_status=0;
   int x=0;
   while(gps_status==0)
   {
    gpsEvent();
    int str_lenth=i;
    latitude=””;
    longitude=””;
    int comma=0;
    while(x<str_lenth)
    {
      if(gpsString[x]==’,’)
      comma++;
      if(comma==2)        //extract latitude from string
      latitude+=gpsString[x+1];     
      else if(comma==4)        //extract longitude from string
      longitude+=gpsString[x+1];
      x++;
    }
    int l1=latitude.length();
    latitude[l1-1]=’ ‘;
    l1=longitude.length();
    longitude[l1-1]=’ ‘;
    lcd.clear();
    lcd.print(“Lat:”);
    lcd.print(latitude);
    lcd.setCursor(0,1);
    lcd.print(“Long:”);
    lcd.print(longitude);
    i=0;x=0;
    str_lenth=0;
    delay(2000);
   }
}

void init_sms()
{
  Serial.println(“AT+CMGF=1”);
  delay(400);
  Serial.println(“AT+CMGS=\”+91**********\””);   // use your 10 digit cell no. here
  delay(400);
}

void send_data(String message)
{
  Serial.println(message);
  delay(200);
}

void send_sms()
{
  Serial.write(26);
}

void lcd_status()
{
  lcd.clear();
  lcd.print(“Message Sent”);
  delay(2000);
  lcd.clear();
  lcd.print(“System Ready”);
  return;
}

void tracking()
{
init_sms();
send_data(“Vehicle Tracking Alert:”);
send_data(“Your Vehicle Current Location is:”);
Serial.print(“Latitude:”);
send_data(latitude);
Serial.print(“Longitude:”);
send_data(longitude);
send_data(“Please take some action soon..\nThankyou”);
send_sms();
delay(2000);
lcd_status();
}

Artículo traducido al español. Fuente original: Circuit Digest

Similar Posts

Deja un comentario