Control de robot móvil con GPS

Hola! Saludos a todos. Este es un proyecto que me esta dando complicaciones.

Estoy empezando un proyecto con PIC18F2550, para controlar y manejar un robot móvil con los datos de un módulo GPS.
El caso es que no he usado mucho este PIC, algo he hecho con el RS232. Lo voy a realizar en lenguaje c18

He construido una pequeña tarjeta en la que he colocado los siguientes elementos que en
principio considero necesarios para que logre la obtención de las tramas, que permita desde ella la interacción con un PC, bien vía RS-232.

Aún no la he puesto en marcha. Bueno, lo cierto es que he usado el MAX232 con la antena GPS y ya puedo ver las tramas que me envía cada segundo, ahora se trata de interpretar los datos y cómo usarlos. La pregunta que surge es la siguiente:

Como decodificar las tramas NMEA y que me muestre la ubicación?

Como puedo lograr el control del robot a través de el software Matlab, comunicándolo con el microcontrolador?
Espero que me den algunos consejos, para saber como he de proceder para que intervenga el 18F2550 y poder hacer una aplicación interesante.

Creo que en mi atrevimiento, me ha adelantado a los conocimientos y espero que no me tenga que arrepentir ya que es el proyecto que tengo que hacer para mi tesis.
 
Creo que en mi atrevimiento, me ha adelantado a los conocimientos y espero que no me tenga que arrepentir ya que es el proyecto que tengo que hacer para mi tesis.

No me lo tomes a mal pero creo que si te adelantaste mucho, jamas he hecho eso que dices, lamento no poder ayudar pero si te puedo decir "Animo" despues de todo aunque no salga para tu tesis, te aseguro que algo has de aprender
 
Exacto tu lo acabas de decir es mas sencillo por tal motivo dentro de mi proyecto no me permitieron utilizar ningun pic de arduino o similiar, en mi caso si es necesario realizar la programación en c18, al robot lo tengo que controlar con el software Matlab, por eso necesito algunas opiniones.
 
Arduino es hardware libre por lo que hay muchas personas trabajando en eso, he podido encontrar diseños GPS- Ardupilot que es algo parecido a lo que quieres hacer, sin matlab y con software propio, si bien no vas a usar arduino, puedes guiarte viendo como ellos decodificaron las tramas NMEA, buscando en el codigo del proyecto la parte GPS, aunque eso implicaria comprender un poco como esta estructurado arduino. NMEA esta estandarizado asi que puedes extraer algoritmos que te pueden servir.
Yo he copiado codigo de arduino en bastantes ocasiones, sin tener tarjetas arduino, modifique librerias para utilizarlas en un simple micro atmel es un poco tardado pero es una muy buena guia, aunque se te dificultara un poco por lo que usas PIC's.(busca en Code.google.com)
Aqui hay un modulo Gps de linx technologies........ puede que te sirva.
http://www.linxtechnologies.com/resources/data-guides/rxm-gps-sr.pdf
 
Bien Hamster, te agradezco tu opinion y dejame decirte que en un principio si estaba trabajando con el Gps RXM-GPS-SR, pero por ciertos problemitas ya no continue con él. Ahora voy a trabajar con el PMB-648 GPS module. solo que aún sigo esperando la llegada porque como lo pedi en el extranjero todavia no llega.
Ya tengo un código para obtener las tramas pero aún no lo he probado directamente con el GPS. Si alguien puede hecharle un vistazo y comentar sobre el se los agradecería.
A otra cosa el desplazamiento del robot lo tengo que realizar calculando los "Centros de Rotación Instantanea", y no tengo ni idea de como implementarlo.
Help me!!!!
 
Hola jkrllos, Que buen dato!, el PMB-648 GPS se ve mas fácil de trabajar físicamente y mas barato que el RXM-GPS-SR de Linx Technologies, yo estaba ahorrando para comprar el RXM-GPS-SR, pero creo que el PMB-648 GPS es mejor opción.:unsure:
Lo bueno que le miraba al RXM-GPS-SR es el software que la compañia ofrece, con este se visualizaban las tramas de llegada y la información que estas contenían, lo que facilitaría la programación
Buscaré toda la información que pueda del PMB-648, de verdad me interesa mucho.... gracias por el dato.:apreton:
 
No hay problema, para lo q se pueda aquí estamos. Sobre lo que dices del software no hay problema, las tramas las puedes obtener en muchos otros programas por ejemplo en Matlab o directamente en hyperterminal, claro configurando los mismos valores de paridad, bits de parada, etc.

