segunda-feira, 30 de dezembro de 2019

NEO-M9N GPS

 NEO-M9N GPS - BLOG BETA

O objetivo deste BLOG é dar uma ideia geral do módulo  NEO-M9N da u-blox e ferramentas para programação e assistentes.
INTRODUÇÃO

O QUE É GNSS?

GNSS significa Global Navigation Satellite System, um termo abrangente que descreve o GPS dos Estados Unidos, o sistema de posicionamento global russo GLONASS e o Galileo europeu.

COMO FUNCIONA

Uma constelação de satélites envia um sinal contínuo para a Terra. A bordo de cada satélite, há um relógio atômico, e todos são sincronizados, graças a uma escala de tempo de referência definida por todo o sistema. Assim, os sinais provenientes dos diferentes satélites da mesma constelação compartilham a mesma escala de tempo de referência.

Se o usuário deseja utilizar o GNSS para determinar uma posição, ele deve ter uma antena que receba os sinais provenientes dos satélites e um receptor que traduza esses sinais. A posição da antena será deduzida das medições do atraso de tempo entre o tempo de emissão (satélite) e o tempo de recepção (receptor) para pelo menos 4 sinais provenientes de diferentes satélites.

https://www.u-blox.com/sites/default/files/products/documents/GPS-Compendium_Book_%28GPS-X-02007%29.pdf é o compêndio do GPS. Você pode aprender todos os detalhes impressionantes que deseja. E o M9N cobre a maioria das funcionalidades nele. Você começará a perceber que não é uma coisa simples, há algumas coisas sérias acontecendo lá. E isso não é trivial. Depois de conhecer a teoria por trás de todas as configurações existentes, você pode tentar obter a configuração correta para seu M9N.

NEO-M9N GPS

NEO-M9N GPS é módulo com opções de configuração igualmente impressionantes. O módulo NEO-M9N é um receptor GNSS de motor de 92 canais u-blox M9, o que significa que ele pode receber sinais das constelações GPS, GLONASS, Galileo e BeiDou com precisão de ~1,5 metros. Essa fuga oferece suporte à recepção simultânea de quatro GNSS, maximizando a precisão da posição em condições desafiadoras, aumentando a precisão e diminuindo o tempo de bloqueio.

Com uma bateria recarregável, você terá energia de reserva, permitindo que o GPS obtenha um hot lock em segundos! Isso reduz o tempo de correção inicial de uma partida a frio (~24s) para uma partida a quente (~2s). A bateria manterá os dados de órbita RTC e GNSS sem ficar conectada à energia por muito tempo.

O módulo NEO-M9N detecta eventos de interferência e falsificação e pode relatá-los ao host, para que o sistema possa reagir a esses eventos. Um filtro SAW (Surface Acoustic Wave) combinado com um LNA (amplificador de baixo ruído) no caminho de RF é integrado no módulo NEO-M9N, o que permite a operação normal mesmo sob fortes interferências de RF.

Os produtos GPS baseados em U-blox são configuráveis ​​usando o popular, mas denso, programa do Windows chamado u-center:

Altamente interativo e fácil de usar;
Suporte total a todos os receptores GNSS u-blox;
Recursos abrangentes de configuração e controle;
Exibição em tempo real a partir de um receptor GNSS via interface RS232 e USB.


Muitas funções diferentes podem ser configuradas no NEO-M9N: taxas de transmissão, taxas de atualização, geofencing, detecção de falsificação, interrupções externas, SBAS/D-GPS, etc. Tudo isso pode ser feito na Biblioteca Arduino! No caso do Arduino, exemplos via I2C.


Características




Antena de Chip Integrada
Receptor GNSS de 92 canais
Precisão Horizontal de 1.5m
Taxa de atualização máxima de 25Hz (4 GNSS simultâneos)
Tempo até a primeira correção (partida):
  • Frio: 24s
  • Quente: 2s
Altitude máxima: 80.000 m
G máximo: ≤4
Velocidade máxima: 500m / s
Precisão da velocidade: 0.05m / s
Precisão no cabeçalho: 0,3 graus
Precisão do pulso de tempo: 30ns
3.3V VCC e E/S
  • Consumo atual: ~ 31mA GPS + GLONASS
Software configurável
  • Geofencing
  • Odômetro
  • Detecção de falsificação
  • Interrupção Externa
  • Controle de pinos
  • Modo de baixa potência
  • Muitos outros!

Suporta protocolos NMEA, UBX e RTCM através de interfaces UART ou I2C

Desenvolvemos o u-blox M9 como resultado da nossa bem-sucedida plataforma u-blox M8 GNSS, oferecendo ainda mais tecnologia robusta de posicionamento no nível do medidor e recursos de segurança para proteger a integridade das aplicações no setor automotivo, telemática, e mercados de UAV ”, disse Bernd Heidtmann, gerente de produto, Estratégia de Produto GNSS, Posicionamento do Centro de Produto, na u-blox.


Os usuários do u-blox M9 se beneficiarão de fazer parte da família mais ampla de produtos u-blox, o que significa que os desenvolvedores poderão projetar uma única placa de circuito impresso e migrar para uma tecnologia de posicionamento diferente - como o GNSS de tecnologia de dead-reckoning - com poucas alterações no design da placa.

IDEIA GERAL DE HARDWARE

