Rastreador GPS Com ESP32 E NEO-6M

by PNAAT_FIT in Circuits > Microcontrollers

41 Views, 0 Favorites, 0 Comments

Rastreador GPS Com ESP32 E NEO-6M

Proj4_Capa2.png

Obtenha coordenadas GPS em tempo real utilizando uma placa Heltec ESP32 LoRa e um módulo GPS NEO-6M, desenvolvendo uma aplicação em ESP-IDF para leitura, interpretação e exibição de dados de posicionamento.


Link para o repositório do projeto: https://github.com/pnaat/lab-maker-assincrono/tree/main/Projetos/04-Localizacao-cargas


Este projeto faz parte dos exemplos assíncronos disponibilizados pelo curso de IoT oferecido pelo PNAAT.


O PNAAT é o Programa Nacional de Aprendizado Acelerado em Tecnologia, uma iniciativa gratuita de capacitação em tecnologia nas áreas de computação, desenvolvimento embarcado (IoT) e inteligência artificial.

Este programa conecta você a capacitações técnicas, laboratórios de ponta e a indústrias nacionais e internacionais. Transforme suas ideias em soluções para desafios reais e acelere sua carreira em tecnologia!

Supplies

Hardware:

  1. Heltec ESP32
  2. GPS NEO-6M
  3. Jumpers
  4. Protoboard

Software:

  1. Computador ou notebook
  2. VSCode
  3. ESP-IDF

Demonstração

fix.png
nofix.png

Após a implementação do sistema, o monitor serial apresentará a mensagem de "Sem FIX GPS" enquanto procura por satélites GPS disponíveis (Rodar o programa em local aberto)

Quando o sensor enxergar satélites o suficiente para entregar uma coordenada válida, o sistema mostrará a seuinte menságem: "FIX OK", sua coordenada, e a quantidade de satélites vistos.

Montagem Do Hardware

diagram.png
montagem.png
tabela_Conexao.png

Tabela de conexões, diagrama de montagem e imagem do protótipo montado

Estrutura Geral Do Programa

Aqui serão explicadas as principais funções do código do projeto.


1 - Configuração da UART

Definindo parametros como Baudrate; tamanho do buffer entre outros. Além disso associa os pinos GPIO à UART

Linhas 131 a 181

// ==================================================
// Task GPS
// ==================================================
static void gps_task(void *arg)
{
gpio_config_t gpio_cfg = {
.pin_bit_mask = (1ULL << GPS_POWER),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE
};

ESP_ERROR_CHECK(gpio_config(&gpio_cfg));

gpio_set_level(GPS_POWER, 1);

uart_config_t uart_config = {
.baud_rate = GPS_BAUDRATE,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
.source_clk = UART_SCLK_DEFAULT
};

ESP_ERROR_CHECK(
uart_driver_install(
GPS_UART,
BUF_SIZE * 2,
0,
0,
NULL,
0));

ESP_ERROR_CHECK(
uart_param_config(
GPS_UART,
&uart_config));

ESP_ERROR_CHECK(
uart_set_pin(
GPS_UART,
GPS_TXD,
GPS_RXD,
UART_PIN_NO_CHANGE,
UART_PIN_NO_CHANGE));

uint8_t *data = malloc(BUF_SIZE);

ESP_LOGI(TAG, "GPS iniciado");

2 - Convertendo as coordenadas GPS

Os receptores GPS transmitem as coordenadas para o microcontrolador em formato NMEA. O seguinte bloco converte os dados em graus.

Linhas 33 a 42

// ==================================================
// Converte coordenadas NMEA para graus decimais
// ==================================================
static float nmea_to_decimal(float value)
{
int degrees = (int)(value / 100);
float minutes = value - (degrees * 100);

return degrees + (minutes / 60.0f);
}

3 - Exibindo as informações no monitor serial

Formatação e exibição das informações de Latitude; Longitude; Qualidade do Sinal e Número de Satélites.

Linhas 44 a 129

// ==================================================
// Parse da sentença GGA
// ==================================================
static bool parse_gga(const char *sentence,
float *latitude,
float *longitude,
int *satellites,
int *fix_quality)
{
char buffer[128];

strncpy(buffer, sentence, sizeof(buffer) - 1);
buffer[sizeof(buffer) - 1] = '\0';

char *token;
int field = 0;

float lat = 0;
float lon = 0;

char lat_dir = 'N';
char lon_dir = 'E';

*satellites = 0;
*fix_quality = 0;

token = strtok(buffer, ",");

while (token != NULL)
{
field++;

switch (field)
{
case 3:
if(strlen(token))
lat = atof(token);
break;

case 4:
if(strlen(token))
lat_dir = token[0];
break;

case 5:
if(strlen(token))
lon = atof(token);
break;

case 6:
if(strlen(token))
lon_dir = token[0];
break;

case 7:
if(strlen(token))
*fix_quality = atoi(token);
break;

case 8:
if(strlen(token))
*satellites = atoi(token);
break;
}

token = strtok(NULL, ",");
}

if (*fix_quality == 0)
{
*latitude = 0;
*longitude = 0;
return false;
}

*latitude = nmea_to_decimal(lat);
*longitude = nmea_to_decimal(lon);

if (lat_dir == 'S')
*latitude *= -1;

if (lon_dir == 'W')
*longitude *= -1;

return true;
}


Configuração Do Ambiente VSCode

Nenhuma configuração é necessária.

Compile, grave e abra o monitor serial para ver as informações de localização.

Após ler as primeiras informações no monitor serial, espere cerca de 5 minutos. Caso o GPS não tenha encontrado nenhum satélite, leve o sistema ligado e conectado para um local aberto. Em pouco tempo é para o módulo encontrar satélites e começar a enviar a localização em tempo real para o monitor serial.


Conclusão E Próximos Passos

1 - Objetivos da implementação deste projeto:

Desenvolver uma base sólida para futuros projetos de:

  1. Rastreamento via GPS;
  2. Telemetria de ativos;
  3. Monitoramento de veículos;
  4. Sistemas IoT georreferenciados;

2 - Conclusão e proximos passos:

No projeto atual, é possível ler no monitor serial sua posição atual em latitude/longitude.

Como proximos passos, é possível realizar a expansão das funcionalidades do sistema embarcado ao incluir uma bateria recarregável no sistema, de modo a torná-lo móvel. Incluir sistema de envio de dados por lora/e ou 4g para um receptor ou servidor, de modo que o projeto desenvolvido possa ter utilidade em campo, funcionando como um rastreador de patrimonio.