O artigo de hoje é sobre o módulo GPS Neo-6M. Esse módulo GPS é simples e fácil de ser integrado em projetos com Arduino. Ótimas bibliotecas já estão disponíveis online e facilitam bastante as tarefas de conversão e tratamento da string de dados que o módulo fornece ao Arduino.
Nesse texto vamos ligar o módulo GPS Ne0-6M com um Arduino UNO e apresentar dados de localização e velocidade na tela serial do computador. Uma aplicação bacana é mostrar os dados na tela de um LCD 16×2, ou mesmo gravá-los em um datalogger para fazer análises posteriores. Também vamos dar algumas dicas nessas direções.
** Revisão em andamento – atualizações em breve**
Com certeza você sabe o que é o sistema GPS, ou pelo menos já ouviu falar dele. Embora o sistema seja usado diariamente por quase todo mundo, poucas pessoas sabem a infraestrutura que está por trás dos equipamentos GPS. A sigla é abreviação de Global Positioning System, e do ponto de vista físico, o sistema em si consiste em uma constelação de satélites, com um número mínimo de 24 satélites para manter o sistema operacional e um número alvo de 33.
O sistema GPS é mantido e administrado pela 50th Space Wing, uma das alas aéreas da Força Aérea dos EUA. Foi lançado originalmente em 1978 com objetivos militares, e acabou se tornando o backbone de toda uma indústria de equipamentos e serviços de posicionamento global.
Além da constelação de satélites, há também a rede de controle baseada em terra e os equipamentos de usuários em si. A constelação é constituída de satélites na órbit MEO (Medium Earth Orbit), a uma altitudade de aproximadamente 20200 km. Cada satélite dá a volta na Terra duas vezes por dia. O arranjo dos satélites é feito de forma que exista 6 planos orbitais igualmente espaçados circulando a Terra. Cada plano contém quatro “slots” ocupados por um satélite. Ou seja, o arranjo total compreende 24 slots, de forma que um usuário pode sempre ver(receber o sinal) de pelo menos 4 satélites de qualquer lugar do planeta.( Fonte: www.gps.gov). A imagem abaixo ilustra a constelação e seus 24 “slots”.
Constelação GPS. Fonte: www.gps.gov
Com pelo menos 4 satélites sendo percebidos por um módulo GPS, é possível saber a posição e velocidade global. Como isso é feito? Da seguinte forma: Primeiro, os dados enviados para a terra pelos satélites GPS possuem várias informações, dentre elas, as mais importantes é o tempo do momento exato em que o sinal foi enviado(cada satélite possui um preciso relógio atômico integrado para gerar essa informação). Além do tempo medido pelo relógio atômico do satélite, também é enviada a posição orbital do satélite e os tempos de chegada em diferentes pontos da órbita.
Em resumo, o seu módulo GPS(independente de modelo e fabricante) recebe de cada satélite um “timestamp” de quando o sinal foi enviado, e também a informação de onde cada satélite está posicionado(e várias outras informações). Assim, o receptor GPS sabe a distância para cada satélite. Com esses dados, o módulo calcula internamento, via triangulação de dados, a posição, velocidade e tempo exatos.
Para saber os detalhes do cálcula, acesse as seguintes referências:
É sempre bom lembrar que além do GPS, que é operado pela USAF, existem outras constelações de satélites usadas para os mesmos propósitos, como o sistema Galileu(Europa), o GLONASS(Russo) e o BeiDou(Chinês).
Para mostrar como integrar GPS ao seu projeto, vamos usar o módulo GPS Neo-6M. Esse módulo é capaz de informar a localização exata , enviando dados referentes a latitude e longitude, data, hora e velocidade de deslocamento.
Uma informação importante do Módulo GPS é sua interface serial de 3,3V, não tolerando 5V. Portanto, não aplica sinais de 5V ao módulo, lembre-se de utilizar um conversor de sinais lógicos, como faremos em nosso exemplo.
As especificações são:
Para usar o módulo, existe uma conhecida biblioteca chamada TinyGPS. Na verdade, essa biblioteca apenas faz a manipulação dos dados do GPS, evitando que você tenha que manipular as strings enormes que o módulo enviar. Outra boa biblioteca disponível é a GPSneo, que é bem semelhante à anterior.
Materiais necessários para o projeto com Arduino Uno e GPS Neo-6M
A montagem em si é bem simples pois o módulo GPS Neo-6M se comunica com Arduino via interface serial. Vamos usar um divisor de tensão simples para converter os sinais TX do Arduino(5V) para 3.3V correspondentes do RX do GPS Neo-6M. A montagem fica conforme abaixo:
Editado por Gustavo Murta
Várias montagens disponíveis na internet fazem a ligação direta dos pinos RX/TX, sem a conversão de nível de lógico. Em nossos testes, a conexão direta(sem conversão dos níveis lógicos da serial) também funcionou bem, mas recomendamos usar os níveis indicados pelo fornecedor do módulo. Qualquer teste ligando TX direto em RX é por sua conta e risco.
Podemos fazer o software de duas formas. A mais simples de todas é simplesmente ler as strings originais do módulo GPS e mostrá-las na tela serial. A segunda forma é usar uma biblioteca para tratar os dados e usar funções pré-definidas para obter apenas as informações que você pŕecisa.
O código mais simples é mostrado abaixo:
#define GPS_RX 4 #define GPS_TX 3 #define GPS_Serial_Baud 9600 #include <SoftwareSerial.h> // The serial connection to the GPS device SoftwareSerial gpsSerial(GPS_RX, GPS_TX); void setup() { Serial.begin(115200); // Beginning the serial monitor at Baudrate 115200 and make sure you select same in serial monitor gpsSerial.begin(GPS_Serial_Baud); } void loop() { //Mostra os dados crus do GPS while (gpsSerial.available() > 0) { Serial.write(gpsSerial.read()); } }
Para esse primeiro código, você vai observar mais ou menos o seguinte na sua saída serial.
Essas strings são os dados “crus” tal como GPS envia para o Arduino. Para tratar as Strings vamos usar a biblioteca TinyGPS. Fazendo as devidas adaptações nos códigos de exemplo, uma bom código de referência é o que se segue abaixo:
#define GPS_RX 4 #define GPS_TX 3 #define GPS_Serial_Baud 9600 #include <SoftwareSerial.h> #include <TinyGPS.h> TinyGPS gps; SoftwareSerial gpsSerial(GPS_RX, GPS_TX); void setup() { Serial.begin(GPS_Serial_Baud); gpsSerial.begin(GPS_Serial_Baud); } void loop() { bool newData = false; unsigned long chars; // For one second we parse GPS data and report some key values for (unsigned long start = millis(); millis() - start < 1000;) { while (gpsSerial.available()) { char c = gpsSerial.read(); // Serial.write(c); //apague o comentario para mostrar os dados crus if (gps.encode(c)) // Atribui true para newData caso novos dados sejam recebidos newData = true; } } if (newData) { float flat, flon; unsigned long age; gps.f_get_position(&flat, &flon, &age); Serial.print("LAT="); Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6); Serial.print(" LON="); Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6); Serial.print(" SAT="); Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites()); Serial.print(" PREC="); Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop()); Serial.println(); Serial.println(); } }
Com o segundo código, você obterá como saída o seguinte conjunto de mensagens:
Oberseve que com as funções gps.f_get_position e gps.satelites nós obtivemos os dados de latitude e longitude e também quantos satélites foram identificados pelo módulo. Outras funções estão disponíveis para acessar as demais informações que o módulo fornece.
Sugerimos que você explore os exemplos da biblioteca TinyGPS para conhecer as demais funções que ela disponibiliza. Para entender o significa das strings originais do módulo(lidar com os dados crus pode dar flexibilidade para implementar a sua própria biblioteca ou funções) recomendamos o site gpsinformation(em inglês).
Por fim, imagina como ficaria legal integrar um LCD e um datalogger a esse projeto! Aqui no blog também ensinamos a usar esses componentes em qualquer projeto com arduino. Confira os seguintes posts e incorpore um cartão SD e um LCD para visualizar os dados do seu módulo GPS:
Lembre-se de verificar as recomendações de seu fornecedor sobre a tensão de ligação do módulo. Se você olhar de perto, verá que os pinos RX e TX estão conectados diretamente ao módulo uBlox, que é o chip GPS em si do módulo Neo 6m. De acordo com o datasheet o Neo 6M possui tensão de alimentação de 2,7 a 3,3V.
O que permite que alguns projetos na internet liguem diretamente em 5V é o fato de o pequeno shield ao qual o módulo uBlox vem integrado possuir um adaptador de tensão. Mas o mesmo não acontece com a interface serial, que se liga direta aos ṕinos do chip uBlox, portanto, cuidado!
Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!