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.
|
0 comentários:
Postar um comentário