ALIMENTAÇÃO

3.3V (VCC)


Bateria

É uma pequena bateria de lítio. Esta bateria não fornece energia ao IC como o sistema de 3,3V, mas a sistemas relevantes dentro do IC que permitem uma rápida reconexão com os satélites. O tempo para a primeira correção será de aproximadamente 29 segundos, mas depois de ter uma trava, a bateria permitirá dois segundos para a primeira correção. Isso é conhecido como partida a quente e dura quatro horas depois que a placa é desligada. A bateria fornece mais de um ano de energia ao sistema de backup e carrega lentamente quando a placa é alimentada. Para carregá-lo, deixe seu módulo conectado por 48 horas.

LEDs
Há um LED de energia rotulado como PPS conectado à linha Pulso por segundo. Quando conectada a um satélite, essa linha gera um pulso sincronizado com uma grade de tempo GPS ou UTC. Por padrão, você verá um pulso por segundo.

SPI x UART

Há como habilitar o barramento de dados SPI, desabilitando as funções UART nessas linhas, via D_SEL o qual deve ser aterrado.

I2C (DDC)

Existem dois pinos rotulados como SDA e SCL, que indicam as linhas de dados I2C.
O único endereço I2C deste e de todos os produtos GPS u-Blox é 0x42, embora cada um possa ter seu endereço alterado por software.

SPI

Existem quatro pinos  rotulados com a funcionalidade SPI correspondente. Conforme mencionado na seção SPIxUART, você precisará fechar um jumper para ativar o SPI.

UART

Existem dois pinos rotulados por sua funcionalidade UART.

D_SEL EM GND


SDA torna-se SPI CS
SCL torna-se SPI CLK
TX torna-se SPI MISO
RX torna-se SPI MOSI

PINOS DE CONTROLE E STATUS

Pulso por segundo (PPS), Reset (RST), Safeboot (SAFE) e, finalmente, o pino de interrupção (INT). O primeiro PPS do pino emite trens de pulso sincronizados com a grade horária do GPS ou UTC. O sinal padrão é uma vez por segundo, mas é configurável em uma ampla faixa. Leia a Especificação do protocolo do receptor u-blox na guia Recursos e indo para mais informações para obter mais informações. O pino de reset reseta o chip. O próximo pino, SAFE, é usado para inicializar o IC no modo de inicialização segura; isso pode ser útil se você, de alguma forma, conseguir corromper a memória Flash do módulo. O pino final INT pode ser usado para ativar o chip do modo de economia de energia.

CAPACIDADES DO GPS

O NEO-M9N é capaz de conectar até quatro constelações GNSS diferentes ao mesmo tempo, tornando-o muito preciso para o seu tamanho. Abaixo estão os recursos listados da unidade GPS ao conectar-se a várias constelações GNSS e ao conectar-se a uma única constelação.

Quando utilizando uma várias constelações GNSS

ConstellationsGPS+GLO+GAL+BDSGPS+GLONASS+GALGPS+GLOGPS+BDSGPS+GAL
Horizontal Position Accuracy2m2m2m2m2m
Max Navigation Update RatePVT25Hz25Hz25Hz25Hz25Hz
Time-To-First-FixCold Start24s25s26s28s29s
Hot Start2s2s2s2s2s
SensitivityTracking and Navigation-167dBm-167dBm-167dBm-1667dBm-166dBm
Reacquisition-160dBm-160dBm-160dBm-160dBm-160dBm
Cold Start-148dBm-148dBm-148dBm-148dBm-148dBm
Hot Start-159dBm-159dBm-159dBm-159dBm-159dBm
Velocity Accuracy0.05m/s0.05m/s0.05m/s0.05m/s0.05m/s
Heading Accuracy0.3deg0.3deg0.3deg0.3deg0.3deg
Quando utilizando uma simples constelação GNSS
ConstellationGPSGLONASSBEIDOUGalileo
Horizontal Position Accuracy2m4m3m3m
Max Navigation Update RatePVT25Hz25Hz25Hz25Hz
Time-To-First-FixCold Start29s27s32s42s
Hot Start2s2s2s2s
SensitivityTracking and Navigation-166dBm-164dBm-160dBm-159dBm
Reacquisition-160dBm-155dBm-157dBm-154dBm
Cold Start-148dBm-145dBm-145dBm-140dBm
Hot Start-159dBm-156dBm-159dBm-154dBm
Velocity Accuracy0.05m/s0.05m/s0.05m/s0.05m/s
Heading Accuracy0.3deg0.3deg0.3deg0.3deg


PRINCIPAIS CARACTERÍSTICAS TÉCNICAS

Product variantsNEO-M9N
GNSS features
GNSSBeiDou, Galileo, GLONASS, GPS / QZSS
Number of concurrent GNSS4
OscillatorTCXO
Microprocessor on board
Standalone module
Interfaces
UART1
USB1
SPI1
DDC (I2C compliant)1
Electrical data
Minimum supply [V]2.70
Maximum supply [V]3.6
Environmental data, quality & reliability
Maximum temperature [°C]85
Minimum temperature [°C]-40
Size [mm]12.2 x 16.0 x 2.4
Features
Antenna supervisor
Data logging
FW update via serial interface
Internal oscillator
RTC crystal
Other
MarketsAutomotive & Transport, Industry, Smart Cities, Unmanned Vehicle, Healthcare, Infrastructure

