Libreria GPS de D. Cuartielles

Hola!

Estoy trabjando con un GPS EM-406, Sirf III, protocolo estandar NMEA...

¿Conocési alguna buena libreria? ¿Sabéis si la librería "LB_GPS", hecha por D. Cuartielles (http://www.libelium.com/tienda/catalog/product_info.php?cPath=21&products_id=37 ) podría utilizarse?

Me encanta el concepto de esa biblioteca..! de todas formas cualquier información sobre este tema será bien recivida.

Para el GPS, de momento utilizo el código del playground de Arduino.

Muchas, gracias

Buenas Frutronik,

directamente yo no he trabajado con esa librería, pero creo recordar que hacía uso de SoftwareSerial. En mi caso, que uso el mismo modelo de GPS que tú, también uso SoftSerial, pues necesito rx y tx libres, así que posiblemente no tengas problemas.

Saludos

Gracias Kayak!

Qé código estás emplenado? Con lo que estoy trabajnado yo es con:

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1166042147/

Pero, realmente hay un par de funciones que no acabo de comprender...

Gracias de antemano!

Por cierto, cuanto tiempo tarda tu GPS en coger satélites..más o menos.. :wink:

Por ejemplo, en este código:

//Created August 15 2006
//Heather Dewey-Hagborg
//http://www.arduino.cc
//reworked to GPS reader
//Dirk, december 2006

#include <ctype.h>
#include <string.h>

#define bit9600Delay 84
#define halfBit9600Delay 42
#define bit4800Delay 188
#define halfBit4800Delay 94

byte rx = 6;
byte tx = 7;
byte SWval;
char dataformat[7] = "$GPRMC";
char messageline[80] = "";
int i= 0;

void setup() {
  pinMode(rx,INPUT);
  pinMode(tx,OUTPUT);
  digitalWrite(tx,HIGH);
  digitalWrite(13,HIGH); //turn on debugging LED
  SWprint('h');  //debugging hello
  SWprint('i');
  SWprint(10); //carriage return
  Serial.begin(9600);  // this is used to echo what is read from the GPS out the USB->SerialDebugMonitor
}

void SWprint(int data)
{
  byte mask;
  //startbit
  digitalWrite(tx,LOW);
  delayMicroseconds(bit4800Delay);
  for (mask = 0x01; mask>0; mask <<= 1) {
    if (data & mask){ // choose bit
      digitalWrite(tx,HIGH); // send 1
    }
    else{
      digitalWrite(tx,LOW); // send 0
    }
    delayMicroseconds(bit4800Delay);
  }
  //stop bit
  digitalWrite(tx, HIGH);
  delayMicroseconds(bit4800Delay);
}

char SWread()
{
  byte val = 0;
  while (digitalRead(rx));
  //wait for start bit
  if (digitalRead(rx) == LOW) {
    delayMicroseconds(halfBit4800Delay);
    for (int offset = 0; offset < 8; offset++) {
      delayMicroseconds(bit4800Delay);
      val |= digitalRead(rx) << offset;
    }
    //wait for stop bit + extra
    delayMicroseconds(bit4800Delay);
    delayMicroseconds(bit4800Delay);
    return val;
  }
}

void char2string()
{
  i = 0;
  messageline[0] = SWread();
  if (messageline[0] == 36) //string starts with $
  {
    i++;
    messageline[i] = SWread();
    while(messageline[i] != 13 & i<80) //carriage return or max size
    {
      i++;
      messageline[i] = SWread();
    }
    messageline[i+1] = 0; //make end to string
  }
}

void loop()
{
  digitalWrite(13,HIGH);

  //
  // 1st way to print only the $GPRMC message
  //

  //only print string with the right dataformat
  
  // char2string();!!!!!!!!
  // if (strncmp(messageline, dataformat, 6) == 0 & i>4)
  // {
  //   for (int i=0; messageline[i] != '\0'; i++)
  //   {
  //      Serial.print(messageline[i], BYTE);
  //   }
  // }

  //
  // 2nd way to print only the $GPRMC message
  //

  //   char2string(); !!!!!!!!!!!!!!!
  //   if (strncmp(messageline, dataformat, 6) == 0 & i>4)
  //   {
  //     Serial.println(messageline);
  //   }

  //
  // way to print ALL RECEIVED MESSAGES!
  //

   Serial.print(SWread(),BYTE); //use this to get all GPS output, comment out from char2string till here

}

No entiendo los “SWprint(‘h’); //debugging hello
SWprint(‘i’);
SWprint(10); //carriage return”
¿Por qué hace esto?

Si suprimes estas tres instrucciones, la función “SWprint()” de dicho código, para qué se utiliza?

Buenas de nuevo Frutronik,

pues respondiendo primero a esto último que comentas.

En este caso, como te comentaba, dado que está utilizando la librería SoftSerial (o similar), y tampoco lo he mirado detenidamente, parece que el GPS lo tiene conectado a los pines 6 y 7 (softserial).

El hecho de que haga eso que tú comentas (lo de SWprint(‘h’); … debe ser un simple proceso de depuración o comprobación, como indica. Tan sólo envía al GPS un mensaje de saludo “hi” y salto y retorno de carro, como diciendo, hey! estás escuchando?!, pero sin mayor sentido.

En cuanto a lo que me preguntabas del retardo de adquisición de la señal del GPS, pues la primera vez, o encendido en frío, aún te tardará unos minutillos, pero una vez ha adquirido señal, si apagaras, y encendieras, serían unos segundos.

Te dejo aquí el parser que yo utilicé, y que luego modifiqué, pues tenía algún problema con algún dato: http://www.ladyada.net/make/gpsshield/GPStest_RMC.pde

Un saludo