Rastreador GPS en tiempo real con linkit one

Publicado el: 19 de junio de 2019
Intermedio
Acerca de este proyecto
Rastreador de personas y objetos en tiempo real, utilizando la tarjeta linkit one. La posición del objeto se visualiza en un mapa web.
linkit one gps rastreador localizador
Publicidad
DETALLES

Este proyecto consiste en un rastreador de personas y objetos en tiempo real, utilizando la tarjeta linkit one.

Muy útil para llevarlo en un vehículo o cargarlo en un maletín y poder visualizar en un mapa cargado en una página web de manera remota la posición de donde se encuentre el objeto o persona.

Fue realizado con la tarjeta linkit one debido a que a diferencia del arduino, ya viene con los módulos GPS y GPRS incorporados.

LISTA DE MATERIALES. 

Tarjeta linkit one

Servidor web


  • Tarjeta linkit one con su respectivas antenas y batería.
  • Tarjeta SIM con saldo para conectarse a internet.
  • Nombre de dominio y hosting web (donde se almacenara y visualizara el mapa)

FUNCIONAMIENTO


Funcionamiento


VIDEO DE FUNCIONAMIENTO


 

Conectamos la antena GPS y GPRS a la tarjeta linkit one, le colocamos la tarjeta SIM que tenga saldo para poder navegar en internet y le colocamos la batería incluida. Recordar colocar el switch en posición de batería.

La tarjeta se conecta a el sitio web que configuremos en el código gracias a la conexión GPRS, a su vez obtiene las coordenadas (latitud y longitud) con su GPS y las envía por el método GET a la página web.

La página recibe los datos y los almacena en un archivo JSON, el cual es leído cada cierto tiempo con una función de javascript y dicha función muestra en un mapa un marcador en las coordenadas obtenidas. A medida que el rastreador se desplace, se va mostrando en el mapa la posición actual.

El código verifica si está recibiendo información GPS de por lo menos 4 satélites para poder obtener las coordenadas.


El código fuente se encuentra en la sección de códigos de este articulo.

Tener en cuenta cambiar que hay que obtener el nombre del operador de su internet móvil y asignarlo a la constante GPRS_APN:

//Reemplazar con sus datos de operador móvil
#define GPRS_APN "web.colombiamovil.com.co"


Haz clic aca para descargar los archivos web.


Es el archivo que visualiza el mapa en un DIV y el llamado a la API del mapa de google maps. Se debe obtener una clave o key que se pasa como parámetro en el llamado a la función:

src='https://maps.googleapis.com/maps/api/js?key=ACAVATUKEY'


  • El archivo guardar.php:

Este archivo recibe las coordenadas envíadas por la tarjeta linkit one, por ejemplo, si las coordenadas envíadas son: latitud = 10.9813427696345 y latitud = -74.451235876543, la url formada seria:

www.nombredetusitio.com/guardar.php?lati=10.9813427696345&longi=-74.451235876543

luego las almacena en un archivo de tipo JSON llamado coordenadas.json, el cual posee este formato:

{"latitud":"10.9813427696345","longitud":"-74.451235876543"}

  • El archivo funciones.js:

Este archivo se encarga de leer cada cierto tiempo el archivo coordenadas,json y va actualizando la posición de un marcador incrustado en el mapa. El tiempo en ejecutar dicha lectura es modificable, por defecto está configurado en 1000 milisegundos (1 segundo).

Si tienen alguna duda o comentario favor realizarlo y con gusto lo resolveré.

Suscribete a mi canal de youtube



CODIFICACIÓN
Codigo para la tarjeta linkit one-
Recuerda que este codigo se carga desde el IDE de arduino.
//Gps
#include <LGPS.h>

//Gprs
#include <LGPRS.h>
#include <LGPRSClient.h>
///////////////////////////////////
//  Aca se coloca el dominio del sitio web usado
char server[] = 'http://www.tusitioweb.com';

int port = 80; // HTTP

//Reemplazar con sus datos de operador móvil
//  APN CLARO = 'internet.comcel.com.co'
//  APN TIGO = 'web.colombiamovil.com.co'
//  APN MOVISTAR 'internet.movistar.com.co'
//  APN UFF = 'web.uffmovil.com'
//  APN UNE = 'www.une.net.co'

//Colocar aca el APN de su operador de la tarjeta SIM
#define GPRS_APN  'internet.comcel.com.co'

LGPRSClient cliente;

String latitud='0.00';

String longitud='0.00';


// Configuración GPS
gpsSentenceInfoStruct info; //needed to get GPS data

double latitude = 0.00;
double longitude = 0.00;
float altitude = 0.00;
float dop = 100.00; //dilution of precision
float geoid = 0.00;
float k_speed = 0.00, m_speed = 0.00; //speed in knots and speed in m/s
float track_angle = 0.00;
int fix = 0;
int hour = 0, minute = 0, second = 0;
int sat_num = 0; //number of visible satellites
int day = 0, month = 0, year = 0;
String time_format = '00:00:00', date_format = '00:00:0000';
String lat_format = '0.00000', lon_format = '0.00000';
char file[15] = '';
int pause = 3000; //time in milliseconds between two logs