ESQUEMA ELÉTRICO


MÍNIMA INTERFACE

ANTENA

BIBLIOTECA SPARKFUN U-BLOX

Nota: Este exemplo supõe que você esteja usando a versão mais recente do IDE do Arduino na área de trabalho. Se esta é a primeira vez que você usa o Arduino, consulte nosso tutorial sobre a instalação do IDE do Arduino. Se você não instalou anteriormente uma biblioteca do Arduino, consulte nosso guia de instalação.

A biblioteca SparkFun U-blox Arduino pode ser baixada com o gerenciador de bibliotecas do Arduino, pesquisando 'SparkFun Ublox' ou você pode pegar o zip aqui no repositório GitHub citado.

Exemplo: (i2c e protocolo UBX) - MN9

#include <Wire.h> //Needed for I2C to GPS

#include "SparkFun_Ublox_Arduino_Library.h" //Click here to get the library: http://librarymanager/All#SparkFun_Ublox_GPS
SFE_UBLOX_GPS myGPS;

void setup()
{
  Serial.begin(115200);
  Serial.println("SparkFun Ublox Example");

  Wire.begin();

  if (myGPS.begin() == false)
  {
    Serial.println(F("Ublox GPS not detected at default I2C address. Please check wiring. Freezing."));
    while (1);
  }

  //This will pipe all NMEA sentences to the serial port so we can see them
  myGPS.setNMEAOutputPort(Serial);
}

void loop()
{
  myGPS.checkUblox(); //See if new data is available. Process bytes as they come in.

  delay(250); //Don't pound too hard on the I2C bus
}
Ao fazer o upload desse código, você terá que aguardar ~29s para bloquear os satélites. Após o primeiro bloqueio, a bateria reserva na placa fornecerá energia para alguns sistemas internos que permitirão um hot start na próxima vez que você ligar a placa. O hot start dura apenas quatro horas, mas permite que você bloqueie em um segundo. Depois de obter um bloqueio, o terminal serial começará a listar as coordenadas de longitude e latitude, conforme mostrado abaixo. Certifique-se de definir o monitor serial para 115200 baud.


"Por que UBX quando há muitos analisadores NMEA disponíveis? ". A resposta curta é que o UBX é um protocolo binário eficiente e o pacote UBX-NAV-PVT fornece muito mais dados do que os disponíveis via NMEA

COMPATIBILIDADE DE SINAIS

É preciso presta atenção que a interface é de 3.3V e não tolerante a 5V, ou seja, não dá para ligar no Arduino Nano V3 diretamente. Na verdade qualquer microcontrolador com GPIO de 5V vai precisar de um level shift para fazer interface com este módulo.

No caso da Stellaris, Tiva C, STM32, FRDM-KL25Z  pode conectar direto, pois o GPIO é 3.3V.

OUTRAS BIBLIOTECAS PARA O PROTOCOLO PROPRIETÁRIO DA U-BLOX (UART), AINDA NÃO TESTADAS NO NEO-M9N


e (RECOMENDADO VER OS 2 VIDEOS ABAIXO, NEO-6M)







ZIP com exemplos dos videos acima!


Exemplo de código
#include <SoftwareSerial.h>

// Connect the GPS RX/TX to arduino pins 3 and 5
SoftwareSerial serial = SoftwareSerial(3,5);

const unsigned char UBX_HEADER[]        = { 0xB5, 0x62 };
const unsigned char NAV_POSLLH_HEADER[] = { 0x01, 0x02 };
const unsigned char NAV_STATUS_HEADER[] = { 0x01, 0x03 };

enum _ubxMsgType {
  MT_NONE,
  MT_NAV_POSLLH,
  MT_NAV_STATUS
};

struct NAV_POSLLH {
  unsigned char cls;
  unsigned char id;
  unsigned short len;
  unsigned long iTOW;
  long lon;
  long lat;
  long height;
  long hMSL;
  unsigned long hAcc;
  unsigned long vAcc;
};

struct NAV_STATUS {
  unsigned char cls;
  unsigned char id;
  unsigned short len;
  unsigned long iTOW;
  unsigned char gpsFix;
  char flags;
  char fixStat;
  char flags2;
  unsigned long ttff;
  unsigned long msss;
};

union UBXMessage {
  NAV_POSLLH navPosllh;
  NAV_STATUS navStatus;
};

UBXMessage ubxMessage;

// The last two bytes of the message is a checksum value, used to confirm that the received payload is valid.
// The procedure used to calculate this is given as pseudo-code in the uBlox manual.
void calcChecksum(unsigned char* CK, int msgSize) {
  memset(CK, 0, 2);
  for (int i = 0; i < msgSize; i++) {
    CK[0] += ((unsigned char*)(&ubxMessage))[i];
    CK[1] += CK[0];
  }
}


// Compares the first two bytes of the ubxMessage struct with a specific message header.
// Returns true if the two bytes match.
boolean compareMsgHeader(const unsigned char* msgHeader) {
  unsigned char* ptr = (unsigned char*)(&ubxMessage);
  return ptr[0] == msgHeader[0] && ptr[1] == msgHeader[1];
}


