|

Rastrear un vehículo en Google Maps con Arduino, ESP8266 y GPS

PorSaddam 

Rastreador de vehículos con Arduino usando ESP8266, GPS y Google Maps

El sistema de rastreo de vehículos se ha vuelto muy importante hoy en día, especialmente en caso de vehículos robados. Si tienes un sistema GPS instalado en tu vehículo, puedes rastrear la ubicación de tu vehículo, y eso ayuda a la policía a localizar los vehículos robados. Anteriormente construimos un proyecto similar en el que las coordenadas de ubicación del vehículo se envían a un teléfono celular; revísalo aquí ‘Rastreador de vehículos basado en Arduino usando GPS y GSM.

Aquí construiremos una versión más avanzada del sistema de rastreo de vehículos en la que puedes rastrear tu vehículo en Google Maps. En este proyecto enviaremos las coordenadas de ubicación al servidor local y solo necesitas abrir una ‘página web’ en tu computadora o móvil, donde encontrarás un enlace a Google Maps con las coordenadas de ubicación de tu vehículo. Cuando haces clic en ese enlace, te lleva a Google Maps mostrando la ubicación de tu vehículo. En este sistema de rastreo de vehículos usando Google Maps, el módulo GPS se usa para obtener las coordenadas de ubicación, el módulo Wi-Fi para seguir enviando datos a la computadora o móvil por Wi-Fi y el Arduino se usa para hacer que el GPS y el Wi-Fi se comuniquen entre sí.

rastreo de vehículo usando Google Maps

Cómo funciona:

Para rastrear el vehículo necesitamos encontrar las coordenadas del vehículo usando el módulo GPS. El módulo GPS se comunica continuamente con el satélite para obtener las coordenadas. Luego necesitamos enviar estas coordenadas desde el GPS a nuestro Arduino usando UART. Y después el Arduino extrae los datos requeridos de los datos recibidos del GPS.

Diagrama de bloques del sistema de rastreo de vehículos con Google Maps

Antes de esto, el Arduino envía comandos al módulo Wi-Fi ESP8266 para configurarlo y conectarlo al router y obtener la dirección IP. Después el Arduino inicializa el GPS para obtener las coordenadas y la LCD muestra un mensaje de ‘Actualizar página’. Eso significa que el usuario necesita actualizar la página web. Cuando el usuario actualiza la página web, el Arduino obtiene las coordenadas del GPS y las envía a la página web (servidor local) por Wi-Fi, con información adicional y un enlace de Google Maps en ella. Ahora, al hacer clic en este enlace, el usuario es redirigido a Google Maps con las coordenadas y luego obtendrá la ubicación actual del vehículo en el punto rojo del mapa de Google. Todo el proceso se muestra correctamente en el video al final.

Componentes requeridos:

  • Arduino UNO
  • Módulo Wi-Fi ESP8266
  • Módulo GPS
  • Cable USB
  • Cables de conexión
  • Laptop   
  • Fuente de alimentación
  • LCD 16×2
  • Protoboard
  • Router Wi-Fi

Explicación del circuito:

El circuito para este proyecto de ‘rastreo de vehículos usando Google Maps’ es muy simple y principalmente necesitamos un Arduino UNO, un módulo GPS y un módulo Wi-Fi ESP8266. Hay una LCD 16×2 conectada opcionalmente para mostrar el estado. Esta LCD se conecta a los pines 14-19 (A0-A5) del Arduino.

Diagrama del circuito del sistema de rastreo de vehículos usando Google Maps

Aquí el pin Tx del módulo GPS está conectado directamente al pin digital número 10 del Arduino. Usando la librería Software Serial aquí, hemos habilitado la comunicación serie en los pines 10 y 11, convirtiéndolos en Rx y Tx respectivamente, y dejamos el pin Rx del módulo GPS abierto. Por defecto, los pines 0 y 1 del Arduino se usan para la comunicación serie, pero usando la librería SoftwareSerial podemos permitir la comunicación serie en otros pines digitales del Arduino. Se usa un adaptador de 12 voltios para alimentar el módulo GPS. Revisa aquí para aprender “Cómo usar GPS con Arduino” y obtener las coordenadas.

Los pines Vcc y GND del módulo Wi-Fi ESP8266 están conectados directamente a 3.3V y GND del Arduino, y CH_PD también está conectado a 3.3V. Los pines Tx y Rx del ESP8266 están conectados directamente a los pines 2 y 3 del Arduino. La librería Software Serial también se usa aquí para permitir la comunicación serie en los pines 2 y 3 del Arduino. Ya cubrimos en detalle la interfaz del módulo Wi-Fi ESP8266 con Arduino; también revisa “Cómo enviar datos desde Arduino a una página web usando WiFi” antes de hacer este proyecto. A continuación se muestra la imagen del ESP8266:

