Utilização do Módulo GPS NEO-6M
Visando aplicações de telemetria em Geolocalização, o objetivo deste tutorial será apresentar como funciona o Módulo GPS NEO-6M (Ublox NEO-6M) e propor um exemplo de aplicação prática em conjunto com o Arduino Uno na captação das coordenadas de localização geográficas.
[toc]
Contexto Histórico
Durante guerras, era essencial saber a localização das tropas aliadas e inimigas para desenvolver estratégias de ataque e defesa. Com isso, sempre houve uma grande preocupação das grandes nações em aplicar tecnologias para conseguir essas informações de maneira mais rápida, o que se intensificou no contexto da guerra fria em que Estados Unidos e União Soviética estavam interessados no desenvolvimento desta tecnologia. Em 1957, a União Soviética lançou seu primeiro satélite artificial no espaço, iniciando assim a pesquisa do uso de satélites para geolocalização. Porém, a tecnologia GPS – Global Position System foi criada pelos americanos, com o projeto NAVSTAR em 1960, desenvolvido pelo Departamento de Defesa dos Estados Unidos. Este projeto conseguia oferecer informações sobre qualquer localização no planeta, e apenas nos anos 90 se tornou totalmente operacional.
Atualmente, a aplicação do GPS deixou de ser unicamente utilizada militarmente e é amplamente utilizada em veículos do mundo todo, na agricultura, estudos geológicos, meteorológicos, entre outras várias utilizações.
Como funciona o GPS
A figura a seguir mostra uma ilustração de como localizar o módulo GPS, que foi realizada utilizando como coordenadas a localização do módulo na cidade de Itabira MG.
A localização exata do módulo GPS está indicada pela circunferência vermelha. Cada uma das outras circunferências são os sinais provenientes de três satélites. Caso o módulo GPS recebesse sinal de apenas um satélite como, por exemplo, o verde, ele saberia que está em algum ponto de toda a sua circunferência. Caso o módulo GPS recebesse sinais de apenas dois satélites como, por exemplo, verde e amarelo, note que existe duas intersecções entre estes círculos. Assim, o módulo não saberia discernir em qual dos dois pontos eles estão. Porém, quando o módulo GPS recebe o sinal de três satélites, note que existe apenas um ponto de intersecção entre os três sinais. Isso permite que o módulo consiga se localizar geograficamente com maior precisão.
O Módulo GPS NEO-6M
O Módulo GPS NEO-6M é um módulo GPS pronta para uso junto a placas de desenvolvimento. Elá possui o Ublox GPS NEO-6M, módulo pertencente a uma família de GPS autônomos. Fácil de usar, esse módulo consegue, sozinho, determinar com precisão horizontal de até 2,5m a sua localização.
Você pode conferir mais informações sobre o GPS NEO-6M através do datashett na página do produto no próprio site da Ublox.
Esse módulo também vem equipado com todos os periféricos necessários para que você possa implementa-lo em seu projeto com facilidade.
Especificações técnicas
- Tensão de alimentação: 3V a 5V;
- Modelo: GY-GPS6MV2;
- Antena externa de Cerâmica;
- Velocidade padrão: 9600 bps;
- Número de canais: 50;
- Sensibilidade: -146dBm/-160dBm;
- Faixa de atualização de navegação: 5Hz;
- Altitude limite: 50000m;
- Velocidade limite: 500m/s;
- Memória de Armazenamento: EEPROM;
- Com Bateria de backup: MS621FE;
- Possui LED para indicar o sinal;
Algumas aplicações
Este módulo GPS utiliza a comunicação serial/TTL e, por isso, ele possui somente quatro pinos. Com estas características, este módulo é muito utilizado em:
- Circuitos de drones;
- Carrinhos de controle remoto;
- Veículos de transporte;
- Mapeamento de rotas.
Mãos à obra – Utilizando o Módulo GPS NEO-6M
Componentes Necessários
Para desenvolvimento do projeto, serão utilizados os seguintes componentes:
- 1 x Módulo GPS NEO-6M
- 1 x Arduino Uno
- 1 x Protoboard
- Fios Jumpers
Montando o projeto
Para realizar a montagem do projeto, deve-se conectar os pinos TX e RX do módulo GPS aos pinos TX e RX correspondentes no Arduino. É possível utilizar o próprio microcontrolador para suprir a alimentação do módulo GPS, conectando os cabos Vcc e Gnd desse aos respectivos equivalentes, como é mostrado no circuito abaixo. A utilização do Arduino se dá em virtude do seu baixo custo e também pela facilidade na implementação e comunicação com o módulo.
Módulo GPS NEO-6M | Arduino UNO |
VCC | 5V |
RX | Pino 9 |
TX | Pino 8 |
GND | GND |
Após o código carregado e o circuito montado, basta energizar o conjunto para que funcione. Para obter melhores resultados, ou seja, mais rápidos e confiáveis, é aconselhável a utilização do módulo ao ar livre. Isso permite que este consiga captar os sinais por sua antena de maneira mais eficiente.
Com o circuito pronto, pode-se comparar os dados coletados com o próprio GPS do aplicativo Google Maps. Desta forma é possível ter em mãos uma ferramenta comparativa de dados para verificar se o módulo está captando informações corretas e se a programação está funcionando como o esperado.
Programando
Após realizar a montagem do projeto na protoboard e verificar se as conexões estão corretas, copie e cole o código abaixo na IDE do Arduino e em seguida faça o Upload para o mesmo:
#include<SoftwareSerial.h> #include<TinyGPS.h> SoftwareSerial SerialGPS(8, 9); TinyGPS GPS; float lat, lon, vel; unsigned long data, hora; unsigned short sat; void setup() { SerialGPS.begin(9600); Serial.begin(9600); Serial.println("Buscando satelites..."); } void loop() { while (SerialGPS.available()) { if (GPS.encode(SerialGPS.read())) { //Hora e data GPS.get_datetime(&data, &hora); Serial.print("--"); Serial.print(hora / 1000000); Serial.print(":"); Serial.print((hora % 1000000) / 10000); Serial.print(":"); Serial.print((hora % 10000) / 100); Serial.print("--"); Serial.print(data / 10000); Serial.print("/"); Serial.print((data % 10000) / 100); Serial.print("/"); Serial.print(data % 100); Serial.println("--"); //latitude e longitude GPS.f_get_position(&lat, &lon); Serial.print("Latitude: "); Serial.println(lat, 6); Serial.print("Longitude: "); Serial.println(lon, 6); //velocidade vel = GPS.f_speed_kmph(); Serial.print("Velocidade: "); Serial.println(vel); //Satelites sat = GPS.satellites(); if (sat != TinyGPS::GPS_INVALID_SATELLITES) { Serial.print("Satelites: "); Serial.println(sat); } Serial.println(""); } } }
Colocando para funcionar
Veja como ficou o resultado no Monitor serial da IDE Arduino:
Entendendo a fundo
Software
– Incluindo as bibliotecas a serem utilizadas
Inicialmente para que a aplicação funcione de forma adequada é necessário adicionar duas bibliotecas, a primeira é a SoftwareSerial.h, que permitirá nomear dois pinos digitais do Arduino para realizarem comunicação serial com o módulo GPS. A segunda biblioteca necessária é a TinyGPS.h, essa atua contendo todas as funções e comando necessários para se comunicar com o módulo e acessar suas ferramentas.
#include<SoftwareSerial.h> #include<TinyGPS.h>
Nas próximas duas linhas criamos dois objetos responsáveis por acessar as instruções existentes em cada biblioteca. Observe ainda que o objeto SerialGPS(8, 9) envia dois valores como parâmetro ao construtor da biblioteca SoftwareSerial.h, esses parâmetros dentro dos parênteses informam quais serão os pinos de comunicação serial. Sendo assim o pino 8 é o Rx e o pino 9 o Tx. O objeto GPS não possui nenhum parâmetro a ser enviado ao construtor da biblioteca TinyGPS.h.
SoftwareSerial SerialGPS(8, 9); TinyGPS GPS;
– Declarando as variáveis do projeto
Em seguida é necessário instanciar ou criar as variáveis responsáveis por armazenar os dados obtidos pela comunicação do GPS com os satélites. As variáveis lat, lon, vel (do tipo long) armazenam respectivamente os valores de Latitude, Longitude e Velocidade de onde se encontra a aplicação. Já as variáveis data e hora (do tipo unsigned long) são responsáveis por guarda as informações de data e hora solicitadas pelo módulo GPS. Por fim a variável sat (do tipo unsigned short) é incumbida de armazenar a quantidade de satélites disponíveis para se comunicar com o módulo.
float lat, lon, vel; unsigned long data, hora; unsigned short sat;
– Estabelecendo as configurações iniciais
Na função void setup(), primeiro inicializamos a comunicação serial com a função Serial.begin(9600), onde definimos o baudrate para 9600. Na próxima linha iniciamos a porta serial responsável por enviar e receber informações do módulo GPS e definimos o baudrate para 9600. A última linha do setup() é composta pela instrução Serial.println(“Buscando satelites…”) que exibe no monitor serial a string dentro das aspas.
void setup() { Serial.begin(9600); SerialGPS.begin(9600); Serial.println("Buscando satelites..."); }
– Comunicação com o GPS
A função void loop() contém todos os procedimentos para que o GPS colete dados dos satélites. A primeira instrução executada pelo microcontrolador é a while (SerialGPS.available()), essa instrução permite identificar se existe algum dado disponível do GPS para o Arduino. Caso essa verificação aponte dados disponíveis, o if() dentro das chaves do while() é executado. Essa condicional faz a verificação de um caractere proveniente do GPS, e faz a validação do mesmo de forma a liberar ou não o request (solicitação) de informações do mesmo.
while (SerialGPS.available()) { if (GPS.encode(SerialGPS.read())) {
– Aquisição de hora e data
Dentro das chaves do if() é possível solicitar diversas informações dos satélites por meio do GPS. Duas informações importantes que permitem validar análises, são data e horário. Assim o objeto GPS por meio da função get_datatime(&data, &hora) armazena nas variáveis data e hora os respectivos dados. Observe que as duas variáveis são do tipo long, desta maneira a data fica no formato ddmmaa e o horário no formato hhmmss. Para separar a data em dia/mês/ano é utilizado o procedimento de divisão e resto da divisão(%), tal procedimento também é repetido para o horário. Para exemplificar, suponha que o valor da variável data seja 230318. O dia pode ser encontrado desta forma: data/10000 = 23, e assim para separar o mês basta usar o resto da divisão da operação anterior: (hora % 1000000) / 10000 = 03, e assim por diante como mostrado no código abaixo:
GPS.get_datetime(&data, &hora); Serial.print("--"); Serial.print(hora / 1000000); Serial.print(":"); Serial.print((hora % 1000000) / 10000); Serial.print(":"); Serial.print((hora % 10000) / 100); Serial.print("--"); Serial.print(data / 10000); Serial.print("/"); Serial.print((data % 10000) / 100); Serial.print("/"); Serial.print(data % 100); Serial.println("--");
– Aquisição da latitude e longitude
Para obter a informação da Latitude e Longitude de onde se encontra a aplicação, basta utilizar a seguinte instrução: GPS.f_get_position(&lat, &lon), essa função armazena nas variáveis lat e lon os respectivos valores e exibe-os no monitor serial com a instrução Serial.println(lat, 6). O valor 6 nesse caso indica o número de casa decimais.
GPS.f_get_position(&lat, &lon); Serial.print("Latitude: "); Serial.println(lat, 6); Serial.print("Longitude: "); Serial.println(lon, 6);
– Aquisição da velocidade
Da mesma forma, para receber a informação da velocidade da aplicação em relação ao satélite com o qual o módulo esta se comunicando, basta chamar a função GPS.f_speed_kmph(), que retorna o valor da velocidade e armazena a mesma na variável vel. Posteriormente a variável é mostrada no monitor serial através da função Serial.println(vel). Uma observação importante, neste caso, a função f_speed_kmph() nesse caso já retornou o valor da velocidade em km/h, mas é possível trabalhar com unidades como nós, milha/s e milha/h, basta pesquisar as funções disponíveis na biblioteca TinyGPS.h.
vel = GPS.f_speed_kmph(); Serial.print("Velocidade: "); Serial.println(vel);
– Satélites disponíveis
A última função para solicitar informações do módulo GPS é a GPS.satellites(). Por meio dessa função o objeto GPS repassa a variável sat a quantidade de satélites encontrados e disponíveis para comunicação com o módulo GPS conectado ao Arduino. Em seguida uma nova condicional é avaliada, esse if (sat != TinyGPS::GPS_INVALID_SATELLITES) é utilizado para verificar se o valor de satélites armazenados na variável sat é um valor válido antes de imprimi-lo no monitor serial com a função Serial.println(sat). Tal procedimento de verificação é usado nas demais funções anteriores, mas todos internamente.
sat = GPS.satellites(); if (sat != TinyGPS::GPS_INVALID_SATELLITES) { Serial.print("Satelites: "); Serial.println(sat); }
Desafio
Agora que você já conhece as funções do módulo GPS, temos alguns desafios para que você possa aplicar seus conhecimentos:
- Que tal controlar um carrinho de controle remoto com ele? Por exemplo, entre no aplicativo Google Maps e pegue as coordenadas próximas de sua casa. Utilizando o Módulo GPS NEO-6M, faça com que o carrinho chegue a algum lugar próximo das coordenadas tomadas anteriormente.
- Adquira os dados de latitude e longitude do Módulo GPS NEO-6M durante um deslocamento executado por você e plote um gráfico. Esse pode ser feito utilizando os Softwares Excel, Origin ou até mesmo o LabView. Você verá que irá formar um mapa com a trajetória executada.
Considerações finais
Nesse tutorial, demonstramos como você pode obter informações de localização e deslocamento utilizando um Arduino Uno e um Módulo GPS. Espera-se que este tutorial possa ter ajudado no desenvolvimento de seu projeto. A equipe responsável agradece pela sua leitura e, em caso de dúvidas e sugestões, deixe seu comentário para que possamos sanar suas dúvidas! Obrigado!
Equipe de BAJA SAE da Universidade Federal de Itajubá – Campus Avançado de Itabira.
O programa Baja SAE BRASIL é um desafio lançado aos estudantes de Engenharia que oferece a chance de aplicar na prática os conhecimentos adquiridos em sala de aula, visando incrementar sua preparação para o mercado de trabalho.
Ao participar do programa Baja SAE, o aluno se envolve com um caso real de desenvolvimento de um veículo off road, desde sua concepção, projeto detalhado, construção e testes.
DAFTAR SLOT ONLINE DAN LOGIN DI LINK ALTERNATIF UOB77
22 Comments
Deixe uma pergunta, sugestão ou elogio! Estamos ansiosos para ter ouvir!Cancelar resposta
Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.
Olá, como faço para usar o GPS Neo 6 com (delay) no código? Pois preciso de uma “espera”, mas sempre que coloco delay, não consigo obter as coordenadas
Sim, é possível utilizar o exemplo acima para trabalhar junto ao app inventor. Você precisa de um módulo bluetooth, módulo WIFI, ESP8266 ou um ESP32 para comunicar sua aplicação com o celular e enviar os dados do GPS para o aplicativo.
Outra dica: Se o exemplo aqui do site funciona mas o seu código não funciona isso é porque você está usando um delay! Se olhar o exemplo daqui para cada vez que o led azul da placa do GPS pisca, o led vermelho RX do Arduino Uno pisca também. Isso é porque os dados do GPS ficam muito pouco tempo na “memória” do GPS e daí ele já limpa para ler mais informações, se nesse meio tempo seu código estiver executando um delay então as informações do GPS são perdidas. Tire o delay!
Uma dica para quem não consegue funcionar. Ao alimentar esse módulo GPS e ele começar a ler os dados então um LED azul na placa dele começa a piscar. Se essa luz azul não piscar nunca vai funcionar este exemplo.
Se deixar a antena dele em cima do próprio chip não funciona. Também se deixar muito perto de metal ou mesmo segurando com os dedos.
Olá, tive um probleminha com o código, pois fica aparecendo “buscando satélite” e não aparece os dados. Já faz 3 horas que eu carreguei o programa e até agora nada, o céu esta limpo e estou á céu aberto. Será que alguém consegue me ajudar com isso?
A antena cerâmica do meu módulo gps 6M quebrou. Gostaria de saber se posso substituir por algum outro tipo de antena, ou se tem que ser a cerâmica mesma
Bem, quero agradecer pelos ótimos conteúdos que vocês disponibilizam , são simplesmente bons.
Olá, eu tô usando GPS NEO-6M-0-00 e nele contém um pino a mais (PPS), se alguém puder me explicar como funciona esse pino fico grato .
Como posso usar esse GPS no Esp32?
Olá, é possível fazer com que as informações adquiridas do satélite sejam gravadas em um SD para posterior tratamento dos dados?
Olá, Denis.
É possível sim, e existe uma infinidade de opções de como fazer isso.
No meu caso eu fiz um programa em Python e usei um raspberry pi para isso. Instalei uma biblioteca de python que faz a leitura da porta “COM1” onde está meu arduino ligado no raspberry pi, e nesse mesmo programa, ele recebe os dados do arduino e vai adicionando no final de um arquivo de texto o dado. Fiz tambem uma pagina de internet na minha rede local onde ela lê os dados desse arquivo que o programa em python escreveu e já gera os graficos de hora em hora para mim.
Eu montei uma mini estação meteorológica, com sensores de temperatura, umidade, pressão, luminosidade, altitude, latitude, longitude e imagens de uma câmera que fica apontada para o céu. Ai eu integrei tudo isso nessa página local que fiz.
Tem como fazer para mostrar no display LCD ? se estiver como faço para implementar no progama ?
O meu só retornou “Buscando satélites… ” e não retornou mais nada. O que pode ter acontecido?
Olá Paula!
O meu também esta da mesma forma que o seu. Vc conseguiu resolver? O que vc fez?
Aconteceu a mesma coisa comigo, o problema foi que eu não esperei o módulo entrar em comunicação com os satélites ,ele demora a ter essa comunicação ,depende muito do tempo e do lugar em que vocês estejam testando. Então , aconselho vocês testaram novamente mas sem compilar o progama
.
Eu estou com o meu ligado a mais de 8 horas, céu limpo e aparelho do lado externo e não funciona.
Ótimo tutorial! Irei utilizar este módulo em um projeto. Vocês sabem me dizer se é possível usá-lo com o MIT App Inventor, fazendo com que apareça a localização do módulo no app do cel???
Alguém sabe dizer o que devo fazer para que esse codigo fique compativel com NodeMCU 1.0??
Obrigado pessoal! O seu código foi o único que funcionou para mim. Os outros retornavam dados vazios. Até pensei que o módulo estivesse com problema, ou minhas ligações estavam erradas.
a antena do meu gps quebrou, alguem sabe onde posso comprar só ela?
Procure no mercado livre por antena de GPS, mas geralmente tem que comprar um adaptador ufl.
Está em torno de 20 reais.