Componente · Sensor

Módulo GPS NEO-6M

O NEO-6M fornece a posição absoluta de um robô ao ar livre por uma porta serial. Como ler NMEA, por que o HDOP importa mais que a precisão e o que ele não faz.

O que é

Um receptor GNSS: um chip que escuta os sinais de tempo transmitidos por uma constelação de satélites e determina sua própria posição a partir das diferenças entre os instantes de chegada. O NEO-6M é o módulo que a maioria dos robôs de iniciação encontra primeiro—um receptor u-blox, uma antena cerâmica planar e uma porta serial.

Ele é o único sensor de um robô que informa uma posição absoluta. Todo o restante neste site— encoders, uma IMU, uma matriz de sensores de refletância infravermelha— mede uma mudança ou uma característica local. O GPS impede que a deriva da odometria se torne ilimitada e é o que permite atribuir a um rover ao ar livre um destino a um quilômetro de distância.

Como funciona

Você não conversa com ele. Ele conversa com você, a 9600 baud, em mensagens NMEA 0183—uma linha separada por vírgulas por mensagem, várias vezes por segundo.

Duas delas carregam tudo o que um robô precisa:

$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,...   fix quality, sats, HDOP
$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,...      validity, position, speed, course

Leia a posição e então valide-a. O campo de status no RMC é A para ativo ou V para inválido, e a qualidade no GGA é 0 quando não há solução—nos dois casos, a mensagem ainda traz coordenadas de aparência plausível. O campo HDOP é o que pega a falha mais sutil: ele descreve a geometria dos satélites, e uma geometria ruim produz uma resposta confiante, porém errada em dezenas de metros.

A latitude chega como graus e minutos decimais (4807.038 é 48° 07.038′), o que não é simplesmente um número em graus. Converta uma vez e depois novamente para metros em relação a uma origem fixa—a aritmética está aqui—e tudo o que vier depois funcionará em unidades que o controlador entende.

Quando usar

Use um GPS sempre que o robô trabalhar ao ar livre em distâncias maiores que as que a odometria sobrevive: um rover com pontos de referência, um cortador de grama, uma plataforma de levantamento ou um robô agrícola. Como regra, depois de trinta metros de deslocamento, a navegação por estimativa já acumulou mais erro do que uma leitura de GPS normalmente apresenta.

Não procure isso em ambientes internos, em nenhuma hipótese. E não procure precisão: 2,5 m é uma distância grande para um robô com 30 cm de largura. O GPS informa em que parte do campo você está; um encoder de roda informa onde você está dentro de um metro dessa parte. Use os dois em conjunto.

O caminho de atualização, em ordem de valor: primeiro uma taxa de atualização maior (5 ou 10 Hz remove a maior parte da defasagem), depois um módulo multiconstelação (GPS mais GLONASS ou Galileo melhora a geometria e, portanto, o HDOP) e só então RTK—que alcança centímetros e exige uma estação base, um canal de dados e um orçamento diferente.

Armadilhas comuns

  • A partida a frio leva minutos, não segundos. Sem almanaque, o receptor precisa baixar o almanaque dos satélites a 50 bits por segundo. Um robô que parece morto na primeira ligação ao ar livre normalmente está apenas esperando.
  • Ele não tem orientação. Apenas posição. Combine-o com um magnetômetro ou giroscópio; o rumo sobre o solo não significa nada abaixo de cerca de 1 m/s.
  • A aplicação de 5 V no RX mata módulos de 3,3 V. Verifique se a placa adaptadora faz conversão de nível. A TX do módulo em uma placa de 5 V é segura.
  • A antena precisa de céu livre, não apenas de uma linha de visão. Metal acima dela—inclusive a própria placa do chassi—pode fazer você perder alguns satélites. Monte-a no topo, plana e voltada para cima.
  • Nunca siga soluções brutas. Faça navegação por estimativa entre elas e corrija em cada uma; seguir diretamente causa um erro de rastreamento uma ordem de grandeza maior e quatro vezes mais esforço de direção.
  • Seis casas decimais são 11 cm—e mais do que um float comporta. Converta para metros em relação à origem da missão, em vez de fazer aritmética com graus brutos.

Pinagem e conexão

