Sensor de posición
 

GPS (Global Positioning System)

 

1.- Fundamentos

El GPS puede determinar con una precisión de 1 metro la posición absoluta de una persona u objeta en todo el planeta.

Este funciona a través de una red de 27 satélites en órbita alrededor del planeta, donde cada uno de estos lleva un reloj atómico y es un claro ejemplo de la teoría de la relatividad de nuestro amigo Albert Einstein.

Vamos a usar un chip relativamente nuevo llamado MTK MT3318 que están sustituyendo a los flamantes chips SIRF Star III por ser más económicos y tener un menor consumo además de poseer mejores características.

Como bien sabemos, si algo ya existe es mejor y más barato comprarlo que hacerlo, es por ello que en vez de comprar el módulo gps con el chip MTK, hemos decidido comprar directamente el GPS de la casa Holux llamado M1200 por sus buenas características y precio reducido, además nos ahorramos el comprar una batería para el chip.

Sus características más importantes son las siguientes:

Soporta DGPS con lo que obtiene una posición menor de 2.2 metros en horizontal
Sensibilidad -159dBm, sirve para indoor.
Bluetooth.
Protocolo NMEA v. 3.01
Comunicación serie: 38400 bps, 8 data bits , No parity, 1 stop bit.

 

2.- Protocolo NMEA

NMEA (National Marine Electronics Association), permite enviar datos de posición entre los equipos electrónicos de la Marina. Los receptores de GPS han sido definidos con este protocolo de transmisión sencillo. Todas las sentencias NMEA empiezan con los carácteres $GP y acaban con *YZ donde YZ es un número de dos cifras que representa el checksum de la cadena. Nosotros sólo vamos a explicar el significado de la primera trama de datos que envía un GPS ya que esta es la más importante por su contenido.

$GPGGA,163308.000,4019.5475,N,00347.4121,W,1,9,.086,686.3,M,51.7,M,,*46

GGA -> Global Positioning System Fix Data
163308.000 -> Fix taken at 16:33:08.000 UTC
4019.5475,N -> Latitude 40 deg 19.5475' N
00347.4121,W -> Longitude 3 deg 47.' W
1 -> Fix quality: Este puede ser de diferentes tipos:

0
invalid
1
GPS fix (SPS)
2
DGPS fix
3
PPS fix
4
Real Time Kinematic
5
Float RTK
6
estimated (dead reckoning) (2.3 feature)
7
Manual input mode
8
Simulation mode

9 -> Number of satellites being tracked
0.86 -> Horizontal dilution of position
686.3,M -> Altitude, Meters, above mean sea level
51.7,M -> Height of geoid (mean sea level) above WGS84
*46 -> the checksum data, always begins with *

 

3.- Recogiendo los datos del GPS

Holux M1200 tiene un refresco de datos de 1Hz o lo que es lo mismo envía una trama de datos cada segundo. Esta trama de datos es enviada a la USART del PIC, donde a través de un interrupción guardaremos cada linea recibida por el GPS (hasta que recibimos un fin de carro).

Luego guardaremos dicha linea en una variable de tipo array of char llamada cbuff la cual será enviada al ordenador a través del usb y así sucesivamente con todas las lineas que envía el GPS.

Hay que tener en cuenta la conexión entre el GPS y el PIC, para ello tenemos que ir al datasheet y ver el siguiente diagrama de pines.

Como hemos conectado el gps a través de un cable con conector mini usb y lo hemos cortado, hemos visto la siguiente combinación.

Cable marrón -> TX Pic
Cable verde -> RX Pic

El esquemático y componentes necesarios para la realización de este tutorial es el siguiente.

La programación del pic se a realizado mediante el compilador CCS.

El código fuente es el siguiente.

