- Componentes necessários
- Obtendo dados de localização do GPS
- Diagrama de circuito
- Etapas para fazer a interface do GPS com o microcontrolador AVR
- Explicação do código
Os módulos GPS são amplamente usados em aplicações eletrônicas para rastrear a localização com base nas coordenadas de longitude e latitude. Sistema de rastreamento de veículos, relógio GPS, sistema de alerta de detecção de acidentes, navegação no tráfego, sistema de vigilância, etc., são alguns dos exemplos em que a funcionalidade GPS é essencial. O GPS fornece altitude, latitude, longitude, hora UTC e muitas outras informações sobre a localização específica, obtidas de mais de um satélite. Para ler os dados do GPS, é necessário um microcontrolador, portanto, estamos fazendo a interface do módulo GPS com o microcontrolador AVR Atmega16 e imprimindo a longitude e a latitude em um display LCD 16x2.
Componentes necessários
- Atmega16 / 32
- Módulo GPS (uBlox Neo 6M GPS)
- Antena de fio longo
- LCD 16x2
- Resistor 2,2k
- Capacitor 1000uf
- Capacitor 10uF
- Fio de conexão
- LM7805
- DC Jack
- Adaptador 12v DC
- Burgstips
- PCB ou PCB de uso geral
Ublox Neo 6M é um módulo GPS serial que fornece detalhes de localização por meio de comunicação serial. Possui quatro pinos.
PIN |
Descrição |
Vcc |
2.7 - fonte de alimentação 5V |
Gnd |
Terra |
TXD |
Transmitir Dados |
RXD |
Receber dados |
O módulo GPS Ublox neo 6M é compatível com TTL e suas especificações são fornecidas a seguir.
Hora de captura |
Arranque a frio: 27s, Arranque a quente: 1s |
Protocolo de comunicação |
NMEA |
Comunicação em série |
9600bps, 8 bits de dados, 1 bit de parada, sem paridade e sem controle de fluxo |
Corrente operacional |
45mA |
Obtendo dados de localização do GPS
O Módulo GPS transmitirá dados em várias sequências a 9600 Baud Rate. Se usarmos um terminal UART com taxa de 9600 Baud, podemos ver 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. Neste projeto utilizamos uma Biblioteca GPS que fornece algumas funções para extrair a latitude e longitude para que não tenhamos que nos preocupar com isso.
Anteriormente, conectamos o GPS a outros microcontroladores:
- Como usar GPS com Arduino
- Tutorial de interface do módulo GPS Raspberry Pi
- Interface do Módulo GPS com Microcontrolador PIC
- Rastreie um veículo no Google Maps usando Arduino, ESP8266 e GPS
Confira todos os projetos relacionados a GPS aqui.
Diagrama de circuito
O diagrama de circuito para interface GPS com microcontrolador AVR Atemga16 é fornecido abaixo:
Todo o sistema é alimentado por um adaptador de 12v DC, mas os circuitos funcionam em 5v, então a fonte de alimentação é regulada para 5v pelo regulador de tensão LM7805. Um LCD 16x2 é configurado no modo de 4 bits e suas conexões de pinos são mostradas no diagrama de circuito. O GPS também é alimentado por 5v e seu pino tx é conectado diretamente ao microcontrolador Rx do Atmega16. Um oscilador de cristal de 8 MHz é usado para sincronizar o microcontrolador.
Etapas para fazer a interface do GPS com o microcontrolador AVR
- Defina as configurações do microcontrolador que incluem a configuração do oscilador.
- Defina a porta desejada para o LCD incluindo o registro DDR.
- Conecte o módulo GPS ao microcontrolador usando USART.
- Inicialize o UART do sistema no modo ISR, com 9600 baud rate e LCD no modo 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 $ for recebido, então é uma string, precisamos verificar $ GPGGA, com 6 letras incluindo $.
- Se for GPGGA, então receba a string completa e defina os sinalizadores.
- Em seguida, extraia a latitude e longitude com direções em duas matrizes.
- Finalmente imprima as matrizes de latitude e longitude no LCD.
Explicação do código
O código completo com um vídeo de demonstração é fornecido no final, aqui algumas partes importantes do código são explicadas.
Em primeiro lugar, inclua alguns cabeçalhos necessários no código e, em seguida, escreva MACROS de bitmask para configuração de LCD e UART.
#define F_CPU 8000000ul #include #include
Agora declare e inicialize algumas variáveis e matrizes para armazenar a sequência de GPS, latitude, longitude e sinalizadores.
char buf; volátil char ind, flag, stringReceived; char gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; latitude char; char logitude;
Depois disso, temos algumas funções de driver de LCD para conduzir o LCD.
void lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; if (r == 1) RSHigh; else RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; if (r == 1) RSHigh; else RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); } void lcdprint (char * str) { while (* str) { lcdwrite (* str ++, DATA); // __ delay_ms (20); } } void lcdbegin () { char lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; para (int i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Depois disso, inicializamos a comunicação serial com GPS e comparamos a string recebida com "GPGGA":
void serialbegin () { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB = (1 <
Agora, se a string recebida for correspondida com sucesso com o GPGGA, na função principal extraia e exibe as coordenadas de latitude e longitude do local:
lcdwrite (0x80,0); lcdprint ("Lat:"); serialprint ("Latitude:"); para (int i = 15; i <27; i ++) { latitude = buf; lcdwrite (latitude, 1); serialwrite (latitude); if (i == 24) { lcdwrite ('', 1); i ++; } } serialprintln (""); lcdwrite (192,0); lcdprint ("Log:"); serialprint ("Logitude:"); para (int i = 29; i <41; i ++) { logitude = buf; lcdwrite (logitude, 1); serialwrite (logitude); if (i == 38) { lcdwrite ('', 1); i ++; } }
Portanto, é assim que o módulo GPS pode ser conectado ao ATmega16 para encontrar as coordenadas de localização.
Encontre o código completo e o vídeo de trabalho abaixo.