sexta-feira, 7 de agosto de 2015

Lendo dados de um módulo GPS no Arduino

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.

← Postagem mais recente Postagem mais antiga → Página inicial

0 comentários:

Postar um comentário