Una de los cosas mas interesantes para medir es la posición, esto es posible gracias al uso de GPS. En este artículo registramos nuestras primeras pruebas con el módulo GPS de Adafruit esta vez lo conectamos a un Arduino y a un Teensy
El módulo viene con lo que se muestra en la foto
Lo básico es soldar los pines, luego se debe soldar el soporte de la pila en la parte inferior del módulo. Es muy fácil !
Adicionalmente agregamos la pila CR1220 para mantener el reloj interno RTC, por sus siglas en inglés.Esto hará más fácil la sincronización
Tras el salto la explicación en detalle
Usando Arduino
La primera prueba es con Arduino
Materiales
- Arduino Uno
- Cable USB
- Cables
- Protoboard
- PC con Arduino IDE 1.0.3
Conectando Hardware
Conecta el arduino al PC mediante su cable USB
Conecta los siguientes pines del modulo GPS
VIN a +5V
GND a Tierra
Rx del GPS a puerta RX<-0 de Arduino
Tx del GPS a puerta TX->1 de Arduino
El primer sketch es directo y facil de interpretar, necesitamos hacer un bypass y obtener la información directo del GPS. Esto permite familiarizarnos con el formato NMEA que tiene este módulo.
Carga el siguiente sketch
void setup() {}
void loop() {}
Como se aprecia el sketch esta vacío, es sólo para permitir la comunicación en forma directa con el modulo GPS.
Ahora que esta conectado solo debes poner el modulo a cielo abierto y abrir el monitor serial, configurarlo con 9600bps, y obtendrás la información del GPS, verás unas líneas con mucha información.
La siguiente prueba es usando la biblioteca de Adafruit.
Se debe conectar el GPS de la siguiente manera
VIN a +5V
GND a Tierra
RX del GPS a digital 2 del Arduino
TX del GPS a digital 3 del Arduino
Quedara como se aprecia en la foto
Para bajarla ir al repositorio de GitHub de Adafruit y haz click en el botón DOWNLOADS de la esquina inferior derecha.
Debes descargar el archivo .zip, éste contiene una carpeta con todos los archivos necesarios de la librería. Debes descomprimir esta carpeta en el directorio raíz donde esta instalado el software Arduino dentro de la carpeta «libraries», debes renombrar la carpeta como Adafruit_GPS para que el software la reconozca. Revisa que la carpeta Adafruit_GPS contenga los siguientes archivos
- Adafruit_GPS.cpp
- Adafruit_GPS.h
Ahora al reiniciar el Arduino IDE aparecerá cargada la nueva librería. El sketch que usaremos sera el de ejemplo en File→Examples→Adafruit_GPS→parsing este sketch esta en este link
Para ver los datos se debe conectar el monitor serial.
Usando Teensy 3.0
Ahora usaremos el Teensy 3.0 para conectar el módulo GPS
Materiales
Teensy
Cable adaptador USB
Cables
Protoboard
PC con Teensyduino
Conectando el Hardware
Conecta el Teensy mediante su cable adaptador al PC
VIN a +5V
GND a Tierra
Rx a puerta 1 Tx1 de Teensy
Tx a puerta 0 Rx1 de Teensy
Esto se ve como en la siguiente foto
Software
El sketch lo encontramos en la página de Teensy y realizamos algunas modificaciones.
Puede parecer complejo pero se despliega bastante información por lo que se debe tomar lo que necesites
#include <TinyGPS.h>
/* This sample code demonstrates the normal use of a TinyGPS object. */
TinyGPS gps;
/* On Teensy, the UART (real serial port) is always best to use. */
/* Unlike Arduino, there's no need to use NewSoftSerial because */
/* the "Serial" object uses the USB port, leaving the UART free. */
HardwareSerial Uart1 = HardwareSerial();
void gpsdump(TinyGPS &gps);
void printFloat(double f, int digits = 2);
void setup()
{
Serial.begin(115200);
Uart1.begin(9600); // Changed from 4800
delay(1000);
Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
Serial.println("by Mikal Hart");
Serial.println();
Serial.print("Sizeof(gpsobject) = "); Serial.println(sizeof(TinyGPS));
Serial.println();
}
void loop()
{
bool newdata = false;
unsigned long start = millis();
// Every 5 seconds we print an update
while (millis() - start < 5000) {
if (Uart1.available()) {
char c = Uart1.read();
// Serial.print(c); // uncomment to see raw GPS data
if (gps.encode(c)) {
newdata = true;
break; // uncomment to print new data immediately!
}
}
}
if (newdata) {
Serial.println("Acquired Data");
Serial.println("-------------");
gpsdump(gps);
Serial.println("-------------");
Serial.println();
}
}
void gpsdump(TinyGPS &gps)
{
long lat, lon;
float flat, flon;
unsigned long age, date, time, chars;
int year;
byte month, day, hour, minute, second, hundredths;
unsigned short sentences, failed;
gps.get_position(&lat, &lon, &age);
Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon);
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
// On Arduino, GPS characters may be lost during lengthy Serial.print()
// On Teensy, Serial prints to USB, which has large output buffering and
// runs very fast, so it's not necessary to worry about missing 4800
// baud GPS characters.
gps.f_get_position(&flat, &flon, &age);
Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
gps.get_datetime(&date, &time, &age);
Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" Time(hhmmsscc): ");
Serial.print(time);
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
Serial.print("Date: "); Serial.print(static_cast(month)); Serial.print("/");
Serial.print(static_cast(day)); Serial.print("/"); Serial.print(year);
Serial.print(" Time: "); Serial.print(static_cast(hour)); Serial.print(":");
Serial.print(static_cast(minute)); Serial.print(":"); Serial.print(static_cast(second));
Serial.print("."); Serial.print(static_cast(hundredths));
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
Serial.print("Alt(cm): "); Serial.print(gps.altitude()); Serial.print(" Course(10^-2 deg): ");
Serial.print(gps.course()); Serial.print(" Speed(10^-2 knots): "); Serial.println(gps.speed());
Serial.print("Alt(float): "); printFloat(gps.f_altitude()); Serial.print(" Course(float): ");
printFloat(gps.f_course()); Serial.println();
Serial.print("Speed(knots): "); printFloat(gps.f_speed_knots()); Serial.print(" (mph): ");
printFloat(gps.f_speed_mph());
Serial.print(" (mps): "); printFloat(gps.f_speed_mps()); Serial.print(" (kmph): ");
printFloat(gps.f_speed_kmph()); Serial.println();
gps.stats(&chars, &sentences, &failed);
Serial.print("Stats: characters: "); Serial.print(chars); Serial.print(" sentences: ");
Serial.print(sentences); Serial.print(" failed checksum: "); Serial.println(failed);
}
void printFloat(double number, int digits)
{
// Handle negative numbers
if (number < 0.0) {
Serial.print('-');
number = -number;
}
// Round correctly so that print(1.999, 2) prints as "2.00"
double rounding = 0.5;
for (uint8_t i=0; i<digits; ++i) rounding /= 10.0; number += rounding; // Extract the integer part of the number and print it unsigned long int_part = (unsigned long)number; double remainder = number - (double)int_part; Serial.print(int_part); // Print the decimal point, but only if there are digits beyond if (digits > 0)
Serial.print(".");
// Extract digits from the remainder one at a time
while (digits-- > 0) {
remainder *= 10.0;
int toPrint = int(remainder);
Serial.print(toPrint);
remainder -= toPrint;
}
}
Una vez cargado el sketch anterior puedes ver los datos abriendo el serial monitor.
Bibliografía
Tutorial GPS de Adafruit
Información formato NMEA usado para la Tx de datos GPS
Página de Teensy