void setup()
{  
   
   Serial.begin(9600);
   
   LGPS.powerOn(); //Encendemos el GPS
   
   delay(1000);
         
  while(!LGPRS.attachGPRS(GPRS_APN,NULL,NULL))
    {
      Serial.println('Esperando a que la tarjeta SIM esté lista');
      
      delay(4000);
    } 

    Serial.println('TARJETA DETECTADA');
       
} 


void loop()
{

   if(cliente.connect(server, port))
 
   {      
    //Comentar esta linea en modo produccion
    Serial.println('Conectado');
    
    lat_format;
    
    lon_format;
  
  if (getData(&info) > 3)
  {
      
      String str = 'GET /guardar.php?';
      
      latitud = lat_format;

      longitud = lon_format;
      
      str += 'lati=';
      
      str += latitud;
      
      str += '&longi=';
      
      str += longitud;            
 
      cliente.print(str);
      
      cliente.println(' HTTP/1.1');
      
      cliente.print('Host: ');
      
      cliente.println(server);
      
      cliente.println('Connection: close');
      
      cliente.println();
      
      cliente.stop();
  
      cliente.flush();

  }
  
  else //Serial.println('Menos de 4 satélites.');
  
  delay(pause);
}
}
/**
*Converts degrees from (d)ddmm.mmmm to (d)dd.mmmmmm
*@param str the string rappresentation of the angle in (d)ddmm.mmmm format
*@param dir if true the direction is south, and the angle is negative.
*@return the given angle in dd.mmmmmm format.
*/
float convert(String str, boolean dir)
{
  double mm, dd;
  int point = str.indexOf('.');
  dd = str.substring(0, (point - 2)).toFloat();
  mm = str.substring(point - 2).toFloat() / 60.00;
  return (dir ? -1 : 1) * (dd + mm);
}

/**
*Gets gps informations
*@param info gpsSentenceInfoStruct is a struct containing NMEA sentence infomation
*@return the number of hooked satellites, or 0 if there was an error getting informations
*/
int getData(gpsSentenceInfoStruct* info)
{
  //Serial.println('Collecting GPS data.');
  LGPS.getData(info);
  //Serial.println((char*)info->GPGGA);
  if (info->GPGGA[0] == '$')
  {
    //Serial.print('   GGA data....');
    String str = (char*)(info->GPGGA);
    str = str.substring(str.indexOf(',') + 1);
    hour = str.substring(0, 2).toInt();
    minute = str.substring(2, 4).toInt();
    second = str.substring(4, 6).toInt();
    time_format = '';
    time_format += hour;
    time_format += ':';
    time_format += minute;
    time_format += ':';
    time_format += second;
    str = str.substring(str.indexOf(',') + 1);
    latitude = convert(str.substring(0, str.indexOf(',')), str.charAt(str.indexOf(',') + 1) == 'S');
    int val = latitude * 1000000;
    String s = String(val);
    lat_format = s.substring(0, (abs(latitude) < 100) ? 2 : 3);
    lat_format += '.';
    lat_format += s.substring((abs(latitude) < 100) ? 2 : 3);
    str = str.substring(str.indexOf(',') + 3);
    longitude = convert(str.substring(0, str.indexOf(',')), str.charAt(str.indexOf(',') + 1) == 'W');
    val = longitude * 1000000;
    s = String(val);
    lon_format = s.substring(0, (abs(longitude) < 100) ? 2 : 3);
    lon_format += '.';
    lon_format += s.substring((abs(longitude) < 100) ? 2 : 3);

    str = str.substring(str.indexOf(',') + 3);
    fix = str.charAt(0) - 48;
    str = str.substring(2);
    sat_num = str.substring(0, 2).toInt();
    str = str.substring(3);
    dop = str.substring(0, str.indexOf(',')).toFloat();
    str = str.substring(str.indexOf(',') + 1);
    altitude = str.substring(0, str.indexOf(',')).toFloat();
    str = str.substring(str.indexOf(',') + 3);
    geoid = str.substring(0, str.indexOf(',')).toFloat();
    //Serial.println('done.');
    
    if (info->GPRMC[0] == '$')
    {
      //Serial.print('Parsing RMC data....');
      str = (char*)(info->GPRMC);
      int comma = 0;
      for (int i = 0; i < 60; ++i)
      {
        if (info->GPRMC[i] == ',')
        {
          comma++;
          if (comma == 7)
          {
            comma = i + 1;
            break;
          }
        }
      }

      str = str.substring(comma);
      k_speed = str.substring(0, str.indexOf(',')).toFloat();
      m_speed = k_speed * 0.514;
      str = str.substring(str.indexOf(',') + 1);
      track_angle = str.substring(0, str.indexOf(',')).toFloat();
      str = str.substring(str.indexOf(',') + 1);
      day = str.substring(0, 2).toInt();
      month = str.substring(2, 4).toInt();
      year = str.substring(4, 6).toInt();
      date_format = '20';
      date_format += year;
      date_format += '-';
      date_format += month;
      date_format += '-';
      date_format += day;
      //Serial.println('done.');
      return sat_num;
    }
  }
  else
  {
    //Serial.println('No GGA data');
  }
  return 0;
}


Autor: sistemasymicros
26 proyectos 6 seguidores 0 siguiendo

Ingeniero en electrónica. Maker, apasionado por la programación. Sigueme en sistemasymicros.