Pino Nome O que faz
1 VCC 3,3–5 V. Verifique se sua placa adaptadora regula — muitas NEO-6M fazem isso
2 RX O módulo recebe configuração. Lógica de 3,3 V em um módulo puro
3 TX O módulo transmite NMEA. Seguro em uma entrada de 5 V
4 GND Massa
5 PPS Um pulso por segundo, alinhado ao tempo GPS. Ignorado pela maioria dos projetos
GPS Arduino Uno Observação
VCC 5 V Se a placa tiver regulador; 3,3 V se não tiver
GND GND
TX Pino 4 (RX do SoftwareSerial) O módulo transmite; a placa recebe
RX Pino 3 por divisor Necessário apenas se você configurar o módulo

Você pode deixar o RX totalmente desconectado. Um módulo GPS no estado padrão transmite NMEA a 9600 baud sem que ninguém peça, e, para um robô que lê apenas posição, isso é tudo o que você precisa. Conecte o RX somente quando quiser aumentar a taxa de atualização ou silenciar sentenças não usadas.

Lendo sem biblioteca

#include <SoftwareSerial.h>

SoftwareSerial gps(4, 3);          // RX from module TX, TX to module RX

char line[100];
uint8_t len = 0;

void setup() {
  Serial.begin(115200);
  gps.begin(9600);
}

void loop() {
  while (gps.available()) {
    char c = gps.read();
    if (c == '\n') {
      line[len] = '\0';
      if (strncmp(line, "$GPRMC", 6) == 0) handleRmc(line);
      len = 0;
    } else if (len < sizeof(line) - 1) {
      line[len++] = c;
    }
  }
}

void handleRmc(char *s) {
  // $GPRMC,time,status,lat,N/S,lon,E/W,speed,course,date,...
  char *field[13] = {nullptr};
  uint8_t n = 0;
  for (char *tok = strtok(s, ","); tok && n < 13; tok = strtok(nullptr, ",")) field[n++] = tok;

  if (n < 7 || field[2][0] != 'A') return;      // 'V' = void. Coordinates are still present
                                                 // and still meaningless. Gate on this.
  Serial.print(toDegrees(field[3], field[4][0]), 6);
  Serial.print(' ');
  Serial.println(toDegrees(field[5], field[6][0]), 6);
}

// NMEA gives ddmm.mmmm — degrees and DECIMAL MINUTES, not decimal degrees.
double toDegrees(const char *ddmm, char hemisphere) {
  double raw = atof(ddmm);
  int deg = (int)(raw / 100);
  double minutes = raw - deg * 100;
  double result = deg + minutes / 60.0;
  return (hemisphere == 'S' || hemisphere == 'W') ? -result : result;
}

As duas linhas mais importantes são aquelas que as pessoas pulam.

field[2][0] != 'A' é a validação. Um receptor sem solução ainda emite sentenças RMC perfeitamente formadas, com coordenadas—normalmente a última posição conhecida, ou zeros. Código que não verifica o indicador de status navegará com confiança para o meio do Atlântico, que é onde fica 0°N 0°E.

toDegrees existe porque 4807.038 não é 4807,038 graus, nem 48,07038 graus. É 48° 07,038′, que é 48,1173°. Tratar coordenadas NMEA como graus decimais é o bug de GPS mais comum, e o erro é grande o suficiente para ser evidente—que é a única coisa boa dele.

Para projetos reais, use TinyGPS++. Ele trata todos os tipos de mensagem, somas de verificação e casos de borda. A versão manual acima vale executar uma vez para saber o que ela está fazendo.

Precisão: o que os números realmente significam

Figura NEO-6M típico O que significa
Precisão horizontal ~2,5 m CEP Metade das soluções fica dentro de 2,5 m. A outra metade, não
Taxa de atualização 1 Hz por padrão, 5 Hz configurável A 1 m/s, uma solução de 1 Hz pode estar desatualizada em até um metro quando você a lê
Partida a frio ~27 s, minutos sem almanaque Nada está errado; ele está baixando a 50 bits por segundo
Partida a quente ~1 s Com a alimentação de backup mantendo o almanaque ativo
Precisão de velocidade ~0,1 m/s De fato boa—melhor que a posição

