Interface de um simulador GPS com controlador PIC18F458 no Proteus usando um emulador de porta serial

Conexión de un simulador de GPS con un controlador PIC18F458 a Proteus mediante un emulador de puerto serie

Para este proyecto, excepto un teléfono celular con GPS para grabar sentencias NMEA GPS, no se requiere ningún hardware. Utilicé un teléfono Android y hay varias aplicaciones disponibles en Play Store que te permiten grabar frases NMEA en formato “.txt” o “.log”. Como no todos los usuarios tienen acceso a un teléfono Android, he adjuntado dos conjuntos de frases de GPS para permitirle completar este proyecto. Dado que no se pudo obtener ninguna señal de GPS en el interior, el primer conjunto de frases de GPS se registró caminando aproximadamente 100 metros al aire libre. El segundo conjunto de sentencias de GPS se registró en interiores para una condición sin señal de GPS. El único otro hardware necesario es una PC host. Para este proyecto, utilicé una computadora portátil HP Pavilion serie G6 con un procesador Intel de 2,1 GHz y 3 GB de RAM con el sistema operativo Windows 7 Home Basic de 64 bits. Se requiere el siguiente software para completar con éxito este proyecto:

1) GPS Sí

2) Labcenter Proteus v7.6 o superior (para este proyecto se utilizó v7.8 con SP2)

3) Divisor de puerto serie Eltima v5.0

GSM

Figura 1: Ventana del simulador de GPS

La Figura 1 muestra la ventana del Simulador GPS. Para comenzar a buscar la carpeta que contiene los archivos de registro de oraciones NMEA, haga clic en el botón Examinar. Seleccione el intervalo de 8 segundos. También se pueden seleccionar 4 segundos; sin embargo, cualquier rango menor que este causará errores en Proteus y la información de latitud y longitud no se mostrará para todas las oraciones. Además, seleccione RMC como tipo de oración, ya que solo estas oraciones se pasan a la simulación de Proteus y se utilizan para obtener información de latitud y longitud. Luego seleccione el puerto COM1 en el menú de selección de puerto. Se puede seleccionar cualquier puerto disponible, siempre que no sea el puerto COM2. El puerto COM2 se utiliza en el Proteus para transmitir datos al pin USART RX del controlador. Además, el puerto seleccionado en este menú debe ser el mismo que se usó para crear un enlace virtual (usando Eltima Serial Splitter) entre el puerto y el puerto COM2 en Proteus. El software GPS Simulator se puede descargar desde el siguiente enlace:

Fig. 2: Ventana divisoria de serie

La Figura 2 muestra la ventana Eltima Software Serial Splitter 5.0. Para crear el enlace virtual entre el puerto seleccionado en el Simulador GPS y el puerto COM2 utilizado en Proteus, seleccione la pestaña 'Paquetes complejos'. Para el lado de entrada, seleccione la opción 'Puerto virtual' y luego el puerto COM utilizado por el Simulador GPS para pasar oraciones a Proteus (COM1 en este caso). Luego haga clic en el botón 'Agregar puerto'. Repita el mismo procedimiento para el lado de salida, pero seleccione el puerto COM2. Una vez que se hayan agregado los puertos de entrada y salida, haga clic en el botón 'Agregar paquete'. Un paquete creado correctamente aparecerá en el lado izquierdo de la ventana del software, como se muestra en la figura. Se puede descargar una versión de prueba de 14 días de Serial Splitter desde el siguiente enlace:

La pestaña Diagrama de circuito muestra el circuito Proteus para la simulación. Un cristal de 15,9744 MHz está conectado a los pines 13 y 14 del microcontrolador PIC18F458. El interruptor SW1 es el interruptor de reinicio. El pin RXD del componente P2 COMPIM está conectado al pin RX (pin 26) del controlador. No se requiere un IC MAX232 ya que está integrado en el componente COMPIM. El puerto D del controlador está conectado a las líneas de datos paralelas D0:D7 de la pantalla LCD. Los pines VSS y VDD de la pantalla LCD están conectados a tierra y proporcionan un voltaje de 5 V respectivamente. Los pines RS, R/W y E de la pantalla LCD están conectados a los pines 38, 39 y 40 respectivamente en el puerto B.
Para desarrollar la lógica de control para el análisis de sentencias GPS, se configuró el módulo UART y se analizó la información de latitud y longitud mediante manipulación de cadenas. Para configurar el módulo UART, se configuró el pin RX para entrada y se habilitó la recepción en serie asignando un valor 0x90 al registro de recepción RCSTA. El registro generador de velocidad en baudios SPBRG recibió un valor de 0x19 para una velocidad en baudios de 9600 bps. El modo asíncrono se eligió borrando el bit SYNC en el estado de transmisión y el registro de control del TXSTA. El indicador de recepción se borró y los datos se copiaron del registro de recepción RCREG a una variable temporal cuando se estableció el indicador al recibir los datos. Luego se borró el bit de habilitación de recepción continua CREN en el registro de recepción RCSTA para permitir la recepción continua de datos.