ESP8266-Wi-Fi-module

El ESP8266 tiene dos LEDs, uno es rojo, para indicar la alimentación, y el segundo es azul, que es el LED de comunicación de datos. El LED azul parpadea cuando el ESP envía datos a través de su pin Tx. Además, no conectes el ESP a una fuente de +5 voltios, de lo contrario tu dispositivo puede dañarse. Aquí en este proyecto hemos seleccionado una velocidad de 9600 baudios para todas las comunicaciones UART.

El usuario también puede ver la comunicación entre el módulo Wi-Fi ESP8266 y el Arduino en el Monitor Serie, a una velocidad de 9600 baudios:

Arduino-Vehicle-Tracking-System-serial-monitor

Revisa también el video al final de este proyecto, para conocer el proceso de funcionamiento detallado. 

Conversión de coordenadas GPS de grados y minutos a grados decimales:

El módulo GPS recibe las coordenadas del satélite en formato de grados y minutos (ddmm.mmmm) y aquí necesitamos el formato de grados decimales para buscar la ubicación en Google Maps. Así que primero necesitamos convertir las coordenadas del formato de grados y minutos al formato de grados decimales usando la fórmula dada.

Supón que 2856.3465 (ddmm.mmmm) es la latitud que recibimos del módulo GPS. Ahora los primeros dos números son grados y los restantes son minutos.
Entonces 28 son los grados y 56.3465 son los minutos.

Ahora aquí no es necesario convertir la parte de los grados (28), sino solo convertir la parte de los minutos a grados decimales dividiendo entre 60:

Coordenada en grados decimales = Grados + Minutos/60

Coordenada en grados decimales = 28 + 56.3465/60

Coordenada en grados decimales = 28 + 0.94

Coordenada en grados decimales = 28.94

El mismo proceso se hará para los datos de longitud. Hemos convertido las coordenadas de grados y minutos a grados decimales usando las fórmulas anteriores en el sketch de Arduino:

float minut= lat_minut.toFloat();
minut=minut/60;
float degree=lat_degree.toFloat();
latitude=degree+minut;

minut= long_minut.toFloat();
minut=minut/60;
degree=long_degree.toFloat();
logitude=degree+minut;

Explicación de la programación:

En este código hemos usado la librería SerialSoftware para conectar el ESP8266 y el módulo GPS con el Arduino. Luego hemos definido diferentes pines para ambos e inicializamos el UART con una velocidad de 9600 baudios. También incluimos la librería LiquidCrystal para conectar la LCD con el Arduino.

#include<SoftwareSerial.h>
SoftwareSerial Serial1(2,3); //make RX arduino line is pin 2, make TX arduino line is pin 3.
SoftwareSerial gps(10,11);

#include<LiquidCrystal.h>
LiquidCrystal lcd(14,15,16,17,18,19);

Después de esto, necesitamos definir o declarar variables y cadenas para diferentes propósitos.

String webpage="";
int i=0,k=0;
int  gps_status=0;
String name="<p>1. Name: Your Name </p>";   //22
String dob="<p>2. DOB: 12 feb 1993</p>";     //21
String number="<p>4. Vehicle No.: RJ05 XY 4201</p>";//29
String cordinat="<p>Coordinates:</p>";          //17
String latitude="";
String logitude="";
String gpsString="";
char *test="$GPGGA";

Luego hemos creado algunas funciones para diferentes propósitos, como:

Función para obtener los datos del GPS con las coordenadas:

