Go Down

Topic: arduino + GPS (Read 11626 times) previous topic - next topic

arduinowsk

Jan 24, 2008, 07:55 pm Last Edit: Jan 24, 2008, 07:55 pm by arduinowsk Reason: 1
Buenas gente! antes de nada agradecer a toda la comunidad por la ayuda que me estan dando en estos inicios con arduino.
Tengo dudas con el modulo GPS para arduino, la cosa esta instalada y funciona perfectamente. Este es el sketch que estoy utilizando:
Code: [Select]
/*******************************************
* Program for reading possition from GPS
* module via the softwareSerial
*
* M. Yarza
* Oct 2.007 Zaragoza
*******************************************/

// include the SoftwareSerial library
#include <SoftwareSerial.h>

// Constants
#define rxPin 9NMEA
#define txPin 8

// set up the serial port

SoftwareSerial mySerial = SoftwareSerial(rxPin, txPin);

// variables
byte byteGPS = 0;
int i = 0;
int indices[13];
int cont = 0;
int conta = 0;

char inBuffer[300] = "";

int k = 0;

void setup(){

 //setup for mySerial port
 pinMode(rxPin, INPUT);
 pinMode(txPin, OUTPUT);
 mySerial.begin(4800);
 
 //setup for Serial port
 Serial.begin(19200);

 // setup the GPS module en la posicion de loteria 2, Bilbao
 Serial.println("Configurando GPS...");
 delay(1000);
 mySerial.println("$PSTMNMEACONFIG,0,4800,1,1");        // configure NMEA sentences to show only GGA sentence
 delay(100);
 
 // command for setting time and position
 mySerial.println("$PSTMINITGPS,4315.280,N,0255.267,W,0016.0,24,01,2008,17,15,00");    

 // "4140.000,N" means: Latitude 41º40'00.0" North
 // "00053.000,W" means: Longitude 0º53'00.0" West
 // "0197" means 197 m elevation
 // "22,10,2007,11,40,00" means date and time (October 22, 2.007 - 11h 40min 00sec UTC time)
}

void loop(){

 byteGPS = 0;
 i = 0;
 while(byteGPS != 42){                   // read the GGA sentence
   byteGPS = mySerial.read();        
   inBuffer[i]=byteGPS;              
   i++;                      
 }
 
 k = 0;
 while(inBuffer[k] != 42){
   Serial.print(inBuffer[k]);            // write the GGA sentence
    k++;
 }
 Serial.println();
 delay(3000);
}


El aparato funciona y leo con el Serial monitor y envia bien la informacion. El problema que tengo es que luego a la hora de utilizar estos datos desde otro entorno (estoy utilizando python y el modulo gps de python, tambien he echo pruebas con otros interfaces) no leo bien los datos.
Utilizo linux con el gspd para leer valores del protocolo NMEA pero en algo debo de fallar porque no toma los valores. Y el caso es que si hay comunicacion serie entre ellos. Pego aqui el codigo python con el que leo los datos:
Code: [Select]
import gps, os, time
     
session = gps.gps()
     
while 1:
   os.system('clear')
   session.query('admosy')
   # a = altitude, d = date/time, m=mode,
   # o=postion/fix, s=status, y=satellites
     
   print
   print ' GPS reading'
   print '----------------------------------------'
   print 'latitude    ' , session.fix.latitude
   print 'longitude   ' , session.fix.longitude
   print 'time utc    ' , session.utc, session.fix.time
   print 'altitude    ' , session.fix.altitude
   print 'eph         ' , session.fix.eph
   print 'epv         ' , session.fix.epv
   print 'ept         ' , session.fix.ept
   print 'speed       ' , session.fix.speed
   print 'climb       ' , session.fix.climb
     
   print
   print ' Satellites (total of', len(session.satellites) , ' in view)'
   for i in session.satellites:
       print '\t', i
     
   time.sleep(3)