// Reads in bytes from the GPS module and checks to see if a valid message has been constructed.
// Returns the type of the message found if successful, or MT_NONE if no message was found.
// After a successful return the contents of the ubxMessage union will be valid, for the 
// message type that was found. Note that further calls to this function can invalidate the
// message content, so you must use the obtained values before calling this function again.
int processGPS() {
  static int fpos = 0;
  static unsigned char checksum[2];
  
  static byte currentMsgType = MT_NONE;
  static int payloadSize = sizeof(UBXMessage);

  while ( serial.available() ) {
    
    byte c = serial.read();    
    //Serial.write(c);
    
    if ( fpos < 2 ) {
      // For the first two bytes we are simply looking for a match with the UBX header bytes (0xB5,0x62)
      if ( c == UBX_HEADER[fpos] )
        fpos++;
      else
        fpos = 0; // Reset to beginning state.
    }
    else {
      // If we come here then fpos >= 2, which means we have found a match with the UBX_HEADER
      // and we are now reading in the bytes that make up the payload.
      
      // Place the incoming byte into the ubxMessage struct. The position is fpos-2 because
      // the struct does not include the initial two-byte header (UBX_HEADER).
      if ( (fpos-2) < payloadSize )
        ((unsigned char*)(&ubxMessage))[fpos-2] = c;

      fpos++;
      
      if ( fpos == 4 ) {
        // We have just received the second byte of the message type header, 
        // so now we can check to see what kind of message it is.
        if ( compareMsgHeader(NAV_POSLLH_HEADER) ) {
          currentMsgType = MT_NAV_POSLLH;
          payloadSize = sizeof(NAV_POSLLH);
        }
        else if ( compareMsgHeader(NAV_STATUS_HEADER) ) {
          currentMsgType = MT_NAV_STATUS;
          payloadSize = sizeof(NAV_STATUS);
        }
        else {
          // unknown message type, bail
          fpos = 0;
          continue;
        }
      }

      if ( fpos == (payloadSize+2) ) {
        // All payload bytes have now been received, so we can calculate the 
        // expected checksum value to compare with the next two incoming bytes.
        calcChecksum(checksum, payloadSize);
      }
      else if ( fpos == (payloadSize+3) ) {
        // First byte after the payload, ie. first byte of the checksum.
        // Does it match the first byte of the checksum we calculated?
        if ( c != checksum[0] ) {
          // Checksum doesn't match, reset to beginning state and try again.
          fpos = 0; 
        }
      }
      else if ( fpos == (payloadSize+4) ) {
        // Second byte after the payload, ie. second byte of the checksum.
        // Does it match the second byte of the checksum we calculated?
        fpos = 0; // We will reset the state regardless of whether the checksum matches.
        if ( c == checksum[1] ) {
          // Checksum matches, we have a valid message.
          return currentMsgType; 
        }
      }
      else if ( fpos > (payloadSize+4) ) {
        // We have now read more bytes than both the expected payload and checksum 
        // together, so something went wrong. Reset to beginning state and try again.
        fpos = 0;
      }
    }
  }
  return MT_NONE;
}

void setup() 
{
  Serial.begin(9600);
  serial.begin(9600);
}

long lat;
long lon;

void loop() {
  int msgType = processGPS();
  if ( msgType == MT_NAV_POSLLH ) {
    Serial.print("iTOW:");      Serial.print(ubxMessage.navPosllh.iTOW);
    Serial.print(" lat/lon: "); Serial.print(ubxMessage.navPosllh.lat/10000000.0f); Serial.print(","); Serial.print(ubxMessage.navPosllh.lon/10000000.0f);
    Serial.print(" hAcc: ");    Serial.print(ubxMessage.navPosllh.hAcc/1000.0f);
    Serial.println();
  }
  else if ( msgType == MT_NAV_STATUS ) {
    Serial.print("gpsFix:");    Serial.print(ubxMessage.navStatus.gpsFix);
    Serial.println();
  }
}
PS: Também via UART 

Também há esta library UbxGps, via UART, EXCELENTE, TESTADA NO M8N.

Essa biblioteca do Arduino foi desenvolvida para a comunicação mais rápida e simples com os módulos GPS u-blox, que suportam o protocolo UBX proprietário que é binário e, portanto, mais compacto que o NMEA comum. A idéia principal era alcançar 10 Hz reais do NEO-7M e foi feito. Agradecemos imensamente ao iforce2d por um vídeo tutorial cujo código é apresentado no básico da biblioteca.

Essa biblioteca depende da configuração do módulo GPS e pode lidar com apenas um tipo de pacote UBX por vez, que você pode escolher durante a configuração do módulo GPS. O UbxGps fornece uma interface fácil de usar para todos os dados disponíveis, de acordo com a Especificação de Protocolo que você pode encontrar no diretório Docs. Além disso, a descrição completa das propriedades está acessível nos códigos-fonte.

Os tipos de pacotes UBX suportados pela biblioteca estão listados abaixo, são 4. Sinta-se à vontade para adicionar outros pacotes à biblioteca, pois ela foi projetada para tornar novos tipos o mais fácil possível.


UbxGpsNavPosecef.h
NAV-POSECEF (Position Solution in ECEF): iTOW, ecefX, ecefY, ecefZ, pAcc.

UbxGpsNavPosllh.h
NAV-POSLLH (Geodetic Position Solution): iTOW, lon, lat, height, hMSL, hAcc, vAcc.

