Seu Curso

  • Full Screen
  • Wide Screen
  • Narrow Screen
  • Increase font size
  • Default font size
  • Decrease font size

Lendo dados de um módulo GPS no Arduino

Imprimir
Avaliação do Usuário: / 27
PiorMelhor 

Ler dados de um módulo GPS no Arduino é uma das tarefas mais simples que há, porém com alguns pequenos detalhes que fazem a total diferença.

A facilidade reside em os módulos GPS existentes no mercado transmitirem suas informações, como localização geográfica, data, hora, altitude, velocidade de deslocamento e etc. através de comunicação serial, perfeita e simplesmente implementáveis no Arduino, o porém está em o Arduino possuir apenas uma interface serial, ou seja, a mesma interface que podemos utilizar para ver os dados no computador é a que deveria ser utilizada para comunicação com o GPS.

Podemos resolver esse problema usando a biblioteca SoftwareSerial, inclusa no ambiente de desenvolvimento do Arduino. Com ela é possível criar uma interface serial via software em qualquer par de pinos digitais da placa, sendo um para recepção e outro para envio de dados.

Vamos ver isso na prática:

Utilizarei o módulo GPS GT-320R, comprado na Tato Equipamentos Eletrônicos (www.tato.ind.br) , de funcionamento exatamente compatível com qualquer outro existente hoje em dia no mercado:

 

 

 

Ligue os pinos de alimentação ao Arduino. Atenção às tolerâncias de voltagem! O módulo GT-320R opera na faixa dos 3,8V até 8V, então irei liga-lo diretamente ao 5V do Arduino, verifique a especificação do seu módulo, caso esteja utilizando outro, para evitar danos ao equipamento.

Ligue o pino TX do GPS ao pino digital 2 do Arduino e o pino RX do GPS ao pino digital 3. Na realidade o pino RX é totalmente desnecessário em um primeiro momento já que não será necessário enviar comandos ao GPS, apenas receber seus dados:

 

 


Com um programa muito reduzido podemos receber os dados do GPS:



#include <SoftwareSerial.h>
SoftwareSerial gps(2,3); 
void setup() {
Serial.begin(9600);
gps.begin(4800);
delay(100);
}
void loop() {
char entrada = 0;
String resposta = "";
while((entrada = gps.read()) != 10) {
if(entrada > 0) 
resposta += entrada;
}
if(!resposta.equals("")) Serial.println(resposta);
}



Com o comando SoftwareSerial gps(2,3); indicamos que os pinos 2 e 3 serão utilizados para, respectivamente, receber (RX) e transmitir (TX) dados seriais através da porta serial virtual que será criada e atenderá pelo nome de gps.

Em Serial.begin(9600); inicializamos a porta serial física do Arduino, nos pinos 0 (RX) e 1 (TX) com a taxa de transferência de 9.600bps. E em gps.begin(4800); inicializamos a porta serial virtual criada nos pinos 2 (RX) e 3 (TX) com a taxa de transferência de 4.800bps que é a taxa requerida para esse módulo GPS.

No laço principal do programa (loop) lemos dados do gps até que o retorno seja o caracter 10 (line feed) que é o finalizador de final de String formada pelo GPS, após ter a resposta completa enviamos para serialmente para o computador.

Para ver esses dados basta fazer upload para o Arduino e abrir o Serial Monitor:

 


 

Baseado nisso você pode criar sua aplicação para tratar os dados do GPS, mas você precisa saber ainda que os dados retornados estão no formato NMEA (National Marine Electronics Association’s), mais detalhes podem ser conhecidos em http://www.nmea.org, mas vamos ao básico pelo menos:

Toda String no formato NMEA começa com os caracteres $GP, seguidas por um sufixo que indica as informações que virão a seguir. Informações essas que seguem separadas por vírgula e terminadas com os caracteres 13h e 10h (carriage return e line feed):

 

GGA – indica o horário, a posição, o número de satélites GPS detectados e etc.

Formato exemplo:

$GPGGA,104549.04,2447.2038,N,12100.4990,E,1,06,01.7,00078.8,M,0016.3,M,,*5C<13><10>