Como veis el codigo es sencillo, pero no me devuelve los valores del modulo gps que veo en el serial monitor :(

DojoDave

Perdona esta pregunta,

pero la tengo que hacer ... apagas el monitor del puerto serie de Arduino antes de abrir la comunicacion con Python?

/d

arduinowsk

Si lo hago, al principio no , pero me dí cuenta que leyendo desde los dos lados, iba mal en los dos.
Tambien os pongo los resultados que me dan de leer el serial monitor y lo que despues veo en python.
Serial monitor salida(lo que manda el modulo gps):
Code: [Select]
$GPGGA,193534.000,4315.280,N,02505.267,W,0,00,99.0,-041.3,M,57.3,M,,

$GPGGA,193538.000,4315.280,N,02505.267,W,0,00,99.0,-041.3,M,57.3,M,,

$GPGGA,193542.000,4315.280,N,02505.267,W,0,00,99.0,-041.3,M,57.3,M,,

$GPGGA,193546.000,4315.280,N,02505.267,W,0,00,99.0,-041.3,M,57.3,M,,


No será que tengo que pasarle tambien el cheksum al final o algo asi? como lo haria, porque si paso el valor ASCII de '*' despues no veo nada en el serial monitor.

Y la salida del interprete de python:
Code: [Select]
GPS reading
----------------------------------------
latitude     0.0
longitude    0.0
time utc      10000000000.0
altitude     10000000000.0
eph          10000000000.0
epv          10000000000.0
ept          10000000000.0
speed        10000000000.0
climb        10000000000.0

Satellites (total of 0  in view)


DojoDave

Pues veras,

me he montado todo el sistema en mi Feisty y me pasa lo mismo que a ti con el script en python. Asi que, como no estoy seguro de cual es el comando que el GPS tiene que mandar como final de linea, he copiado unas secuencias supuestamente validas de GPS que encontre en una web por ahi, incluyendo checksum y demas ... me he instalado gpsdrive y al ejecutarlo:

Code: [Select]

*** NMEA checksum error!
NMEA: $GPRMC,035545.000,A,3036.096,N,09619.512,W,0.0,0.0 ,080806,4.3,E*7
is: 6E6F6974, should be: 14

*** NMEA checksum error!
NMEA: $GPRMC,035545.000,A,3036.096,N,09619.512,W,0.0,0.0 ,080806,4.3,E*7
is: 6E6F6974, should be: 14

*** NMEA checksum error!
NMEA: $GPGGA,035545.000,3036.09648,N,09619.51249,W,2,06, 1.3,095.99,M,-23.3,M,,*5
is: 6E6F6974, should be: 5D


Asi pues, el problema que puedes estar teniendo es que el checksum no este bien ... tal y como me pasa a mi.

/d

DojoDave

Hola otra vez,

me he puesto a buscar una secuencia que no diera error en gpsdrive y ... la encontre!

Hice el siguiente programa en Arduino:

Code: [Select]

void setup() {
Serial.begin(9600);
}

void loop() {
 Serial.println("$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47");
 delay(1000);
}


Con este programa, pongo en marcha gpsdrive y ... el programa responde:

Code: [Select]

Garmin protocol detection disabled!
successfull opened /dev/ttyUSB0
new thread started: -1232884848
got no RMC data, using GGA data


Con esto, pensaba yo, tendria que funcionar el script en python, puesto que ya esta bien el checksum ... pero NO. Asi que me pregunto si es la secuencia tipo GPGGA la que lee tu script o si hay que meterle otro tipo de secuencia NMEA ... lo sabes?

Por otra parte, no estoy completamente seguro de si el fallo se produce por esto o por con conseguir poner en marcha gpsd apropiadamente. Yo lo configuro lanzando el comando gpsd +/dev/ttyUSB0 aunque no tengo muy claro que esto configure bien todas las opciones del puerto serie.

Eso si, toma control del puerto, porque si no mato ese demonio, no puedo volver a arrancar gpsdrive. Por lo tanto, mi diagnostico del problema, una vez el checksum esta bien es:

1) puede ser que no funcione bien para secuencias tipo GPGGA

2) puede ser que no sepa aun como configurar bien gpsd

Como lo ves?

/d

DojoDave

Aha!

ya estoy un poquito mas cerca de la solucion.

De entrada estaba configurando gpsd de la forma equivocada. El comando para llamarlo es:

gpsd /dev/ttyUSB0

(antes lo lei en otro sitio y no se porque añadi ese signo +)

Ademas, despues de leer el estandar un par de veces, en la pagina: http://www.gpsinformation.org/dale/nmea.htm#nmea, he llegado a la conclusion de que seria mejor hacer un programa para Arduino que incluyese informacion de la velocidad, el numero de satelites implicados, etc:

Code: [Select]

void setup() {
Serial.begin(9600);
}

void loop() {
 Serial.println("$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47");
 delay(100);
 Serial.println("$GPGSA,A,3,04,05,,09,12,,,24,,,,,2.5,1.3,2.1*39");
 delay(100);
 Serial.println("$GPGSV,2,1,08,01,40,083,46,02,17,308,41,12,07,344,39,14,22,228,45*75");
 delay(100);
 Serial.println("$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A");
 delay(1000);
}


Al arrancar asi y lanzar el script en python, todo parece comenzar como antes, pero tras un par de segundos en lo que Arduino va lanzando datos, python me responde:

Code: [Select]