Las sentencias $GPRMC se pasaron desde el simulador GPS al pin RX del controlador a través del componente COMPIM. Se grabaron previamente dos conjuntos de estas frases utilizando un teléfono móvil con GPS para dos condiciones: una ubicación GPS variable y sin señal GPS. Para una ubicación GPS variable, el primer conjunto de frases se registró a una distancia de 100 m. En ausencia de una señal de GPS, el segundo conjunto de frases de GPS se grabaron en el interior. Las oraciones $GPRMC y $GPGGA (condición de señal GPS encontrada) tenían la misma longitud (76 caracteres). Si no se encontró ninguna señal de GPS, las oraciones de menos de 76 caracteres no contenían información de latitud y longitud; en cambio, se encontraron una serie de comas en las frases grabadas. Estas características de las oraciones grabadas se utilizaron para identificar la oración $GPRMC y luego extraer información de latitud y longitud. La identificación de la sentencia $GPRMC y la ausencia de señal GPS se obtuvo mediante comparación de cadenas. Una vez encontrada la señal GPS y $GPRMC, se extrajeron la latitud y longitud determinando la posición inicial y el número de caracteres en los valores de latitud y longitud. La Figura 5 muestra la lógica de control para analizar la oración $GPRMC.

GPS

Figura 3: Lógica de control para el análisis de sentencias GPS

Para ejecutar la simulación se deben realizar los siguientes pasos en el orden indicado:

1) Inicie el Serial Splitter y cree el paquete complejo entre el puerto de entrada del Simulador GPS y el puerto COM2 del circuito Proteus.

2) Abra 'gps.DSN' en Proteus

3) Inicie GPS Simulator y seleccione el archivo de registro

4) Inicie la simulación en Proteus y luego comience a transmitir el archivo de registro en GPS Simulator

La pantalla LCD mostrará que se ha encontrado la señal GPS y mostrará información de latitud y longitud. Solo una parte de esta información se muestra en la Figura 6, ya que la pantalla LCD está apagada y se muestra la siguiente información de latitud y longitud. Para el segundo archivo de registro, la pantalla LCD mostrará que no se encuentra la señal GPS.

GPS

Fig. 6: Información de latitud que se muestra parcialmente

Código fuente del proyecto

###


 #incluir
