Geolocalização com GPS no Raspberry Pi

Vamos fazer funcionar o módulo GPS NEO 6M com o Raspberry Pi 3. Este é um GPS serial muito compacto e de bastante precisão.

GPS Cerâmica: GPS-NEO-6M-001

9fc0a3c312ca0a83c5a0e1815acf9ac5Levei algumas horas para conseguir colocar este cara para funcionar, especialmente porque a documentação e os vários textos de troubleshooting (na web e nas várias documentações) me levavam, cada um, para uma direção – uma grandissíssima charada!!

Já eram quase 4AM quando resolvi esta charada…e para variar ‘era algo trivial’ (depois das 200 coisas que fiz que não eram!)

Verifiquem se para a aplicação não vale a pena comprar o GPS dongle USB. De qualquer forma segue a foto do bastard que me fez ficar acordado a madrugada toda:

Seguem as especificações:

  • Tensão de Operação: 3V ou 5V
  • Modelo: GPS-NEO-6M-001
  • 25mmX25mm – modelo passivo com antena de cerâmica
  • Possui backup de dados e bateria integrada recarregável
  • Led de indicação de sinal
  • Baud Rate: 38400
  • Protocolo de saída: NMEA0183
  • Módulo U-BLOX NEO-6M compacto de alta performance
  •  Possui uma EEPROM com parâmetros que podem ser configurados via porta serial

Conectando e Configurando para Uso

Aviso que talvez esta sequência de passos pode (ou não) funcionar para o seu caso, pois na web encontrei dezenas de soluções e nenhuma funcionou para mim. Em caso de dúvida, segura o grito e entre em contato pelos comentários.

Segue a conexão entre Raspberry Pi 3 GPIO e GPS:

  • GPIO14 TX >> RX do GPS
  • GPIO15 RX >> TX do GPS
  • 5V – Pino VCC
  • GND – Pino GND

Obs 1: O RX (Receiver) de um deve conectar ao TX (Transmiter) de outro

Obs 2: Não foi utilizado o pino PPS

Estamos utilizando os pinos 14 e 15 da GPIO que possuem como ‘função especial’ servirem como porta de comunicação serial (UART) para uma infinidade de aplicações, entre elas a comunicação com GPS.

Existem 2 delas, porém devido ao Raspberry Pi 3 utilizar 1 para trabalhar com seu Bluetooth integrado, os códigos anteriores que trabalhavam com a porta ttyAMA0 não funcionam nesta versão.

Bom vamos a jornada de configurações para podermos liberar 1 das portas seriais sem precisar desabilitar o bluetooth nem carregar zilhões de bibliotecas que detonam a performance do RPi 3.

1 – Habilitar a UART (componente que trata das comunicações seriais)

Na linha de comando digite:

sudo nano /boot/config.txt

No fim do arquivo, remova o caracter de comentário (#) ou caso não exista esta linha inclua:

enable_uart=1

Salve o arquivo e saia.

2 – Remover a configuração que utiliza a porta ‘serial0’

Obs: o nome da porta é ‘serial’ com o número zero ao final e não com a letra ó

Na linha de comando:

sudo nano /boot/cmdline.txt

Em meio a única linha que existe no arquivo delete aquela que relaciona a porta ‘serial0’ com a console. No meu arquivo eu removi a seguinte parte:

console = serial0, 11520

Caso queira fazer uma cópia do arquivo ‘cmdline.txt’ antes de alterá-lo, você pode utilizar o seguinte comando:

sudo  cp  /boot/cmdline.txt  /boot/cmdline.txt.backup

criará uma cópia chamada cmdline.txt.backup no diretório /boot/

3 – Reboot e Testar se o GPS está OK

Após as alterações vamos fazer um reboot no sistema

sudo reboot

E quando estivermos aptos novamente, podemos testar se o GPS está enviando os sinais pela porta ‘serial0’ através do comando

sudo cat /dev/serial0

Uma série de números no protocolo NMEA deverá aparecer. Se isto ocorreu o GPS está fornecendo seus números pela nossa porta serial.

Porém precisamos interpretar estes números adequadamente para utilizarmos. Para isso vamos instalar uma biblioteca auxiliar chamada de GPS Daemon ou GPSD.

4 – Instalar e Configurar o GPSD

Para instalar o GPSD digitamos na linha de comando:

sudo apt-get install gpsd gpsd-clients python-gps

E assim que tiver terminado, vamos configurá-lo através do arquivo /default/gpsd

sudo nano cat/etc/default/gpsd

Certifique-se que o arquivo contenha as seguintes diretivas:

START_DAEMON=”true”
GPSD_OPTIONS=”-n”
DEVICES=”/dev/serial0″
USBAUTO=”true”
GPSD_SOCKET=”/var/run/gpsd.sock”

Para certificar que o arquivo seja carregado iremos precisamos fazer um novo reboot no sistema

sudo reboot

Após a reinicialização, precisamos desabilitar quais serviços ainda pendentes na ‘serial0’, utilizando o novo serviço da versão Raspbian Jessie conhecido como serial-getty.

sudo systemctl stop serial-getty@serial0.service
sudo systemctl disable serial-getty@serial0.service

O comando de disable acima, assegura que mesmo no reboot os serviços da serial0 não serão mais utilizados pelo Raspberry Pi e estará atrelado ao nosso serviço de GPS.

Para iniciar os serviços do GPSD:

sudo systemctl start gpsd.socket

É possível conferir se está tudo ok utilizando a opção ‘status’

sudo systemctl status gpsd.socket

Confirmando que está tudo ok, vamos habilitar para que o GPSD esteja disponível mesmo depois do reboot do RPi 3

sudo systemctl enable gpsd.socket

5 – Visualizar os dados em formato amigável

Agora que temos certeza que cada parte cumpriu seu papel, vamos utilizar o viewer do GPSD para visualizar todos os dados disponibilizados pelo GPS.

sudo cgps -s

Você irá receber uma tela mais ou menos como esta, dependendo do número de satélites que o GPS esteja captando no momento.

gps_client

Obs: hoje estava tão nublado que a maioria dos dados não apareceram, resolvi pegar alguma tela da web para ficar mais claro o exemplo.

It’s Coding Time

Vou deixar o código de outro aventureiro do GPS bem didático e portável para futuras aplicações, desenvolvido por Dan Mandle

#! /usr/bin/python
# Written by Dan Mandle http://dan.mandle.me September 2012
# License: GPL 2.0

import os
from gps import *
from time import *
import time
import threading

gpsd = None #seting the global variable

os.system('clear') #clear the terminal (optional)

class GpsPoller(threading.Thread):
 def __init__(self):
 threading.Thread.__init__(self)
 global gpsd #bring it in scope
 gpsd = gps(mode=WATCH_ENABLE) #starting the stream of info
 self.current_value = None
 self.running = True #setting the thread running to true

def run(self):
 global gpsd
 while gpsp.running:
 gpsd.next() #this will continue to loop and grab EACH set of gpsd info to clear the buffer

if __name__ == '__main__':
 gpsp = GpsPoller() # create the thread
 try:
 gpsp.start() # start it up
 while True:
 #It may take a second or two to get good data
 #print gpsd.fix.latitude,', ',gpsd.fix.longitude,' Time: ',gpsd.utc

os.system('clear')

print
 print ' GPS reading'
 print '----------------------------------------'
 print 'latitude ' , gpsd.fix.latitude
 print 'longitude ' , gpsd.fix.longitude
 print 'time utc ' , gpsd.utc,' + ', gpsd.fix.time
 print 'altitude (m)' , gpsd.fix.altitude
 print 'eps ' , gpsd.fix.eps
 print 'epx ' , gpsd.fix.epx
 print 'epv ' , gpsd.fix.epv
 print 'ept ' , gpsd.fix.ept
 print 'speed (m/s) ' , gpsd.fix.speed
 print 'climb ' , gpsd.fix.climb
 print 'track ' , gpsd.fix.track
 print 'mode ' , gpsd.fix.mode
 print
 print 'sats ' , gpsd.satellites

time.sleep(5) #set to whatever

except (KeyboardInterrupt, SystemExit): #when you press ctrl+c

Espero que com este post você tenha levado apenas alguns minutos para configurar e utilizar este fela**, pois é um ótimo GPS com várias funcionalidades disponíveis, baixo custo, pequeno e com antena embutida.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s