Proyecto de novato con sentencias NMEA

Hola, es mi primer mensaje y estoy iniciandome en el mundo arduino, por lo que soy muy novato y con conocimientos limitados sobre todo en cuanto al software.

Os cuento mi proyecto, y me gustaria saber si es factible hacerlo con Arduino o si no va a ser posible o demasiado complicado.

El asunto es que tengo tres Gps que me generan unas sentencias NMEA por Rs232, algunas de estas sentencias son comunes en los 3 gps, como las coordenadas de posicion, pero otras me las da uno si y el otro no, como la altura, y un tercero me da la velocidad, que no me lo da los otros dos.
Lo que quiere hacer es un multiplexor de estas 3 entradas que acabe en una unica salida rs232,que discrimine las sentencias repetidas y contenga las unicas de cada entrada claro, de forma que en la salida obtenga la mezcla de las sentencias de los 3 gps sin duplicar las repetidas.

Para liar mas la cosa me gustaria que la salida fuera a 19200bps, pero las entradas unas son a 4800 y la otra a 19200, por lo que tiene que haber un bufer.

¿Lo veis facil de hacer?

Saludos y gracias, espero con el tiempo poder aportar algo yo....

En principio no parece dificil, aunque si algo complicado.

Hay un punto clave que no cuentas, que es cuándo le llegan los datos al Arduino. Si para recibir los datos antes los ha de pedir, entonces es bastante sencillo: lees secuencialmente cada uno de los GPS, guardado cada envío en un array, reformateas los datos y los reenvías.

Si en lugar de bajo demanda los datos llegan según los GPS los van cantando, entonces si que habría que hacer un poco más de trabajo, tal vez usando interrupciones, pero tampoco mucho más.

Las velocidades de transmisión dan igual, simplemente adaptas cada puerto a cada dispositivo y listos.

Ah, y te hará falta el Arduino Mega, que tiene 4 puertos serie, el Uno, el barato, solo tiene uno.

Los gps segun los enciendes empiezan a escupir datos de este estilo:

$GPRMC,023042,A,3907.3837,N,12102.4684,W,0.0,156.1,131102,15.3,E,A36
$GPRMB,A,,,,,,,,,,,,A,A
0B
$GPGGA,023042,3907.3837,N,12102.4684,W,1,04,2.3,507.3,M,-24.1,M,,75
$GPGSA,A,3,04,05,,,09,,,24,,,,,2.8,2.3,1.0
36
$GPGSV,3,2,11,09,47,229,42,10,04,157,00,14,00,305,00,24,70,154,3379
$GPGLL,3907.3837,N,12102.4684,W,023042,A,A
5E
$GPBOD,,T,,M,,47
$GPVTG,156.1,T,140.9,M,0.0,N,0.0,K
41
$PGRME,8.4,M,23.8,M,25.7,M2B
$PGRMZ,1735,f
34
$PGRMM,WGS 8406
$HCHDG,,,,15.3,E
30
$GPRTE,1,1,c,37
$GPRMC,023044,A,3907.3840,N,12102.4692,W,0.0,156.1,131102,15.3,E,A
37

Cada uno con sus sentencias, pero estan siempre enviando datos desde el inicio y repitiendolos, no son a demanada, el arduino debe coger algunas lineas de cada uno y despreciar las duplicadas.

Gracias por la respuesta !

Pues en ese caso lo más fácil es que el secuenciamento lo hagas tú: mantienes todos los puertos serie desactivados y los vas activando uno por uno. Lees lo que hay entre las marcas de inicio y fin de transmisión, lo metes en un array, cierras el puerto y al siguiente. Después de haber leído los cuatro, tomas lo que quieras de cada array, lo reformateas, lo mandas a la salida y vuelta a empezar.

Yo también soy nuevo en el tema arduino, pero no es la primera plataforma del estilo que toco.

Si activa y desactiva los puertos cuando él quiera, no tiene certeza alguna de que los datos que va a adquirir desde cada aparato pertenecen al mismo ciclo de los gps, y puede recibir secuencias incompletas, así que no creo que esa opción sea válida.

Por otro lado también hay que tener en cuenta que el Mega tien 64bytes de buffer, y cada una de las estructuras de las sentencias nmea es más larga que ese buffer, así que o le da maxima importancia a la lectura, o tendrá perdidas de datos.

Como tercera complejidad que veo, es el hecho de que dos gps de uso doméstico no van a dar el mismo dato por muy cerca que estén, con lo que si quieres eliminar sentencias RMC y GGA o bien eliminas una de las dos que te entren al azar, o haces media de ambas, pero iguales no van a ser.

Lamento no ayudar mucho, pero como digo no conozco arduino en profundidad, y no he trabajado con GPS en él. Solo me limito a adelantarte problemas para que no te des con esos muros cuando lleguen, y los veas venir de lejos :wink:

Usando un arduino Mega puedes conectar los 3 GPS, luego con la libreria softwareserial abres las tres conexiones y coges lo que quieras de cada una.
No entiendo lo que un GPS no envié todos los datos NMEA, hasta los gps de 12 euros que hay en ebay lo hacen

Software serial

Arduino Mega

Enlace
http://arduino.cc/es/Main/ArduinoBoardMega

flico:
Usando un arduino Mega puedes conectar los 3 GPS, luego con la libreria softwareserial abres las tres conexiones y coges lo que quieras de cada una.
No entiendo lo que un GPS no envié todos los datos NMEA, hasta los gps de 12 euros que hay en ebay lo hacen

Software serial
http://arduino.cc/en/Tutorial/SoftwareSerialExample

Perdón por la inexperciencia, pero como ya comenté, soy nuevo en arduino. ¿Por que utilizar SoftwareSerial si los puertos 1, 2 y 3 del arduino son nativos? ¿Aporta mayor buffer? ¿Que ventaja tiene frente al Serial común?

Tienes razón, me había colado con otra cosa.

Y cuál es el objeto del proyecto, si no es indiscrección, osea esos datos dónde van a parar y qué haces con ellos.
Es que para un novato parsear sentencias nmea y comunicar con el PC (supongo que luego esos datos los procesarás con algún software a medida para algo en concreto), no es precisamente una forma sencilla de empezar.

¿No sería más lógico ir paso a paso?
Primero entender como enviar y recibir con RS232
Luego cómo parsear NMEA
Entre tanto las peculiaridades del Arduino (tamaño de los buffers por ej)

Luisito555es:
Hola, es mi primer mensaje y estoy iniciandome en el mundo arduino, por lo que soy muy novato y con conocimientos limitados sobre todo en cuanto al software.