UbxGpsNavPvt.h
NAV-PVT (Navigation Position Velocity Time Solution): iTOW, year, month, day, hour, min, sec, valid, tAcc, nano, fixType, flags, reserved1, numSV, lon, lat, height, hMSL, hAcc, vAcc, velN, velE, velD, gSpeed, heading, sAcc, headingAcc, pDOP, reserved2, reserved3.

TESTADAS POR ENQUANTO NO M8N COM ARDUINO MEGA. EM BREVE PARA O M9N VIA UART.





ATENÇÃO - TAMANHO DO PAYLOAD
UbxGpsNavPvt(T &serial) : UbxGps<T>(serial)
    {
        this->setLength(92);
    }

Exemplo do código
#include <Arduino.h> #include <UbxGpsNavPvt.h> #define GPS_BAUDRATE 9600L #define PC_BAUDRATE 9600L #define DATETIME_FORMAT "%04d.%02d.%02d %02d:%02d:%02d" #define DATETIME_LENGTH 20 UbxGpsNavPvt<HardwareSerial> gps(Serial3); char datetime[DATETIME_LENGTH]; void setup() { Serial.begin(PC_BAUDRATE); gps.begin(GPS_BAUDRATE); } void loop() { if (gps.ready()) { snprintf(datetime, DATETIME_LENGTH, DATETIME_FORMAT, gps.year, gps.month, gps.day, gps.hour, gps.min, gps.sec); Serial.print(datetime); Serial.print(','); Serial.print(gps.lon / 10000000.0, 7); Serial.print(','); Serial.print(gps.lat / 10000000.0, 7); Serial.print(','); Serial.print(gps.height / 1000.0, 3); Serial.print(','); Serial.print(gps.gSpeed * 0.0036, 5); Serial.print(','); Serial.print(gps.heading / 100000.0, 5); Serial.print(','); Serial.print(gps.fixType); Serial.print(','); Serial.println(gps.numSV); } }



UbxGpsNavSol.h
NAV-SOL (Navigation Solution Information): iTOW, fTOW, week, gpsFix, flags, ecefX, ecefY, ecefZ, pAcc, ecefVX, ecefVY, ecefVZ, sAcc, pDOP, reserved1, numSV, reserved2.

Também portado para PLATFORMIO




  • UbxGps.h

  • UbxGpsNavPosecef.h

  • UbxGpsNavPvt.h

  • UbxGpsNavPosllh.h

  • UbxGpsNavSol.h




U-CENTER (MAIS DETALHES)



O U-Center é uma ferramenta inteligente que permite escolher a configuração necessária para o receptor GPS e armazená-lo em sua memória não volátil. Com o U-Center, você pode testar a precisão do receptor com instrumentos visuais exibindo informações sobre: ​​satélites, DOP, mensagens de saída, taxa de transmissão, modo FIX etc.

SUMÁRIO DO PRODUTO

https://www.u-blox.com/sites/default/files/NEO-M9N_ProductSummary_%28UBX-19027207%29.pdf


U-CENTER E SINCRONIZAÇÃO COM LIBRARIES

A maior dor nas costas por essas coisas é a taxa de transmissão. A segunda maior dificuldade é o número de parâmetros de cisalhamento a serem configurados. Como padrão, o M9N é uma tentativa de produzir GPS confiável para a maioria dos consumidores. Ao conectar um PC a ele, você deve usar algum software que não o deixe de fora com as configurações do modem. Você se conecta a um PC com a porta USB e ao seu drone com o i2c (não o meu favorito) ou serial. Essas são portas diferentes. Você deve configurar cada um separadamente e com cuidado antes de fazer o macaco com outras configurações.

Se você possui uma conexão USB, pode usá-la para conectar e configurar o dispositivo a partir do seu PC usando o UCenter, se desejar. A maioria dos softwares de controle de vôo possui o suficiente para configurá-lo para você quando a conexão de dados, seja a configuração serial ou i2c, estiver funcionando. Então não se incomode com isso.

Se você é totalmente entusiasmado com o UCenter, não entre em pânico. Defina sua taxa de transmissão tão alta quanto o modelo tolerará e instale-a. Power it. E espere. Se sua placa M9N tiver bateria reserva (poucas), você está com sorte. Enquanto você liga o sistema a cada semana ou duas por um tempo, a longa espera termina. Caso contrário, o seu M9N levará minutos para adquirir o bloqueio. Isso é simplesmente porque esse é o padrão GPS. O protocolo transmite todos os dados necessários nesse período. Não é culpa do conselho. Nada mais é ou pode ser mais rápido. Isso pressupõe que você tenha 4 satélites ao alcance. Tente fazer isso em um campo aberto, sem grandes edifícios por perto, para sombrear a recepção. Você não deve ter problemas com um ou dois edifícios, porque o sinal é polaraizado (curva à direita). Esta é a mesma técnica usada em equipamentos FPV polarizados. O M9N usa muitos protocolos diferentes, não apenas o GPS. Portanto, sua milhagem pode variar dependendo de onde você está na terra.

DATASHEET


MANUAL DE INTEGRAÇÃO

https://www.u-blox.com/sites/default/files/NEO-M9N_Integrationmanual_%28UBX-19014286%29.pdf

PROTOCOLO DA U-BLOX

https://www.monocilindro.com/wp-content/uploads/2016/03/u-blox6-Receiver-Description-Protocol-Specification.pdf

M9N INTERFACE

https://loja.smartcore.com.br/pagina/datasheet-documentacao-de-produtos.html
folder NEO-M9N

U-CENTER

https://www.u-blox.com/sites/default/files/u-center_ProductSummary_%28UBX-13003929%29.pdf
https://www.u-blox.com/en/blogs/innovation/11-things-you-probably-didn%E2%80%99t-know-about-u-center
https://www.u-blox.com/sites/default/files/u-center_Userguide_%28UBX-13005250%29.pdf


google maps API

BREAKOUT SPARKFUN

TheSparkFun NEO-M9N GPS Breakout é uma placa GPS de alta qualidade com opções de configuração igualmente impressionantes. Duas opções estão disponíveis: uma com um conector U.FL para que você possa usar sua própria antena e a segunda com uma antena de chip integrada.

Detalhes técnicos da placa e arquivos EAGLE podem ser obtidos aqui:



Released under the Creative Commons Attribution Share-Alike 4.0 License

Via ULP você pode exportar para outros CAD, como exemplo, ALTIUM


E guia para iniciantes


OPENHARDWARE - HACKADAY



Este estudante esta fazendo um projeto de placa com M9N para ser um projeto aberto. Participe!


Este projeto pretende ser um hardware aberto. Gostaria apenas de ter esse design para um estado em que estou confiante com ele para compartilhar / publicar os arquivos.

Sobre Avery W.

"Estudando Engenharia Elétrica e de Computação no Worcester Polytechnic Institute. Estou muito envolvido com o aluno que administra a Makerspace no campus. Passo muito do meu tempo livre jogando videogame, mexendo com eletrônicos e limpando o laboratório."


Por padrão, o módulo GPS u-blox tem os conjuntos de dados NMEA mais comuns ativados, como GNGGA, GNGSA, GNGLL,… Às vezes é necessário ativar ou desativar conjuntos de dados NMEA específicos. Para habilitar ou desabilitar conjuntos de dados NMEA específicos, siga as etapas abaixo.

Solução

  1. Abra u-center.
  2. Conecte o módulo GPS (default port é COM3, baudrate 9600).
  3. Vá para View > Configuration View.
  4. Click MSG (Messages) no lado esquerdo da lista.
    1. Para habilitar:
      Escolhe o dataset NMEA em Message. Check as caixas I2CUART1USB, e SPI e entre 1 em todos os quatro campos On.
      u-blox settings in windows
      Click o botão Send no canto esquerdo inferior.
      u-blox settings in windows
    2. Para desabilitar:
      Escolha um dataset NMEA na Message. Uncheck todas as caixas.
      u-blox settings in windows
      Click o botão Send no canto esquerdo inferior.
      u-blox settings in windows
  5. Alterne para a guia CFG (configuração) na lista do lado esquerdo. Selecione Salvar configuração atual. Em Dispositivos, selecione todas as 4 entradas da lista. (Para selecionar todas as entradas, toque e segure a caneta / mouse na primeira entrada e mova para baixo até a última entrada. Solte a caneta / mouse). Clique no botão Enviar no canto inferior esquerdo:
    u-blox settings in windows
  6.  Click Receiver > Action > Save Config:
    u-blox settings in windows
  7. Pronto.
  8. REFORÇANDO

Configurando e mostrando sentenças NMEA 

Vamos analisar alguns recursos que você provavelmente usará:

Console de Texto

O botão do console de texto mostrará as frases brutas do NMEA. Isso é útil para inspecionar rapidamente o ASCII visível proveniente do módulo via USB.
u-center text console

Configure

