Lo que necesitamos ahora es un

Anuncio
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
mikroPASCAL® y mikroPASCAL PRO® son marcas registradas de MikroElektronika. Reservados todos los derechos.
... making it simple
SOFTWARE AND HARDWARE SOLUTIONS FOR EMBEDDED WORLD
www.mikroe.com
Esquema Eléctrico 1. Conexión del módulo
LEA-5S al PIC18F4520
Dado que el microcontrolador PIC18F4520
utiliza una fuente de alimentación de 5V
para funcionar, es necesario utilizar un conversor de nivel de tensión para convertir la
tensión de nivel “Lógico Uno” de 3,3V a 5V.
El programa
En este ejemplo, una pantalla gráfica con
una resolución de 128x64 píxeles, muestra
un mapa del mundo con el cursor apuntando su posición en el globo. Como podemos ver, el código del programa que se
introduce en el microcontrolador es muy
corto. Casi la mitad del código constituye
un mapa de bits convertido en un conjunto
de datos adecuados. Esa conversión permite que el microcontrolador muestre el
mapa. El resto del código se compone de
la recepción de las cadenas NMEA desde
el receptor GPS, el cálculo de la latitud y la
longitud, 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.
mikroPASCAL PRO para el editor de librerías
PIC® con librerías listas para usar, como:
GLCD, Ethernet, CAN, SD/MMC etc.
program Smart_Gps;
const World_bmp : array[1024] of byte = (
255,129, 1, 1, 1,129,129,129,129,193,129,129,129,129,129,129,
129,129,129,129,129,225,161,161, 97, 97,209,209,129, 49, 49,201,
201,201,201, 97,205,205,129,137, 25, 57, 57, 57,121,249,249,249,
249,249,253,253,121,121,113, 9, 9, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 17, 17,145,145,145,145,129,129,129, 1, 1, 1, 1,
9, 73, 73, 73, 73,193, 65, 65,129,129,193,193,129,193,193,241,
241,241,241,225,225,225,193,193,193,193,193,193,193,193,193,129,
193,193,225,225,129,129,129,129,129,129,129,129,129,129,129,255,
255, 1, 33, 17, 17, 15, 15, 15, 15, 15, 7, 7, 7, 7, 15, 15,
31, 63, 63, 63, 63,255,255,255,255,255,255,255,255,251,251,240,
240,240,240,226,252,252,249,249,250,240,240, 1, 1, 1, 1, 3,
1, 1, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 24, 24,224,224,
224,224,244,239,239,255,255,255,255,255,255,255,255,255,254,254,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
95, 95, 3, 3, 3, 3, 63, 15, 15, 3, 3, 3, 3, 3, 1,255,
255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 15, 63, 63,255,255,255,255,255, 63, 63, 63,
63, 63, 63, 63,135,135, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,192,192,192,243,243,251,251,
251,251,251,247,231,231,243,247,247,247,230,236,124,124,255,255,
220, 60, 61, 61, 63,126,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255, 59, 59, 3, 7, 3, 27, 12,
7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,
255, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 3, 6, 6, 13,
13, 13, 13, 17,242,242,242,242,240,224,224,192,192,192,192, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 31, 31, 63, 63, 63, 63,
63, 63,255,255,255,255,255,255,255,255,255,255,248,248,247,247,
55, 3, 3, 3, 3, 0, 1, 1, 3, 3, 15, 15, 7, 0, 0, 1,
1, 3, 3,239, 15, 15, 1,129,224,174, 46,128, 0,128, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,
255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 3, 63, 63,255,255,255,255,255,255,255,255,255,255,
254,254, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1,255,255,255,255,255,255,255,255,255, 63, 63,193,193,
240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 3, 3, 4, 9,129,193,192,225,224,226,224,242,
227,227,228,228, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,
255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,255,255,255, 31, 31, 15, 15, 15, 15, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 3, 3, 15, 15, 15, 15, 15, 3, 3, 0, 0, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 7, 15, 15, 7, 7, 7, 7, 7,
31, 31,127,127, 70, 70, 0, 0, 0, 0, 0, 0,208,208, 0,255,
255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,135,135,193, 64, 68, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
128,128,128,128,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Funciones usadas en el programa
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 mikroPASCAL PRO for PIC usadas en el programa:
GO TO
Usart_Init()
strstr()
Usart_Read()
Delay_ms()
El código para este ejemplo escrito para microcontroladores PIC® en C, Basic y Pascal,
así como los programas escritos para microcontroladores dsPIC® y AVR® los pueden
encontrar en nuestra página web: www.mikroe.com/en/article/
[
Ejemplo 1: Programa para demostrar el funcionamiento del módulo LEA -5S.
0, 0, 0,128,128,128,128,128,128, 0, 0, 0, 0, 0, 0,128,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,
255,240,240,240,240,248,248,248,248,248,248,248,248,248,252,252,
252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,
252,252,252,252,254,254,255,255,255,252,252,248,248,248,248,248,
248,248,248,248,248,248,252,252,252,254,254,254,254,254,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,254,254,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,250,250,250,216,216,248,255
);
var txt : string[768]; str : string[40]; tmpStr : string[10];
latitude, i, cnt : integer; ready : byte;
g, nmbByte, longitude : word;
var GLCD_Dataport: byte at PORTD;
var GLCD_CS1: sbit at RB0_bit; GLCD_CS1_Direction: sbit at TRISB0_bit;
GLCD_CS2: sbit at RB1_bit; GLCD_CS2_Direction: sbit at TRISB1_bit;
GLCD_RS: sbit at RB2_bit; GLCD_RS_Direction: sbit at TRISB2_bit;
GLCD_RW: sbit at RB3_bit; GLCD_RW_Direction: sbit at TRISB3_bit;
GLCD_EN: sbit at RB4_bit; GLCD_EN_Direction: sbit at TRISB4_bit;
GLCD_RST: sbit at RB5_bit; GLCD_RST_Direction: sbit at TRISB5_bit;
function search_str2_in_str1(var s1, s2: string[4000]): word;
var i, j: word; aa, bb : byte;
begin
i := 0; j := 0; aa := s1[0]; bb := s2[0]; result := 0xFFFF;
while(aa <> 0) do
begin
while(aa = bb) do
begin
if(i = 0) then result := j;
i := i + 1; j := j + 1; aa := s1[j]; bb := s2[i];
if(bb = 0) then exit;
end;
i := 0; j := j + 1; aa := s1[j]; bb := s2[i]; result := 0xFFFF;
end;
end;
Q
procedure interrupt();
begin
if (PIR1.B0 = 1) then {if interrupt is generated by TMR1IF}
begin
T1CON.B0 := 0; {Stop Timer 1} ready := 1; {Set data ready}
i := 0; {set array counter} PIR1.B0 := 0; {Clear TMR1IF}
end;
if (PIR1.B5 = 1) then {if interrupt is generated by RCIF}
begin
txt[i] := UART1_Read();
if(txt[i] = 0) then i := 0
else Inc(i);
if (i = 768) then begin ready := 1; i := 0; end;
T1CON.B0 := 0; {Stop timer 1} TMR1L := 0xB0; TMR1H := 0x3C; {Timer1 starts
counting from 15536}
T1CON.B0 := 1; {Start timer 1} PIR1.B5 := 0; {Set RCIF to 0}
end;
end;
procedure Display_Coursor(lat : integer; lon : integer);
var latitude_y, longitude_x : integer ;
begin
latitude_y := ((61*(90 - lat))/180) + 1; longitude_x := ((125*(lon + 180))/360) + 1;
Glcd_Dot(longitude_x,latitude_y,2); Glcd_Dot(longitude_x-1,latitude_y,2); Glcd_
Dot(longitude_x+1,latitude_y,2);
Glcd_Dot(longitude_x,latitude_y-1,2); Glcd_Dot(longitude_x,latitude_y+1,2); Delay_
ms(500); Glcd_Image(@world_bmp);
end;
begin
ADCON1 := 0x0F; {Set AN pins to Digital I/O}
Glcd_Init(); Glcd_Set_Font(@FontSystem5x8, 5 , 7, 32 ); Glcd_Fill(0x00); Delay_
ms(100); ready := 0;
T1CON.B5 := 1; T1CON.B4 := 1; {Set Timer1 Prescaller to 1:8} PIE1.B0 := 1; {
Enable Timer1 interrupt}
TMR1L := 0xB0; TMR1H := 0x3C; {Timer1 starts counting from 15536} PIR1.B0 :=
0; {Clear Timer1 interrupt flag}
UART1_Init(9600); PIE1.B5 := 1; {Initialize UART1 module, enable UART Reciever
interrupt}
INTCON.B7 := 1; INTCON.B6 := 1; {Enable Global interrupt and Peripheral
interrupt}
T1CON.B0 := 1; {Start Timer 1} Glcd_Image(@world_bmp); {Display World map
on the GLCD}
while (TRUE) do
begin
RCSTA.1 := 0; {Set OERR to 0} RCSTA.2 := 0; {Set FERR to 0}
if (ready = 1) then {if the data in txt array is ready do}
begin
ready := 0; nmbByte := search_str2_in_str1(txt,’$GPGLL’); cnt := 0;
for g := nmbByte to nmbByte+39 do
begin str[cnt] := txt[g]; inc(cnt); end;
if (nmbByte <> 0xFFFF) then
{If txt array contains “$GPGLL” string we
proceed...}
begin
if (str[7] <> ‘,’) then
{if “$GPGLL” NMEA message have ‘,’ sign in the 8-th}
begin
latitude := (str[7]-48)*10 + (str[8]-48); longitude := (str[20]-48)*100 + (str[21]48)*10 + (str[22]-48);
if(str[18] = ‘S’) then latitude := 0 - latitude; {if the latitude is in the South
direction it has minus sign}
if(str[32] = ‘W’) then longitude := 0 -longitude; {if the longitude is in the West
direction it has minus sign}
Display_Coursor(latitude, longitude);
{Display the cursor on the
world map}
el
end;
r en
end;
ribilador
c
s
end;
E mpi
end;
co
end.
AL
ASC
P
o
r
mik
IC
or P
Microchip®, el logotipo y combinaciones de los mismos, PIC® y otros, son marcas registradas o marcas de Microchip Corporation o sus
RO f
P
subsidiarias. Otros términos y nombres de productos pueden ser marcas de otras compañías.
Descargar