#incluir
#pragma configuración OSC=HS #pragma Configuración OSCS = APAGADO #pragma Configuración WDT = APAGADO #pragma configuración DEBUG = APAGADO #pragma Configuración LVP = APAGADO #definir rsPORTBbits.RB7 #definir rw PORTBbits.RB6 #definir en PORTBbits.RB5 #definir puerto LCD void mydelay (carácter sin firmar); void data_wrt (carácter sin firmar); vacío init_lcd(vacío); void cmd_wrt (carácter sin firmar); vacío lat_long(vacío); anular nada(nulo); carácter sin firmar cmd ={0x38,0x01,0x0C,0x06}; //comando LCD char unsigned strcompare(char *s1, char *s2, tamaño del char unsigned); //Función de comparación de cadenas carácter sin firmar gps(77)={'�'}; estado de personaje sin firmar; carácter firmado; /**/ char lati(11) = "Latitud: "; char unsigned longi(12) = "Longitud: "; char deg(9) = "grados" sin firmar; carácter sin firmar mins(10) = "minutos", "; vacío principal (vacío) { // verificar variables de frase carácter estático sin firmar gprmc(7), gprmctemp(7)="$GPRMC"; estático int gp1, gp2; estático int st=0,len=6; estático int i,j,k; //comprueba las variables de corrección del satélite carácter estático sin signo sc(2), sctemp(2)="V"; estático int sc1, sc2; estático int sc_st=8,sc_len=1; static unsigned char nogps(14) = "Sin señal GPS"; carácter estático sin firmar yesgps(17) = "Señal GPS encontrada"; x,y interna; estado = 0; retiro = 0; TRISB = 0x00; //hacer puertoB como salida TRISD = 0x00; //hacer puertoD como salida PORTCbits.RX = 1; //Define el pin RX como entrada TXSTAbits.SYNC = 0; //modo asíncrono TXSTAbits.BRGH = 1; //alta velocidad en baudios RCSTA = 0x90; //habilitar puerto serie y receptor SPBRG = 0x19; //9600 baudios, 16MHz xtal init_lcd; mi retraso(1); cmd_wrt(0x80); //fuerza el cursor al principio de la primera línea mientras(1) { para(x=0;x<76;x++) { mientras(PIR1bits.RCIF==0); //esperar a recibir gps(x) = RCREG; } //Comprueba si se recibió la sentencia $GPRMC para (gp1=st,gp2=0; gp2 gprmc(gp2)=gps(gp1); gprmc(gp2)='�'; para (sc1=sc_st,sc2=0;sc2 sc(sc2)=gps(sc1); sc(sc2)='�'; si (strcompare(gprmc,gprmctemp,6)==1 && (strcompare(sc,sctemp,1)==0)) //Comprueba si se encontró la señal GPS { //cmd_wrt(0x80); para(j=0;j<16;j++) datos_wrt(simgps(j)); mi retraso(500); cmd_wrt(0xC0); mi retraso(1); cmd_wrt(0x80); mi retraso(1); latitud longitud ; } si ((strcompare(gprmc,gprmctemp,6)==1) && (strcompare(sc,sctemp,1)==1)) { //cmd_wrt(0x80); para(l=0;l<13;l++) data_wrt(nogps(i)); mi retraso(500); cmd_wrt(0x01); mi retraso(1); cmd_wrt(0x80); mi retraso(1); } RCSTAbits.CREN=0; //Borra el bit de habilitación de recepción continua RCSTAbits.CREN=1; //Establece el bit de habilitación de recepción continua para recepción continua } } vacío lat_long (vacío) { carácter estático sin firmar latitud (13), longitud (14); estático int lat_a,lat_b,long_c,long_d; estático int lat_st1=19,long_st2=33,lat_len1=13,long_len2=14; /****Latitud****/ //Declaraciones para separar dígitos y caracteres estático int lat1_a, lat2_b, lat1_c, lat2_d; estático int la_st1=0,la_st2=11,la_len1=12,la_len2=1; carácter estático sin signo latF1(12), latF2(1); //Declaraciones para separar grados y minutos de dígitos static int laa,lab,lac,lad; static int último1=0,último2=1,lalen1=2,lalen2=9; carácter estático sin firmar latFinal1(2), latFinal2(9); //Variables para mostrar estático int i1,j1,k1,l1,m1,n1; /****Longitud****/ //Declaraciones para separar dígitos y caracteres estático int long1_a,long2_b,long1_c,long2_d; estático int long_st1=0,lo_st2=12,long_len1=12,lo_len2=1; carácter estático sin firmar longF1(12), longF2(1); //Declaraciones para separar grados y minutos de dígitos estático int loa,lob,loc,lod; static int perdido1=0, perdido2=2,lolen1=2,lolen2=9; carácter estático sin firmar longFinal1(3), longFinal2(9); estático int i2,j2,k2,l2,m2,n2; /*latitud*/ // Extrayendo información de latitud para (lat_a=lat_st1,lat_b=0; lat_b latitud(lat_b)=gps(lat_a); latitud(lat_b)='�'; //Separando dígitos y caracteres para (lat1_a=la_st1,lat2_b=0; lat2_b latF1(lat2_b)=latitud(lat1_a); latF1(lat2_b)='�'; para (lat1_c=la_st2,lat2_d=0; lat2_d latF2(lat2_d)=latitud(lat1_c); latF2(lat2_d)='�'; //Mostrar en grados y minutos para (laa=último1,lab=0; laboratorio latFinal1(lab)=latF1(laa); latFinal1(laboratorio)='�'; para (lac=último2,muchacho=0; chico latFinal2(lad)=latF1(lac); latFinal2(muchacho)='�'; /*ponga el código para mostrar la latitud aquí*/ cmd_wrt(0x01); mi retraso(1); cmd_wrt(0x80); para(i1=0;i1<10;i1++) data_wrt(lati(i1)); mi retraso(50); cmd_wrt(0xC0); mi retraso(1); para(j1=0;j1<2;j1++) data_wrt(latFinal1(j1)); para(k1=0;k1<8;k1++) data_wrt(grados(k1)); mi retraso(500); cmd_wrt(0x01); mi retraso(1); cmd_wrt(0x80); para(l1=0;l1<9;l1++) data_wrt(latFinal2(l1)); cmd_wrt(0xC0); para(m1=0;m1<9;m1++) data_wrt(minutos(m1)); mi retraso(1); para(n1=0;n1<1;n1++) datos_wrt(latF2(n1)); mi retraso(500); /*longitud*/ cmd_wrt(0x01); mi retraso(1); cmd_wrt(0x80); para(i2=0;i2<10;i2++) data_wrt(longi(i2)); mi retraso(50); cmd_wrt(0xC0); mi retraso(1); // Extrayendo información de longitud para (long_c=long_st2,long_d=0; long_d longitud(long_d)=gps(long_c); longitud(long_d)='�'; //Separando dígitos y caracteres para (long1_a = long_st1, long2_b = 0; long2_b longF1(long2_b)=longitud(long1_a); longF1(long2_b)='�'; para (long1_c=lo_st2,long2_d=0; long2_d longF2(long2_d)=longitud(long1_c); longF2(long2_d)='�'; //Mostrar en grados y minutos para (loa=perdido1,lob=0; lob longFinal1(lob)=longF1(loa); longFinal1(lob)='�'; para (loc=perdido2,lod=0; lod largoFinal2(lod)=largoF1(loc); longFinal1(lod)='�'; /*inserte el código para mostrar la longitud aquí*/ para(j2=0;j2<3;j2++) data_wrt(longFinal1(j2)); para(k2=0;k2<8;k2++) data_wrt(grados(k2)); mi retraso(500); cmd_wrt(0x01); mi retraso(1); cmd_wrt(0x80); para(l2=0;l2<9;l2++) data_wrt(longFinal2(l2)); cmd_wrt(0xC0); para(m2=0;m2<9;m2++) data_wrt(minutos(m2)); mi retraso(1); para(n2=0;n2<1;n2++) datos_wrt(longF2(n2)); mi retraso(500); cmd_wrt(0x01); mi retraso(1); cmd_wrt(0x80); mi retraso(1); RCSTAbits.CREN=0; //Borra el bit de habilitación de recepción continua RCSTAbits.CREN=1; //Establece el bit de habilitación de recepción continua para recepción continua principal ; } strcompare de carácter sin firmar (char *s1, char *s2, tamaño del carácter sin firmar) { carácter sin firmar i; para (l=0;l { si(*s1 != *s2) { devolver 0; } otro { //Hacer nada } s1++; s2++; } devolver 1; } /*****Código LCD*****/ init_lcd vacío { intj; para(j=0;j<4;j++) cmd_wrt(cmd(j)); } /***************************************/ void cmd_wrt (cmddata de caracteres sin firmar) { rs=0;// selecciona rs como comando reg rw=0;//para escribir en la pantalla LCD lcd=cmddata; es=1; mi retraso(1); en=0; mi retraso(1); } void data_wrt (datos de caracteres sin firmar) { rs=1;// selecciona rs como registro de datos rw=0; lcd=datos; es=1; mi retraso(1); en=0; mi retraso(1); } void mydelay (valor de carácter sin firmar) { para(;val>=1;val--) { Retraso1KTCYx(1); } }

###

Diagramas de circuito

gps_proteus

Conteúdo Relacionado

Determinar uma localização precisa é necessário em várias indústrias...
En cada vehículo hay una red de sensores integrada...
El controlador del motor es uno de los componentes...
ESP32-CAM es un módulo de cámara compacto que combina...
La evolución de los estándares USB ha sido fundamental...
SCHURTER anuncia una mejora de su popular serie SWZ...
Visual Communications Company (VCC) ha anunciado sus nuevos tubos...
A Sealevel Systems anuncia o lançamento da Interface Serial...
A STMicroelectronics introduziu Diodos retificadores Schottky de trincheira de...
O novo VIPerGaN50 da STMicroelectronics simplifica a construção de...
A Samsung Electronics, fornecedora de tecnologia de memória avançada,...
O mercado embarcado tem uma necessidade de soluções de...
Probablemente se haya encontrado con el término " resistencia...
Probablemente tenga un aislante de soporte si ha notado...
Probablemente haya visto un aislante colocado en postes de...
Probablemente hayas visto aisladores de grillete entronizados en postes...
Probablemente hayas experimentado situaciones en las que controlar un...
Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.