CEP é uma mediana, não um limite. Metade das soluções é pior que 2,5 m, e a cauda é longa perto de prédios. Para um robô com 30 cm de largura, “em algum lugar a poucos metros” não é uma posição—é um bairro.

HDOP é o campo a observar. Ele descreve a geometria dos satélites, não a qualidade do sinal, e é o que produz uma resposta confiante que está errada em dezenas de metros:

HDOP Qualidade Usar?
< 1 Ideal Sim
1–2 Excelente Sim
2–5 Boa Sim, com cuidado
5–10 Moderada Somente como correção lenta
> 10 Ruim Rejeite a solução

Valide pelo HDOP e também pelo indicador de validade. Uma solução com HDOP 12 não é uma solução; é um palpite com ponto decimal.

Deriva estática e por que ela importa

Deixe um módulo GPS completamente parado por dez minutos e registre cada solução. Você verá uma nuvem com vários metros de extensão. Nada se moveu.

Esta é a observação mais importante que você deve fazer por conta própria antes de escrever qualquer código de navegação, porque ela explica por que seguir soluções brutas é inútil. Um controlador alimentado por essa nuvem a persegue, e o robô serpenteia continuamente enquanto faz pouco progresso. Faça navegação por estimativa com encoders entre as soluções e use cada solução apenas para corrigir a deriva lenta; o mesmo controlador acompanha a trajetória sem ruído—o tutorial de navegação por pontos de referência tem os números.

Configurando o módulo

Aumentar a taxa de atualização é a mudança mais valiosa, e vale fazê-la antes de qualquer outra coisa. Módulos u-blox aceitam comandos UBX binários:

// UBX-CFG-RATE: 200 ms measurement period -> 5 Hz
const uint8_t setRate5Hz[] = {
  0xB5, 0x62, 0x06, 0x08, 0x06, 0x00,
  0xC8, 0x00,          // 200 ms
  0x01, 0x00,          // one measurement per solution
  0x01, 0x00,          // align to GPS time
  0xDE, 0x6A           // checksum
};

void setup() {
  gps.begin(9600);
  delay(100);
  gps.write(setRate5Hz, sizeof(setRate5Hz));
}

Com 5 Hz, 9600 baud vira o gargalo—o conjunto completo de mensagens NMEA não cabe em 200 ms. Ou aumente a taxa de baud para 38400, ou desative as mensagens que não usa (GSV, em particular, é extenso e informa detalhes de satélites que nenhum robô precisa).

Observe que, em um NEO-6M, a configuração não persiste sem alimentação de backup no módulo. Envie-a a cada inicialização.

Solução de problemas

Sintoma Causa provável Solução
Nenhum dado TX/RX não cruzados ou baud errado TX do módulo → RX da placa; tente 9600 primeiro
Os dados chegam, mas nunca há solução Está em ambiente interno O GPS precisa de céu. Uma janela normalmente não basta
A primeira solução leva minutos Partida a frio sem almanaque Normal. Espere ao ar livre com visão clara
A posição é 0, 0 Usando uma solução inválida Valide pelo indicador de status A do RMC
A posição está muito incorreta Tratando ddmm.mmmm como graus Converta: deg + minutes/60
A posição salta vários metros Ruído normal do receptor Esperado. Faça a fusão com a odometria; nunca siga soluções brutas
A solução é confiante, mas está muito fora Geometria ruim dos satélites Rejeite soluções com HDOP acima de ~5
Menos satélites do que o esperado Antena obstruída Monte no topo, voltada para cima e longe da placa do chassi
O módulo esquentou e morreu 5 V em um pino RX de 3,3 V Verifique se a placa faz conversão de nível antes de conectar
Funciona e para a 5 Hz 9600 baud não comporta as mensagens Aumente o baud ou desative GSV

Escolhendo um módulo

Módulo Constelações Taxa Observações
NEO-6M GPS 1–5 Hz A opção barata usual. Envelhecendo, mas presente em todo lugar
NEO-M8N GPS + GLONASS + Galileo até 10 Hz Geometria e HDOP melhores—a opção sensata
NEO-M9N Compatível com multibanda até 25 Hz Visivelmente melhor em ambientes urbanos
ZED-F9P (RTK) Multibanda 20 Hz Precisão de centímetros, com estação base e canal de dados

