0

I am using a gps chip with my raspberry pi using python for coding and I want to get the speed from the gps and convert it to mph in a loop using a 1 second loop.

How can this be accomplished with fairly precise data? I am currently using the following code:

From gps import *
import time
import threading
import math
import RPi.GPIO as GPIO ## Import GPIO library
import time ## Import 'time' library. Allows us to use 'sleep'

GPIO.setmode(GPIO.BOARD) ## Use board pin numbering
GPIO.setup(40,GPIO.OUT) ## Setup GPIO Pin 40 to OUT

class GpsController(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.gpsd = gps(mode=WATCH_ENABLE) #starting the stream of info
        self.running = False

    def run(self):
        self.running = True
        while self.running:
            # grab EACH set of gpsd info to clear the buffer
            self.gpsd.next()

    def stopController(self):
        self.running = False

    @property
    def fix(self):
        return self.gpsd.fix

    @property
    def utc(self):
        return self.gpsd.utc

    @property
    def satellites(self):
        return self.gpsd.satellites

mph = 15

if __name__ == '__main__':
    # create the controller
    gpsc = GpsController() 
    try:
        # start controller
        gpsc.start()
        while True:
            if gpsc.fix.speed < mph :
                print "speed is under 15 mph",gpsc.fix.speed
                print mph
                GPIO.output(40,GPIO.HIGH)
                time.sleep(1)
                GPIO.output(40,GPIO.LOW)
                time.sleep(1)
                #GPIO.output(40,True)
                #time.sleep(.5)
                #GPIO.output(40,False)
                #time.sleep(.10)

            elif gpsc.fix.speed > mph :
                print "speed (m/s) ",gpsc.fix.speed
                #    GPIO.cleanup()

            else:
                print "fine"
                #GPIO.cleanup()

            #print "latitude ", gpsc.fix.laif 
            #print "longitude ", gpsc.fix.longitude
            #print "time utc ", gpsc.utc, " + ", gpsc.fix.time
            #print "altitude (m)", gpsc.fix.altitude
            #print "eps ", gpsc.fix.eps
            #print "epx ", gpsc.fix.epx
            #print "epv ", gpsc.fix.epv
            #print "ept ", gpsc.gpsd.fix.ept
            #print "speed (m/s) ", gpsc.fix.speed
            #print "climb ", gpsc.fix.climb
            #print "track ", gpsc.fix.track
            #print "mode ", gpsc.fix.mode
            #print "sats ", gpsc.satellites
            time.sleep(1)

#Error
    #except:
    #   print "Unexpected error:", sys.exc_info()[0]
    #  raise

    #Ctrl C
    except KeyboardInterrupt:
        print "User cancelled"

    finally:
        print "Stopping gps controller"
        gpsc.stopController()
        #wait for the thread to finish
        gpsc.join()

    print "Done"

GPIO.cleanup()

The current code gives me a reading but it appears to be approximately 15 mph out of sync.

Byrne
  • 15
  • 7

1 Answers1

0

You need to grab the GPS coordinates from your chip, convert them to cartesian coordinates, and subtract the current second from the previous second. The distance between the two points is then your distance traveled in one second. This will be noisy at low speeds so you may want to do some filtering of some kind.

poompt
  • 248
  • 1
  • 8