Mostrando las entradas con la etiqueta gps. Mostrar todas las entradas
Mostrando las entradas con la etiqueta gps. Mostrar todas las entradas

domingo, 23 de diciembre de 2018

Módulo GPS

Hoy les traigo el módulo gps neo6m.
Primero hablemos sobre lo que es el gps, es un sistema de posicionamiento global (uno de varios), el cual está compuesto por una costelación de satélites que emiten señales con ciertos datos, como por ejemplo la hora. Luego estos datos se procesan, conociendo la identifiación de cada satélite, la hora, la intensidad de la señal recibida y algunas cosas más, se puede conocer la posición del dispositivo que recibe estas señales; esto se logra con trigonometría, por lo que para conocer la posición exacta de algo como mínimo se van a necesitar tres satélites, y cuantos más haya el sistema va a ser más preciso.
El gps utiliza longitud y latitud y divide a la tierra en 4 partes, cada una de 90 grados, si obvservamos un mapa:



podremos ver que estas divisiones ya existen hace tiempo, por lo que agregando unos cuantos ceros detrás de la coma obtendremos distancias muy precisas, cada grado corresponde a 111,1 km (es periódico ese valor, es decir que tiene infinitos unos detrás de la coma) y por ejemplo un metro son 0,000009 grados, cien metros son 0,0009 grados y así sucesivamente. Cuántos más ceros haya detrás de la coma, más precisas van a ser las mediciones.
Para comenzar a utilizar el módulo, primero vamos a utilizar un programa que nos permita utilizar un arduino como un puente serie entre el dispositivo y la computadora (básicamente generamos un puerto serie en dos pines del arduino, en el cuál vamos a conectar el gps, y luego conectamos el arduino a la computadora, no hay que conectar el módulo de gps a los pines 0 y 1), lo que nos va a mandar el gps va a ser algo similar a lo siguiente:

$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62
$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68
225446 Time of fix 22:54:46 UTC
A Navigation receiver warning (A = OK, V = warning)
4916.45,N Latitude 49 deg. 16.45 min North = 49°16'45''
12311.12,W Longitude 123 deg. 11.12 min West = 123°11'12''
000.5 Speed over ground, Knots
054.7 Course Made Good, True
191194 Date of fix 19 November 1994
020.3,E Magnetic variation 20.3 deg East
*68 mandatory checksum

Como hay un montón de datos, lo más fácil es utilizar una librería para interpretarlos, puesto que ya alguien se encargó de depurar esos datos y fue lo suficientemente gentil para compartirlo con el mundo vamos a utilizarla, se llama tinyGPS, vamos a utilizar uno de los tres ejemplos:

#include <SoftwareSerial.h>
#include <TinyGPS.h>

/* 
   This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/

TinyGPS gps;
SoftwareSerial ss(4, 3);

void setup()
{
  Serial.begin(115200);
  ss.begin(4800);
  
  Serial.print("Simple TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
}

void loop()
{
  bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;

  // For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (ss.available())
    {
      char c = ss.read();
      // Serial.write(c); // uncomment this line if you want to see the GPS data flowing
      if (gps.encode(c)) // Did a new valid sentence come in?
        newData = true;
    }
  }

  if (newData)
  {
    float flat, flon;
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
    Serial.print("LAT=");
    Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
    Serial.print(" LON=");
    Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
    Serial.print(" SAT=");
    Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
    Serial.print(" PREC=");
    Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
  }
 
  gps.stats(&chars, &sentences, &failed);
  Serial.print(" CHARS=");
  Serial.print(chars);
  Serial.print(" SENTENCES=");
  Serial.print(sentences);
  Serial.print(" CSUM ERR=");
  Serial.println(failed);
  if (chars == 0)
  {
    Serial.println("** No characters received from GPS: check wiring **");
  }
}

Este ejemplo nos entrega los datos separados, por lo que podríamos implementarlo en cualquier proyecto que necesite gps.
Hay otra librería llamada tinyGPS plus, del mismo creador, que en teoría nos ofrece más cosas, como por ejemplo usar el glonass (el análogo ruso del gps).