- Componentes necessários:
- Diagrama de circuito e explicação: -
- Obtendo dados de localização do GPS:
- Passos para fazer a interface do GPS com o microcontrolador PIC: -
- Explicação do código:
GPS é a abreviatura de Sistema de Posicionamento Global. É um sistema que fornece altitudes precisas, latitude, longitude, hora UTC e muito mais informações, que são obtidas de 2, 3, 4 ou mais satélites. Para ler os dados do GPS, precisamos de um microcontrolador e já conectamos o GPS com o Arduino e com o Raspberry Pi.
Selecionamos o módulo GPS G7020, feito pela U-blox. Receberemos a longitude e a latitude de uma posição específica do satélite e exibiremos a mesma em um LCD de 16x2 caracteres. Então aqui faremos a interface do GPS com o microcontrolador PIC16F877A por microchip.
Componentes necessários:
- Pic16F877A - pacote PDIP40
- Tábua de pão
- Pickit-3
- Adaptador 5V
- LCD JHD162A
- Módulo GPS uBLOX-G7020
- Fios para conectar periféricos.
- Resistores de 4,7k
- Pote de 10k
- 20mHz Crystal
- 2 pcs capacitores de cerâmica 33pF
Diagrama de circuito e explicação: -
O LCD de 16x2 caracteres é conectado ao microcontrolador PIC16F877A, no qual RB0, RB1, RB2 está conectado respectivamente ao pino do LCD que é RS, R / W e E. RB4, RB5, RB6 e RB7 são conectados aos 4 pinos D4, D5 do LCD, D6, D7. O LCD está conectado no modo de 4 bits ou modo nibble. Saiba mais sobre a interface do LCD com o microcontrolador PIC.
Um Oscilador de cristal de 20 MHz com dois capacitores de cerâmica de 33pF conectados entre os pinos OSC1 e OSC2. Ele fornecerá freqüência de clock de 20 MHz constante ao microcontrolador.
Módulo GPS uBlox-G7020, recebe e transmite dados usando UART. PIC16F877A consiste em um driver USART dentro do chip, nós receberemos dados do módulo GPS pelo USART, então uma conexão cruzada será feita do pino Rx do microcontrolador ao pino Tx do GPS e pino USART Receive conectado ao pino Transmit do GPS.
O uBlox-G7020 possui código de cores para os pinos. O pino Positivo ou 5 V é na cor vermelha, o pino negativo ou GND é na cor preta e o pino de transmissão é na cor azul.
Eu conectei tudo isso no breadboard.
Obtendo dados de localização do GPS:
Vamos ver como fazer a interface do GPS usando USART e ver o resultado em um LCD de 16x2 caracteres.
O Módulo transmitirá dados em várias sequências a 9600 Baud Rate. Se usarmos um terminal UART com taxa de 9600 Baud, veremos os dados recebidos pelo GPS.
O módulo GPS envia os dados de posição de rastreamento em tempo real no formato NMEA (veja a imagem acima). O formato NMEA consiste em várias frases, nas quais quatro frases importantes são fornecidas abaixo. Mais detalhes sobre a frase NMEA e seu formato de dados podem ser encontrados aqui.
- $ GPGGA: Dados de correção do sistema de posicionamento global
- $ GPGSV: satélites GPS à vista
- $ GPGSA: GPS DOP e satélites ativos
- $ GPRMC: dados específicos mínimos recomendados de GPS / trânsito
Saiba mais sobre dados de GPS e strings NMEA aqui.
Estes são os dados recebidos pelo GPS quando conectado na taxa de transmissão de 9600.
$ GPRMC, 141848,00, A, 2237,63306, N, 08820,86316, E, 0,553,, 100418,,, A * 73 $ GPVTG,, T,, M, 0,553, N, 1,024, K, A * 27 $ GPGGA, 141848,00, 2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54,2, M,, * 74 $ GPGSA, A, 2,06,02,05,,,,,,,,,, 2,75, 2,56,1,00 * 02 $ GPGSV, 1,1,04,02,59,316,30,05,43,188,25,06,44,022,23,25,03,324, * 76 $ GPGLL, 2237,63306, N, 08820.86316, E, 141848,00, A, A * 65
Quando usamos o módulo GPS para rastrear qualquer localização, precisamos apenas de coordenadas e podemos encontrar isso na string $ GPGGA. Apenas a string $ GPGGA (Dados de correção do sistema de posicionamento global) é usada principalmente em programas e outras strings são ignoradas.
$ GPGGA, 141848.00,2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54,2, M,, * 74
Qual é o significado dessa linha?
O significado dessa linha é: -
1. String sempre começa com um sinal “$”
2. GPGGA significa Global Positioning System Fix Data
3. “,” Vírgula indica a separação entre dois valores
4. 141848,00: hora GMT como 14 (hr): 18 (min): 48 (seg): 00 (ms)
5. 2237,63306, N: Latitude 22 (graus) 37 (minutos) 63306 (s) Norte
6. 08820.86316, E: Longitude 088 (graus) 20 (minutos) 86316 (seg) Leste
7. 1: Quantidade de correção 0 = dados inválidos, 1 = dados válidos, 2 = correção de DGPS
8. 03: Número de satélites vistos atualmente.
9. 1.0: HDOP
10. 2,56, M: Altitude (altura acima do nível do mar em metros)
11. 1,9, M: altura de geoides
12. * 74: soma de verificação
Portanto, precisamos do nº 5 e do nº 6 para reunir informações sobre a localização do módulo ou onde ele está localizado.
Passos para fazer a interface do GPS com o microcontrolador PIC: -
- Defina as configurações do microcontrolador que incluem a configuração do oscilador.
- Defina a porta desejada para LCD incluindo o registro TRIS.
- Conecte o módulo GPS ao microcontrolador usando USART.
- Inicialize o sistema USART em modo de recepção contínua, com taxa de transmissão de 9600 e LCD com modo de 4 bits.
- Pegue duas matrizes de caracteres, dependendo do comprimento de latitude e longitude.
- Receba um bit de caractere por vez e verifique se ele é iniciado em $ ou não.
- Se $ Receive então é uma string, precisamos verificar o GPGGA, estas 5 letras e a vírgula.
- Se for GPGGA, então vamos pular o tempo, e procurar a Latitude e Longitude, vamos armazenar a Latitude e Longitude em uma matriz de dois caracteres até que N (Norte) e E (Leste) não sejam recebidos.
- Iremos imprimir a matriz em LCD.
- Limpe a matriz.
Explicação do código:
Vejamos o código linha por linha. As primeiras linhas são para definir bits de configuração que foram explicados no tutorial anterior, portanto, estou pulando por agora. O código completo é fornecido no final deste tutorial.
Estas cinco linhas são usadas para incluir arquivos de cabeçalho da biblioteca, lcd.h e eusart.h é para LCD e USART respectivamente. E xc.h é para o arquivo de cabeçalho do microcontrolador.
#incluir
Na função void main () , o system_init () ; função é usada para inicializar o LCD e USART.
Vazio principal (vazio) { TRISB = 0x00; // Definindo como saída system_init ();
O lcd_init (); e EUSART_Intialize (); é chamado a partir das duas bibliotecas lcd.h e eusart.h
void system_init (void) { lcd_init (); // Isso inicializará o lcd EUSART1_Initialize (); // Isso inicializará o Eusart }
Em enquanto loop de nós quebramos a seqüência GPGGA para obter a longitude e latitude coordenadas. Recebemos um bit de cada vez e comparamos com os caracteres individuais presentes na string GPGGA.
Quebramos os códigos que obteremos: -
incomer_data = EUSART1_Read (); // Verifique a string '$ GPGGA,' / * ------------------------------ Passo a passo encontrando a linha GPGGA- --------------------------- * / if (incomer_data == '$') {// A primeira declaração dos dados GPS começa com um $ sign incomer_data = EUSART1_Read (); // Se o primeiro se tornar verdadeiro, então a próxima fase if (incomer_data == 'G') { incomer_data = EUSART1_Read (); if (incomer_data == 'P'); { incomer_data = EUSART1_Read (); if (incomer_data == 'G'); { incomer_data = EUSART1_Read (); if (incomer_data == 'G') { incomer_data = EUSART1_Read (); if (incomer_data == 'A') { incomer_data = EUSART1_Read (); if (incomer_data == ',') {// primeiro, recebido incomer_data = EUSART1_Read (); // Nesta fase Final check in feito, GPGGA é encontrado.
Usando este código, pulamos a hora UTC.
while (incomer_data! = ',') {// pulando hora GMT incomer_data = EUSART1_Read (); }
Este código é para armazenar os dados de latitude e longitude na matriz de caracteres.
incomer_data = EUSART1_Read (); latitude = incomer_data; while (incomer_data! = ',') { for (array_count = 1; incomer_data! = 'N'; array_count ++) { incomer_data = EUSART1_Read (); latitude = incomer_data; // Armazena os dados Latitude } incomer_data = EUSART1_Read (); if (incomer_data == ',') { for (array_count = 0; incomer_data! = 'E'; array_count ++) { incomer_data = EUSART1_Read (); longitude = incomer_data; // Armazene os dados de longitude } }
E, finalmente, imprimimos a longitude e a latitude no LCD.
array_count = 0; lcd_com (0x80); // Seleção da linha um do LCD while (array_count <12) {// O array de dados de latitude tem 11 dígitos lcd_data (latitude); // Imprime os dados Latitude array_count ++; } array_count = 0; lcd_com (0xC0); // Seleção da linha dois do Lcd while (array_count <13) {// Array de dados de longitude tem 12 dígitos lcd_data (longitude); // Imprime os dados de longitude array_count ++; }
É assim que podemos fazer a interface do módulo GPS com o microcontrolador PIC para obter a latitude e longitude da localização atual.
O código completo e os arquivos de cabeçalho são fornecidos abaixo.