Avançar para o conteúdo

Rastreamento de GPS com ESP32-C6

Vamos estudar e implementar um rastreamento de GPS com ESP32-C6, usando código Arduino (Arduino IDE) e uma porta softSerial. Mas primeiro, o que é um GPS? Significa Sistema de Posicionamento Global, composto por vários satélites (cerca de 50). Seu dispositivo (aqui na Terra) triangula com esses satélites para obter sua posição com uma precisão de centímetros.

GPS estão em todos os lugares, desde nossos carros (para encontrar o caminho) até drones, navios e aviões. Existem várias tecnologias, incluindo chinesa e russa; estamos nos concentrando no GPS, pois é o que está mais amplamente disponível. Também é claro que o código e o hardware do Arduino são mais facilmente encontrados para GPS do que para outras tecnologias.

Hardware

Usaremos o NEO-6M da UBLOX para nosso protótipo hoje, cuja folha de dados está aqui. É um módulo GPS pequeno e poderoso, rodando a 3,3 V e se comunicando via UART (serial) com qualquer microcontrolador.

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

Ele possui um conector FL para uma antena externa, ilustrado acima. Ele também possui uma bateria externa para cronometragem, soldada à placa de circuito. O diagrama de conexão com nosso Xiao ESP32-C6 está abaixo, observe que tudo o que você precisa são quatro fios: +3V3, GND, TX e RX.

módulo GPS NEO-6M com ESP32-C6
Diagrama esquemático do módulo GPS NEO-6M com ESP32-C6

Firmware para teste inicial

Estamos fazendo dois testes aqui hoje, o primeiro será com um firmware Arduino que testa o básico do NEO-3M. Isso significa que as informações no monitor serial IDE do Arduino serão um monte de números e letras, a maioria irreconhecível por nós, humanos (não treinados).

O código está abaixo e foi retirado desta fonte, meus amigos do RandomNerdTutorials. Ele usa a porta serial primária do meu Xiao ESP32-C6, serial 0 nos pinos D6 e D7.

/*********
  Rui Santos & Sara Santos - Random Nerd Tutorials
  Complete instructions at https://RandomNerdTutorials.com/esp32-neo-6m-gps-module-arduino/
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/

 // Define the RX and TX pins for Serial 2
#define RXD2 D7
#define TXD2 D6

#define GPS_BAUD 9600

// Create an instance of the HardwareSerial class for Serial 2
HardwareSerial gpsSerial(0);

void setup(){
  // Serial Monitor
  Serial.begin(115200);
  
  // Start Serial 2 with the defined RX and TX pins and a baud rate of 9600
  gpsSerial.begin(GPS_BAUD, SERIAL_8N1, RXD2, TXD2);
  Serial.println("Serial 2 started at 9600 baud rate");
}

void loop(){
  while (gpsSerial.available() > 0){
    // get the byte data from the GPS
    char gpsData = gpsSerial.read();
    Serial.print(gpsData);
  }
  delay(1000);
  Serial.println("-------------------------------");
}

Ao carregar o código acima no ESP32-C6 e abrir o monitor serial do Arduino IDE (e dar algum tempo para o GPS fixar a posição), você verá algo assim:

Valor "crú" lido no GPS
Valor “crú” lido no GPS

Uma solução mais polida

O que está acima não é exatamente o que queremos, certo? Queremos ver coordenadas reais, posição GPS. Para isso, teremos que usar uma biblioteca, chamada “TinyGPS”. Instale-a no seu Arduino IDE indo: “Sketch > Include library > Manage library” e digitando “TinyGPS”; instale o de Mikal Hart.

O código completo está abaixo, e também pode ser encontrado nos exemplos do Arduino IDE, em “File > Examples > TinyGPS > Simple_test”. Esse código nos fornecerá dados de latitude e longitude, além do número de satélites e número de erros.

#include <SoftwareSerial.h>

#include <TinyGPS.h>

/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of SoftwareSerial, and assumes that you have a
   9600-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/

TinyGPS gps;
SoftwareSerial ss(D7, D6); // RX, TX

void setup()
{
  Serial.begin(115200);
  ss.begin(9600);
  
  Serial.print("Simple TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
}

void loop()
{
  bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;

  // For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (ss.available())
    {
      char c = ss.read();
      // Serial.write(c); // uncomment this line if you want to see the GPS data flowing
      if (gps.encode(c)) // Did a new valid sentence come in?
        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());
  }
  
  gps.stats(&chars, &sentences, &failed);
  Serial.print(" CHARS=");
  Serial.print(chars);
  Serial.print(" SENTENCES=");
  Serial.print(sentences);
  Serial.print(" CSUM ERR=");
  Serial.println(failed);
  if (chars == 0)
    Serial.println("** No characters received from GPS: check wiring **");
}

Ao carregar este código no seu ESP32 e abrir o monitor serial do Arduino IDE, você verá algo assim:

Dados de saída da biblioteca TinyGPS para minha localização
Dados de saída da biblioteca TinyGPS para minha localização

Minhas coordenadas estão próximas de Lat=-26 Lon=-49, o número de satélites no momento é 9 e ocorreu um erro.

Pra fechar

Um GPS é um sensor poderoso e preciso, que tira proveito de muitos satélites no céu em tempo real. Existem muitas aplicações que podem tirar proveito de tal dispositivo, como por exemplo drones, veículos de entrega, mapeamento de terreno e muitos outros.

Se você quiser comprar o sensor usado neste tutorial, consulte meu link de afiliado. Um pouco não relacionado mas ainda relacionado, conheça também o giroscópio L3G4200D aqui.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *