Interfaceando receptor GPS GT-3731 com Arduino

O sistema de posicionamento global (GPS) é usado a mais de 15 anos, porém somente nos últimos, se tornou algo economicamente viável para civis. Hoje temos até celulares com sistemas navegadores de GPS. Seu funcionamento consiste basicamente em um receptor receber sinais de 4 satélites, e de acordo com o tempo de recepção de cada um, calcular sua posição.

Os navegadores de carros e celulares, usam as coordenadas recebidas pelos receptores e as aplicam em seus mapas, dessa forma conseguem com precisão informar onde o aparelho receptor se encontra, qual sua altitude, velocidade, e qual é a hora local. Experimente acessar http://maps.google.com e pesquisar por “-27.00687,-51.152902” sem as aspas. Esse local indica a cidade onde moro atualmente. Experimente variar pequenos valores nestes números e verá o ponteiro “navegando” no mapa. Assim percebemos o quão “simples” é a tarefa de um navegador no que diz respeito a exibir onde você está.

Mas o que exatamente o receptor de sinal GPS envia ao navegador? Aqui tudo começa ficar muito interessante. Se adquirirmos um navegador GPS para PC, e conectarmos um serial logger nele, veremos as coordenadas no padrão NMEA 0183 que nada mais são que caracteres informando dados em determinado padrão. No meu caso, comprei no mercadolivre o receptor GT-3731 que hoje está disponível apenas em: http://www.maregps.com.br/loja/mouse-gt3731-altasensibilidade-canais-para-windows-linux-p-502.html . Na época paguei pouco mais que 120,00 reais. Hoje temos módulos menores e próprios para o que venho propor neste post, veja aqui uma lista: http://lista.mercadolivre.com.br/m%C3%B3dulo%20receptor%20gps%20.

O único problema do receptor que comprei, foi de que ele se comunica com o computador via USB. Normalmente isso é ótimo, porém quando estamos falando de sistema embarcado a melhor comunicação se faz via I2C ou Serial. Aí surge um problema: como interfacear o receptor GPS com um microcontrolador, neste caso a plataforma Arduino?

Primeiramente o que fiz foi estudar qual a comunicação entre o receptor e o PC. Sabia que era via USB, mas logo percebi que ela se faz via um adaptador Serial -> USB. Vários dispositivos de comunicação estão usando esses adaptadores hoje em dia que são baseados no módulo FT232 da FTDI. No meu curso de C, falo sobre ele: http://www.paulotrentin.com.br/programacao/curso-gratuito-programacao-c/apresentacao-e-motivacao-do-curso/ e o próprio arduino usa-o para comunicar-se entre o computador e o microprocessador. Este receptor usa o adaptador PL-2303 que também é muito conhecido, e funciona de forma semelhante ao anterior, com a diferença que no windows é reconhecido, às vezes, como mouse, aí ocorre uma interferência onde comandos do GPS são enviados para o ponteiro do mouse, e então podemos imaginar o que acontece.

Tendo em mente que em dado momento o receptor tem um sinal serial e o converte para USB, podemos logo supor que em algum lugar do circuito poderemos capturar esse sinal serial. Mas em qual lugar? Aqui entra em sena a grande vantagem de recorrer a um datasheet do circuito principal do receptor. Porém olhe na figura abaixo:

DSC06978-normal

Como podemos ver, a identificação do chip foi “raspada” pela empresa. Isso acontece muito em eletrônica e como podemos supor, é uma medida de segurança para evitar cópias de projetos. Essa marcação que vemos no chip impossibilita sua identificação, logo não teremos como acessar o datasheet do componente e identificar os pinos responsáveis pela comunicação serial.

Porém, como reparei que no conector do receptor  havia 6 pinos, sendo dois para alimentação e 2 para comunicação USB, não foi difícil imaginar que os outros dois poderiam ser para comunicação serial. Testando com um multímetro percebi que os outros dois fios que antes não eram usados, estavam diretamente conectados ao chip principal, então aumentaram ali as possibilidades para que eles fossem responsáveis pela comunicação serial:

