sexta-feira, 8 de agosto de 2025

Protocolo UBX -- Parte 3

Untitled
Perante o que foi apresentado, para realizar a configuração das mensagens e como o nosso sistema funcionará, a melhor coisa a fazer é realmente buscar o datasheet. A parte de baixo traz um extrato do que tem no documento, logo na sua parte inicial:
Captura de tela 2025-08-05 114412.png
Ou seja, em tese, todas as mensagens de interesse (NMEA/UBX) são enviadas para todas as portas ao mesmo tempo, a menos que sejam desativadas pelo usuário. As portas disponíveis são UART1, UART2, I2C, USB, SPI e uma reservada (vide figura abaixo). A ativação e desativação por parte do usuário, para cada porta, é realizada por meio de código por porta, ou seja, 0x00 para I2C, 0x01 para UART1 etc.
Captura de tela 2025-08-06 085943.png
Depois dessa verificação sistêmica, o que a gente precisa fazer agora é simplesmente configurar as mensagens que desejamos receber ou não receber e verificar se foi efetiva a solicitação. Pelo datasheet, conforme apresentado na figura abaixo, veja que:
Captura de tela 2025-08-05 110507.png
A gente então precisa entender como que funciona o UBX-CFG-PRT e o UBX-CFG-MSG. Primeiramente, pela sequência de nomenclatura, vamos observar o UBX-CFG-MSG. No datasheet, na seção 32.10.18, intitulada UBX-CFG-MSG (0x06 0x01), o que primeiramente se observa é que existem três seções para essa mesma mensagem: uma para polling e duas outras para setar as taxas das mensagens. Irei pegar a mensagem mais completa para análise, até porque é um indicativo de que iremos configurar todas elas ao mesmo tempo (as 6 possíveis, conforme figura acima).
Captura de tela 2025-08-05 110752.png
É possível observar que é uma mensagem suportadas por diversos firmwares (a gente vai chegar lá ainda) e pode ser do tipo get/set (dá para escrever nela ou pegar dados dela). A formação da mensagem leva em consideração a estrutura da mensagem UBX-CFG-MSG: header (0x85 0x62), class (0x06), ID (0x01), Length (8 bytes). Para o payload a gente tem que verificar qual tipo de mensagem será ativada e/ou desativada por porta. Pelo hiperlink disponível no Comment NMEA Messages Overview, há o direcionamento para a seguinte tabela:
NMEA.png
Nem todas as mensagens NMEA estão ativadas para um NEO M8N advindo de fábrica. As mensagens NMEA PUBX Messages não estão, por exemplo, nem algumas outras do meio NMEA Standard Message. Desse modo, a concetração de desativação as mensagens são restritas, nesse primeiro momento, às mensagens padrão (NMEA Standard Message). Note que a class é idêntica entre estas mensagens (0xF0) e o que muda são os ID's específicos. Eu fiz esse código em C++ para facilitar a selação de qual mensagem será prenchida no payload (eu só reorganizei mesmo, mas estão todas aí, as do Standard Message por enquanto).
// Para enable/disable NMEA Standard Message
#define NMEA_CLASS 0xF0
#define NMEA_ID_GGA 0x00
#define NMEA_ID_GLL 0x01
#define NMEA_ID_GSA 0x02
#define NMEA_ID_GSV 0x03
#define NMEA_ID_RMC 0x04
#define NMEA_ID_VTG 0x05
#define NMEA_ID_GRS 0x06
#define NMEA_ID_GST 0x07
#define NMEA_ID_ZDA 0x08
#define NMEA_ID_GBS 0x09
#define NMEA_ID_DTM 0x0A
#define NMEA_ID_THZ 0x0E
#define NMEA_ID_GNS 0x0D
#define NMEA_ID_VLW 0x0F
#define NMEA_ID_GPQ 0x40
#define NMEA_ID_TXT 0x41
#define NMEA_ID_GNQ 0x42
#define NMEA_ID_GLQ 0x43
#define NMEA_ID_GBQ 0x44
No que diz respeito às porta I/O, tem-se que o enable ocorrerá por meio de um set (0x01) e disable por um reset (0x00). Deve-se atentar para a ordem das portas (vide figura acima). Abaixo um exemplo para a seleção pela mensagem GGA com ativação nas portas UART1 e desativação nas demais (I2C, UART2, USB e SPI). Se eu quiser desativar a mensagem GGA nas portas UART1 e UART2 eu apenas faço o reset dos bytes (0x00). Sequência semelhante deve ser feita para as mensagens acima da NMEA.
// Payload para o NMEA GGA
uint8_t payload_GGA[] = {NMEA_CLASS, // Class
NMEA_ID_GGA, // ID
0x00, // I2C (DDC)
0x01, // UART1
0x00, // UART2
0x00, // USB
0x00, // SPI
0x00}; // reservado
Eu preciso saber agora o que será enviado por meio da porta UART1. O seguinte código leva em consideração o fato de que estarei tentando desativar praticamente todos os itens da mensagem NMEA, a menos da GGA.
// Payload -------->>>>>>>> CLASS | ID | I2C |UART1|UART2| USB | SPI | res.|
uint8_t payload_GGA_e[] = {NMEA_CLASS, NMEA_ID_GGA, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}; // enable
uint8_t payload_GGA_d[] = {NMEA_CLASS, NMEA_ID_GGA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // disable
uint8_t payload_GLL[] = {NMEA_CLASS, NMEA_ID_GLL, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t payload_GSA[] = {NMEA_CLASS, NMEA_ID_GSA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t payload_GSV[] = {NMEA_CLASS, NMEA_ID_GSV, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t payload_RMC[] = {NMEA_CLASS, NMEA_ID_RMC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t payload_VTG[] = {NMEA_CLASS, NMEA_ID_VTG, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t payload_GRS[] = {NMEA_CLASS, NMEA_ID_GRS, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t payload_GST[] = {NMEA_CLASS, NMEA_ID_GST, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t payload_ZDA[] = {NMEA_CLASS, NMEA_ID_ZDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t payload_GBS[] = {NMEA_CLASS, NMEA_ID_GBS, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t payload_DTM[] = {NMEA_CLASS, NMEA_ID_DTM, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
 
setup(){}
 
// Configura os itens de comunicação serial, por exemplo, entre outras coisas.
...
...
 
// Utiliza o framework do Arduino para setar a serial 2 no ESP32.
// Estou, inicialmente, utilizando 9600 de boud rate.
// Mais a frente serão realizadas outras modificações.
NEO_M8N.begin(9600, SERIAL_8N1, GPS_RX, GPS_TX);
 
 
// Desativar as mensagens NMEA, a menos da GGA.
UBX_send_message(UBX_CFG_MSG_CLASS, UBX_CFG_MSG_ID, 8, payload_GGA_e); // enable
UBX_send_message(UBX_CFG_MSG_CLASS, UBX_CFG_MSG_ID, 8, payload_GLL);
UBX_send_message(UBX_CFG_MSG_CLASS, UBX_CFG_MSG_ID, 8, payload_GSA);
UBX_send_message(UBX_CFG_MSG_CLASS, UBX_CFG_MSG_ID, 8, payload_GSV);
UBX_send_message(UBX_CFG_MSG_CLASS, UBX_CFG_MSG_ID, 8, payload_RMC);
UBX_send_message(UBX_CFG_MSG_CLASS, UBX_CFG_MSG_ID, 8, payload_VTG);
UBX_send_message(UBX_CFG_MSG_CLASS, UBX_CFG_MSG_ID, 8, payload_GRS);
UBX_send_message(UBX_CFG_MSG_CLASS, UBX_CFG_MSG_ID, 8, payload_GST);
UBX_send_message(UBX_CFG_MSG_CLASS, UBX_CFG_MSG_ID, 8, payload_ZDA);
UBX_send_message(UBX_CFG_MSG_CLASS, UBX_CFG_MSG_ID, 8, payload_GBS);
UBX_send_message(UBX_CFG_MSG_CLASS, UBX_CFG_MSG_ID, 8, payload_DTM);
}
Depois de desativadas, o que se deseja agora é ativar o envio de certas mensagens UBX pela porta de interesse (no meu caso a UART1). Pelo que tenho visto, pelo menos num primeiro momento, as mensagens do tipo UBX-NAV-PVT podem ser suficientes para as aplicações que desejo. Mais a frente eu procurarei abordar também questões como quais constelações GNSS (GPS, Galileu, Beidou, GLONASS etc.) eu desejo ativa/desativar, quais as velocidades de transmissão das mensagens eu desejo obter entre diversas outras. Deixarei para um próximo post a questão de ativar a mensagem UBX-NAV-PVT na UART1, como alterar a velociade de transmissão das mensagens, como receber os dados na UBX-NAV-PVT, como realizar o parsing da mensagem e além disso como trabalhar com os dados de engenharia advindos da UBX-NAV-PVT. Mesma metodologia pode ser empregada para as diversas outras mensagens do protocolo UBX.

Nenhum comentário:

Postar um comentário