Como usar o módulo GPS GY-NEO6MV2
Neste post vamos mostrar como usar o módulo GPS GY-NEO6MV2 com Arduino Uno, exibindo informações fornecidas pelos satélites do sistema GPS em um display OLED I2C.
O GY-NEO6MV2 é um módulo de fácil utilização, realizando a comunicação através de comunicação serial. Esse tipo de comunicação faz com que o módulo seja facilmente integrado à projetos que utilizem microcontroladores e também placas como Raspberry Pi, Linkit, Beaglebone, NodeMCU, ESP8266 e outras.
O módulo GPS GY-NEO6MV2
Em termos de pinagem o GY-NEO6MV2 é bem “econômico”: são somente 4 pinos, sendo dois de alimentação (Vcc e GND, 2.7 à 5VDC), e dois de comunicação serial (RX e TX).
O módulo possui antena embutida e a corrente de operação do conjunto é de apenas 45mA, tornando o módulo GPS GY-NEO6MV2 uma excelente opção para utilização em carrinhos, drones, projetos de navegação aérea ou terrestre e geolocalização.
Conexão do módulo GPS ao Arduino
Nos nossos testes vamos usar o módulo GY-NEO6MV2 com Arduino Uno e um display OLED I2C, que vai mostrar as informações de data, hora, latitude e longitude fornecidas pelos satélites do sistema GPS.
O módulo GPS está conectado aos pinos digitais 3 e 4 do Arduino, e vamos usar a biblioteca SoftwareSerial para efetuar a comunicação com o módulo, liberando a serial por hardware do Arduino para enviar dados ao serial monitor do computador, se necessário. O display OLED utiliza a comunicação I2C e é ligado aos pinos analógicos A4 (SDA) e A5 (SCL).
Fique atento às conexões do Vcc e GND do display OLED, pois em alguns módulos esses pinos vem invertidos.
Programa
O programa utiliza a biblioteca TinyGPS++, que você pode instalar a partir da IDE do Arduino. Para isso, acesse o menu Sketch, selecione Incluir Biblioteca e depois Gerenciar Bibliotecas. Procure por TinyGPS e instale a biblioteca indicada na imagem abaixo:
Vamos também utilizar a biblioteca TimeLib, que servirá para ajustar o fuso horário (TimeZone) depois que os dados de data e hora forem recebidos pelo módulo GPS GY-NEO6MV2.
A TimeLib está junto com a biblioteca Time, que pode ser instalada através da própria IDE, para isso abra a IDE do Arduino, acesse o menu Sketch, selecione Incluir Biblioteca e depois Gerenciar Bibliotecas. Procure pela biblioteca Time, de Michael Margolis, e clique em instalar:
Realize o mesmo procedimento para instalar a biblioteca U8glib, usada para exibição de gráficos e informações no display OLED.
A TinyGPS++ (TinyGPSPlus) é uma biblioteca que permite extrair as informações fornecidas pelo módulo GPS de forma simples, fornecendo apenas as informações que desejamos, como no exemplo deste post, as informações de data, hora, latitude e longitude.
//Programa: Modulo GPS GY-NEO6MV2 com Arduino Uno //Autor: Arduino e Cia #include <TimeLib.h> #include <TinyGPS++.h> #include <SoftwareSerial.h> #include <U8glib.h> //Pinos utilizados para conexao do modulo GY-NEO6MV2 static const int RXPin = 4, TXPin = 3; //Objeto TinyGPS++ TinyGPSPlus gps; //Conexao serial do modulo GPS SoftwareSerial Serial_GPS(RXPin, TXPin); //Definicoes do display Oled U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_FAST); void draw() { //Ajuste do horario/timezone GPS_Timezone_Adjust(); //Comandos graficos para o display devem ser colocados aqui u8g.setFont(u8g_font_8x13B); u8g.drawRFrame(0, 0, 128, 64, 4); //Linha Data u8g.drawStr(10, 14, "D: "); u8g.setPrintPos(34, 14); //Mostra o dia if (day() < 10) { u8g.print("0"); } u8g.print(day()); u8g.drawStr(51, 14, "/"); u8g.setPrintPos(60, 14); //Mostra o mes if (month() < 10) { u8g.print("0"); } u8g.print(month()); u8g.drawStr(76, 14, "/"); u8g.setPrintPos(85, 14); //Mostra o ano u8g.print(year()); //Linha Horario u8g.drawStr(10, 29, "H: "); u8g.setPrintPos(45, 29); //Mostra hora if (hour() < 10) { u8g.print("0"); } u8g.print(hour()); u8g.drawStr(61, 28, ":"); u8g.setPrintPos(70, 29); //Mostra minutos if (minute() < 10) { u8g.print("0"); } u8g.print(minute()); u8g.drawStr(86, 28, ":"); u8g.setPrintPos(95, 29); //Mostra segundos if (second() < 10) { u8g.print("0"); } u8g.print(second()); //Linha latitude u8g.drawStr(10, 44, "Lat: "); u8g.setPrintPos(45, 44); u8g.print(gps.location.lat(), 5); //Linha longitude u8g.drawStr(10, 59, "Lon: "); u8g.setPrintPos(45, 59); u8g.print(gps.location.lng(), 5); } //Ajuste o timezone de acordo com a regiao const int UTC_offset = -3; void setup() { //Baud rate Arduino Serial.begin(115200); //Baud rate Modulo GPS Serial_GPS.begin(9600); //Mostra informacoes iniciais no serial monitor Serial.println(F("Data, Hora, Latitude e Longitude")); Serial.println(F("Modulo GPS GY-NEO6MV2")); Serial.print(F("Biblioteca TinyGPS++ v. ")); Serial.println(TinyGPSPlus::libraryVersion()); Serial.println(); //Definicoes do display Oled if ( u8g.getMode() == U8G_MODE_R3G3B2 ) { u8g.setColorIndex(255); // white } else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) { u8g.setColorIndex(3); // max intensity } else if ( u8g.getMode() == U8G_MODE_BW ) { u8g.setColorIndex(1); // pixel on } else if ( u8g.getMode() == U8G_MODE_HICOLOR ) { u8g.setHiColorByRGB(255, 255, 255); } } void loop() { //Conexao com modulo GPS while (Serial_GPS.available() > 0) if (gps.encode(Serial_GPS.read())) displayInfo(); if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected: check wiring.")); while (true); } //Chama a rotina de desenho na tela u8g.firstPage(); do { draw(); } while ( u8g.nextPage() ); delay(1000); } void displayInfo() { //Mostra informacoes no Serial Monitor Serial.print(F("Location: ")); if (gps.location.isValid()) { Serial.print(gps.location.lat(), 6); //latitude Serial.print(F(",")); Serial.print(gps.location.lng(), 6); //longitude } else { Serial.print(F("INVALID")); } Serial.print(F(" Date/Time: ")); if (gps.date.isValid()) { Serial.print(gps.date.day()); //dia Serial.print(F("/")); Serial.print(gps.date.month()); //mes Serial.print(F("/")); Serial.print(gps.date.year()); //ano } else { Serial.print(F("INVALID")); } Serial.print(F(" ")); if (gps.time.isValid()) { if (gps.time.hour() < 10) Serial.print(F("0")); Serial.print(gps.time.hour()); //hora Serial.print(F(":")); if (gps.time.minute() < 10) Serial.print(F("0")); Serial.print(gps.time.minute()); //minuto Serial.print(F(":")); if (gps.time.second() < 10) Serial.print(F("0")); Serial.print(gps.time.second()); //segundo Serial.print(F(".")); if (gps.time.centisecond() < 10) Serial.print(F("0")); Serial.print(gps.time.centisecond()); } else { Serial.print(F("INVALID")); } Serial.println(); } void GPS_Timezone_Adjust() { while (Serial_GPS.available()) { if (gps.encode(Serial_GPS.read())) { int Year = gps.date.year(); byte Month = gps.date.month(); byte Day = gps.date.day(); byte Hour = gps.time.hour(); byte Minute = gps.time.minute(); byte Second = gps.time.second(); //Ajusta data e hora a partir dos dados do GPS setTime(Hour, Minute, Second, Day, Month, Year); //Aplica offset para ajustar data e hora //de acordo com a timezone adjustTime(UTC_offset * SECS_PER_HOUR); } } }
Carregue o programa no Arduino e depois de alguns segundos (ou minutos, dependendo do local), as informações recebidas dos satélites GPS serão mostradas no display OLED e atualizadas à cada 1 segundo. Não se esqueça que o módulo precisa “enxergar” os satélites, ou seja, você terá resultados muito melhores se usar o Arduino com o módulo GPS ao ar livre, ok?
Para verificar se o seu módulo GY-NEO6MV2 está mostrando as informações corretas, abra por exemplo o Google Maps e digite as coordenadas mostradas no display, como na imagem abaixo:
O Google Maps mostrará então no mapa o local exato em que o módulo GPS se encontra(va).
Explore a biblioteca TinyGPS++ para utilizar outros comandos que vão fornecer informações como altitude e velocidade, e também verifique os dados “puros” (raw data), que são enviados pelo módulo através da porta serial.
Você também pode criar algum tipo de rastreador enviando os dados obtidos pelo GPS através da rede de telefonia celular via SMS ou internet: confira os posts aqui do Arduino e Cia sobre o módulo GSM SIM800L e o GSM GPRS Shield SIM900.
Não estou conseguindo usar a libre TinyGPS++
Boa tarde Franklin,
Esta apresentando alguma mensagem de erro?
Adilson
boa tarde , como faço pra instalar no carro por exemplo pra localizar, no local e ver no monitor serial a localização, nao adianta nada….obrigado
como poderia fazer para o programador nao usar o computador, ou seja, desconectar o Arduíno do PC, assim conseguindo a localização com o GPS, repetido DESCONECTADO DO PC. fiz isso mas não deu certo. vc tem alguma ideia do que posso fazer.
Bom dia!
Estou recebendo a hora e data correta, mas a minha localização aparece a mensagem de invalida.
Oq devo fazer ?
Boa Tarde!
Estou recebendo os dados de data e hora mas a localização está aparecendo como invalida, oq devo fazer?
Tem que ir pra rua pra funcionar o GPS!!
Não consegui fazer com que este módulo funcione, (n sei se um dia nublado tem a ver), mas conectei tudo certo e o modo de exibição foi pela exibição serial, e nada de retornar dados, pelo exemplo do tiny gps, todos os resultados me mostraram nulos, comprei semana antepassada este módulo e so testei hoje.
Grato, Nathan
Can I do this program using Arduino Nano?
Bom-dia.
A ideia do meu projeto é instalar em um veículo, e Preciso ter uma informação da localidade em tempo real e sendo emitida por áudio no mesmo veículo, será que esse módulo é capaz? Ou além desse GPS preciso daquele módulo de áudio? E como farei para sincronizar a localidade capturada pelo Módulo GPS e emitir em áudio? Ou como isso me é possível?
Grato!
A posição do GPS está correta mas a hora nao bate com a hora local, está 3 horas adiantado sendo que meu timezone está correto -3, o que pode ser feito ?
E necessário que você utilize um módulo de voz comunicando com o atmega 328pu , tem que fazer uma programação para dizer a coordenada do GPS
Oi Adilson,
Obrigado como sempre por seus exemplos de código, que nos ajudam tanto.
Você sabe me dizer se o NEO-7M GPS funciona com seu código do 6?
Muito obrigado!
Oi Adilson,
Como sempre obrigado pela suas postagens.
Este seu código funciona com o NEO-7M?
Você tem conhecimento de algum sensor altímetro de precisão de 1 metro?
O que você acha dos seguintes sensores: MPL3115A2, MPL3115A2, BMP085, BMP180 e o BMP280. Qual o de melhor precisão em altitude?
Obrigado.
Abraços!
Opa!
Obrigado! Olha, não testei ainda com o NEO-7M, e ainda não vi nenhum sensor específico para medir altitude, além dos sensores barométricos como o BMP180, 280, etc.
Dos sensores que eu testei, acho que o melhor foi o BMP280.
Abraço!
Adilson
Também estou com mesmo problema, vc conseguiu encontrar a solução?
O meu módulo funcionou. Tive que esperar alguns minutos para aparecer a localização, mas apareceu corretamente.
Problema 1. O horário aparece o 3 horas de defasagem.
Problema 2. Às vezes demora muito para atualizar, mesmo estando ao ar livre.
Problema 3. Às vezes fica repetindo o mesmo horário diversas vezes, atrasando vários segundos.
O que posso fazer?
Como faço a conexão do módulo gps com o módulo sms para que as informações do gps sejam enviadas por mensagem?
Gostaria de saber se teria como mostrar diretamente no maps fazer isso na programação para ir aparecendo em tempo real a localização do veículo diretamente no maps
Oi Fagner,
Nunca fiz, mas dá uma olhadinha nesse vídeo aqui, pode te dar uma luz: https://www.youtube.com/watch?v=SBjy0TyOGDk
Abraço!
Adilson
Olá! Estou em busca de alguém que faça um projeto utilizando arduino e um módulo GPS para mensurar a velocidade de um corpo. Gratifica-se… $$
Só recebo a mensagem de No GPS Detected : check wiring
saudações, meu display ficou parado na contagem de 4 segundos, com data 01/01/1970..não encontrei a biblioteca time de Michael,,,