O botão de configuração abre a janela mais poderosa. Nesta janela, você pode inspecionar e definir novas configurações. Não é óbvio, mas quando você clica em uma configuração como "MSG (Mensagens)", o u-center pesquisará o módulo quanto ao seu estado atual. Os '10s' no canto indicam quantos anos as informações exibidas são. Nesse caso, passaram 10 segundos desde a última consulta dessa configuração. Clique no botão "Enquete" para atualizar as informações. Vá em frente e selecione a mensagem F0-00 NMEA GxGGA. Ao clicar no menu suspenso, o software pesquisará as configurações atuais. É um pouco desorientador no começo, mas melhora com o tempo.
Configuration button and msg window
A configuração MSG é muito poderosa. Ele permite que você ative ou desative várias frases NMEA, bem como protocolos binários, como o NAV-PVT (confira a [folha de dados completa do protocolo] (texto do link). Depois que uma frase for selecionada, como GxGGA, as caixas de seleção serão preenchidas. Se você deseja desativar a sentença GxGGA para a interface SPI, desmarque a caixa de seleção SPI e clique em 'Enviar'. Parabéns! A sentença GxGGA não é mais apresentada na interface SPI. Isso levanta um fato importante:
Nota: A série NEO-M8 possui 4 interfaces: USB (serial), I2C, SPI e UART. Todas as interfaces podem acessar informações simultaneamente. Isso significa que você pode inspecionar as definições de configuração pela porta serial USB enquanto o seu Arduino faz alterações nas configurações da porta I2C. Você pode ler sentenças NMEA pela porta I2C ou enviar dados RTCM para o módulo pela SPI. Tudo é altamente configurável.

Portas

O submenu Portas (PRT) em Configuração é muito útil. Você pode fazer coisas como alterar a taxa de transmissão, o endereço I2C e os protocolos. Dependendo do seu aplicativo, convém ativar ou desativar protocolos de interface inteiros. Por exemplo, se você deseja ativar sentenças NMEA para a interface SPI, faça-o aqui. Felizmente, o padrão de fábrica para o NEO-M8P é bom para I2C e UART1 para fins de RTK (a entrada do RTCM3 está ativada para ambas as portas).
u-center ports menu
Mensagens
A janela de mensagens permitirá visualizar as várias frases relatadas pelo módulo. Não é óbvio, mas se você clicar duas vezes em "NMEA", a árvore de mensagens será fechada. Da mesma forma, se você clicar duas vezes em "UBX", ele expandirá, mostrando as várias frases de UBX. Por padrão, muitos deles não estão ativados.
MSG window

COMUNICAÇÃO VIA SPI COM M9N (11.6)
https://www.u-blox.com/sites/default/files/products/documents/u-blox8-M8_ReceiverDescrProtSpec_(UBX-13003221)_Public.pdf
(também contem informações para I2C)
SPI Port
A Serial Peripheral Interface (SPI) bus is available with selected receivers. 
SPI is a four-wire synchronous communication interface. In contrast to UART, the master provides the clock
signal, which therefore doesn't need to be specified for the slave in advance. Moreover, a baud rate setting is
not applicable for the slave. SPI modes 0-3 are implemented and can be configured using the field mode.
spiMode in CFG-PRT for SPI (default is SPI mode 0).
The SPI clock speed is limited depending on hardware and firmware versions!

Maximum SPI clock speed
Generation Firmware Max SPI speed
u-blox 6 7 200 kHz
u-blox 6 6.02 100 kHz
u-blox 5 all 25 kHz

Read Access
As the register mode is not implemented for the SPI port, only the UBX/NMEA message stream is provided. This
stream is accessed using the Back-To-Back Read and Write Access (see section Back-To-Back Read and Write
Access). When no data is available to be written to the receiver, MOSI should be held logic high, i.e. all bytes
written to the receiver are set to 0xFF.
To prevent the receiver from being busy parsing incoming data, the parsing process is stopped after 50
subsequent bytes containing 0xFF. The parsing process is re-enabled with the first byte not equal to 0xFF. The
number of bytes to wait for deactivation (50 by default) can be adjusted using the field mode.ffCnt in
CFG-PRT for SPI, which is only necessary when messages shall be sent containing a large number of subsequent
0xFF bytes.
If the receiver has no more data to send, it sets MISO to logic high, i.e. all bytes transmitted decode to 0xFF. An
efficient parser in the host will ignore all 0xFF bytes which are not part of a message and will resume data
processing as soon as the first byte not equal to 0xFF is received.

Back-To-Back Read and Write Access
The receiver does not provide any write access except for writing UBX and NMEA messages to the receiver,
such as configuration or aiding data. For every byte written to the receiver, a byte will simultaneous be read
from the receiver. While the master writes to MOSI, at the same time it needs to read from MISO, as any
pending data will be output by the receiver with this access. The data on MISO represents the results from a
current address read, returning 0xFF when no more data is available.

DISCUSSÃO SOBRE SPI
https://forum.arduino.cc/index.php?topic=327314.0
https://forum.arduino.cc/index.php?topic=289342.msg2090694#msg2090694

MAIS UM LINK COM LIBRARY PARA GPS (ADAFRUIT, SERIAL, I2C, SPI)
https://github.com/adafruit/Adafruit_GPS

EVB BOARD (TESTES COM UART1 e USB)



DICAS SPI

Some notes about using SPI:

The M9N must be used in slave mode

Is the M9N being used in slave mode?
Is D_SEL connected to GND at power up?
Confirm that MISO and MOSI are connected correctly

50times 0xFF will be treated as the indicator to stop parsing from receiver side.

The communication between the host and the u-blox receiver needs to follow 'SPI Back-To-Back Read/Write Access'. It means whenever the host writes a byte to the receiver, the host needs to read a byte back immediately from the receiver no matter if the host parses the bytes received or not.

Remember to set UBX-CFG-PRT correctly for SPI port




Configurações para utilizar SPI com Arduino (MISO, MOSI, SCK, CS)

Direcionando Saída para SPI

Ligação com STM32 (SPI, Arduino)

UBX NAV-PVT

#include <SPI.h> // pins used for the connection with the sensor // the other you need are controlled by the SPI library): const int chipSelectPin = D10; void setup() { Serial.begin(115200); Serial.println("SPI"); // start the SPI library: SPI.begin(); // initalize the data ready and chip select pins: pinMode(chipSelectPin, OUTPUT); } unsigned int car; void loop() { car = readRegister(); if(!(car == 255)) { if(car == 0xB5) Serial.println(); //start Serial.print(car, HEX); Serial.print(" "); } else delay(1); } unsigned int readRegister() { unsigned int result = 0; // result to return // take the chip select low to select the device: digitalWrite(chipSelectPin, LOW); // send the device the register you want to read: result = SPI.transfer(0x00); // take the chip select high to de-select: digitalWrite(chipSelectPin, HIGH); // return the result: return (result); }
Log


SENTENÇAS NMEA (ASCII)

Noções básicas sobre sentenças NMEA

As sentenças NMEA começam com o caractere $ e cada campo de dados é separado por vírgula.

$ GPGGA, 110617.00,41XX.XXXXX, N, 00831.54761, W, 1,05,2,68,129,0, M, 50,1, M ,, * 42
$ GPGSA, A, 3,06,09,30,07,23 ,,,,,,,, 4.43,2.68,3.53 * 02
$ GPGSV, 3,1,11,02,48,298,24,03,05,101,24,05,17,292,20,06,71,227,30 * 7C
$ GPGSV, 3,2,11,07,47,138,33,09,64,044,28,17,01,199, 19,13,214, * 7C
$ GPGSV, 3,3,11,23,29,054,29,29,01,335,, 30,29,167,33 * 4E
$ GPGLL, 41XX.XXXXX, N, 00831.54761, W, 110617,00, A, A * 70
$ GPRMC, 110618.00, A, 41XX.XXXXX, N, 00831.54753, W, 0.078,, 030118 ,,, A * 6A
$ GPVTG ,, T ,, M, 0,043, N, 0,080, K, A * 2C

Existem diferentes tipos de sentenças NMEA. O tipo de mensagem é indicado pelos caracteres antes da primeira vírgula.

O GP após o $ indica que é uma posição GPS. O $GPGGA é a mensagem GPS NMEA básica, que fornece localização 3D e dados de precisão. Na seguinte sentença:

$ GPGGA, 110617.00,41XX.XXXXX, N, 00831.54761, W, 1,05,2,68,129,0, M, 50,1, M ,, * 42

110617 - representa o horário em que o local da correção foi obtido, 11:06:17 UTC
41XX.XXXXX, N - latitude 41 graus XX.XXXXX 'N
00831.54761, W - Longitude 008 deg 31,54761 ′ W
1 - qualidade da correção (0 = inválido; 1 = correção do GPS; 2 = correção DGPS; 3 = correção PPS; 4 = Cinemático em tempo real; 5 = RTK flutuante; 6 = estimado (cálculo de mortos); 7 = modo de entrada manual; 8 = Modo de simulação)
05 - número de satélites sendo rastreados
2.68 - Diluição horizontal de posição
129,0, M - Altitude, em metros acima do nível do mar
50.1, M - Altura do geóide (nível médio do mar) acima do elipsóide WGS84
campo vazio - tempo em segundos desde a última atualização do DGPS
campo vazio - número de identificação da estação DGPS
*42 - os dados da soma de verificação, sempre começam com *
As outras frases do NMEA fornecem informações adicionais:

$ GPGSA - DOP GPS e satélites ativos
$ GPGSV - Informação detalhada por satélite GPS
$ GPGLL - Latitude e longitude geográfica
$ GPRMC - Dados essenciais do GPS pvt (posição, velocidade, tempo)
$ GPVTG - Velocity made good

Lib para fazer o PARSER (serial)


MBED


VISUINO

Os componentes encontrados no software Visuino representam seus componentes de hardware e você poderá criar e projetar facilmente seus programas usando o recurso de arrastar e soltar. Nenhum equipamento ou hardware é necessário para executar o software no modo de design. Depois de concluir o design, você pode conectar o upload da placa do Arduino e executá-lo. Um dos componentes é para GPS, protocolo NMEA, veja a conexão e o resultado da execução!






DÚVIDAS BÁSICAS

suporte@smartcore.com.br

Sobre a SMARTCORE

A SmartCore fornece módulos para comunição wireless, biometria, conectividade, rastreamento e automação.
Nosso portifólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS / GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.
Mais detalhes em www.smartcore.com.br

Referências Bibliográficas

https://github.com/sparkfun/SparkFun_Ublox_Arduino_Library/tree/master/examples
https://www.gpsworld.com/u-blox-meter-level-positioning-technology-offers-enhanced-gnss-for-autos/
https://insidegnss-com.exactdn.com/wp-content/uploads/2019/12/u-blox-NEO-M9N.png?strip=all&lossy=1&ssl=1
https://cdn.sparkfun.com/assets/learn_tutorials/1/1/0/2/SparkFun_GPS_NEO_M9N_ANT_Schematic.pdf
https://www.mikroe.com/gnss-5-click
https://andrea-toscano.com/u-blox-neo-m8n-u-center-configuration-and-arduino-parser-sketch/
https://www.autodesk.com.br/products/eagle/free-download
https://www.youtube.com/watch?v=ylxwOg2pXrc
https://libraries.io/platformio/UbxGps
https://forum.pjrc.com/threads/36103-uBlox-Library/page5
https://diydrones.com/m/blogpost?id=705844%3ABlogPost%3A1634689
https://platformio.org/lib/show/2014/UbxGps/installation
https://platformio.org/lib/show/2014/UbxGps/installationhttps://platformio.org/lib/show/2014/UbxGps/examples
https://learn.sparkfun.com/tutorials/getting-started-with-u-center-for-u-blox/all
https://randomnerdtutorials.com/guide-to-neo-6m-gps-module-with-arduino/
https://www.visuino.com
 

Sobre a SMARTCORE

A SmartCore fornece módulos para comunicação wireless, biometria, conectividade, rastreamento e automação.
Nosso portifólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS / GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.
Mais detalhes em www.smartcore.com.br