Traceback (most recent call last):
 File "gps_py", line 7, in <module>
   session.query('admosy')
 File "/var/lib/python-support/python2.5/gps.py", line 434, in query
   return self.poll()
 File "/var/lib/python-support/python2.5/gps.py", line 420, in poll
   self.__unpack(self.response)
 File "/var/lib/python-support/python2.5/gps.py", line 288, in __unpack
   self.gps_time = isotime(self.utc)
 File "/var/lib/python-support/python2.5/gps.py", line 517, in isotime
   return calendar.timegm(time.strptime(date, "%Y-%m-%dT%H:%M:%S")) + float("0." + msec)
 File "/usr/lib/python2.5/_strptime.py", line 334, in strptime
   data_string[found.end():])
ValueError: unconverted data remains: 0


Ahora si que la cosa toma un tono diferente ... creo que el problema ya esta en la forma en que las librerias decodifican las cadenas de GPS ... que sabes tu de esto?

/d

arduinowsk

... pues yo sigo en las mismas le he dado un par de vueltas mas este fin de semana pero sigo en las mismas. Voy a ver si miro algo de gpsd para ver que lee , como funciona, archivo de conf o algo...
Aun asi, yo de momento solo necesito la longitud y latitud, entoces podria leer en bruto lo que manda el arduino, y parseo el texto yo directamente verdad? tomo el valor de la cadena directamente, sin que me lo parsee el gpsd. Pero claro para eso necesito tener algo de movilidad para ver si esta funcionando, porque ahora mismo no puedo mover el ordenata de donde esta. Haber si lo pruebo con el portatil esta semana!

alonsoBrain

Hola

Perdona que me meta en el thread pero me gustaria saber si has obtenido datos REALES del GPS.
(Es que estoy montando lo mismo pero no me va...)

A mi el GPS me esta dando datos NMEA correctos, pero no son diferentes de los que les he metido en la inicializacion. Son los mis mismos salvo que la hora va cambiado, pero tampoco es la hora real UTC sino la que tu le has metido incrementada correctamente...

Mas que un GPS parece un reloj :-D

Llevo con el mas de 15 minutos en la ventana i"ntentando sintonizar la onda", pero nada

Alguna idea?

gracias!

DojoDave

No se si la pregunta va dirigida a mi,

en cualquier caso, yo solo he utilizado lo que se ve en ventana. Tengo un GPS en la mesa de mi laboratorio para un articulo que ando escribiendo. Lo probare la semana que entra y ya escribire aqui sobre mis conclusiones.

/d

arduinowsk

ultimanente no he tenido de meterle mas horas a esto, pero para mi tambien es como un reloj, de momento me da la hora :)
postearé cuando consiga algo... de momento...

alonsoBrain

#10
Feb 04, 2008, 11:41 pm Last Edit: Feb 04, 2008, 11:49 pm by alonsoBrain Reason: 1
Solucionado
Ya pilla señal correctamente.

Era cuestion de exponerlo 15 minutos en la montaña despejada y listo :-)
Al cabo de solo 2 minutos ya entrega la hora UTC correcta, y en cuanto recibe 3 satelites ya da la posicion por "fixada"

Las siguientes conexiones ya tarda menos....

un saludo

noceco33

#11
Feb 12, 2008, 04:38 pm Last Edit: Feb 12, 2008, 05:02 pm by noceco33 Reason: 1
Tengo ese problema, la hora no es correcta y las coordenadas son de 0000.00000 N y lo mismo Este, no se lo que hacer, lo tengo en la ventana desde hace un rato, con el monitor de puerto serie leyendo constantemente. No hay edificios en un radio de 300 m (reales), Cuando te lo has llevado al campo como has sabido que estaba funcionando??? has llevado el portatil tambien???

Hay que proporcionarle coordenadas la primera vez que lo enchufas????



DojoDave

Que GPS tienes?

No hace falta inicializar los GPSs, tienen que empezar a darte datos una vez han conseguido suficientes mediciones como para calcular su posicion. Yo me fijaria en si la antena esta bien conectada, si no hay posibilidad de que tu edificio haga sombra a los satelites (puedes probar a bajarte a la calle con el portatil), etc.

Si despues de un tiempo prudencial el sistema no te da valores de coordenadas apropiadas, lo mismo esta estropeado.

/d

noceco33

El sistema es de Libelium!!!!!, no habia pensado en que el edificio haga sombra, y tiene bastante lógica. el caso es que ademas no me gusta nada el cablecito que une el conector de la antena en la placa y la propia antena,

He seguido la explicación de este Link

Y aqui tienes una imagen de mi disp en particular...



DojoDave

Bien,

entonces tu GPS es como el mio. Si no se estropeo en el transporte cuando lo compraste de Libelium, lo mas probable es que, como te dije, el edificio te haga sombra. Parece una tonteria, pero con que te alejases 4 o 5 metros de la ventana, seria mas que suficiente para que recibiese señales de los satelites.

/d

Go Up