void gpsEvent()
{
  gpsString="";
  while(1)
  {
   while (gps.available()>0)
   {
    char inChar = (char)gps.read();
     gpsString+= inChar;
     if (i < 7)
     {
      if(gpsString[i-1] != test[i-1])
      {
        i=0;
        ..... ....
        ..... .....

Función para extraer datos de la cadena del GPS y convertir esos datos al formato de grados decimales a partir del formato de minutos decimales, como se explicó anteriormente.

void coordinate2dec()
{

    String lat_degree="";
    for(i=18;i<20;i++)
      lat_degree+=gpsString[i];

    String lat_minut="";
    for(i=20;i<28;i++)
      lat_minut+=gpsString[i];
        ..... ....
        ..... .....

Función para enviar comandos al ESP8266 para configurarlo y conectarlo con el WIFI.

void connect_wifi(String cmd, int t)
{
  int temp=0,i=0;
  while(1)
  {
    Serial.println(cmd);
    Serial1.println(cmd);
    while(Serial1.available()>0)
    ..... ....
    ..... .....

La función void show_coordinate() sirve para mostrar las coordenadas en la LCD y el Monitor Serie, y la función void get_ip() sirve para obtener la dirección IP.

La función Void Send() sirve para crear una cadena de información que se enviará a la página web usando el ESP8266, y la función void sendwebdata() sirve para enviar la cadena de información a la página web usando UART.

En la función void loop el Arduino espera continuamente una solicitud de la página web (actualización de la página web).

void loop()
{
  k=0;
  Serial.println("Please Refresh Ur Page");
  lcd.setCursor(0,0);
  lcd.print("Please Refresh  ");
  lcd.setCursor(0,1);
  lcd.print("Your Web Page..  ");
  while(k<1000)
  ..... ....
  ..... .....

Consulta el código completo a continuación.Código

#include<SoftwareSerial.h>
SoftwareSerial Serial1(2,3);     //make RX arduino line is pin 2, make TX arduino line is pin 3.
SoftwareSerial gps(10,11);

#include<LiquidCrystal.h>
LiquidCrystal lcd(14,15,16,17,18,19);

boolean No_IP=false;
String IP=””;

String webpage=””;
int i=0,k=0;
int  gps_status=0;
String name=”<p>1. Name: Your Name </p>”;   //22
String dob=”<p>2. DOB: 12 feb 1993</p>”;     //21
String number=”<p>4. Vehicle No.: RJ05 XY 4201</p>”;//29
String cordinat=”<p>Coordinates:</p>”;          //17
String latitude=””; 
String logitude=””;                       

String gpsString=””;
char *test=”$GPGGA”;

void check4IP(int t1)
{
  int t2=millis();
  while(t2+t1>millis())
  {
    while(Serial1.available()>0)
    {
      if(Serial1.find(“WIFI GOT IP”))
      {
        No_IP=true;
      }
    }
  }
}

void get_ip()
{
  IP=””;
  char ch=0;
  while(1)
  {
    Serial1.println(“AT+CIFSR”);
    while(Serial1.available()>0)
    {
      if(Serial1.find(“STAIP,”))
      {
        delay(1000);
        Serial.print(“IP Address:”);
        while(Serial1.available()>0)
        {
          ch=Serial1.read();
          if(ch==’+’)
          break;
          IP+=ch;
        }
      }
      if(ch==’+’)
      break;
    }
    if(ch==’+’)
    break;
    delay(1000);
  }
  lcd.clear();
  lcd.print(IP);
  lcd.setCursor(0,1);
  lcd.print(“Port: 80”);
  Serial.print(IP);
  Serial.print(“Port:”);
  Serial.println(80);
  delay(1000);
}

void connect_wifi(String cmd, int t)
{
  int temp=0,i=0;
  while(1)
  {
    Serial.println(cmd);
    Serial1.println(cmd); 
    while(Serial1.available()>0)
    {
      if(Serial1.find(“OK”))
      {

      i=8;
      }
    }
    delay(t);
    if(i>5)
    break;
    i++;
  }
  if(i==8)
  {
    Serial.println(“OK”);
  }
  else
  {
  Serial.println(“Error”);
  }
  delay(1000);
}

void setup() 
{
  Serial1.begin(9600);
  Serial.begin(9600);
  lcd.begin(16,2);  
  lcd.print(“Vehicle Tracking”);
  lcd.setCursor(0,1);
  lcd.print(”     System     “);
  delay(2000);
  lcd.clear();
  lcd.print(“WIFI Connecting..”);
//  lcd.setCursor(0,1);
//  lcd.print(“Please Wait…”);
  delay(1000);
  connect_wifi(“AT”,1000);
  connect_wifi(“AT+CWMODE=3”,1000);
  connect_wifi(“AT+CWQAP”,1000);  
  connect_wifi(“AT+RST”,5000);
  check4IP(5000);
  if(!No_IP)
      {
        Serial.println(“Connecting Wifi….”);
        connect_wifi(“AT+CWJAP=\”1st floor\”,\”muda1884\””,7000);   //AT+CWJAP=”wifi_username”,”wifi_password”
      }
      else
        {
        }
      Serial.println(“Wifi Connected”);
      lcd.clear();
      lcd.print(“WIFI Connected”);
      delay(2000);
      lcd.clear();
      lcd.print(“Getting IP”); 
      get_ip();
      delay(2000);
      connect_wifi(“AT+CIPMUX=1”,100);
      connect_wifi(“AT+CIPSERVER=1,80”,100);
      Serial1.end();
      lcd.clear();
      lcd.print(“Waiting For GPS”);
      lcd.setCursor(0,1);
      lcd.print(”     Signal    “);
      delay(2000);
      gps.begin(9600);
      get_gps();
      show_coordinate();
      gps.end();
      Serial1.begin(9600);
      delay(2000);
      lcd.clear();
      lcd.print(“GPS is Ready”);
      delay(1000);
      lcd.clear();
      lcd.print(“System Ready”);
      Serial.println(“System Ready..”);
}

void loop() 
{
  k=0;
  Serial.println(“Please Refresh Ur Page”);
  lcd.setCursor(0,0);
  lcd.print(“Please Refresh  “);
  lcd.setCursor(0,1);
  lcd.print(“Your Web Page..  “);
  while(k<1000)
  {
    k++;

   while(Serial1.available())
   {
    if(Serial1.find(“0,CONNECT”))
    {
      Serial1.end();
  gps.begin(9600);
  get_gps();
  gps.end();
  Serial1.begin(9600);
  Serial1.flush();
   /* lcd.clear();
      lcd.print(“Sending Data to “);
      lcd.setCursor(0,1);
      lcd.print(”    Web Page     “);*/
      Serial.println(“Start Printing”);
      Send();
      show_coordinate();
      Serial.println(“Done Printing”);
      delay(5000);
      lcd.clear();
      lcd.print(“System Ready”);
      delay(1000);
      k=1200;
      break;
    }
  }
  delay(1);
 }
}

void gpsEvent()
{
  gpsString=””;
  while(1)
  {
   while (gps.available()>0)                //Serial incoming data from GPS
   {
    char inChar = (char)gps.read();
     gpsString+= inChar;                    //store incoming data from GPS to temporary string str[]
     i++;
     if (i < 7)                      
     {
      if(gpsString[i-1] != test[i-1])       //check for right string
      {
        i=0;
        gpsString=””;
      }
     }
    if(inChar==’\r’)
    {
     if(i>65)
     {
       gps_status=1;
       break;
     }
     else
     {
       i=0;
     }
    }
  }
   if(gps_status)
    break;
  }
}

void get_gps()
{
   gps_status=0;
   int x=0;
   while(gps_status==0)
   {
    gpsEvent();
    int str_lenth=i;
    latitude=””;
    logitude=””;
    coordinate2dec();
        i=0;x=0;
    str_lenth=0;
   }
}

void show_coordinate()
{
    lcd.clear();
    lcd.print(“Latitide:”);
    lcd.print(latitude);
    lcd.setCursor(0,1);
    lcd.print(“Longitude:”);
    lcd.print(logitude);
    Serial.print(“Latitude:”);
    Serial.println(latitude);
    Serial.print(“Longitude:”);
    Serial.println(logitude);
}

void coordinate2dec()
{
    
    //j=0;
    String lat_degree=””;
    for(i=18;i<20;i++)          //extract latitude from string
      lat_degree+=gpsString[i];
    
    String lat_minut=””;
    for(i=20;i<28;i++)
      lat_minut+=gpsString[i];
    
    String long_degree=””;
    for(i=30;i<33;i++)          //extract longitude from string
      long_degree+=gpsString[i];
      
    String long_minut=””;
    for(i=33;i<41;i++)
      long_minut+=gpsString[i];
      
     float minut= lat_minut.toFloat();
     minut=minut/60;
     float degree=lat_degree.toFloat();
     latitude=degree+minut;
     
     minut= long_minut.toFloat();
     minut=minut/60;
     degree=long_degree.toFloat();
     logitude=degree+minut;
}

void Send()
{
     
      webpage = “<h1>Welcome to Saddam Khan’s Page</h1><body bgcolor=f0f0f0>”;
      webpage+=name;
      webpage+=dob;
      webpage+=number;
      webpage+=cordinat;
      webpage+=”<p>Latitude:”;
      webpage+=latitude;
      webpage+=”</p>”;
      webpage+=”<p>Longitude:”;
      webpage+=logitude;
      webpage+=”</p>”;
     webpage+= “<a href=\”http://maps.google.com/maps?&z=15&mrt=yp&t=k&q=“;
     webpage+=latitude;
     webpage+=’+’;              //28.612953, 77.231545   //28.612953,77.2293563
     webpage+=logitude;
     webpage+=”\”>Click Here for google map</a>”;
     sendwebdata();
       webpage=””;

     while(1)
     {
      Serial.println(“AT+CIPCLOSE=0”);
      Serial1.println(“AT+CIPCLOSE=0”);
      while(Serial1.available())
      {
        //Serial.print(Serial1.read());
        if(Serial1.find(“0,CLOSE”))
        {
          return;
        }
      }
      delay(500);
      i++;
      if(i>5)
      {
        i=0;
      }
      if(i==0)
      break;
     }
}

void sendwebdata()
{
     i=0;
     while(1)
     {
      unsigned int l=webpage.length();
      Serial1.print(“AT+CIPSEND=0,”);
      Serial1.println(l+2);
      Serial.println(l+2);
      Serial.println(webpage);

      Serial1.println(webpage);
      while(Serial1.available())
      {
        if(Serial1.find(“OK”))
        {
         return;
        }
      }
            i++;
      if(i>5)
        i=0;
        if(i==0)
        break;
      delay(200);
     }
}Video

Artículo traducido al español. Fuente original: Saddam — CircuitDigest

Similar Posts

Deja un comentario