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]

kit robotica educacional com Arduino ESP ou Microbit

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.

Entendendo o funcionamento do Módulo GPS
Entendendo o funcionamento do Módulo GPS

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.

Módulo GPS NEO-6M
Módulo GPS NEO-6M

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:

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.

Diagrama de ligação do Módulo GPS NEO-6 ao Arduino.
Diagrama de ligação do Módulo GPS NEO-6M ao Arduino.
Módulo GPS NEO-6M Arduino UNO
VCC 5V
RX Pino 9
TX Pino 8
GND GND
Confira a seguir um pequeno GIF da montagem:
Montagem do projeto com o Módulo GPS NEO-6M
Montagem do projeto com o Módulo GPS NEO-6M

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:

Monitor Serial.
Artduino uno com Módulo GPS NEO-6M
Artduino uno com Módulo GPS NEO-6M

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 9Tx. 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 latlonvel (do tipo long) armazenam respectivamente os valores de Latitude, Longitude e Velocidade de onde se encontra a aplicação. Já as variáveis data 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 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 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 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!

Privacy Preference Center