Usando Arduino GPS Shield com Google My Maps 123

O sistema GPS se mostra essencial nos dias de hoje. Ele está presente em drones, aviões comerciais, robôs terrestres e carros elétricos autônomos. Embora o sistema GPS esteja presente em diversas tecnologias de ponta, ele também está acessível a você que quer desenvolver seus projetos utilizando este recurso. Existem diversas maneiras de implementar um sistema de geolocalização usando GPS. Neste post iremos mostrar como gravar as coordenadas de GPS em um cartão SD e fazer a exibição desses dados no Google My Maps, usando o Arduino GPS Shield Duinopeak para Arduino.

SHIELD_ANTENA

Material Utilizado

Funcionamento do Shield GPS Duinopeak

O Arduino GPS Shield Duinopeak é composto das seguintes partes:

Ele se comunica com o Arduino através da interface UART com uma velocidade de transmissão padrão de 9600bps. É possível usar tanto a interface serial nativa do Arduino (Pinos D0 e D1) como uma interface serial via Software (Software Serial).

A interface serial de comunicação é selecionada entre os pinos D2 e D7 através de jumpers. Para este post deixaremos livre a porta Hardware Serial do Arduino para facilitar a programação do mesmo e usaremos os pinos 2 e 3 para comunicação via Software Serial com o shield GPS. Os jumpers devem ficar da seguinte maneira:

Pinagem seleção porta serial

O Arduino GPS Shield conta também com um leitor de cartão SD que utiliza a interface SPI do Arduino para comunicação. Com isso existe a possibilidade de gravar os dados de GPS em um cartão SD funcionando como um datalogger. Mostraremos a utilização do cartão SD mais adiante. Lembrando que o cartão deve estar formatado em FAT.

O Shield possui dois LEDs de indicação. O LED PWR deve acender sólido indicando que o Shield está energizado e o LED TP deve piscar indicando que o Shield realizou a localização dos satélites de GPS.

Programa Arduino GPS Datalogger

Antes de compilar o programa exemplo, precisamos baixar e instalar a biblioteca TinyGPS. Com essa biblioteca é possível “parsear” os dados NMEA produzidos pelo GPS e extrair informações importantes como latitude, longitude, velocidade, número de satélites e etc.

Então esses dados são gravados em um arquivo no formato CSV dentro do cartão SD. Esse arquivo gerado terá nome GPSLOGxx.CSV e será incrementado um número cada vez que o Arduino reiniciar.

Para fazer o download da biblioteca TinyGPS acesse aqui e baixe o arquivo .zip da última versão da biblioteca. Então, na IDE do Arduino clique em Sketch -> Incluir Biblioteca -> Adicionar biblioteca .ZIP.

Menu adicionar biblioteca ZIP

Copie o programa a seguir dentro da IDE Arduino e grave no Arduino.

/******************************************************************************
  This example uses SoftwareSerial to communicate with the GPS module on
  pins 8 and 9, then communicates over SPI to log that data to a uSD card.

  It uses the TinyGPS++ library to parse the NMEA strings sent by the GPS module,
  and prints interesting GPS information - comma separated - to a newly created
  file on the SD card.

  Resources:
  TinyGPS++ Library  - https://github.com/mikalhart/TinyGPSPlus/releases
  SD Library (Built-in)
  SoftwareSerial Library (Built-in)

  Development/hardware environment specifics:
  Arduino IDE 1.6.7
  GPS Logger Shield v2.0 - Make sure the UART switch is set to SW-UART
  Arduino Uno, RedBoard, Pro, Mega, etc.
******************************************************************************/

#include <SPI.h>
#include <SD.h>
#include <TinyGPS++.h>

#define ARDUINO_USD_CS 8 // uSD card CS pin (pin 8 on Duinopeak GPS Logger Shield)

/////////////////////////
// Log File Defintions //
/////////////////////////
// Keep in mind, the SD library has max file name lengths of 8.3 - 8 char prefix,
// and a 3 char suffix.
// Our log files are called "gpslogXX.csv, so "gpslog99.csv" is our max file.
#define LOG_FILE_PREFIX "gpslog" // Name of the log file.
#define MAX_LOG_FILES 100 // Number of log files that can be made
#define LOG_FILE_SUFFIX "csv" // Suffix of the log file
char logFileName[13]; // Char string to store the log file name
// Data to be logged:
#define LOG_COLUMN_COUNT 8
char * log_col_names[LOG_COLUMN_COUNT] = {
  "longitude", "latitude", "altitude", "speed", "course", "date", "time", "satellites"
}; // log_col_names is printed at the top of the file.

//////////////////////
// Log Rate Control //
//////////////////////
#define LOG_RATE 5000 // Log every 5 seconds
unsigned long lastLog = 0; // Global var to keep of last time we logged

/////////////////////////
// TinyGPS Definitions //
/////////////////////////
TinyGPSPlus tinyGPS; // tinyGPSPlus object to be used throughout
#define GPS_BAUD 9600 // GPS module's default baud rate

////////////////////////////////////////////////
// Arduino GPS Shield Serial Port Definitions //
////////////////////////////////////////////////
// If you're using an Arduino Uno, Mega, RedBoard, or any board that uses the
// 0/1 UART for programming/Serial monitor-ing, use SoftwareSerial:
#include <SoftwareSerial.h>
#define ARDUINO_GPS_RX 3 // GPS TX, Arduino RX pin
#define ARDUINO_GPS_TX 2 // GPS RX, Arduino TX pin
SoftwareSerial ssGPS(ARDUINO_GPS_TX, ARDUINO_GPS_RX); // Create a SoftwareSerial

// Set gpsPort to either ssGPS if using SoftwareSerial or Serial1 if using an
// Arduino with a dedicated hardware serial port
#define gpsPort ssGPS  // Alternatively, use Serial1 on the Leonardo