Vale seguir o caminho de atualização em ordem. Uma taxa de atualização maior remove quase todo o problema de defasagem e não custa nada. Um receptor multiconstelação vê mais satélites, o que melhora a geometria e portanto o HDOP—essa é uma melhoria real maior do que a especificação de precisão sugere, especialmente perto de prédios. RTK alcança centímetros e pode transformar o desempenho de um robô que precisa seguir uma linha em um campo, mas exige uma estação base, um canal de correção e aproximadamente dez vezes o orçamento.

Uma coisa que nenhum módulo GPS oferece a qualquer preço: orientação enquanto o robô está parado. O rumo sobre o solo (COG) é derivado de posições sucessivas; portanto, abaixo de cerca de 1 m/s, é ruído, e a velocidade zero não tem significado. Um robô que precisa saber para que lado está voltado precisa de um magnetômetro ou giroscópio, por melhor que seja o GPS.

Explore o grafo

Usado nestas montagens

Projetos, caminhos de aprendizagem e simuladores que incluem Módulo GPS NEO-6M.

Perguntas

Perguntas frequentes sobre Módulo GPS NEO-6M

Quão preciso é realmente um NEO-6M?

Cerca de 2,5 metros metade das vezes, com uma visão clara do céu e boa geometria dos satélites—esse é o número da folha de dados e é otimista para um robô que passa ao lado de um prédio ou sob árvores. A parte importante é que ele produz respostas erradas com aparência de confiança, em vez de falhas evidentes; portanto, valide cada posição pela qualidade informada e pelo HDOP, em vez de confiar nela só porque o texto foi analisado.

O que é HDOP e por que importa mais que o número de precisão?

A diluição horizontal de precisão descreve a geometria dos satélites atualmente visíveis. Satélites espalhados pelo céu produzem uma solução bem condicionada; satélites agrupados produzem uma solução mal condicionada, e o receptor ainda informa uma posição com toda a confiança. Um HDOP abaixo de 2 é bom, e acima de aproximadamente 2,5 vale a pena rejeitar. É o campo mais útil da mensagem GGA e quase ninguém o lê.

Um módulo GPS pode dizer ao meu robô qual é a sua orientação?

Não. Uma solução é uma posição, e um robô parado voltado para o norte fornece exatamente a mesma solução que um voltado para o sul. O rumo sobre o solo é calculado a partir de posições consecutivas; portanto, só significa algo enquanto o robô está realmente se movendo—abaixo de aproximadamente 1 m/s, é principalmente ruído. Robôs móveis ao ar livre combinam GPS com um magnetômetro para obter a orientação absoluta, um giroscópio para a orientação de curta duração ou ambos.

Por que meu robô serpenteia ao seguir pontos de referência GPS?

Porque uma solução de 1 Hz está desatualizada e ruidosa ao mesmo tempo, e um seguidor de trajetória alimentado com soluções brutas avança a cada nova leitura. Medido no mesmo percurso com o mesmo controlador, uma solução de 1 Hz com ruído na escala de metro transforma 0,09 m de erro lateral RMS em 1,25 m e multiplica por quatro e meio o esforço de direção. A solução é fazer navegação por estimativa entre as soluções e usar cada nova solução para corrigir essa estimativa, não substituí-la.

Funciona em ambientes internos?

Basicamente nunca, e isso não é defeito. O sinal de um satélite GPS chega mais fraco que o piso de ruído térmico e precisa de céu sem obstrução; um telhado o bloqueia. Módulos na janela às vezes adquirem e informam grandes erros devido a reflexões múltiplas (multpercursos). Teste ao ar livre, em local aberto, e reserve um minuto para a partida a frio antes de supor que algo está quebrado.

5 V ou 3,3 V?

A maioria das placas adaptadoras tem regulador e aceita 5 V no VCC, mas a lógica do próprio módulo é de 3,3 V. Aplicar 5 V ao RX em uma placa sem conversão de nível é a maneira usual de esses módulos morrerem. Verifique a placa específica e, em caso de dúvida, aplique o sinal ao RX por um divisor—a TX do módulo em um microcontrolador de 5 V é seguro, pois 3,3 V supera o limiar de lógica alta em um AVR.

Leitura complementar

Referências