Bueno cambiando de tema un poco, ayer se me paso subir el código que ya tengo en c18 para decodificar las tramas pero aún no lo he probado, haber si alguien puede hecharle un vistazo y orientarme o auxiliarme en el proyecto.
El código lo anexo enseguida:

Código:
#include<p18f2550.h>
#include<delays.h>
#include<usart.h>
#include<adc.h>
#include<stdio.h>
#include<string.h>
#include<xlcd.h>

#pragma config FOSC=XT_XT,IESO=OFF,CPUDIV=OSC1_PLL2 
#pragma config PWRT=ON,BOR=OFF,WDT=OFF,WDTPS=32768  
#pragma config MCLRE=ON,PBADEN=OFF,CCP2MX=OFF    
#pragma config STVREN=OFF,XINST=OFF 
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CPB=OFF,CPD=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF
#pragma config WRTB=OFF,WRTC=OFF,WRTD=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTRB=OFF
#pragma config LVP=OFF

//***********Interrupciones***********//
void ISRRecepcion(void);
volatile char Data, Kbhit;

#pragma code Interrupcion = 0x0008
void VectorInterrupcion(void){
	_asm goto ISRRecepcion _endasm
}
#pragma code

#pragma interrupt ISRRecepcion
void ISRRecepcion(void){
	if(PIR1bits.RCIF==1){
		Data=getcUSART();
		Kbhit=1;
		PIR1bits.RCIF=0;
	}
}

//***********LCD***********//
void DelayFor18TCY(void){
    Delay10TCYx(2);
}
void DelayPORXLCD(void){
    Delay1KTCYx(15);
}
void DelayXLCD(void){
    Delay1KTCYx(2);
}

// Envia comandos al LCD
void comandXLCD(unsigned char a){
    BusyXLCD();
    WriteCmdXLCD(a);
}
//Ubica cursor en (x = posición en línea, y = N de linea)
void gotoxyXLCD(unsigned char x, unsigned char y){
unsigned char direccion;

	if(y != 1)
	    direccion = 0x40;
	else
	    direccion=0;
	
	direccion += x-1;
	comandXLCD(0x80 | direccion);
}


//***********Programa principal***********//
void flush_buffer(void);
void main(void){
	int k;
char str[], cadenaGGA[], cadenaRMC[], GPS_Latitude, GPS_LatMins, GPS_LatFrac, GPS_Longitude, GPS_LonMins, GPS_LonFrac;
float fGPS_Latitude, fGPS_Longitude;
	OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON &
		  USART_ASYNCH_MODE & USART_EIGHT_BIT &
		  USART_CONT_RX & USART_BRGH_HIGH,25);
	OpenADC(ADC_FOSC_RC & ADC_2_TAD & ADC_RIGHT_JUST, 
			ADC_REF_VDD_VSS & ADC_INT_OFF, ADC_2ANA);
	Kbhit=0;
	RCONbits.IPEN=0;
	INTCONbits.PEIE=1;
	INTCONbits.GIE=1;

//***********Inicializa LCD***********//
	OpenXLCD(FOUR_BIT & LINES_5X7);
	comandXLCD(0x06);
	comandXLCD(0x0C);

	gotoxyXLCD(fGPS_Latitude,1);
	gotoxyXLCD(1,2);
	putrsXLCD("  mecatronica  ");
	while(1){
	}	

