Avaliação do Usuário

Estrela inativaEstrela inativaEstrela inativaEstrela inativaEstrela inativa
 

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:



{code}

#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);

}
{/code}



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.