74 lines
2.1 KiB
Python
74 lines
2.1 KiB
Python
import serial, time
|
|
import smbus
|
|
import math
|
|
import RPi.GPIO as GPIO
|
|
import struct
|
|
import sys
|
|
|
|
ser = serial.Serial('/dev/ttyAMA0', 9600, timeout = 0) #Open the serial port at 9600 baud
|
|
ser.flush()
|
|
|
|
def readlineCR():
|
|
rv = ""
|
|
while True:
|
|
time.sleep(0.001) # This is the critical part. A small pause
|
|
# works really well here.
|
|
ch = ser.read()
|
|
rv += ch
|
|
if ch=='\r' or ch=='':
|
|
return rv
|
|
|
|
class GPS:
|
|
#The GPS module used is a Grove GPS module http://www.seeedstudio.com/depot/Grove-GPS-p-959.html
|
|
inp=[]
|
|
# Refer to SIM28 NMEA spec file http://www.seeedstudio.com/wiki/images/a/a0/SIM28_DATA_File.zip
|
|
GGA=[]
|
|
|
|
#Read data from the GPS
|
|
def read(self):
|
|
while True:
|
|
# GPS.inp=ser.readline()
|
|
GPS.inp = readlineCR().strip()
|
|
if GPS.inp[:6] =='$GPGGA': # GGA data , packet 1, has all the data we need
|
|
break
|
|
time.sleep(0.1)
|
|
try:
|
|
ind=GPS.inp.index('$GPGGA',5,len(GPS.inp)) #Sometimes multiple GPS data packets come into the stream. Take the data only after the last '$GPGGA' is seen
|
|
GPS.inp=GPS.inp[ind:]
|
|
except ValueError:
|
|
print ""
|
|
GPS.GGA=GPS.inp.split(",") #Split the stream into individual parts
|
|
return [GPS.GGA]
|
|
|
|
#Split the data into individual elements
|
|
def vals(self):
|
|
time=GPS.GGA[1]
|
|
lat=GPS.GGA[2]
|
|
lat_ns=GPS.GGA[3]
|
|
long=GPS.GGA[4]
|
|
long_ew=GPS.GGA[5]
|
|
fix=GPS.GGA[6]
|
|
sats=GPS.GGA[7]
|
|
alt=GPS.GGA[9]
|
|
return [time,fix,sats,alt,lat,lat_ns,long,long_ew]
|
|
|
|
g=GPS()
|
|
f=open("gps_data.csv",'w') #Open file to log the data
|
|
f.write("name,latitude,longitude\n") #Write the header to the top of the file
|
|
ind=0
|
|
while True:
|
|
try:
|
|
x=g.read() #Read from GPS
|
|
[t,fix,sats,alt,lat,lat_ns,long,long_ew]=g.vals() #Get the individial values
|
|
print "Time:",t,"Fix status:",fix,"Sats in view:",sats,"Altitude",alt,"Lat:",lat,lat_ns,"Long:",long,long_ew
|
|
s=str(t)+","+str(float(lat)/100)+","+str(float(long)/100)+"\n"
|
|
f.write(s) #Save to file
|
|
time.sleep(2)
|
|
except IndexError:
|
|
print "Unable to read"
|
|
except KeyboardInterrupt:
|
|
f.close()
|
|
print "Exiting"
|
|
sys.exit(0)
|
|
except:
|
|
print "Raw String appears to be empty."
|