// Define the serial monitor port. On the Uno, Mega, and Leonardo this is 'Serial'
//  on other boards this may be 'SerialUSB'
#define SerialMonitor Serial

void setup()
{
  SerialMonitor.begin(9600);
  gpsPort.begin(GPS_BAUD);

  SerialMonitor.println("Setting up SD card.");
  // see if the card is present and can be initialized:
  if (!SD.begin(ARDUINO_USD_CS))
  {
    SerialMonitor.println("Error initializing SD card.");
  }
  updateFileName(); // Each time we start, create a new file, increment the number
  printHeader(); // Print a header at the top of the new file
}

void loop()
{
  if ((lastLog + LOG_RATE) <= millis())
  { // If it's been LOG_RATE milliseconds since the last log:
    if (tinyGPS.location.isUpdated()) // If the GPS data is vaild
    {
      if (logGPSData()) // Log the GPS data
      {
        SerialMonitor.println("GPS logged."); // Print a debug message
        lastLog = millis(); // Update the lastLog variable
      }
      else // If we failed to log GPS
      { // Print an error, don't update lastLog
        SerialMonitor.println("Failed to log new GPS data.");
      }
    }
    else // If GPS data isn't valid
    {
      // Print a debug message. Maybe we don't have enough satellites yet.
      SerialMonitor.print("No GPS data. Sats: ");
      SerialMonitor.println(tinyGPS.satellites.value());
    }
  }

  // If we're not logging, continue to "feed" the tinyGPS object:
  while (gpsPort.available())
    tinyGPS.encode(gpsPort.read());
}

byte logGPSData()
{
  File logFile = SD.open(logFileName, FILE_WRITE); // Open the log file

  if (logFile)
  { // Print longitude, latitude, altitude (in feet), speed (in mph), course
    // in (degrees), date, time, and number of satellites.
    logFile.print(tinyGPS.location.lng(), 6);
    logFile.print(',');
    logFile.print(tinyGPS.location.lat(), 6);
    logFile.print(',');
    logFile.print(tinyGPS.altitude.feet(), 1);
    logFile.print(',');
    logFile.print(tinyGPS.speed.mph(), 1);
    logFile.print(',');
    logFile.print(tinyGPS.course.deg(), 1);
    logFile.print(',');
    logFile.print(tinyGPS.date.value());
    logFile.print(',');
    logFile.print(tinyGPS.time.value());
    logFile.print(',');
    logFile.print(tinyGPS.satellites.value());
    logFile.println();
    logFile.close();

    return 1; // Return success
  }

  return 0; // If we failed to open the file, return fail
}

// printHeader() - prints our eight column names to the top of our log file
void printHeader()
{
  File logFile = SD.open(logFileName, FILE_WRITE); // Open the log file

  if (logFile) // If the log file opened, print our column names to the file
  {
    int i = 0;
    for (; i < LOG_COLUMN_COUNT; i++)
    {
      logFile.print(log_col_names[i]);
      if (i < LOG_COLUMN_COUNT - 1) // If it's anything but the last column
        logFile.print(','); // print a comma
      else // If it's the last column
        logFile.println(); // print a new line
    }
    logFile.close(); // close the file
  }
}

// updateFileName() - Looks through the log files already present on a card,
// and creates a new file with an incremented file index.
void updateFileName()
{
  int i = 0;
  for (; i < MAX_LOG_FILES; i++)
  {
    memset(logFileName, 0, strlen(logFileName)); // Clear logFileName string
    // Set logFileName to "gpslogXX.csv":
    sprintf(logFileName, "%s%d.%s", LOG_FILE_PREFIX, i, LOG_FILE_SUFFIX);
    if (!SD.exists(logFileName)) // If a file doesn't exist
    {
      break; // Break out of this loop. We found our index
    }
    else // Otherwise:
    {
      SerialMonitor.print(logFileName);
      SerialMonitor.println(" exists"); // Print a debug statement
    }
  }
  SerialMonitor.print("File name: ");
  SerialMonitor.println(logFileName); // Debug print the file name
}

Ao ligar o Arduino, dê uma caminhada na rua e logo você deverá ver o LED GPS fix piscar. Continue caminhando, ou ande de preferência de carro, para coletar uma boa quantidade de coordenadas.

Desligue o Arduino, retire o cartão e insira em algum computador. Você deverá ver o arquivo gerado. Abra o arquivo no excel e o arquivo deverá conter mais ou menos o seguinte conteúdo:

Arquivo de dados CSV

Visualizando as coordenadas no Google My Maps

Para melhor visualizar os dados coletados no arduino GPS Shield, você poderá carregá-los no Google My Maps.

Acesse o My Maps e clique em “Create a New Map”.

Tela My Maps criar um novo mapa

Para carregar o arquivo .CSV clique em “Import”.

Tela My Maps importar um arquivo CSV

Então busque e abra o arquivo .CSV gravado no cartão SD.

Tela My Maps exibição das coordenadas

É possível fazer várias customizações no mapa, por exemplo, criar um traçado entre os pontos.

Tela My Maps traçado das coordenadas

Veja neste link como criar e customizar mapas no My Maps.

Veja a seguir um mapa interativo com as coordenadas de GPS:

Gostou do Arduino GPS Shield Duinopeak? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

