¿Qué es este blog?

La idea de este blog nace para compartir los avances que se vayan realizando a lo largo de un estudio sobre cómo interconectar los distintos sensores que se pueden encontrar en el mercado, o fabricar de forma casera, con la plataforma Mindstorms de LEGO. Para ello se hará uso ARDUINO, un entorno de desarrollo abierto basado en microcontrolador.
Mostrando entradas con la etiqueta GPS. Mostrar todas las entradas
Mostrando entradas con la etiqueta GPS. Mostrar todas las entradas

domingo, 12 de junio de 2011

Conexión del GPS Venus con conector SMA con Arduino por puerto serie


Otro de los dispositivos cuya integración se ha probado con Arduino ha sido un receptor GPS de la marca Venus, que se puede apreciar en la siguiente imagen:

Figura Receptor GPS Venus con conector SMA
Se trata de un receptor de gran sensibilidad, que permite la conexión de una antena externa mediante un conector SMA. Se puede configurar para lograr una tasa de refresco de hasta 10 Hz., y permite obtener por el puerto serie cadenas del tipo NMEA-0183, que se explicarán en otro post del blog. La tasa por defecto a la que este dispositivo devuelve datos es de 9600 baudios, pero puede configurarse con una velocidad de hasta 115200 baudios.
El corazón de este GPS es el chip Venus634FLPx, que lleva incorporado un LNC, un reloj en tiempo real y un regulador de tensión. Las características más destacadas son las siguientes:
  • 51 canales de adquisición y 14 de tracking
  • Lleva un chipset SkyTrack
  • La frecuencia máxima de actualización es de 10 Hz. aunque viene configurada por defecto a 1 H.
  • Lleva LNA integrado
  • Se debe alimentar con una tensión de entre 2,7 y 3,3 V.
  • Su consumo es de unos 28 mA una vez conectado con los satélites.
  • Su sensibilidad es de -161 dBm
  • El margen de error al posicionarse es de menos de 2,5 metros
  • Si se arranca en frío puede tardar unos 29 segundos en localizarse, mientras que si se arranca en caliente este tiempo se reduce incluso hasta un segundo.
  • Soporta antenas tanto activas como pasivas, aunque en el caso de las primeras deberán alimentarse de forma externa.
  • Su tamaño es de 3,8x1,8 cm, con lo que es fácilmente integrable.


Conexiones realizadas

Las conexiones realizadas son similares a las que se hicieron en el caso del lector RFID, con la diferencia de que en este caso el circuito va alimentado a una tensión de 3,3 V. Por lo tanto:
  • Las tierras (pines GND) de dispositivo se conectan entre sí y con cualquiera de los pines de tierra de la placa de Arduino.
  • El pin TX se conecta con el pin RX0 de Arduino, que en el caso de Arduino Mega 2560 corresponde al pin 0.
  • El pin de alimentación de 3,3 V se conecta con el pin de 3,3 V de Arduino.

Código implementado

En el código que se incluye a continuación, simplemente se configura la velocidad a 9600 baudios y se van mostrando los datos que se vayan recibiendo a través del puerto serie:

char val = 0; //Para almacenar el valor que le llega

void setup() {
    Serial.begin(9600); // Conectamos al puerto serie
}

void loop () {

    char IDstring[13]; //Para almacenar el tag
    int  i;
  
    if (Serial.available() > 0 ) {
      //Serial.println("Datos --> ");
      val = Serial.read();    // Se busca el inicio del codigo
      Serial.print(val);
      if (val=='\r'){
        Serial.println(" ");
      }
    }
}



Sentencias NMEA

Para poder entender el funcionamiento del receptor GPS que explicará a continuación, explicaremos primero en qué consisten las sentencias NMEA y cuáles son sus principales campos.

Las siglas NMEA son las siglas en inglés de la Asociación de Marina y Electrónica Nacional, es decir, la “National Marine Electronic Asociation). Esta asociación americana, fue la primera en establecer un protocolo normalizado de comunicación entre equipos y dispositivos de navegación. A modo de reseña histórica, comentar que el primer protocolo en aparecer fue el NMEA 180 simple, que permitía a los barcos transmitir datos a un piloto automático del grado de desviación a babor o a estribor con respecto a una trayectoria predeterminada. Más tarde, aparecieron los protocolos NMEA 180 complejo y el NMEA 182, que mejoraban al primero incluyendo datos de geolocalización.
El protocolo más usado actualmente, y el que usa nuestro GPS Venus, es el NMEA-183 cuyas principales secuencias se describen a continuación.

GGA - Global Positioning System Fix Data


Este tipo de mensajes incluye información sobre el tiempo, la posición, y otros datos relativos al posicionamiento de un receptor GPS.
La estructura de estos mensajes es la siguiente:

$GPGGA,hhmmss.sss,ddmm.mmmm,a,dddmm.mmmm,b,x,yy,z.z,x.x,M,,,,xxxx*hh

Veamos a continuación lo que significa cada campo:

  • hhmmss.sss: Tiempo en formato UTC (Universal Coordinate Time).
  • ddmm.mmmm: Latitud. Se rellena con ceros por la izquierda.
  • a: Indica el hemisferio de la latitud (N o S según sea latitud Norte o Sur).
  • ddmm.mmmm: Longitud. Se rellena con ceros por la izquierda.
  • b: Indica el hemisferio de la longitud (E o W según la longitud sea Este u Oeste)
  • x: Indica la calidad del GPS
    • 0: no se ha podido obtener la posición
    • 1: posición GPS válida. Modo SPS.
    • 2: posición GPS váida. Modo GPS diferencial
    • 3: posición GPS válida. Modo PPS.
    • 4: Modo “Real Time Kinematic”.
    • 5: Modo “Floating RTK”.
    • 6: Modo de estimación
    • 7: Modo de entrada de datos manual
    • 8: Modo simulación
  • yy: Número de satélites usados
  • z.z: Parámetro HOPD. Nos da la precisión horizontal
  • x.x: Altitud con respecto al nivel del mar
  • Finalmente, nos ofrece otros parámetros como el identificador de la estación GPS de referencia y un checksum para comprobar la correcta recepción de los datos.