#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)
#USE RS232(BAUD=38400, XMIT=PIN_C6, RCV=PIN_C7, PARITY=N ,BITS=8, ERRORS,stream=RF,disable_ints)//Mediante HW
#define LEDV PIN_B4
#define LEDR PIN_B5
#define LED_ON output_high
#define LED_OFF output_low
int const lenbuff=90; // Tamaño del buffer de recepción
int xbuff=0; // Índice: siguiente char en cbuff
int8 cbuff[lenbuff]; // Buffer
char gpsbuff[lenbuff]; // Buffer GPS
char rcvchar=0; // Ultimo caracter recibido
int1 flagcommand=0; // Flag para indicar comando disponible
char c,d;
int i,j;
const int8 LF=10;

#include <usb_cdc.h>//Siempre va antes del include usb_desc_cdc.h
#include <usb_desc_cdc.h>

void inicbuff(void); // Borra buffer
void addcbuff(char c); // añade caracter recibido al buffer

#int_rda
void serial_isr()
{ // Interrupción USART
d=0;
LED_OFF(LEDR);
LED_ON(LEDV);
d=getchar(RF);
addcbuff(d);
}

void inicbuff(void)
{ // Inicia a \0 cbuff -------------------
int j;
for(j=0;j<lenbuff;j++)
{ // Bucle que pone a 0 todos los
cbuff[j]=0; // caracteres en el buffer
}
xbuff=0; // Inicializo el indice de siguiente caracter
}

void addcbuff(char c)
{
switch(c)
{
case 10:
flagcommand=1;
disable_interrupts(int_rda);
break;
default:
cbuff[xbuff++]=c;
if(xbuff>lenbuff)
xbuff=lenbuff;
}
}

void main() {

flagcommand=0;

LED_OFF(LEDV); //encendemos led rojo
LED_ON(LEDR);

enable_interrupts(int_rda); // Habilita Interrupción RDA
usb_cdc_init();
usb_init(); //inicializamos el USB
enable_interrupts(global); // Habilita interrupciones

usb_task();
usb_wait_for_enumeration();//Esta linea espera hasta que el usb esté conectado

LED_OFF(LEDR);
LED_ON(LEDV); //encendemos led verde

while (true)
{
if(usb_enumerated())
{
if(flagcommand==1)
{
flagcommand=0;
for(i=0;i<(xbuff);i++)
{
usb_cdc_putc(cbuff[i]);
}
usb_cdc_putc(10);
inicbuff();
LED_OFF(LEDR);
LED_OFF(LEDV); //encendemos led verde
enable_interrupts(int_rda);
}
}
}
}

Cuando recibimos los datos del GPS, el pic realiza una interrupción por el puerto serie, este función de interrupción la hemos llamado serial_isr(), este se ejecutará cada vez que el buffer de la USART tenga algo que enviar.

Por tanto si este buffer tiene algo lo almacenamos en la variable cbuff a través de la función
void addbuff().

Si el caracter recibido por el GPS es un retorno de carro (#10), enviamos la cadena recibida al usb y formateamos el array de char cbuff y así constantemente.

 

4.- Programación PC

Se ha realizado un programa que se conecte con el pic y recoja la primera trama NMEA que envía el GPS para mostrarla en pantalla con un refresco de 500ms.

El funcionamiento es muy sencillo, seleccionamos el puerto com correspondiente y sus propiedades (velocidad, paridad...) para más tarde pulsar sobre Inicio para comenzar la comunicación a la cual recibiremos la trama entera de datos en el editbox de la derecha y formatearemos la primera trama de datos ($GPGGA) para situarla sobre los editbox de la izquierda del programa.

 

5.- Download

Esquemático en OrCAD.

Proyecto PIC en CCS.

Ejecutable MetroTrasto.

Manual de usuario GPS Holux M1200.

Manual de usuario chipset MTK.

 

6.- Ejemplo visual de la aplicación

Este ejemplo se ha realizado en el parque de polvoranca, aquí podéis ver donde se situa y las coordenadas que nos ha dado el GPS en la demostración realizada.

Aquí podéis ver el video de la aplicación.

 
 



Inicio | Foro | FAQ | MapaWeb | BuscadorWeb