"Ciencia y Tecnología" por Manolo: Arduino. Localizador GPS NEO6

Marquesina

"AQUÍ NO NOS DETENEMOS A MIRAR EL PASADO POR MUCHO TIEMPO SIGUE SIEMPRE ADELANTE, ABRIENDO NUEVAS PUERTAS Y HACIENDO COSAS NUEVAS. SÉ CURIOSO" Walt Disney.

martes, 29 de diciembre de 2020

Arduino. Localizador GPS NEO6

Este módulo que traigo aquí es de un módulo de localización por GPS y que podemos usar con arduino.

 Hay varios modelos pero son muy semejantes a su uso.

Foto vía


Viene con una antena en forma rectangular exterior y que tendremos que unir al módulo.

Se alimenta con 3,6 V. como mucho en algunos modelos pero tiene incorporado la electrónica para usar con 5 V. y tiene un consumo pequeño con 37 mA.

La precisión, según cuenta fabricante, es de 2,5 m. Algo muy favorable sobretodo con el bajo precio que tiene. 

Es importante recordar que se debe colocar en el exterior o muy cerca de ventana para captar satélites. Esto se notará porque parpadeará el LED incorporado

CONEXIÓN

Usamos la conexión UART del módulo.

Para no interferir con otras conexiones con el puerto en serie se puede usar la librería SoftSerial y así usar cualquier pin para dicha conexión. En la placa Mega lo tenemos más fácil ya que dispone de varios pines RX/TX, y yo uso los 18 y 19. 

 He de recordar que se deben cruzar los pines en esta conexión es decir RX(módulo) con TX(arduino) y TX(módulo) con RX(arduino).

Una advertencia, el 18 no hace falta conectarlo, ya que funciona igulamente.

Por los tanto nos quedaría.

Origen Imagen


Módulo GP NEO6Pin Arduino UNOPin Arduino MEGA
VCC5 V.5 V.
GNDGNDGND
RXD3 (u otro)TX1 (18)
TXD4 (u otro)RX1 (19)





Los datos obtenidos están agrupados en un formato GPRMC que es el del protocolo NMEA (National Marine Electronic Association). De esta cadena de datos podemos sacar la longitud, latitud, hora en UTC, fecha, velocidad, variación magnética en grados...A mi me interesan los 5 primeros datos que he nombrado.

Para sacar los datos de esta cadena de GPRMC se puede usar la librería TinyGPS.h (disponible dentro del gestor de librerías de ARDUINO, pero hay que descargarla) o hacerlo "a mano"




Aquí os dejo el programa que uso yo SIN LIBRERÍAS  y para arduino Mega, calculo también la hora en Madrid


/*Programa para usar GPS NEO6 con MEGA
Modificación Manolo
No usa librerías.
 */

char nmeaSentence[68];
String latitude;		//latitud
String longitude;		//longitud
String lndSpeed;		//velocidad
String gpsTime;			//Hora UTC, la hora a 0 grados de longitud del primer meridiano, a 8 horas de la hora de Beijing
String madridTime;	//Hora de Madrid
String gpsDate;     //Fecha

#define GpsSerial Serial1
#define DebugSerial Serial

void setup()	//Contenido inicial
{
  GpsSerial.begin(9600);
//Tasa de baudios de 9600.
  DebugSerial.begin(9600);
  DebugSerial.println("Test GPS Arduino/mega2560");
  DebugSerial.println("@ManoloJCR/Tao");
  DebugSerial.println("Wating to get gps data...");

}

