GPS Arduino

- 3 mins read

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

GPS Arduino GPS Arduino

GPS Arduino GPS Arduino GPS Arduino

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

GPS Arduino GPS Arduino GPS Arduino

Notas

disable GGA:

	$PSRF103,00,00,00,01*24

enable GGA (1 sec interval):

	$PSRF103,00,00,01,01*25