sunnuntai 17. marraskuuta 2013

GPS paikannin ja Python koodia



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

Ei kommentteja:

Lähetä kommentti