123 Comentários

  1. Prezados, ótimo artigo. Vendo em 2023. Seria muito complexo utilizar este shield (ou o módulo Neo 6m) para, uma vez fornecidas as coordenadas, o arduino girar um servo até à exata posição geográfica correspondente ? Obrigado

    1. Olá.

      Seria possível tendo como referência uma posição geográfica específica (que serviria de base). No caso, o código faria a todo momento a comparação entre a posição geográfica atual e a de base, assim seria possível ter um mecanismo externo que aponta para essa base. Precisando é claro de shields e drivers para esse motor.

      E sim, provavelmente trata-se de um projeto um pouco mais complexo, pois teria que ser com extrema precisão.

      Att.
      Vitor Mattos.
      Suporte Técnico MakerHero.

  2. Tenho um módulo GPS-NEO-6M e um módulo SIM80L, você pode me ajudar a criar um código onde eu possa enviar a localização do GPS por SMS?

    MAURO RAFAEL RODRIGUES PAIXÃO
    1. *SIM800L

      MAURO RAFAEL RODRIGUES PAIXÃO
  3. Olá Aqui não funcionou. Estou usando o Arduino Mega. A Shield está piscando a TP mas só retorna a mensagem “GPS No Data” e 0 satélites.
    Já mudei os pinos, o baude rate e nada. O que será que pode ser?

    1. Só para registrar, encontrei a solução. Utilizei a Serial1 do arduino (pinos 18 e 19) , substituindo todas as tags “gpsPort” do programa original por Serial1. Por exemplo

      Serial1.begin(GPS_BAUD);

      1. Giovani

        Que bom que conseguiu!

        Abraços!
        Diogo – Equipe MakerHero

  4. Existe possibilidade de enviar a notificação para o celular quando o GPS Shield se aproximasse a determinada distancia?

    desde e já agradeço, ótimo post

  5. Boa Noite,
    Tenho um Arduino Uno com GPS Shield V1R3, eu tenho um trabalho para fazer, que é fazer do google earth para Datum PT-TM06 ou então ter programa para o ide, para ter coordenadas de portugal, e poder transpor para autocad mas com este tipo de coordenadas, Será que alguém me pode ajudar?

    1. Pedro,

      Sugiro você levar a sua dúvida com mais detalhes para o nosso fórum, lá é mais prático de fornecer ajuda 🙂

      Abraços!
      Diogo – Equipe MakerHero

  6. Bom dia, alguém criou um APP para que receba o SMS e de forma automática de a localização no maps assim que requisitado, tipo um app de localização?

  7. Olá,

    O meu GPS Shield não veio com jumpers.

    Não usando os jumpers creio que basta alterar o código abaixo ?

    //DE
    #define ARDUINO_GPS_RX 3 // GPS TX, Arduino RX pin
    #define ARDUINO_GPS_TX 2 // GPS RX, Arduino TX pin

    //PARA
    #define ARDUINO_GPS_RX 1 // GPS TX, Arduino RX pin
    #define ARDUINO_GPS_TX 0 // GPS RX, Arduino TX pin

    Ou devo comprar jumpers para fazer igual?

    Obrigado pelo tutorial.

    1. David,

      Você precisa dos jumpers para configurar o shield corretamente.

      Abraços!
      Diogo – Equipe MakerHero

      1. Obrigado pela resposta.

        Já adicionei os jumpers mas surgiu-me outra duvida.

        Onde diz:
        “Lembrando que o cartão deve estar formatado em FAT”

        pode ser FAT32 ?

        Muito obrigado pela ajuda!

        1. David,

          É para ser possível a utilização em FAT32.

          Abraços!
          Diogo – Equipe MakerHero

  8. bom dia

    gostaria de saber se e possivel enviar os dados para um servidor php + mysql
    e ter a localizacao em tempo real do mapa por uma pagina web

    1. Olá, Arnaldo!

      Apenas com o GPS Shield, não. Você terá que ter algum acesso à internet com algum módulo (por exemplo o ESP8266).

      Abraços!
      Diogo – Equipe MakerHero

  9. Valeu “Gio”, OBRIGADO! GRANDE ABRAÇO!!!

  10. Excelente projeto.
    Tem como deixar a localizaçao em tempo real?

    1. João,

      Aconselho dar uma olhada nesse projetinho, pode te ajudar.
      https://www.instructables.com/id/Athena-The-Global-Car-Tracking-System/

      Abraços!
      Diogo – Equipe MakerHero

  11. Olá Giovanni .
    Antes de mais nada gostaria de agradecer pelos conteúdos que você compartilha conosco, são muito bons e muito uteis.
    Preciso enviar minha localização GPS por mensagem para um outro celular quando eu der um comando para o Arduíno. Você tem alguma dica de como devo fazer? Ou pode me ajudar de alguma outra forma?

    1. Olá!

      Seu Arduino teria que estar conectado de alguma forma com o celular em questão. Para tal, você poderia usar um módulo GSM junto a um módulo GPS. No link abaixo existem mais informações (em inglês):

      https://mechatrofice.com/arduino/send-gps-location-via-sms

      Abraços!
      Diogo – Equipe MakerHero

      1. Tenho duas opções de como fazer o meu projeto.
        Uma delas é utilizar o Arduíno com um modulo bluetooth, esse vai enviar as coordenadas para o meu celular e o meu celular vai enviar a mensagem para o outro aparelho celular.
        A segunda é essa opção de utilizar um modulo GPS com GSM e enviar a mensagem.
        Voce consegue me auxiliar com algumas dicas de como devo proceder com a ideia do modulo bluetooth?
        Desde já agradeço.

        1. Olá, Emerson!

          Peço que abra um tópico no nosso fórum para que possamos tratar de forma mais detalhada sobre isso!

          Abraços!
          Diogo – Equipe MakerHero

          1. Boa noite amigo. A algum tempo conversamos sobre um projeto meu, e vc pediu para eu criar um tópico no fórum mas eu não consegui criar esse tópico, e estou precisando de algumas dicas. tem como me mandar uma explicação de como criar esse tópico?

            EMERSON SIBERINO DUARTE
          2. Emerson,

            Acesso o nosso fórum. Em seguida, selecione a categoria que se encaixa seu tópico (Por exemplo em Projetos do Usuário). Depois, basta descer a página, ali em baixo vai ter a opção de criar o fórum 🙂

            Abraços!
            Diogo – Equipe MakerHero

            Diogo Zimmermann
      2. Bom dia Diogo. Vc conseguiria me auxiliar em como eu poderia fazer para enviar uma mensagem utilizando o SIM 800L , a partir da variável de um sensor?

  12. Tem como saber o pdop das leituras das coordenadas?

    1. Olá Luciano,

      Acredito que não seja possível :/

      Abraço!
      Rosana – Equipe MakerHero

  13. Eu preciso criar velocímetro/odômetro com um módulo GPS desses para o meu carro. É possível? Colocar um sensor nas rodas tá meio difícil…

    1. Olá Fábio,

      Fazendo algumas adaptações no código eu acredito que seja possível sim! Se conseguir, conta aqui pra gente 😉

      Abraço!
      Rosana – Equipe MakerHero

  14. Oi Boa tarde!!!

    Estou tentando configurar um gps de modo a que o mesmo gaste menos energia, vocês saberiam como posso fazer isto?
    Pelo manual seria enviar, por ex. para configurar no modo periódico, um comando como: “PMTK225,2,3000,12000,18000,72000*15\x0D\x0A”. No entanto, envio esta linha na interface o gps não se reconfigura. Ignora o comando.

    Obrigado!!!

  15. Boa noite,

    Estou tentando ligar um Shield GPS Duinopeak em conjunto com um acelerometro mpu6050, mas quando inicio o acelerometro o shild para de fazer a gravação e retorna a mensagem: “Failed to log new GPS data.”

    o codigo que estou usando para o acelerometro é esse:
    https://www.makerhero.com/blog/tutorial-acelerometro-mpu6050-arduino/

    Eu gostaria de ler os dois (GPS e acelerometro) e gravar tudo num arquivo no cartão SD.

    Obrigado

    1. Olá,

      Você conseguiu fazer os dois funcionarem separadamente?

      Abraço!
      Rosana – Equipe MakerHero

      1. Olá,
        Sim, os dois funcionam separadamente sem problema.

        Acho que está dando algum conflito entre as bibliotecas SoftwareSerial e Wire.

        Estou usando um arduino uno.

        1. Olá Ivens,

          Esses Shields (e acredito que seja o caso do Shield GPS DuinoPeak) costumam usar vários pinos para comunicação com o Arduino. Dessa forma, sobram poucos pinos que realmente podem ser usados. O que deve estar acontecendo, na verdade, é um conflito no uso dos pinos. tanto o Shield GPS quanto o acelerômetro devem estar usado um mesmo pino (ou mais).

          Abraço!
          Rosana – Equipe MakerHero

          1. Obrigado Rosana,
            Vou tentar usando um arduino mega.

            Ivens Augusto F Pinto
          2. Olá Ivens,

            Se der certo, avisa por aqui!
            Seu problema pode ser de outras pessoas também.

            Abraço!
            Rosana – Equipe MakerHero

  16. Boa tarde, no meu projeto eu preciso conectar o gps na protoboard, e entao liga-lo ao arduino. voce sabe oque mudaria na programação?

    1. Olá Raphael,

      Desde que você faça todas as conexões corretamente não é preciso mudar nada no código.

      Abraço!
      Rosana – Equipe MakerHero

  17. Obrigado pelo tutorial !

    Como faço para converter o numero da data e da hora em formato normal.

    Obrigado!

    1. Olá Anderson,

      Na própria tabela você pode configurar para que a data e hora sejam visualizadas no formato comum.

      Abraço!
      Rosana – Equipe MakerHero

  18. Olá Giovanni!

    Eu consigo monitorar uma pessoa dentro de uma fábrica com este sistema de localização ?

    Ótimo artigo, obrigado!

    1. Olá Carlos,

      Acredito que a precisão da localização não seja muito boa em ambientes internos.

      Abraço!
      Rosana – Equipe MakerHero

  19. Parabéns pelo post.
    Uma questão. Por que somente 100 posições? Seria possível salvar mais posições que 100? Obrigado!

    CRHISTIAN MACHADO IZAGUIRRY
    1. Olá,

      Usando esse código o número máximo de posições é 100. isso porque os aquivos são chamados “gpslogXX.csv, então “gpslog99.csv” é o número máximo de arquivos.

      Abraço,
      Rosana – Equipe MakerHero

  20. Olá amigo gostaria de saber como eu faço isso para gerar em um servidor remoto PHP,em tempo real o deslocamento do veículo

  21. Boa tarde, em meu gps o led que pisca quando recebe sinal de satelite, nao pisca, quer dizer que nao estou a receber cinal de satelite? se for, como posso resolver?

    1. Olá Samuel!

      Você pode colocar esse problema com mais detalhes no nosso fórum? Lá o pessoal pode te ajudar melhor nisso.

      https://www.makerhero.com/forum/

      Abraços!

      André – Equipe MakerHero

  22. Boa tarde.
    É possível ter, p ex, 2 coordenadas distantes e deixar que um robô com esse sistema ache a melhor rota?

    1. Olá Ronaldo!

      Se o robô tiver um software rodando que o faça capaz de achar a melhor rota é possível sim.

  23. Boa Noite,
    gostaria de saber como posso programar um programa para um GPS Shield com Arduino com cartao micro-usb, para de dar a latitude e a longitude, nem que tenha que por um botão para ligar o ponto, mas só os pontos que eu quiser como por exemplo, ponto 1, ponto 2, num ponto 1 clico e dá-me as coordenadas daquele ponto que eu cliquei, depois clico noutro ponto 2 e dá-me as coordenadas desse ponto que eu cliquei e por aí a diante…..
    espero que tenham percebido o meu pedido de ajuda.
    Obrigados pela ajuda,

    1. Olá Pedro!

      Primeiramente indico começar estudando o código deste tutorial.

      Basicamente vocẽ teria que programar seguindo a seguinte lógica:

      if (botão pressionado)
      {
      logGPSData();
      }

      Ao apertar o botão, acontece a função de log.
      Dentro da função log você pode escolher exibir as coordenadas no Serial monitor ao invés de gravar no cartão SD.

      Abraço e bons projetos!

  24. Olá, tudo bem ?
    Gostaria de desenvolver um localizador portátil, alimentado por uma bateria DC e descaracterizado, poderia ajudar-me ?

    Obrigado

    Carlos Alberto

    Carlos Alberto Ferrari Motta
    1. Olá Carlos!

      Recentemente adicionamos vários tipos de baterias em nossa loja. Dê uma olhada aqui: https://www.makerhero.com/?s=baterias&post_type=product

      Você pode facilmente adicionar uma delas no projeto do Shield GPS com Arduino.

      Bons projetos!

  25. Olá Giovanni muito bom seu post.

    Meu caro preciso montar um projeto de tracker gps rastreador… Preciso de uma shield que tenha GPS, GSM, GPRS …. E se possível tenha opção de SD card.

    Grato desde já.

    1. Olá Fernando! Obrigado pela leitura do post.

      Não temos um shield completo com todos esses requisitos. Mas temos um Shield GSM e também módulos GPS que poderiam ser adicionados à solução.

      Segue um exemplo:
      https://www.makerhero.com/produto/modulo-gps-vk2828u7g5lf-ttl/

      O shield GSM estamos sem estoque por enquanto.

      Aí bastaria fazer a programação para funcionarem os dois juntos.

      Abraço!

  26. Boa tarde galera, estou tentando adaptar o codigo com o meu projeto,uso um modulo GPS da quectel UC20 que nao possui biblioteca propria. Enfim esta dando um problema na verificacao do codigo e nao consigo identificar, se alguem puder me ajudar por favor.
    Estou usando o GPS como Serial1.

    Expected ‘)’ before char. (Can’t seem to find it)

    #include
    #include

    #define UC20_POWER_KEY_PIN 22
    #define SD_CARD_CS 8

    #define LOG_PREFIX_ARQUIVO “GPSLOG”
    #define MAX_LOG_ARQUIVO 100
    #define LOG_SUFFIX_ARQUIVO “csv”
    #define LOG_COLUNA_CONT 11

    char logNomeArquivo[13];

    char *log_col_nomes[LOG_COLUNA_CONT] = {“UTC”, “latitude” , “longitude” , “hdop” , “altitude” , “fix” , “cog” , “velocidade km/h” , “velocidade mph” , “date” , “nsat”} // vai printar no topo do arquivo

    #define log_rate 5000
    //variavel global para manter loggado

    char *var = “AT+CCLK?\r\n”;
    String resposta = “”;
    char c;
    bool sent = false;

    void setup() {

    Serial1.begin(115200);
    Serial.begin(115200);

    definePins();

    powerUC20On();

    leitura_SD();

    printHeader();

    }

    void loop() {
    if(!sent && millis() > 20000)
    {
    sent = true;

    while(Serial1.available()){Serial1.read();}
    delayMicroseconds(100);
    Serial1.write(var);
    Serial.println(var);

    }

    while(Serial1.available())
    {
    c = Serial1.read();
    resposta += c;
    delayMicroseconds(150);
    Serial.print(c);

    }
    if((ultimoLog + log_rate) <=mills())
    {
    if(Serial1.begin())
    {
    if(log_GPS_Data())
    {
    Serial.println("Shield GPS logado.");
    lastlog = mills();
    }
    }
    else
    {
    Serial.print(" Nao existe dados de GPS !");
    Serial.println(c);
    }
    }
    }
    while(Serial1.available())
    UC20_GPS.encode(Serial1.read());
    }

    byte log_GPS_Data()
    {
    File logNome = SD.open(logNomeArquivo, FILE_WRITE);

    if(LogNome)
    {
    logNome.print(UC20_GPS.date.UTC());
    logNome.print(',');
    logNome.print(UC20_GPS.location.latitude());
    logNome.print(',');
    logNome.print(UC20_GPS.location.longitude());
    logNome.print(',');
    logNome.print(UC20_GPS.location.hdop());
    logNome.print(',');
    logNome.print(UC20_GPS.feet.altitude());
    logNome.print(',');
    logNome.print(UC20_GPS.satelites.fix());
    logNome.print(',');
    logNome.print(UC20_GPS.location.cog());
    logNome.print(',');
    logNome.print(UC20_GPS.speed.spkm());
    logNome.print(UC20_GPS.speed.spkn());
    logNome.print(',');
    logNome.print(UC20_GPS.date.date());
    logNome.print(',');
    logNome.print(UC20_GPS.satelites.nsat());
    logNome.print(',');

    return 1;
    }
    return 0;
    }

    void powerUC20On()
    {
    digitalWrite(UC20_POWER_KEY_PIN, INPUT_PULLUP);

    delay(150);

    digitalWrite(UC20_POWER_KEY_PIN, INPUT_PULLUP);

    //delay(150);

    //digitalWrite(UC20_POWER_KEY_PIN, HIGH);
    }

    void definePins()
    {
    pinMode(UC20_POWER_KEY_PIN, OUTPUT);
    }

    void leitura_SD()
    {
    Serial1.begin(UC20_POWER_KEY_PIN);
    Serial.println("Lendo o cartao SD");

    if(!SD.begin(SD_CARD_CS))
    {
    Serial.println("Erro na leitura do cartao");
    }
    criando_Arquivo();
    printHeader();
    }
    void printHeader()
    {
    File logNome = SD.open(logNomeArquivo , FILE_WRITE);

    if(logNome)
    {
    int i =0;
    for(; i < LOG_COLUNA_CONT ; i++ )
    {
    logNome.print(log_col_nomes[i]);
    if(i < LOG_COLUNA_CONT – 1)
    logNome.println();
    }
    logNome.close();
    }
    }
    void updateFileName()
    {
    int i = 0;
    for(; i < MAX_LOG_ARQUIVO; i++ )
    {
    memset(logNomeArquivo, 0, strlen(logNomeArquivo));
    sprintf(logNomeArquivo, "%s%d.%s",LOG_PREFIX_ARQUIVO, i, LOG_SUFFIX_ARQUIVO);
    if(!SD.exists(logNomeArquivo))
    {
    break;
    }
    else
    {
    Serial.print(logNomeArquivo);
    Serial.println("existe");
    }
    }
    }

  27. Obrigado pelo seu tutorial. Existe uma maneira de haver conexão dos dados do gps do arduino ou teensys em tempo real contrariamente aos contidos no sd-card?Muito obrigado

    1. Olá Marco, obrigado pela leitura!

      Existem várias maneiras, por exemplo usando um módulo para conexão com rede celular.

      https://www.makerhero.com/produto/gsm-gprs-shield-para-arduino-efcom-sim900-antena/

  28. Ja foi feito o teste do consumo real da bateria por hora em mA/h?
    Há a possibilidade de diminuir ao máximo esse conjunto, acoplando uma bateria de lítio para uso contínuo por até 5 horas?

    1. Olá Rafael! Infelizmente não fizemos esse teste e não temos informação do consumo de energia do shield. Abraço!

  29. Uma duvida, eu queria utilizar este arduino para monitorar em tempo real uma rota de ônibus da universidade, através de um aplicativo ele e capaz de mostrar a rota em tempo real do veiculo como na uber?

    1. Olá Luis!

      Dá pra fazer sim. Provavelmente vai precisar de um módulo GSM para enviar os dados de coordenada para internet e comunicar com aplicativo.

      Sucesso no projeto!

  30. como faço para reconhecer estradas? (especificamente as que precisam acender o farol do carro)

    1. Olá Eduardo!

      Com esse módulo não é possível fazer isso. Ele busca o ponto no GPS e apresenta depois, mas não sabe se esta numa rodovia ou no meio do mar.

      Abraços!

      André – Equipe MakerHero

      1. entendi, agradeço a atenção, e gostaria de saber se existe alguma alternativa para conseguir reconhecer a rodovia

        1. Olá Eduardo!

          Fiz uma rápida pesquisa no google para você. Segue link:
          https://www.google.com.br/search?q=check+if+coordinate+is+a+road&oq=check&aqs=chrome.2.69i57j69i60j69i59l2j69i65l2.3447j0j7&sourceid=chrome&ie=UTF-8

          Logo os primeiros links me pareceram bem interessantes.
          O segundo link me redirecionou para o stackoverflow:

          https://stackoverflow.com/questions/20293844/how-to-determine-if-lat-long-coordinates-are-on-a-road-with-google-maps-api-v2

          A primeira resposta já foi bem interessante:

          “Use reverse geocoding via Google geocoding API” e me redirecionou para a API de geolocalização do Google:

          https://developers.google.com/maps/documentation/geocoding/start#ReverseGeocoding

          Reverse geocoding me pareceu bastante interessante para sua aplicação:
          “Reverse geocoding is the process of converting geographic coordinates into a human-readable address.”

          Ou seja, a partir de uma coordenada a API converte para um endereço “entendível”.

          Veja se te atende.

          Abraço!

  31. Boa tarde

    Estou tentando configurar um GPS Neo 6 utilizando um Arduino Mega, baixei as bibliotecas (TinyGPS) e (Softwareserial), Utilizei também o programa exemplo da biblioteca, porém quando aceso o monitor serial nenhum satélite é listado,

    1. Olá João!

      É o mesmo GPS do nosso tutorial? É formato shield?

      Como você está fazendo o teste? Já experimentou caminhar ao ar livre com o módulo?

  32. Boa tarde Giovani,

    Tens ideia do consumo deste módulo?

  33. Olá, estou envolvido em um projeto que visa rastrear o ônibus em sua rota, o que você desenvolveu aqui será de grande ajuda, gostaria de pedir sua opinião sobre o que eu posso fazer para adquirir esses dados que foram armazenados no SD de forma online. Obrigado pela ajuda.

  34. Olá boa noite!
    Estou com um projeto aqui usando esse GPS e queria enviar esses dados para o MySQL utilizando o Módulo De Rede Ethernet Shield W5100. Eu consigo fazer os dois funcionarem separadamente, o gps e o módulo de rede, mas quando eu junto eles, não dá muito certo. Vocês poderiam me dar uma luz? Agradeço!

    1. Olá Andrezza!

      Talvez possa ser a parte do cartão SD do shield GPS que esteja dando interferência.

      O módulo GPS usa comunicação Serial, então essa parte não deve ter problema.

      Talvez o problema seja que o cartão SD de ambos os shields e mais o chip ethernet usem protocolo SPI. Deve ser utilizado um pino chip select(CS) para cada dispositivo SPI. Se o CS de algum dispositivo for o mesmo do outro pode dar problema na comunicação.

      Esse é o problema mais comum quando se usa mais de um shield com Arduino. É necessário verificar que tipo de interface de comunicação cada shield usa(SPI, I2C, UART, Serial, etc), e quais pinos estão sendo utilizados, para não dar conflito.

      Abraço!

  35. Olá sou analista de sistema Android e estou iniciando neste mundo de Arduino agora! Cada vez mais tenho me interessado mais por eles rsrs! E antes que eu esqueça parabéns pelo post!!
    Uma dúvida seria possível eu pegar estes dados de latitude, longitude, altitude, velocidade e enviar para um servidor Web? Se sim quais seria as formas: Wifi, Rede direta, etc?

    1. Olá Maycon, seja bem vindo!

      Existem adaptadores de arduino para ethernet e wireless direto. Minha sugestão é dar uma olhada nas placas que já vem com essa conexão integrada como a ESP e a Raspberry Pi.

      Abraços!

      André – Equipe MakerHero

  36. Bom dia, ótimo projeto.
    Fiquei com uma duvida: no projeto é citado para eu fazer uma caminhada com ele, correto?

    1. Olá Diego!

      Sim. Para gravar um trajeto com várias coordenadas é necessário andar com o módulo.

      No caso do tutorial eu liguei o módulo no ônibus no meu trajeto para o trabalho.

      Abraço!

  37. Giovanni boa tarde!

    Estou tentando desnvolver um prototipo, que auxilie deficientes visuais. A ideia inicial seria identificar os pontos da minha cidade que possuem semaforo/faixa de pedestres, gravar estes pontos. Qual a sua opniao de melhor escolha para fazer a interação do deficiente com o ponto, e se tem como informar o tempo restante para travessia.

    grato

    1. Olá William! Muito legal a ideia.

      Creio que você possa tirar ideias de projetos como o seu já implementados e em uso.

      Por exemplo veja como funciona um semáforo para deficientes visuais em Belo Horizonte;
      https://g1.globo.com/minas-gerais/noticia/mais-um-semaforo-com-dispositivo-sonoro-ajuda-na-travessia-de-deficientes-visuais-em-belo-horizonte.ghtml

      E veja também a padronização desse tipo de semáforo: http://www.brasil.gov.br/cidadania-e-justica/2017/10/semaforos-sonoros-terao-novas-padronizacoes

      Abraço!

  38. Boa tarde,

    estou com um projetinho de um robo e preciso fazer com que ele que siga tais coordenadas, seria possível? como faço com que ele receba estas coordenadas? há possibilidade da utilização de um chip de celular como forma de rastreio?

    1. Olá Roney!

      Creio que seja possível sim.
      Para receber as coordenadas basta utilizar esse mesmo shield GPS que mostramos no tutorial.

      Também creio que você possa utilizar um shield GPRS celular para incrementar o projeto. https://www.makerhero.com/produto/gsm-gprs-shield-para-arduino-efcom-sim900-antena/

      Abraço!

  39. Bom dia.

    Estou fazendo um trabalho de um Rover orientado por GPS e para fins de teste, quero saber se é possível gravar os dados direto no pc ao invés do cartão SD?

    1. Olá Leonardo! É possível. Tem várias maneiras pra fazer isso.
      Vou te passar algumas maneiras que imagino:
      1 – enviar os dados via cabo USB
      pesquise na internet por comunicação USB serial Arduino computador
      exemplo: https://pplware.sapo.pt/tutoriais/comunicacao-entre-pc-e-arduino/
      2 – enviar os dados via WiFi
      pesquise por ESP8266
      exemplo: https://circuitdigest.com/microcontroller-projects/arduino-vehicle-tracker-on-google-maps-using-esp8266
      3 – enviar os dados via bluetooth
      pesquise por HC-05 ou ESP32
      exemplo:
      https://www.makerhero.com/blog/tutorial-modulo-bluetooth-com-arduino/
      https://www.robocore.net/tutoriais/bluetooth-hc-05-com-arduino-comunicando-com-pc.html

  40. Giovanni, gostei bastante do GPS mas porque ele tem acesso somente pelo cartão SD não pela internet
    Hoje estamos com tanto acesso e ponto pela estrada com wifi ou internet via celular
    o cartão poderia ficar como download para incrementar novas rotas ou novos dados

    caso seja possível gostaria de seu retorno
    se abaixo meu contato

    1. Olá Rogério! Só salva os dados no cartão SD pois esse shield é apenas GPS e não tem internet.

      Mas é bem possível adicionar internet.

      Já ouviu falar dos módulos e shield SIM800? Vai cair como uma luva em seu projeto!

      Segue os links:
      https://www.makerhero.com/produto/modulo-gsm-gprs-sim800l-antena-sma/
      https://www.makerhero.com/produto/modulo-gsm-gprs-sim800l-antena/
      https://www.makerhero.com/produto/gsm-gprs-shield-para-arduino-efcom-sim900-antena/

  41. Bom dia, quero saber si me pode informar o comsumo da placa gps.
    Obrigado.

  42. É possível com uma plaquinha WiFi instalado nesse projeto, as informações do GPS serem enviadas atualizadas para um PC que o recebe, e o caminho pelo qual o Arduino está percorrendo ser informado on line no MAPA?

    1. O que eu preciso é parecido com um jogo de futebol, onde cada jogador tem 1 pulseira com o arduino dentro dela, e eu tenho um monitor, onde eu sei qual arduino está ligado, e onde ele está no exato momento do jogo… Nem preciso de informações de onde o jogador estava e pra onde ele foi, preciso mais é de informações de onde ele está em tempo real… É possível com um Wifi criar um sistema assim?
      Curto demais o site de vcs… Abração.

    2. É possível!

  43. Excelente tutorial!!! Muito bom mesmo!!!

  44. É possivel salvar a potência recebida por cada satélite?

  45. Olá,

    comprei esse shield e estou testando esse código que vc colocou no exemplo, o único resultado que recebo é “gps no data” e no número de satélites 0. Já tentei sair para um local ao ar livre e com quase nenhum nuvem no céu, mas não funciona. Inclusive recebo a mensagem ao compilar “deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]”. Alguma dica do que poderia ser?

    abs

    1. oi. aqui deu esse problema e era porque não precisava de conversor de nível. liguei direto e deu certo.

    2. Estou tendo este mesmo problema “GPS No Data” e 0 satélites.
      No meu caso, percebi que LED TP fica desligado. O que poderia ser o problema? (não encontro muita documentação sobre esse shield na internet e o site oficial está fora do ar).

      1. De acordo com o software é porque não tem satélites suficientes disponíveis para obter a localização:

        else // If GPS data isn’t valid
        {
        // Print a debug message. Maybe we don’t have enough satellites yet.
        SerialMonitor.print(“No GPS data. Sats: “);
        SerialMonitor.println(tinyGPS.satellites.value());
        }

  46. Muito bom seu post Giovanni!!

    Eu consigo gravar uma localização no cartão SD e fazer com que o arduino ligue uma saida digital quando chegar naquela posição?

    1. Obrigado pela leitura Isaac!
      Creio que seria possível sim. No caso do tutorial as posições já são gravadas no cartão SD.

  47. Seria bacana enviar logo para um servidor MySql

    1. to tentando achar como faço isso.
      queria utilizar meu gprs shield.

  48. Bem legal
    vc pode descrever a precisão do gps e as alternativas disponiveis em direção a uma precisão maior?
    obrigado

    1. Olá Jose!
      Você pode encontrar essa e muitas outras informações no datasheet do GPS
      https://www.u-blox.com/sites/default/files/products/documents/NEO-6_DataSheet_(GPS.G6-HW-09005).pdf

      No caso de precisão esse módulo tem 2,5m de precisão.

  49. Boa noite. Estou com dificuldades para corrigir a data e hora, pois ele traz sempre com 3 horas a mais que o horário local. Pensei em apenas subtrair 3 horas, porém, se tiver passado da meia noite, a data também mudou, e, se for duas horas da manha, vai dar um número negativo. Como eu poderia montar uma função para tratar isso? Desde já obrigado.

    1. oi. usa a biblioteca time.
      com ela você consegue arrumar o tempo através de um offset.

      da uma olhada aqui:
      https://www.arduinoecia.com.br/2017/06/como-usar-modulo-gps-gy-neo6mv2.html

  50. Olá, preciso de uma solução como esta com apenas um “agravante”, preciso enviar em tempo real as coordenadas para algum serviço na nuvem. Para isso preciso de um shield GPRS/3G certo? Ou há alguma outra forma?

    1. Olá Adriano!

      Creio que o mais fácil seria isso mesmo. Usar rede celular.
      Ou dependendo do projeto daria pra usar alguma coisa com rádio, tipo LoRa
      https://www.ibm.com/developerworks/community/blogs/tlcbr/entry/mp274?lang=en

  51. Bom dia Giovanni!
    Aprecio muito seus ensinamentos. Estou trabalhando com o módulo GPS L80 da Quectel. Eu sei que o baund rate e outras características destes módulos podem ser alteradas, via serial, com o protocolo NMEA, porém tenho tentado e nada muda. Estou usando o mesmo baund rate que recebo os dados (9600). Você já reconfigurou algum destes módulos? Tem alguma dica?
    abs.

    1. Olá Paulo,

      Muito obrigado pela leitura!

      Nunca tentei reconfigurar um módulo GPS,

      Eu sei que os módulos u-blox tem um software para isso. O U-center.
      Pelo software você consegue trocar o baudrate e fazer outras customizações.

      Pesquisei rapidamente o modelo que está usando. GPS L80 da Quectel.
      Para configurar ele parece que precisa enviar comandos usando protocolo PMTK.
      Encontrei um PDF com especificação de protocolo para esse GPS

      http://docs-europe.electrocomponents.com/webdocs/147d/0900766b8147dbed.pdf

      No capítulo 3 tem uma introdução:
      “This chapter introduces the MTK NMEA packet protocol, which is a set of extension messages of the
      standard NMEA packet protocol. These messages are used to control and configure L80 GPS module.”

      Na seção 3.16 pág 25 mostra qual o comando a ser utilizado para mudar o baudrate
      3.16. Packet Type: 251 PMTK_SET_NMEA_BAUDRATE

      No datasheet também devem ter outras informações sobre isso:
      http://www.quectel.com/uploadimage/downlad/l80_hardware_design_v1.1.pdf

      Espero ter ajudado. Abraço!

  52. funciona com qualquer módulo gps, certo?

    1. Olá Alceu,

      Creio que sim.
      Contanto que o módulo gere dados no padrão NMEA.

      Se o GPS fornece os dados NMEA via serial, o Arduino irá ler esses dados e a biblioteca TinyGPS se encarrega de gerar o arquivo .csv

  53. Eu nao poderia deixar de fazer meus sinceros agradecimentos, muito obrigado pelo compartilhamento desses projetos é de muito valor para os iniciantes.

  54. Boa tarde pessoal!!!
    Aprendo muito com esse site, e agradeço a todos por compartilhar vossas sabedoria….de coração, valeu galera.
    E claro brigadasssso Giovanni Bauermeister,,,,

    1. Olá Nilsom!
      Nós que agradecemos a leitura.
      Cometários como o seu nos motivam a produzir conteúdo cada vez melhor para vocês.

  55. Muito bacana!!! Show de bola!
    Obrigado!

    1. Obrigado pela leitura Rodrigo!

  56. Ele salva a altitude também?
    Para ser utilizado em um Drone por exemplo.

    1. Olá Maurício, obrigado pela leitura!

      Salva altitude também. Veja no exemplo acima no seguinte trecho de código, todas as variáveis que são salvas inclusive altitude:

      char * log_col_names[LOG_COLUMN_COUNT] = {
      "longitude", "latitude", "altitude", "speed", "course", "date", "time", "satellites"
      }; // log_col_names is printed at the top of the file.

      Mas para medir altitude de um drone o melhor seria usar o GPS em conjunto com um Barômetro como os seguintes:
      https://www.makerhero.com/pd-123084-sensor-gy-80-10-dof-acelerometro-giroscopio-magnetometro-barometro.html?ct=&p=1&s=1
      https://www.makerhero.com/pd-6b919-sensor-de-pressao-e-temperatura-bmp280.html?ct=&p=1&s=1

      1. Ola, estou desenvolvendo um projeto, ainda estou começando nesse mundo de programar. Minha pergunta, é muito complexo, que ele pegue os dados de altitude de um sensor externo e não do gps e jogue na mesma planília? dai usaria a lat e long do gps e altitude do bmp388 .

    2. Ao invés de salvar no cartão SD é possível mandar os dados direto para rede e gerar o caminho em tempo real?

      1. Gabriel,

        Dê uma conferida nesse projetinho, ele pode te ajudar: https://www.instructables.com/id/Real-Time-GPS-Tracker-with-Integrated-Google-Maps/

        Abraços!
        Diogo – Equipe MakerHero