conexão serial entre conector e chip principal

Nesta imagem, marquei as conexões existentes, identificadas com o testador de continuidade do multímetro. O fio branco é o TX e o verde o RX da comunicação serial com o chip. Tive muita sorte ao perceber que haviam dois pinos “livres” no chip e em seguida supus que poderiam estar conectados ao conector e seriam a comunicação serial.

conector receptor gps

Originalmente o conector vem com os fios verde e branco entre os fios preto e vermelho, pois serve para a conexão USB. O que fiz basicamente foi mudá-los de posição como vemos na figura ao lado. Para isso basta usar uma ferramenta com ponta e puxar a aste que trava o encaixe interno do conector, puxando-o para fora. Como podemos perceber as duas hastes que prendiam os fios estão marcadas, isto ocorreu no processo citado. Feito isto, o conector está pronto para receber sinais seriais e não USB.

Tendo os fios conectados nos pinos de comunicação serial bastou fazer o mais simples: ligá-los ao arduino. Para isso usei a porta Serial1 do arduino Mega 1280 como pode ver abaixo:

Interface gps entre arduino e gt-3731
Após tudo feito, basta fechar novamente o receptor com sua proteção metálica e fazer as conexões com o Arduino para testar. Usei a comunicação Serial1 que corresponde aos pinos 18 e 19 do Arduino Mega 1280.

Feita a parte de conexão física entre o arduino e o receptor GPS, basta agora vermos a parte lógica, o software. Aqui vem uma dica muito importante ao trabalhar com conexão serial no Arduino: use sempre a condição “if (Serial1.available() > 0 )”. Do contrário verá um registro de dados vindos do dispositivo Serial como este:

programa iniciado.
ÿ9æ02135.001,A,2700.2369,S,05109.9916,W,ÿ00ÿ0.ÿ0ÿ,31ÿ8.9ÿ,2504ÿ11ÿ,,,Aÿ*66
ÿ
$ÿGPÿVTGÿ,ÿ31ÿ8.ÿ9ÿ,Tÿ,,ÿM,ÿ000.0ÿ,N,ÿ000ÿ.0,Kÿ,A*ÿ0E
$ÿGPÿGGA,ÿ2021ÿ36ÿ.001,ÿ27ÿ00ÿ.2ÿ3ÿ69ÿ,Sÿ,0ÿ510ÿ9.991ÿ6,ÿW,1,0ÿ9,1ÿ.0,ÿ696.ÿ7,ÿM,ÿ4.0ÿ,ÿM,ÿ,0ÿ0ÿ00*6ÿ5
$ÿGPÿGSA,Aÿ,3,ÿ22,1ÿ6,1ÿ8,2ÿ1,ÿ06ÿ,ÿ03,ÿ30ÿ,ÿ15ÿ,1ÿ4ÿ,,,,ÿ1.9,ÿ1.0,ÿ1.6*ÿ36ÿ
$GPÿRMCÿ,202ÿ136ÿ.00ÿ1,ÿA,2ÿ70ÿ0.2ÿ36ÿ9,S,ÿ05ÿ109.ÿ9916ÿ,Wÿ,000.0ÿ,3ÿ18.9ÿ,ÿ25ÿ04ÿ11ÿ,,ÿ,Aÿ*65ÿ
ÿ$GPVTÿG,3ÿ18.ÿ9,T,ÿ,M,ÿ000.0ÿ,ÿN,ÿ00ÿ0ÿ.0ÿ,Kÿ,Aÿ*0Eÿ
ÿ
ÿÿÿÿÿÿ$GÿPGÿGA,ÿ202ÿ137.0ÿ0ÿ1,2ÿ70ÿ0ÿ.2ÿ36ÿ9ÿ,Sÿ,0ÿ51ÿ09.ÿ9ÿ916,ÿW,ÿ1,09,ÿ1.0ÿ,696ÿ.7,ÿM,4ÿ.0,M,ÿ,ÿ000ÿ0*ÿ6ÿ4
ÿ
ÿ$GÿPGSAÿ,A,3ÿ,22ÿ,16,1ÿ8,ÿ21,0ÿ6,03ÿ,3ÿ0,ÿ15ÿ,1ÿ4,ÿ,,ÿ,ÿ1.ÿ9,ÿ1.ÿ0,1ÿ.6*3ÿ6
ÿ$GPRMÿC,ÿ2021ÿ37.0ÿ01ÿ,Aÿ,27ÿ0ÿ0.ÿ23ÿ6ÿ9,ÿS,ÿ05ÿ109ÿ.9916ÿ,W,ÿ000.ÿ0,3ÿ18.9,ÿ25ÿ0411ÿ,,,Aÿ*6ÿ4
ÿ
$ÿGPÿVTÿGÿ,3ÿ18.9ÿ,T,ÿ,M,ÿ000.0ÿ,Nÿ,000.ÿ0,Kÿ,A*ÿ0ÿE