void loop()		//Bucle principal
{

  for (unsigned long start = millis(); millis() - start < 1000;)	
//Escanea la información del GPS continuamente en un segundo
  {
    while (GpsSerial.available())	
//El puerto serie obtiene los datos y comienza a analizar
    {
      char c = GpsSerial.read();	//Leer un byte de datos
      switch(c)					//Determinar el valor del byte
      {
        case '$':					
//Si es $, significa el comienzo de un marco de datos
        GpsSerial.readBytesUntil('*', nmeaSentence, 67);		
//Lee los siguientes datos y los guarda en la matriz de caracteres nmeaSentence, hasta 67 bytes
        //Serial.println(nmeaSentence);
        latitude = parseGprmcLat(nmeaSentence);	//Obtener valor de latitud
        longitude = parseGprmcLon(nmeaSentence);//Obtener valor de longitud
        lndSpeed = parseGprmcSpeed(nmeaSentence);//Obtener valor de velocidad
        gpsTime = parseGprmcTime(nmeaSentence);//Obtener la hora del GPS
        gpsDate = parseGprmcDate(nmeaSentence);//Obtener la fecha del GPS

          if(latitude > "")		//Imprimir cuando no esté vacío
          {
          //  DebugSerial.println("latitude: " + latitude);
            DebugSerial.println("------------------------------------");
          int glat = latitude.substring(0,2).toInt();
          int mlat = latitude.substring(2,4).toInt();
          int slat = latitude.substring(5,8).toInt();
          slat = slat*0.0060;
          DebugSerial.print("Latitud: ");
          DebugSerial.print(glat);
          DebugSerial.print("º ");
          DebugSerial.print(mlat);
          DebugSerial.print("´ ");
          DebugSerial.print(slat);
          DebugSerial.print("´´ ");
          DebugSerial.println(latitude.substring(11,12));
          }

          if(longitude > "")		//Imprimir cuando no esté vacío
          {
//       DebugSerial.println("longitude: " + longitude);
         int glong = longitude.substring(0,3).toInt();
         int mlong = longitude.substring(3,5).toInt();
         int slong = longitude.substring(6,10).toInt();
         slong = slong*0.0060;
         DebugSerial.print("Longitud: ");
         DebugSerial.print(glong);
         DebugSerial.print("º ");
         DebugSerial.print(mlong);
         DebugSerial.print("´ ");
         DebugSerial.print(slong);
         DebugSerial.print("´´ ");
         DebugSerial.println(longitude.substring(12,13));
         }  

         if(lndSpeed > "")		//Imprimir cuando no esté vacío
         {
         DebugSerial.println("Speed (knots): " +  lndSpeed);
         }

         if(gpsDate > "")		//Imprimir cuando no esté vacío
         {
         //DebugSerial.println("gpsDate: "+gpsDate);
         int year = gpsDate.substring(4,6).toInt();
         int month = gpsDate.substring(2,4).toInt();
         int day = gpsDate.substring(0,2).toInt();
         DebugSerial.print("gpsDate: ");
         DebugSerial.print(day);
         DebugSerial.print("/");
         DebugSerial.print(month);
         DebugSerial.print("/");
         DebugSerial.println(year);
         }
    
         if(gpsTime > "")    //Imprimir cuando no esté vacío
         {
         //DebugSerial.println("gpsTime: "+gpsTime);
         int hour = gpsTime.substring(0,2).toInt();
         int minute = gpsTime.substring(2,4).toInt();
         int second = gpsTime.substring(4,6).toInt();
         DebugSerial.print("gpsTime: ");
         DebugSerial.print(hour);
         DebugSerial.print("h: ");
         DebugSerial.print(minute);
         DebugSerial.print("min. ");
         DebugSerial.print(second);
         DebugSerial.println("s. "); 
         
         madridTime = madridgetTime(gpsTime);  //Obtener la hora de Madrid
         //DebugSerial.println("madridTime: "+madridTime);
         int mhour = madridTime.substring(0,2).toInt();
         int mminute = madridTime.substring(2,4).toInt();
         int msecond = madridTime.substring(4,6).toInt();
         DebugSerial.print("madridTime: ");
         DebugSerial.print(mhour);
         DebugSerial.print("h: ");
         DebugSerial.print(mminute);
         DebugSerial.print("min. ");
         DebugSerial.print(msecond);
         DebugSerial.println("s. ");
         delay (58000);
         } 
           
        }		
      }
    }
  
  }


String madridgetTime(String s)
{
  int hour = 0;
  int minute = 0;
  int second = 0;
  int onehour = s.substring(0,1).toInt();
  int oneminute = s.substring(2,3).toInt();
  hour = s.substring(0,2).toInt();
              minute = s.substring(2,4).toInt();
              second = s.substring(4,6).toInt();
              hour += 1;
         // DebugSerial.println(minute);
         // DebugSerial.println(oneminute);
          if(hour<10)
          {
            if(minute<10)
  s = String(onehour)+String(hour)+String(oneminute)+String(minute)+String(second);
            else
            {
  s = String(onehour)+String(hour)+String(minute)+String(second);
            }
          }
          else
          {
            if(minute<10)
  s = String(hour)+String(oneminute)+String(minute)+String(second);
  //DebugSerial.println(s);
            else 
            {
  s = String(hour) + String(minute) + String(second);
            }
      if(hour > 24)
      hour -= 24;
          
          }
    return s;
}