Onde:

 

Campo

Exemplo

Descrição

1

104549.04

Tempo universal de 000000.00 até 235959.99

2

2447.2038

Latitude no formato ddmm.mmmm com zeros à esquerda

3

N

Indicador de hemisfério latitudinal, N para Norte e S para Sul

4

12100.4990

Longitude no formato ddmm.mmmm com zeros à esquerda

5

E

Indicador de hemisfério longitudinal, E para Leste e W para Oeste

6

1

Indicador de correção para a qualidade da posição, sendo:

0 – posição inválida

1 – posição válida, modo SPS

2 – posição válida, modo GPS diferencial

7

06

Número de satélites em uso de 0 até 12

8

01.7

Diluição horizontal da precisão de 0.0 até 99.9

9

00078.8

Altitude em relação ao nível do mar de -9999.9 até 17999.9

10

0016.3

Altitude geoidal de -999.9 até 9999.9

11

M (77)

Tempo desde a última transmissão válida em segundos, null caso do não uso do Posicionamento Global Diferencial (DGPS)

12

 

Identificação da estação diferencial de 0000 até 1023

13

5C

Checksum. Número hezadecimal iniciado por * que indica um OR-exclusivo lógico entre todos os caracteres retornados entre o caractere $ e * da String.

 

GSA – indica o modo de operação do receptor GPS, satélites usados e etc.

Formato exemplo:

$GPGSA,A,3,26,21,,,09,17,,,,,,,10.8,02.1,10.6*07<13><10>

Onde:

 

Campo

Exemplo

Descrição

1

A

Modo de operação, sendo:

A – automático

M – manual

2

3

Tipo de correção, sendo:

1 – não disponível

2 – correção 2D

3 – correção 3D

3

26,21,,,09,17,,,,,,

Números dos satélites utilizados, de 1 até 32, máximo 12 por transmissão

4

10.8

Diluição da precisão da posição de 00.0 até 99.9

5

02.1

Diluição horizontal da precisão da posição de 00.0 até 99.9

6

10.6

Diluição vertical da precisão da posição de 00.0 até 99.9

7

07

Checksum. Número hezadecimal iniciado por * que indica um OR-exclusivo lógico entre todos os caracteres retornados entre o caractere $ e * da String.

 

GSV – satélites em visada

Formato exemplo:

$GPGSV,2,1,08,26,50,016,40,09,50,173,39,21,43,316,38,17,41,144,42*7C<13><10>

Onde:

 

Campo

Exemplo

Descrição

1

2

Número total de mensagens GSV a serem transmitidas

2

1

Número da mensagem GSV atual

3

08

Total de satélites em visada de 0 até 12

4

26

Número do satélite, sendo:

01 até 32 – GPS

33 até 64 – SBAS

5

50

Elevação do satélite de 00 até 99 graus

6

016

Azimute do satélite de 00 até 359 graus

7

40

Potência de 00 até 99 dB, sendo null quando não recebendo dados

8

7C

Checksum. Número hezadecimal iniciado por * que indica um OR-exclusivo lógico entre todos os caracteres retornados entre o caractere $ e * da String.

 

RMC – data, hora, posição e velocidade

Formato exemplo:

$GPRMC,104549.04,A,2447.2038,N,12100.4990,E,016.0,221.0,250304,003.3,W,A*22<13><10>

Onde:

 

Campo

Exemplo

Descrição

1

104549.04

Tempo universal no formato hhmmss.ss de 000000.00 até 235959.99

2

A

Status, sendo:

A – posição válida

V – alerta do receptor de navegação

3

2447.2038

Latitude no formato ddmm.mmmm com zeros à esquerda

4

N

Indicador de hemisfério latitudinal, N para Norte e S para Sul

5

12100.4990

Longitude no formato ddmm.mmmm com zeros à esquerda

6

E

Indicador de hemisfério longitudinal, E para Leste e W para Oeste

7

016.0

Velocidade em knots (nós) de 000.0 até 999.99

8

221.0

