GPS Neo-6M com Arduino – Aprenda a usar

O artigo de hoje é sobre o módulo GPS Neo-6M. Esse módulo GPS é simples e fácil de ser integrado em projetos com Arduino. Ótimas bibliotecas já estão disponíveis online e facilitam bastante as tarefas de conversão e tratamento da string de dados que o módulo fornece ao Arduino.

Nesse texto vamos ligar o módulo GPS Ne0-6M com um Arduino UNO e apresentar dados de localização e velocidade na tela serial do computador. Uma aplicação bacana é mostrar os dados na tela de um LCD 16×2, ou mesmo gravá-los em um datalogger para fazer análises posteriores. Também vamos dar algumas dicas nessas direções.

** Revisão em andamento – atualizações em breve**

Introdução – Como funciona o módulo GPS?

Com certeza você sabe o que é o sistema GPS, ou pelo menos já ouviu falar dele. Embora o sistema seja usado diariamente por quase todo mundo, poucas pessoas sabem a infraestrutura que está por trás dos equipamentos GPS. A sigla é abreviação de Global Positioning System, e do ponto de vista físico, o sistema em si consiste em uma constelação de satélites, com um número mínimo de 24 satélites para manter o sistema operacional e um número alvo de 33.

O sistema GPS é mantido e administrado pela 50th Space Wing, uma das alas aéreas da Força Aérea dos EUA. Foi lançado originalmente em 1978 com objetivos militares, e acabou se tornando o backbone de toda uma indústria de equipamentos e serviços de posicionamento global.

Além da constelação de satélites, há também a rede de controle baseada em terra e os equipamentos de usuários em si. A constelação é constituída de satélites na órbit MEO (Medium Earth Orbit), a uma altitudade de aproximadamente 20200 km. Cada satélite dá a volta na Terra duas vezes por dia. O arranjo dos satélites é feito de forma que exista 6 planos orbitais igualmente espaçados circulando a Terra. Cada plano contém quatro “slots” ocupados por um satélite. Ou seja, o arranjo total compreende 24 slots, de forma que um usuário pode sempre ver(receber o sinal) de pelo menos 4 satélites de qualquer lugar do planeta.( Fonte: www.gps.gov). A imagem abaixo ilustra a constelação e seus 24 “slots”.

Constelação GPS

Constelação GPS. Fonte: www.gps.gov

Como o módulo GPS calcula a posição e velocidade?

Com pelo menos 4 satélites sendo percebidos por um módulo GPS, é possível saber a posição e velocidade global. Como isso é feito? Da seguinte forma: Primeiro, os dados enviados para a terra pelos satélites GPS possuem várias informações, dentre elas, as mais importantes é o tempo do momento exato em que o sinal foi enviado(cada satélite possui um preciso relógio atômico integrado para gerar essa informação). Além do tempo medido pelo relógio atômico do satélite, também é enviada a posição orbital do satélite e os tempos de chegada em diferentes pontos da órbita.

Em resumo, o seu módulo GPS(independente de modelo e fabricante) recebe de cada satélite um “timestamp” de quando o sinal foi enviado, e também a informação de onde cada satélite está posicionado(e várias outras informações). Assim, o receptor GPS sabe a distância para cada satélite. Com esses dados, o módulo calcula internamento, via triangulação de dados, a posição, velocidade e tempo exatos.

Para saber os detalhes do cálcula, acesse as seguintes referências:

É sempre bom lembrar que além do GPS, que é operado pela USAF, existem outras constelações de satélites usadas para os mesmos propósitos, como o sistema Galileu(Europa), o GLONASS(Russo) e o BeiDou(Chinês).

O módulo GPS Neo-6M

Para mostrar como integrar GPS ao seu projeto, vamos usar o módulo GPS Neo-6M. Esse módulo é capaz de informar a localização exata , enviando dados referentes a latitude e longitude, data, hora e velocidade de deslocamento.

Uma informação importante do Módulo GPS é sua interface serial de 3,3V, não tolerando 5V. Portanto, não aplica sinais de 5V ao módulo, lembre-se de utilizar um conversor de sinais lógicos, como faremos em nosso exemplo.

As especificações são:

  • Modelo: GY-GPS6MV1;
  • Tensão de trabalho: 3,3 a 5V DC;
  • Interface serial de 3,3V;
  • Taxa de transmissão padrão: 9600;
  • Dimensões do módulo (CxLxA): 30x23x4mm;
  • Dimensões da antena (CxLxA): 25x25x8mm;

Para usar o módulo, existe uma conhecida biblioteca chamada TinyGPS. Na verdade, essa biblioteca apenas faz a manipulação dos dados do GPS, evitando que você tenha que manipular as strings enormes que o módulo enviar. Outra boa biblioteca disponível é a GPSneo, que é bem semelhante à anterior.

Aspectos de Hardware

A montagem em si é bem simples posi o módulo GPS Neo-6M se comunica com Arduino via interface serial. Vamos usar um divisor de tensão simples para converter os sinais TX do Arduino(5V) para 3.3V correspondentes do RX do GPS Neo-6M. A montagem fica conforme abaixo:

Várias montagens disponíveis na internet fazem a ligação direta dos pinos RX/TX, sem a conversão de nível de lógico. Em nossos testes, a conexão direta(sem conversão dos níveis lógicos da serial) também funcionou bem, mas recomendamos usar os níveis indicados pelo fornecedor do módulo. Qualquer teste ligando TX direto em RX é por sua conta e risco.

Aspectos de Software

Podemos fazer o software de duas formas. A mais simples de todas é simplesmente ler as strings originais do módulo GPS e mostrá-las na tela serial. A segunda forma é usar uma biblioteca para tratar os dados e usar funções pré-definidas para obter apenas as informações que você pŕecisa.

O código mais simples é mostrado abaixo:

#define GPS_RX  4
#define GPS_TX  3
#define GPS_Serial_Baund 9600
#include <SoftwareSerial.h>

 
// The serial connection to the GPS device
SoftwareSerial gpsSerial(GPS_RX, GPS_TX);
 
void setup()
{
  Serial.begin(115200); // Beginning the serial monitor at Baudrate 115200 and make sure you select same in serial monitor
  gpsSerial.begin(GPS_Serial_Baund);
}
 
void loop()
{
  //Mostra os dados crus do GPS
  while (gpsSerial.available() > 0)
  {
    Serial.write(gpsSerial.read());
  }
}

Para esse primeiro código, você vai observar mais ou menos o seguinte na sua saída serial.

Essas strings são os dados “crus” tal como GPS envia para o Arduino. Para tratar as Strings vamos usar a biblioteca TinyGPS. Fazendo as devidas adaptações nos códigos de exemplo, uma bom código de referência é o que se segue abaixo:

#define GPS_RX  4
#define GPS_TX  3
#define GPS_Serial_Baund 9600

#include <SoftwareSerial.h>
#include <TinyGPS.h>

TinyGPS gps;
SoftwareSerial gpsSerial(GPS_RX, GPS_TX);

void setup()
{
  Serial.begin(GPS_Serial_Baund);
  gpsSerial.begin(GPS_Serial_Baund);
}

void loop()
{
  bool newData = false;
  unsigned long chars;

  // For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (gpsSerial.available())
    {
      char c = gpsSerial.read();
      // Serial.write(c); //apague o comentario para mostrar os dados crus
      if (gps.encode(c)) // Atribui true para newData caso novos dados sejam recebidos
        newData = true;
    }
  }

  if (newData)
  {
    float flat, flon;
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
    Serial.print("LAT=");
    Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
    Serial.print(" LON=");
    Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
    Serial.print(" SAT=");
    Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
    Serial.print(" PREC=");
    Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
    Serial.println();
    Serial.println();
  }

}

Com o segundo código, você obterá como saída o seguinte conjunto de mensagens:

 

Oberseve que com as funções gps.f_get_position e gps.satelites nós obtivemos os dados de latitude e longitude e também quantos satélites foram identificados pelo módulo. Outras funções estão disponíveis para acessar as demais informações que o módulo fornece.

Sugerimos que você explore os exemplos da biblioteca TinyGPS para conhecer as demais funções que ela disponibiliza. Para entender o significa das strings originais do módulo(lidar com os dados crus pode dar flexibilidade para implementar a sua própria biblioteca ou funções) recomendamos o site gpsinformation(em inglês).

Por fim, imagina como ficaria legal integrar um LCD e um datalogger a esse projeto!  Aqui no blog também ensinamos a usar esses componentes em qualquer projeto com arduino. Confira os seguintes posts e incorpore um cartão SD e um LCD para visualizar os dados do seu módulo GPS:

Considerações finais

Lembre-se de verificar as recomendações de seu fornecedor sobre a tensão de ligação do módulo. Se você olhar de perto, verá que os pinos RX e TX estão conectados diretamente ao módulo uBlox, que é o chip GPS em si do módulo Neo 6m. O datasheet é uma ótima referência para conhecer mais dos módulos da uBlox, uma das principais fabricantes de chips GPS do mercado. De acordo com o datasheet o Neo 6M possui tensão de alimentação de 2,7 a 3,3V.

O que permite que alguns projetos na internet liguem diretamente em 5V é o fato de o pequeno shield ao qual o módulo uBlox vem integrado possuir um adaptador de tensão. Mas o mesmo não acontece com a interface serial, que se liga direta aos ṕinos do chip uBlox, portanto, cuidado!

Qualquer dúvida adicional, entre em contato conosco por meio dos comentários!

Referências

Faça sua avaliação.
Por favor, aguarde...
Vitor Vidal
Vitor Vidal
Engenheiro eletricista, mestrando em eng. elétrica e apaixonado por eletrônica, literatura, tecnologia e ciência. Divide o tempo entre pesquisas na área de sistemas de controle, desenvolvimento de projetos eletrônicos e sua estante de livros.