//Descomponemos cadena NMEA 
//La cadena debe ser GPRMC o no la analizamos
//Return Latitude
String parseGprmcLat(String s)
{
  int pLoc = 0; //paramater location pointer
  int lEndLoc = 0; //lat parameter end location
  int dEndLoc = 0; //direction parameter end location
  String lat;

/*Buscamos GPRM al principio cadena */
  if(s.substring(0,4) == "GPRM")
  {
 // Serial.println(s);
    for(int i = 0; i < 5; i++)
    {
      if(i < 3) 
      {
        pLoc = s.indexOf(',', pLoc+1);
      }
      if(i == 3)
      {
        lEndLoc = s.indexOf(',', pLoc+1);
        lat = s.substring(pLoc+1, lEndLoc);
      }
      else
      {
        dEndLoc = s.indexOf(',', lEndLoc+1);
        lat = lat + " " + s.substring(lEndLoc+1, dEndLoc);
      }
    }
    return lat; 
  }
 }
 

//Descomponemos cadena NMEA 
//La cadena debe ser GPRMC o no la analizamos
//Return Longitude
String parseGprmcLon(String s)
{
  int pLoc = 0; //paramater location pointer
  int lEndLoc = 0; //lat parameter end location
  int dEndLoc = 0; //direction parameter end location
  String lon;

 /*Buscamos GPRM al principio cadena */
  if(s.substring(0,4) == "GPRM")
  {
    //Serial.println(s);
    for(int i = 0; i < 7; i++)
    {
      if(i < 5) 
      {
        pLoc = s.indexOf(',', pLoc+1);
      }
      if(i == 5)
      {
        lEndLoc = s.indexOf(',', pLoc+1);
        lon = s.substring(pLoc+1, lEndLoc);
      }
      else
      {
        dEndLoc = s.indexOf(',', lEndLoc+1);
        lon = lon + " " + s.substring(lEndLoc+1, dEndLoc);
      }
    }
    return lon; 
  }
}


//Descomponemos cadena NMEA 
//La cadena debe ser GPRMC o no la analizamos
//Return velocidad
String parseGprmcSpeed(String s)
{
  int pLoc = 0; //paramater location pointer
  int lEndLoc = 0; //lat parameter end location
  int dEndLoc = 0; //direction parameter end location
  String lndSpeed;

/*Buscamos GPRM al principio cadena */
  if(s.substring(0,4) == "GPRM")
  {
    //Serial.println(s);
    for(int i = 0; i < 8; i++)
    {
      if(i < 7) 
      {
        pLoc = s.indexOf(',', pLoc+1);
      }
      else
      {
        lEndLoc = s.indexOf(',', pLoc+1);
        lndSpeed = s.substring(pLoc+1, lEndLoc);
      }
    }
    return lndSpeed; 
  }
}



//Descomponemos cadena NMEA 
//La cadena debe ser GPRMC o no la analizamos
//Return date
String parseGprmcDate(String s)
{
  int pLoc = 0; //paramater location pointer
  int lEndLoc = 0; //lat parameter end location
  int dEndLoc = 0; //direction parameter end location
  String gpsDate;

  /*Buscamos GPRM al principio cadena */
  if(s.substring(0,4) == "GPRM")
  {
    //Serial.println(s);
    for(int i = 0; i < 10; i++)
    {
      if(i < 9) 
      {
        pLoc = s.indexOf(',', pLoc+1);
      }
      else
      {
        lEndLoc = s.indexOf(',', pLoc+1);
        gpsDate = s.substring(pLoc+1, lEndLoc);
      }
    }
    return gpsDate; 
  }
}


//Descomponemos cadena NMEA 
//La cadena debe ser GPRMC o no la analizamos
//Return tiempo
String parseGprmcTime(String s)
{
  int pLoc = 0; //paramater location pointer
  int lEndLoc = 0; //lat parameter end location
  int dEndLoc = 0; //direction parameter end location
  String gpsTime;

  /*Buscamos GPRM al principio cadena */
  if(s.substring(0,4) == "GPRM")
  {
    //Serial.println(s);
    for(int i = 0; i < 2; i++)
    {
      if(i < 1) 
      {
        pLoc = s.indexOf(',', pLoc+1);
        
      }
      else
      {
        lEndLoc = s.indexOf(',', pLoc+1);
        gpsTime = s.substring(pLoc+1, lEndLoc);
        
      }
    }
    return gpsTime; 
  }
}

// Turn char[] array into String object
String charToString(char *c)
{

  String val = "";

  for(int i = 0; i <= sizeof(c); i++) 
  {
    val = val + c[i];
  }

  return val;
}

Haz clic en el botón para ir a GPS NEO6 con placa una placa ZUM core de BQ