Isso é necessário, pois do contrário o arduino exibe informações seriais mesmo sem que elas existam gerando, para este exemplo, na maior parte do tempo lixo. Quebrei um pouco a cabeça até que descobri isso, mas no início é assim mesmo. Outro detalhe importante é a velocidade da conexão Serial1 que deve ser igual ao do dispositivo remoto qual recebemos dados. Então como o GT-3731 trabalha a 4800 bauds (4800 bits enviados por segundo, veja mais aqui: http://www.webopedia.com/TERM/B/baud.html), devemos configurar a Serial1 do Arduino para também trabalhar à 4800 baunds. Porém a comunicação entre o Arduino e o PC pode ser feita a 9600 bauds sem problemas. Segue abaixo o código fonte que exibirá no serial logger do Arduino as coordenadas enviadas pelo receptor GPS.


void setup(){
  Serial.begin(9600);
  Serial1.begin(4800);
  Serial.println("programa iniciado.");
}

void loop(){
  if (Serial1.available() > 0 ) {
    //  Lê caracteres vindos do GPS
    char c = Serial1.read();
    //  Envia caracteres em forma de Bytes
    Serial.print(c, BYTE);
  }
}

Simples assim, com Arduino chega a ser estranho o quão fácil é fazer as coisas. Iniciando o programa, podemos já conferir sua resposta:


programa iniciado.
$GPGGA,194520.001,2700.2366,S,05109.9925,W,1,10,0.9,698.5,M,4.0,M,,0000*69
$GPGSA,A,3,22,16,29,18,21,06,03,30,15,14,,,1.9,0.9,1.6*35
$GPGSV,3,1,12,22,71,305,38,16,42,272,38,29,17,052,33,18,70,148,37*73
$GPGSV,3,2,12,21,39,128,44,06,45,219,38,03,31,222,41,01,39,322,26*75
$GPGSV,3,3,12,30,40,303,39,15,17,126,39,14,18,012,32,19,03,225,*7A
$GPRMC,194520.001,A,2700.2366,S,05109.9925,W,000.0,318.9,250411,,,A*65
$GPVTG,318.9,T,,M,000.0,N,000.0,K,A*0E

Os dados acima nada mais são que sentenças NMEA Padrão 0183 que podem ser facilmente decifradas seguindo este maravilhoso tutorial do próprio site do Arduino: http://www.arduino.cc/playground/Tutorials/GPS . Ok, mas e se você quer algo já pronto para trabalhar, sem precisar escrever nada de código para analisar as sentenças? Então basta Entrar neste site http://www.maartenlamers.com/nmea/ e baixar os fontes para o Arduino, descompactar a pasta na pasta “libraries” do Arduino e incluir o cabeçalho no programa, ficando assim:


#include "WProgram.h"
//  Cria uma instancia de um objeto NMEA
#include "nmea.h"
NMEA gps(GPRMC);

void setup(){
  Serial.begin(9600);
  Serial1.begin(4800);
  Serial.println("programa iniciado.");
}

void loop(){
  if (Serial1.available() > 0 ) {
    //  Lê caracteres vindos do GPS
    char c = Serial1.read();

    //  Verifica se o valor recebido e uma sentença GPS valida
    if (gps.decode(c)) {
      //  Verifica se o posicionamento GPS esta ativo
      if (gps.gprmc_status() == 'A') {
        Serial.print("Latitude: ");
        Serial.print(gps.gprmc_latitude(), DEC);
        Serial.print("     Longitude: ");
        Serial.println(gps.gprmc_longitude(), DEC);
      }
    }
  }
}

Executando o programa acima teremos apenas a saída com latitude e longitude:


programa iniciado.
Latitude: -27.0039520263     Longitude: -51.1665420532
Latitude: -27.0039520263     Longitude: -51.1665420532
Latitude: -27.0039520263     Longitude: -51.1665420532
Latitude: -27.0039520263     Longitude: -51.1665420532

Tendo em vista a facilidade que é trabalhar com o Arduino, e o baixo custo de receptores GPS (chegando a 60 reais o módulo), tornou-se fácil e viável fazer aplicações que envovam o uso desta excelente tecnologia que com um pouco de criatividade nos permite por exemplo criar um sistema de rastreamento veicular que, apesar de já existir, ainda é uma grande inspiração de projeto.

Outras fotos do receptor GPS GT-3731

marcação de chips do receptor gps

Aqui temos a identificação dos chips do receptor GPS. O chip 1 é um receptor de sinais GPS, ele faz a parte suja, que é receber os sinais dos satélites. O chip 2 é responsável por fazer todo o processamento pesado destes sinais e possibilitar uma interface de comunicação serial. E por último o chip 3 é um PL-2303 que, como citado anteriormente, faz a conversão de um sinal serial para USB.

receptor GPS GT-3731 montado
Após aberto, estudado e testado é hora de montar a capa metálica ao receptor. Para isso apenas refiz as soldas, como podemos ver no detalhe. A luz vermelha fica piscando e indica estado de funcionamento do componente.

receptor GPS gt-3731 adaptado e pronto
Por fim, o receptor bonito e montado novamente, já com seus fios adaptados para uma conexão com protoboard ou diretamente ao Arduino.

Minha reflexão

Nunca imaginei que trabalhar com o Arduino fosse tão fácil. Nada contra a família PIC, mas vejo que os 16f628 irão se aposentar, afinal o custo/benefício é incomparável. Se gostou do POST acima, por favor, deixe seu comentário, vamos trocar ideias!

Comments

  1. Responder

  2. Responder

    • Responder

  3. Responder

  4. By Fábio Sales

    Responder

  5. By Marcelo

    Responder

    • Responder

  6. By iuri gaier

    Responder

  7. Responder

    • Responder

  8. By André makoski

    Responder

  9. By André makoski

    Responder

    • Responder

  10. By André makoski

    Responder

  11. By Eliu Lustosa

    Responder

    • Responder

  12. By André

    Responder

    • Responder

      • Responder

        • Responder

  13. By André

    Responder

  14. By EDILSON

    Responder

    • Responder

  15. By EDILSON

    Responder

    • Responder

  16. By Edilson

    Responder

  17. By julio

    Responder

    • Responder

  18. Responder

    • Responder

  19. Responder

    • Responder

    • Responder

      • Responder

  20. By Julio Ribeiro

    Responder

    • Responder

  21. By Iusley

    Responder

  22. By Paulino neto lopes

    Responder

    • Responder

  23. By paulino neto lopes

    Responder

  24. By Enio Ferraz Wilh

    Responder

    • Responder

Deixe uma resposta para Eliu Lustosa Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *