PUBLICIDAD

Muy Sistema GPS
bien.
Lo que necesitamos ahora es un ...

Módulo SmartGPS conectado al
Sistema de Desarrollo EasyPIC5

Por Dusan Mihajlovic
Departamento de Hardware – MikroElektronika

El Sistema de Posicionamiento Global (Global Positioning System, o GPS) es actualmente una de las principales tecnologías utilizadas para fines de navegación. Está muy extendido en los sistemas de navegación para automóviles. Aquí
describiremos la conexión entre un receptor GPS y el microcontrolador, así como la determinación de latitud y longitud.
El Sistema de Posicionamiento Global (GPS)
se basa en un gran número satélites que radian señales de microondas, que son captadas por los receptores GPS que determinan
así su posición actual, el tiempo o la velocidad. Los receptores GPS pueden comunicarse con un microcontrolador o un PC de
diferentes maneras. Un camino habitual es
a través del puerto serie, mientras que el
protocolo más utilizado para la transmisión
de datos se llama NMEA.

Principio de funcionamiento
El protocolo NMEA se basa en cadenas.
Cada cadena se inicia con el signo $ (código ASCII 36) y termina con una secuencia
de signos que comienza con una nueva línea, tales como CR (código ASCII 13) y LF
(código ASCII 10). El significado de toda la
cadena depende de la primera palabra. Por
ejemplo, una cadena que comienza con
$GPGLL da información acerca de la latitud
y la longitud, la hora exacta (Tiempo Universal Coordinado), la validez de los datos
(A - Activo o V - Prohibido) y la suma de
verificación (“checksum”) que nos permite
comprobar si los datos se recibieron correctamente. Los datos individuales de cada
elemento están separados por una coma “,”.

Cada segundo se envía un conjunto de
cadenas NMEA al microcontrolador. En
el caso de que los datos sobre latitud y
longitud no sean fijos (por ejemplo, si un
receptor GPS falla a la hora de determinar
su posición) o cuando los datos no sean
determinados, el receptor GPS mantendrá
en su salida el mismo juego de cadenas,
dejando de lado cualquier dato perdido.
Aquí tenemos una cadena generada por el
receptor GPS que ha fallado al determinar
su posición:
$GPGLL,,,,,,V,N*64

A continuación se muestra un ejemplo de
una cadena NMEA completa:

El circuito
La conexión entre el microcontrolador y
el receptor GPS es muy sencilla. Para ello,
sólo es necesario proporcionar dos líneas,
RX y TX. Consultar el Esquema 1. La línea
RX se utiliza para enviar datos desde un receptor GPS al microcontrolador, mientras
que la línea TX puede usarse para el envío
de comandos específicos del microcontrolador al receptor GPS. Para este proyecto se utiliza el receptor U-Blox LEA-5S.
Como en la mayoría de los receptores
GPS, la tensión de alimentación de este
receptor es de 3V.

Artículo publicitario de MikroElektronika www.mikroe.com
mikroC® y mikroC PRO® son marcas registradas de MikroElektronika. Reservados todos los derechos.

255.255. 7. 97.255.193. 15. Delay_ms(100).255.252. 0. //Centar dot Glcd_Dot(longitude_x-1. 0. 0.255. Como podemos ver. signed int latitude.248. SD/MMC etc.255.251.239. 3. 0. 0. 0. Glcd_Set_Font(font5x7. 15. El resto del código se compone de la recepción de las cadenas NMEA desde el receptor GPS. 0.192. 0.242.193. 0. 0. //Left dot Glcd_Dot(longitude_x+1. 0.255. 0. 0. 0. 0. 0. 0. 0. 0.249.174.255. 15. 0.255.208. 1.192.255. //Uper dot Glcd_Dot(longitude_x. 1. 1. 1. 3.255.129. 0. 1.255. 0.135. 0.255.128. 0. 0. 0.129. 0. 0. 73. 0.231. 0. 0. 3.latitude.249. string = strstr(txt.255.255. 17.129. 0. 1. 0. 0. 0. //Display World map on the GLCD while(1) { RCSTA. 7. 3.F0 = 0.. 0. 63.255.252. sbit GLCD_RW at RB3_bit. es necesario utilizar un conversor de nivel de tensión para convertir la tensión de nivel “Lógico Uno” de 3. 3. 0.252. 0. 0. 0.201.240.201.193. 7. 129.250.255. 0. 15. Microchip®.com/en/article/ //Set OERR to 0 //Set FERR to 0 if(ready == 1) { //if the data in txt array is ready do: ready = 0.129. 0. 73. 0. longitude = (string[20]-48)*100 + (string[21]-48)*10 + (string[22]-48).254. 0. 0. 0. //Start Timer 1: T1CON. 15. 0. //Set TCKPS0 to 1 //Enable Timer1 interrupt: PIE1. 25.255.216. 0. //If txt array contains “$GPGLL” string we proceed. 255. 0. 0. 0. 1.226.255. 0. 49. 0.255. 0.192. 1.255.255.’ sign in the 8-th //position it means that tha GPS receiver does not have FIXed position! latitude = (string[7]-48)*10 + (string[8]-48).129. 255. 0.129. 0. 15. 0. 0.248.255. 0. Esa conversión permite que el microcontrolador muestre el mapa.255.192.255.255. 0. 0. 3.128.249.248. 0.129. 0. TMR1H = 0x3C.255. } } //if interrupt is generated by RCIF //Start Timer 1: T1CON.193.255. 0. 3. 1. 32).193. 0.224. 0. 0. 0.251.127.251. 0. char *string. 3. 1.124.121. 73.255. 13.255. 0.255.’) { //if “$GPGLL” NMEA message have ‘. 0.F4 = 1. 15. 0. 63. TMR1H = 0x3C.255. ready = 0. 63.255. 46.254.193. 0. 0.145.192.252. 0.249. 0. 0. 0.255. 0. 70.248.255. 0.129. 0. 0. 15. 1.247.F5 = 0.225.255.252.F5 == 1) { txt[i++] = UART1_Read(). 0.2). 15. 0.247. 255. 1.201. 24. } //if the longitude is in the West direction it has minus sign if(string[32] == ‘W’) { longitude = 0 .255. 0.129. 0.255. 0.255. 12. 0. 15.193.129. 0.latitude_y-1. 95.242. 0.129.F7 = 1. 0.255.255. 0.252. 63. i = 0.128. 13. 0. 7.. 15. //Set TMR1ON to 1 Glcd_Image( world_bmp ). 201. 0.255.254. 0.254.252.248. sbit GLCD_RST at RB5_bit. 1. 0. 0. 7. 7. 24.F6 = 1.255. 63.128. 63.252.247. 0. 0.129.230. ready = 1.255.127. 0.255. //Stop Timer 1: T1CON. 0. 0. 0.255. 0. 7.255.255. 31. 3.mikroe.129.255. 0.255. 0. //Display the cursor on the world map } } } //Set TMR1ON to 1 //Set RCIF to 0 Funciones usadas en el programa GO TO //Set Timer1 Prescaler to 1:8 T1CON.255.255. 0. //if the latitude is in the South direction it has minus sign if(string[18] == ‘S’) { latitude = 0 .255.252. 0. longitude_x = ((125*(lon + 180))/360) + 1.145.255.255. 0. 15. 0. 0. 64. sbit GLCD_RS at RB2_bit. 0. 0.255.2). 0. 3.240.252. 0. 0. sbit GLCD_RS_Direction at TRISB2_bit.3V a 5V. 0.. Ethernet. 4.255.193.193. 0. 31.254.239. 0. sbit GLCD_RST_Direction at TRISB5_bit. 7. 0. 0.255.226. 0.255. 0. 63.129.255.227. 0. 0. 13. 57.129.252. 31.2). 61.255.252. 1. 0.192.124. [ Ejemplo 1: Programa para demostrar el funcionamiento del módulo LEA -5S.129.249.129. 0.128.121. 0. 3. 0.255.240. el código del programa que se introduce en el microcontrolador es muy corto. 0.135. 0. 0. 0.224. 0. 0.126. longitude). 0. 63. 15. //Enable Usart Receiver interrupt: PIE1. 249. 0. 0. 0. 224.145. 0.240. 0. 0. 0.255. 65.255.255. 0. //Lower dot Delay_ms(500).255. 0. el logotipo y combinaciones de los mismos. char GLCD_DataPort at PORTD. 0. 0. 55.255.255. 0.128.249.F0 = 0. 0. 0. 0.latitude_y. 0. 0.255. 0. 0. //Set GIE to 1 INTCON.128. 0. 0. 0.255. 0.193. 15. 9. 0. //Cursor drawing: Glcd_Dot(longitude_x.145. 0.129. 255.255.2). 1.255.248. //Set RCIE to 1 //Enable Global interrupt and Peripheral interrupt: INTCON. 0.251. 0. 0. 0.248. 0. 0. 0.255.193. Conexión del módulo LEA-5S al PIC18F4520 l e r en ribi or Escmpilad co Dado que el microcontrolador PIC18F4520 utiliza una fuente de alimentación de 5V para funcionar.128. 0.193.255.248. 0. 0. 31. 3. 0. 6. 254. 0. 0.255. 255. extern const unsigned short world_bmp[1024].255. 0.250. 0. 63. } Display_Cursor(latitude. 0.254.129. 15.255. 0. 0.255.250.255. 0.255.248.255.255. 68.251. sbit GLCD_EN at RB4_bit. if (i == 768) i = 0.255.255. 0. 0. 0.255. 15. 15. 0.255. 0. 0.193. 0.252. sbit GLCD_RW_Direction at TRISB3_bit.129.255.255.137.255. 0.255.205. 63. 1.255. 0.255.128.255.255. 0. 60. 12. 0. 57. 0.135.255.224. 0. Otros términos y nombres de productos pueden ser marcas de otras compañías. 3. 0.255. 0.193.F0 = 1. así como los programas escritos para microcontroladores dsPIC® y AVR® los pueden encontrar en nuestra página web: www. 7. 0.129. 1. 3. sbit GLCD_CS1 at RB0_bit. 0.mikroe.255.129. //Set PEIE to 1 //if interrupt is generated by TMR1IF //Set TMR1ON to 0 //set data ready //reset array counter //Set TMR1IF to 0 } } } mikroC PRO para el editor de librerías PIC® con librerías listas para usar. 0. 0. 63. 0. 0. 27. 0. 0. 0.240. // Set AN pins to Digital I/O Glcd_box() Dibuja un cuadro y lo rellena Glcd_circle() Dibuja un círculo Glcd_Dot() Dibuja un punto* Glcd_Fill() Borra/Rellena pantalla* Glcd_H_Line() Dibuja una línea horizontal Glcd_Image() Importa imagen* Glcd_Init() Inicialización de la pantalla LCD* Glcd_Line() Dibuja una línea Glcd_Read_Data() Lee datos desde la pantalla LCD Glcd_Rectangle() Dibuja un rectángulo Glcd_Set_Font() Selecciona fuente* Glcd_Set_Page() Selecciona página Glcd_Set_Side() Selecciona el lado de la pantalla Glcd_Set_X() Determina la coordenada X Glcd_V_line() Dibuja una línea vertical Glcd_Write_Char() Escribe el carácter Glcd_Write_Data() Escribe el dato Glcd_Write_Text() Escribe el texto * Funciones de la librería Glcd usada en el programa Otras funciones mikroC PRO para PIC usadas en el programa: Usart_Init() strstr() Usart_Read() Delay_ms() El código para este ejemplo escrito para microcontroladores PIC® en C. 0. 0. //Set TMR1IF to 0 //Note: Timer1 is set to generate interrupt on 50ms interval O C PR o r k mi IC for P UART1_Init(9600).255. 49. 0.255. 7. 0.255. 0.lat))/180) + 1.254.252.224.248. 0.255. 0. 7. 0. 0. 1. 63. 63. 0. 0.”$GPGLL”). 0.236. 0.247. 15. 0.224. 0.253.209. 0.255.240. 0. 0. 97. 63.248. 0. son marcas registradas o marcas de Microchip Corporation o sus subsidiarias. 0. 0. 0. 0.252. void interrupt() { if (PIR1.255. 0. longitude.255.205. 1. 1. 255. 0. 0.255.255. 15. 0.129. //Clear Timer1 interrupt flag: PIR1.F0 = 0.255. 63. sbit GLCD_EN_Direction at TRISB4_bit. 17.129.248. 13.248.252. PIC® y otros. una pantalla gráfica con una resolución de 128x64 píxeles.248. 63. 0. 63. 0. 1. 0.F0 == 1) { //Stop Timer 1: T1CON. 0. 0.255. 0.252. 31. 0.242. unsigned short ready. 0. 3. 7. 255. 63.113.latitude_y.252. sbit GLCD_CS1_Direction at TRISB0_bit.255.224. 0. 3. 0.248. 0. 0.252. 0. Glcd_Fill(0x00). 0. 0. 0.255. 63. Casi la mitad del código constituye un mapa de bits convertido en un conjunto de datos adecuados. 0. 220. 0. 0. 31. GLCD_Init(). 0. 0. 61. if(string != 0) { if(string[7] != ‘. 252. 0..255. 1.255.254. 227. 1. 0.193.128.com SOFTWARE AND HARDWARE SOLUTIONS FOR EMBEDDED WORLD Esquema Eléctrico 1.252.latitude_y+1. 0.255. 0. 0.255. 0. longitude_x. 0. 2. 0. 70. 0. //Latitude and Longitude scaling for 128x64 display: //Latitude: Input range is -90 to 90 degrees //Longitude: Input range is -180 to 180 degrees latitude_y = ((61*(90 .242. RCSTA. 7.255.252. 0.128. 0.129.255.240.255.248.255. 0.129. PIR1.129.129.. 3.252. 2. 0. 0. 0. 0.255.253. 252.255. 0.121. //Set TMR1IE to 1 //Timer1 starts counting from 15536: TMR1L = 0xB0. 9.247. 0.252.252.F5 = 1. 0.F0 = 1.209.243. 63. 0. 0. 0.252.255. 0. 0. 0.255.254. 0. 0. 15. 1.255. 0.longitude.161. 1. 1. //Display World map on the GLCD Glcd_Image( world_bmp ).F2 = 0.255.255. 1.129. 0.225. } if (PIR1. 1.251. 63. 0.241. 0. 0.255.231. 0. 0.243. 255. 5. 0.255. sbit GLCD_CS2_Direction at TRISB1_bit.F5 = 1. 12. 0.225. 0.255. 251. 3. 0. 0. 0. 1. 241.255.255. 3.255. como: GLCD.255. 0. 0. 0.248. 0.192. PIR1.255. 0. 0.248.247. signed int lon) { unsigned char latitude_y.255. 0. int i. 0.129.255.225. 0. 0. //Set TMR1ON to 0 void Display_Cursor(signed int lat.250. 3. 0. 128. 0. 3. . 0. 0.129.161.255. 0.255. 0.255.129. 255. 0. 0.129. 0.255.135. 0. 0. 193. 0.255.2).255. Basic y Pascal. 0.129. 0.254. 0. 0. 0. 0. 0.255. 7.F1 = 0. 0. 0. //Right dot Glcd_Dot(longitude_x. 8.254. 1. 0. 0. 0. 31. 0. 0. 0. 255.240. 240. 0. 248.192. 6. 17. 0. 0.255.208. 1. muestra un mapa del mundo con el cursor apuntando su posición en el globo. 0. 0.255 }.latitude_y. 0.193. 15.254.228.240. 0.255.224. 59. 255. 0. CAN. 1. 0.255. el escalado de los datos para que coincida con la resolución de pantalla de 128x64 píxeles y la colocación del cursor en la posición especificada. 0. Q unsigned char const World_bmp[1024] = { 255. 63. //Timer1 starts counting from 15536: TMR1L = 0xB0. 1.129. 0.248. 15. 3.216. 95. 0. 0. 0. 0. 0.128. 0. 1. 255.241. 0. 15.255. 0. 0. 1.255. 63. 65.255. sbit GLCD_CS2 at RB1_bit. 0. 3. char txt[768]. 3. 0.244. 31. 0. 0. 0. 15.228. 63. 0.224.241. 0. making it simple www.F0 = 1. 59.193.255.255. El programa En este ejemplo. 73.255. //Set TCKPS1 to 1 T1CON. 0.255.255.129. 9. 0. 0. 0. 0. 0. 255.255.255.225. 33. 1. 3.225. 97. void main() { ADCON1 = 0x0F.252.255. el cálculo de la latitud y la longitud. 3. 9.193. 1. 0.239. 0.248. 7.193.248. 0. 0.225. 3.255.255. 17.240. 0. 0.128.F0 = 0. 63.255. 0. 0.255.255. 240. 0.255.255. 255. 0.255. if (txt[i-1] == 0) i = 0. 0. 0.255. 17. 15. 0. 0. 57.255.248.128. 1. 3.129. 0.242. 1. 0. 8.255.252. 0.193. 1. 0.243. 0. 0. 0. 0. 0.