GLL – Latitude / Longitude
Estos mensajes transmiten información sobre la latitud y la longitud de la posición actual, así como sobre el tiempo y el estado de la conexión. La estructura es la siguiente:

$GPGLL,ddmm.mmmm,a,dddmm.mmmm,b,hhmmss.sss,A,a*hh

Y veamos lo que significa cada campo:
  • ddmm.mmmm: Latitud. Se rellena con ceros por la izquierda
  • a: Indica el hemisferio (N si es el hemisferio Norte, y S si es el Sur)
  • dddmm.mmmm: Longitud. Se rellena con ceros por la izquierda
  • b: Indica el hemisferio Este (E) u Oeste (W)
  • hhmmss.sss: Tiempo en formato UTC
  • A: Estado. Si muestra una ‘A’, los datós son válidos y si muestra una ‘V’ son inválidos.
  • a: Indicador del modo. Puede contener:
    • N: Datos no válidos
    • A: Modo autónomo
    • D: Modo diferencial
    • E: Modo estimado
    • M: Entrada de datos de forma manual
    • S: Modo simulación
  • Finalmente se incluye información de checksum
GSA – GNSS DOP and Active Satellites

Indica el modo de operación del receptor GPS, los satélites usados para la navegación proporcionados por las sentencias GGA o GNS y los valores DOP. La estructura es la siguiente:

$GPGSA,A,a,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,x.x,x.x,x.x*hh
Y la correspondencia de cada campo:


  • A: Si contiene una ‘M’ estamos en modo manual, forzando el funcionamiento en 2D o en 3D, mientras que si contiene una ‘A’, se está en el modo automático, con selección 2D/3D automática
  • a: Si contiene un ‘1’ es que no ha sido posible obtener información sobre si se encuentra en modo 2D o 3D. El ‘2’ representa el modo 2D, mientras que el ‘3’ representa el modo 3D. 
  • Los siguientes datos corresponden a los identificadores de los satélites (puede haber 12 satélites con identificadores comprendidos entre 01 y 32), seguidos de la precisión de posición, de la precisión horizontal y de la precisión vertical
  • El último campo corresponde al checksum

GSV – GNSS Satellites in View
Estas sentencias nos proporcionan información sobre el número de satélites que el GPS está “viendo” en ese momento, con sus respectivos identificadores, ángulos de azimuth, elevación y relación señal a ruido. Habrá un máximo de 4 satélites por sentencia. Su estructura es la siguiente:

$GPGSV,N,s,yy,xx,xx,xxx,xx,…,xx,xx,xxx,xx *hh


Estos campos corresponden a:

  • N: Indica cuántas sentencias de este tipo se van a transmitir (tomará por tanto valores de entre 1 y 3).
  • s: Número de secuencia
  • yy: Número de satélites que se están viendo en ese momento
  • Los datos siguientes son:
    • Los identificadores de cada uno de los satélites
    • Su elevación
    • Su azimuth
    • Su relación señal a ruido, que valdrá cero si no se está logrando una correcta conexión.
    • Checksum
RMC – Recommended Minimum Specific GNSS Data
Nos proporcionan información sobre la hora, la fecha, el rumbo y la velocidad proporcionados por el receptor GNSS. Su estructura es la siguiente:

$GPRMC,hhmmss.sss,A,dddmm.mmmm,a,dddmm.mmmm,a,x.x,y.y,ddmmyy,,,a*hh

Veamos la explicación de los campos:
  • hhmmss.sss: Hora en formato UTC
  • A: Estado. Si contiene una ‘A’ es que los datos son válidos, mientras que si contiene una ‘V’ es que se está produciendo algún problema
  • dddmm.mmmm: Son los datos de la latitud. Se rellena con ceros pos la izquierda.
  • a: Indicador de Norte (N) o Sur (S)
  • dddmm.mmmm: Datos de la longitud. Se rellena con ceros por la izquierda.
  • a: Indicador de Este (E) u Oeste (W)
  • x.x: Velocidad en nudos con respecto al suelo
  • y.y: Rumbo en grados con respecto a la horizontal
  • ddmmyy: Se transmite una actualización de la fecha en formato UTC
  • a: Indicador del modo. Puede contener:
    • N: Datos no válidos
    • A: Modo autónomo
    • D: Modo diferencial
    • E: Modo de estimación
    • M: Modo de entrada de datos maual
    • S: Modo de simulación
  • Finalmente se transmiere la información de checksum
VTG – Course Over Ground and Ground Speed
Estas sentencias proporcionan información del rumbo y la velocidad con respecto al suelo. Su estructura es la siguiente:

GPVTG,x.x,T,,M,x.x,N,x.x,K,a*hh


Y veamos cada campo:
  • x.x: Rumbo en grados
  • T: Velocidad sobre el suelo en nudos
  • M: Velocidad sobre el sueño en kilómetros por hora
  • A: Indicador de modo. Puede contener:
    • N: Datos no válidos
    • A: Modo autónomo
    • D: Modo diferencial
    • E: Modo de estimación
    • M: Modo de entrada de datos manual
    • S: Modo de simulación
  • Finalmente se transfiere información de checksum.