GPS Arduino
La cosa es que en cierta ocasión había abierto este GPS y me había llamado la atención los agujeritos de conexión que hay dentro, de modo que me puse a buscar información al respecto y di con esta página (de un tal xam) en la que vi una foto en donde se actualizaba el software por medio de los agujeritos… http://xamweb2.dyndns.org/wordpress/2008/02/20/fortuna-clipon-flashing/ http://xamweb2.dyndns.org/wordpress/2007/09/20/innenleben-von-sirf2-gps-mausen-2/
Información
Mi GPS es parecido al de la primera foto pero distin del de la segunda, en vez de tener 12 agujeritos tiene 7
1 - Vcc 3 - TX -> al RX de Arduino 4 - RX -> al TX de Arduino 6 - GND
Por el momento esos (1, 3 y 6) se que son con certeza los que corresponden a mi modelo.El 2 estoy en duda. Tras realizar las conexiones usando el puerto serie 1 de mi arduino he podido ver los datos que se reciben del GPS bien.
Conexiones
Bibliotecas Para decodificar nmea he usado la biblioteca NMEA:: de Maarten Lamers (el Holandes) http://www.maartenlamers.com/nmea/ Links
NMEA codes http://www.gpsinformation.org/dale/nmea.htm
Código de Ejemplo
#include <LiquidCrystal.h>
#include <nmea.h>
// home
long g_lat = 42.827261;
long g_long = -1.665128;
// lcd
int lcd_rs = 10;
int lcd_rw = 11;
int lcd_enable = 12 ;
int lcd_d0 = 13;
int lcd_d1 = 54;
int lcd_d2 = 55;
int lcd_d3 = 56;
LiquidCrystal lcd(lcd_rs,lcd_rw,lcd_enable,lcd_d0,lcd_d1,lcd_d2,lcd_d3);
// GPS
NMEA gps(ALL);
void setup() {
Serial.begin(9600);
// GPS
Serial1.begin(38400);
// LCD
lcd.home();
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print("System Ready.");
lcd.setCursor(0,1);
lcd.print("Wait GPS...");
delay(2000);
}
void loop() {
if (Serial1.available() > 0 ) {
// read incoming character from GPS and feed it to NMEA type object
if (gps.decode(Serial1.read())) {
if (gps.gprmc_status() == 'A')
GpsDecode();
else
GpsNoSignal();
}
} else GpsNoConnection();
}
void GpsDecode()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Lat:");
lcdPrintFloat(gps.gprmc_latitude(),6);
lcd.setCursor(0,1);
lcd.print("Lon:");
lcdPrintFloat(gps.gprmc_longitude(),6);
delay(5000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Distance:");
lcdPrintFloat(gps.gprmc_distance_to(g_lat,g_long,MTR),3);
lcd.setCursor(0,1);
lcd.print("Course:");
lcdPrintFloat(gps.gprmc_course_to(g_lat,g_long),3);
delay(5000);
lcd.setCursor(0,0);
lcd.print("La5:");
lcdPrintFloat(gps.gprmc_latitude(),5);
lcd.setCursor(0,1);
lcd.print("Lo5:");
lcdPrintFloat(gps.gprmc_longitude(),5);
}
void GpsNoSignal()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(gps.sentence());
lcd.setCursor(0,1);
lcd.print("No Signal");
delay(2000);
}
void GpsNoConnection()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("No Connection... ");
lcd.setCursor(0,1);
lcd.print(millis()/1000);
delay(1000);
}
void lcdPrintFloat( float val, byte precision){
// prints val on a ver 0012 text lcd with number of decimal places determine by precision
// precision is a number from 0 to 6 indicating the desired decimial places
// example: lcdPrintFloat( 3.1415, 2); // prints 3.14 (two decimal places)
if(val < 0.0){
lcd.print('-');
val = -val;
}
lcd.print ((long)val); //prints the integral part
if( precision > 0) {
lcd.print("."); // print the decimal point
unsigned long frac;
unsigned long mult = 1;
byte padding = precision -1;
while(precision--)
mult *=10;
if(val >= 0)
frac = (val - int(val)) * mult;
else
frac = (int(val)- val ) * mult;
unsigned long frac1 = frac;
while( frac1 /= 10 )
padding--;
while( padding--)
lcd.print("0");
lcd.print(frac,DEC) ;
}
}
Resultado
Notas
disable GGA:
$PSRF103,00,00,00,01*24
enable GGA (1 sec interval):
$PSRF103,00,00,01,01*25