while(1){

    k=0;
    flush_buffer();
    while(1){
        while(!DataRdyUSART());
        str[k] = getcUSART();
        if (str[k] == 36 ) break;
        }
    str[k] = '$';
    while(1){  //hacer hasta que entre el caracter "*" asci 42
        while(!DataRdyUSART());
        str[k] = getcUSART();
        if(str[k]==0x0A || k >= 70) break;    
        k++;
        }
        if (str[2] == 'G' && str[3] == 'G' && str[4] == 'A' ) strncpy(cadenaGGA,str,k);
        else if (str[2] == 'R' && str[3] == 'M' && str[4] == 'C' ) strncpy(cadenaRMC,str,k);

    k=0;
    while(1){
        while(!DataRdyUSART());
        str[k] = getcUSART();
        if (str[k] == 36 ) break;
        }
    str[k] = '$';
    while(1){  //hacer hasta que entre el caracter "*" asci 42
        while(!DataRdyUSART());
        str[k] = getcUSART();
        if(str[k]==0x0A || k >= 70) break;    
        k++;
        }
        if (str[2] == 'R' && str[3] == 'M' && str[4] == 'C' ) strncpy(cadenaRMC,str,k);
        else if (str[2] == 'G' && str[3] == 'G' && str[4] == 'A' ) strncpy(cadenaGGA,str,k);

	
	GPS_Latitude = (cadenaGGA[17] - '0');
	GPS_Latitude = (cadenaGGA[18] - '0') + 10 * GPS_Latitude ;
	GPS_LatMins = (cadenaGGA[19] - '0');
	GPS_LatMins = (cadenaGGA[20] - '0') + 10 * GPS_LatMins ;
	GPS_LatFrac = (cadenaGGA[22] - '0');
	GPS_LatFrac = (cadenaGGA[23] - '0') + 10 * GPS_LatFrac ;
	GPS_LatFrac = (cadenaGGA[24] - '0') + 10 * GPS_LatFrac ;
	GPS_LatFrac = (cadenaGGA[25] - '0') + 10 * GPS_LatFrac ;

	fGPS_Latitude = (float)GPS_Latitude + ((float)GPS_LatMins + (float)GPS_LatFrac * 0.0001) * 0.0166667;

	GPS_Longitude = (cadenaGGA[29] - '0');
	GPS_Longitude = (cadenaGGA[30] - '0') + 10 * GPS_Longitude ;
	GPS_Longitude = (cadenaGGA[31] - '0') + 10 * GPS_Longitude ;
	GPS_LonMins = (cadenaGGA[32] - '0');
	GPS_LonMins = (cadenaGGA[33] - '0') + 10 * GPS_LonMins ;
	GPS_LonFrac = (cadenaGGA[35] - '0');
	GPS_LonFrac = (cadenaGGA[36] - '0') + 10 * GPS_LonFrac ;
	GPS_LonFrac = (cadenaGGA[37] - '0') + 10 * GPS_LonFrac ;
	GPS_LonFrac = (cadenaGGA[38] - '0') + 10 * GPS_LonFrac ;

	fGPS_Longitude = (float)GPS_Longitude + ((float)GPS_LonMins + (float)GPS_LonFrac * 0.0001) * 0.0166667;
	
}
}


void flush_buffer(void){
    unsigned char W;
    if ( RCSTAbits.OERR ){ // Si se activa el bit de overflow
        RCSTAbits.CREN=0; // toggleo de CREN para limpiar le buffer
        W= RCREG; // flush del registro
        W= RCREG;
        W= RCREG;
        RCSTAbits.CREN=1; // toggleo de CREN
        }
}
 
Última edición por un moderador:
Hola, he estado investigando un poco!
Investigué sobre el PMB-648 , este soporta NMEA0183 V2.2 mientras el RXM-gps-sr soporta NMEA 0183 v3.0 y SiRF Binario, lo que nos permitiria seguir investigando, digo para no estar en gastaderas, he leido que el sirf binario conviene mas en aplicaciones embebidas que el NMEA.
Tu aplicación es en robotica, tal vez te conviene usar el PMB-688, este trae un conector para antena, lo que permitiría mejor recepción y mas satelites. ($50, Antena +PMB-688 +gastos de envio)
http://www.parallax.com/Store/Senso...efault.aspx?SortField=ProductName,ProductName
y antena
http://www.parallax.com/Store/Senso...efault.aspx?SortField=ProductName,ProductName
Ahora, con lo del código, voy hacer mi propia versión con un AVR, luego posteo que tal me fue, me enfocaré únicamente en decodificar y presentar las tramas NMEA.:estudiando:
 
yo hace algun tiempo trate de leer tramas con un pic pero cuando eso programe en picbasic tambien utilize un simulador de gps que se instalaba en el pc y con el virtual serial port lo conecte con mi simulacion en proteus, si quieres te paso el nombre del programa para simular el gps por que no creo que el programa en basic te sirva



http://avangardo.com/download.html

ese ese
 
Última edición:
hace algunos dias ha llegado a mis manos el PMB-688 , estoy haciendo algunas pruebas, y pues hay vamos............. aqui dejo una simulación en proteus de un decodificador de tramas NMEA 0183, la libreria GPS se puede modificar con bastante facilidad, no es una libreria muy profesional pero funciona.
Ya lo probe (pruebas de campo).... usando un ATmega644 y el PMB-688 ...
Cuando tenga tiempo intentaré optimizar la libreria para que sea mas facil de usar.
...........en la simulación el MCU U2 simula el PMB-688..en el LCD solo se visualiza LATITUD y LONGITUD pero si revisan, en los registros del atmega se almacenan varios datos de las tramas RMC y GGA... entre estos: latitud, longitud, hora, minutos, segundos, año, mes,dias, Altura MSL.
falta modificarlas para las demas tramas....
 

Adjuntos

  • gps pmb-688.rar
    164.3 KB · Visitas: 51
Atrás
Arriba