Direção em graus de 000.0 até 359.9

9

250304

Data no formato ddmmaa

10

003.3

Variação magnética de 000.0 até 180.00 graus

11

W

Direção da variação magnética, sendo:

E para leste

W para oeste

12

A

Indicador de modo de operação, sendo:

N – dados inválidos

A – autônomo

D – diferencial

E - estimado

13

7C

Checksum. Número hezadecimal iniciado por * que indica um OR-exclusivo lógico entre todos os caracteres retornados entre o caractere $ e * da String.

 

Comentários  

 
0 #11 GPS Tyco a 1029-bTiago.dsnts 06-03-2016 01:03
Estou com um módulo GPS Tyco a 1029-b e não consigo fazer ele funcionar de jeito nenhum, no serial só aparece uma sequencia de "E" (maiúsculo).
Citar
 
 
+5 #10 Lendo dados especificosLucio Lira 13-07-2015 23:35
Como posso ler apenas uma parte da linha, por exemplo quero utilizar a hora, mas aproveitar somente a hora e salvar em uma variável inteira de depois mostrar em serial.
Citar
 
 
+1 #9 saida de pulsoflavio ramos 23-03-2015 22:27
Boa noite esse modelo de receptor tem saida de pulso
Citar
 
 
+2 #8 GPS garmin e arduinoFernando Bryan Frizzarin 14-10-2012 12:04
Sim, teoricamente funciona com qualquer GPS com interface serial, mas é preciso saber o baud rate (velocidade de comunicação). Pela imagem me parece que esse é o problema.
Citar
 
 
+5 #7 GPS garmin e arduinoAndre_Luiz 12-10-2012 01:38
Gostaria de saber se eu utilizar outro GPS vou ter a mesma tela no serial Monitor.
Tenho um GPS garmin 18xLVC, utilizei seu código mas na tela Serial Monitor o que aparece para mim são textos ilegíveis.
Olhe a imagem: http://imageshack.us/f/255/19479906.jpg/
Citar
 
 
+5 #6 Comunicação entre ArduinosFernando Bryan Frizzarin 05-10-2012 13:29
Erick, fico contente em ter ajudado. Que tal você escrever um tutorial sobre isso e postar aqui? Será muito bem vindo!
Citar
 
 
+7 #5 Comunicaçaõ entre ArduinosErick Ferreira 05-10-2012 10:30
Fernando, obrigado por responder meus posts, consegui fazer a comunicação finalmente.
Só para compartilhar com o pessoal o constatei no meu exemplo..
Tanto a o pino rx quanto tx no arduino precisam estar conectados (pelo que percebi, se apenas um estiver conectado ele envia porem envia lixo)
E sobre enviar caracteres, eu utilizei o serial.print() ao invez de serial.write() (o write retorna em bytes). É uma coisa simples, mas que acabei não me atentando para isso e compartilho.
Vlw
Citar
 
 
+4 #4 Comunicação entre ArduinosFernando Bryan Frizzarin 05-10-2012 07:48
Erick, em dois pinos de cada Arduino crie uma porta serial usando o SoftwareSerial, depois ligue o TX de um ao RX do outro, assim você poderá transmitir qualquer tipo de informação e não só 0 e 1.
Citar
 
 
+6 #3 Comunicação entre 2 ArduinosErick Ferreira 03-10-2012 08:41
No meu exemplo, apenas um envia e outro apenas recebe..
Para enviar eu estou usando apenas um mySerial.write("enviar"); (seria igual ao seu gps)
mas andei dando uma procuranda pela net e vi que o write do arduino apenas envia 1 ou 0 (foi pelo menos o que eu entendi)
agora nem to mais recebendo os dados no outro arduino
Citar
 
 
+2 #2 Comunicação entre 2 ArduinosFernando Bryan Frizzarin 01-10-2012 13:36
Erick, sim, os dois terão que ter a mesma taxa de transferência, isso é essencial. No seu esquema os dois transmitem ou é apenas um?
Citar
 

Adicionar comentário


Código de segurança
Atualizar

You are here: