Jos omistat kuvan kaltaisen GPS laitteen tietokoneen USB porttiin, niin tässä artikkelissa kokeillaan koodia miten saadaan laite toimimaan. Python sopii näihin hommiin hienosti. Esimerkki on Linux koneeseen, mutta tietenkin sorvattavissa myös Win alustaan.
Tällainen GPS paikannin on kätevä jos tarvitaan tietää senhetkinen sijainti, kello tai nopeus … no niin onhan nykyään kännykässä nämä kaikki, mutta tietokoneen isompi näyttö on monesti se syy miksi halutaan käyttää sitä.
Jos halutaan GPS laitteen antama sijainti näkymään kartalla, silloin tarvitaan jokin karttaohjelma … helpoin on Google Map, kun ollaan Online tilassa.
Täytyy kuitenkin sanoa, etten varsinaisesti tiedä/muista asiasta paljoakaan, vaikka joskus tällaisen ohjelman olen tehdyt.. ohjelma ja kaikki sen mukana, hävinnyt aikojen saatossa jonnekin.
Mutta toivottavasti laitteen sielunelämä aukeaa koodauksen aikana.
Tarkennetaan vielä …tässä artikkelissa oleva koodi ei ole täydellistä , vaan jotain sinnepäin … ;)
(Alla oleva koodi ajettiin Ubuntu tai Debian koneessa)
——————————————–
Aluksi meidän täytyy etsiä laite USB portista, tähän tarvitaan Python moduuli nimeltä ”serial” , ja jos moduulia ei löydy, niin se joudutaan asentamaan, asensin omassa Ubuntussa paketti ”python-serial” joka löytyi ja asentui hienosti Synaptic:lla.
Lisää tämä koodiin
import serial
Aluksi etsitään laite portista, eri Linux distroissa laitteet voi löytyä esim. /dev/ttyUSB tai /dev/tty/USB ja Win koneessa ne on COM portteja (ToDo)
Kun kytkemme koneeseen uuden USB laitteen, hakemistoon /dev/ ilmaantuu ttyUSB0 tai ttyUSB1 tai ttyUSB2 … jne
komennolla ls /dev/ttyUSB* nähdään ilmaantuuko laite esille … ja jos ei, silloin ei ehkä kannata jatkaa tästä eteenpäin.
Sitten varsinaiseen koodiin, luodaan aluksi yhteys ja asennetaan oikeat parametrit.
ser = serial.Serial()
for i in range(ports_count):
try:
ser.port = ("/dev/ttyUSB" + str(i))
ser.baudrate = 4800
ser.bytesize = 8
ser.parity = 'N'
ser.stopbits = 1
ser.timeout = 0
ser.open()
finally:
ports_count arvona kannattaa pitää tarpeeksi isona vaikka 10-15, siis jos arvo on 15 niin laitetta etsitään väliltä 0…15
Nyt on tietenkin mahdollista että koneeseen on kytketty jokin toinen laite joka vastaa yllä esitettyyn koodiin, joten meidän on tarkistettava olemmeko oikeassa laitteessa, siksi tässä vaiheessa tutustutaan tarkemmin GPS laitteeseen. (huom. joitain debuggauksia voi olla koodissa)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import serial
import time
ser = None
port = None
ports=7 # porttien maara
def serial_create():
global ser
global port
try:
ser = serial.Serial()
for i in range(ports):
try:
ser.port = ("/dev/ttyUSB" + str(i))
ser.baudrate = 4800
ser.bytesize = 8
ser.parity = 'N'
ser.stopbits = 1
ser.timeout = 0
ser.open()
finally:
if ser.isOpen():
for x in range(3) :
time.sleep(0.5)
response = ser.readline()
# print response
if response.find("$GP") is not -1:
port = i
print 'GPS laite on portissa USB',port
return True
break
print 'loop range or sleep time ?'
break
else:print 'GPS laitetta ei kytketty'
if port is None:
print "GPS laite ei vastaa"
return False
except: #IOError:
return "serial error"
serial_create()
for x in range(15) :
time.sleep(1.0)
response = ser.readline()
print response
try:
ser.close()
except:
pass
sys.exit(0)
Esimerkin pitäisi tulostaa jotain tälläistä
GPS laite on portissa USB 0
$GPGGA,004634,,N,,E,0,00,,,M,,M,,*68
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,2,1,08,26,,,27,13,,,27,01,,,27,29,,,26*7F
$GPGSV,2,2,08,12,,,26,19,,,27,21,,,26,32,,,25*7A
$GPRMC,004634,V,,N,,E,,,010303,,,N*5C
$GPGGA,004635,,N,,E,0,00,,,M,,M,,*69
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,3,1,12,26,,,00,13,,,00,01,,,00,29,,,00*74
$GPGSV,3,2,12,12,,,00,19,,,00,21,,,00,32,,,00*72
$GPGSV,3,3,12,09,,,00,25,,,00,08,,,00,27,,,00*79
$GPRMC,004635,V,,N,,E,,,010303,,,N*5D
$GPGGA,004636,,N,,E,0,00,,,M,,M,,*6A
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,2,1,05,01,,,00,09,,,00,25,,,00,08,,,00*78
$GPGSV,2,2,05,27,,,00,,,,,,,,,,,,*79
$GPRMC,004636,V,,N,,E,,,010303,,,N*5E
(huomataan ettei paikannustietoja ole vielä saatavilla)
Seuraavaksi tätä on sitten yritettävä jotenkin tulkita.
kentästä $GPRMC ainekin löytyy helposti, latitude,longitude, nopeus jne kannattaa tutustua
allaolevaan linkkiin, sieltä selviää paljon
http://www.gpsinformation.org/dale/nmea.htm
koodin loppua voisi muuttaa vaikka näin…
serial_create()
for x in range(15) :
time.sleep(0.5)
response = ser.readline()
if response.find("$GPRMC") is not -1:
print response
A=0; O=0; lista=[]
for i in range(9):
A=response.find(',',O)
O=response.find(',',A+1)
lista.append(response[A+1:O])
print float(lista[2])/100,'latitude'
print float(lista[4])/100,'longitude'
print lista[6],'speed .. knots'
date = lista[8]
aika = date[:2]+'.'
aika += date[2:4]+':20'
aika += date[4:]
print aika,'date'
break
print 'exit'
try:
ser.close()
except:
pass
sys.exit(0)
Ja tulos voi näyttää vaikka tältä.
GPS laite on portissa USB 0
$GPRMC,220025,V,6057.1554,N,02539.6236,E,000.0,013.5,230312,,,N*64
60.571554 latitude
25.396236 longitude
000.0 speed .. knots
23.03:2012 date
exit