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
floatcomporta. 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