Now that the battery pack has arrived I can now think about making this mobile.
Before I get on to connecting up the battery, I need to make the display script start up automatically, since when it is out and about it wont have a keyboard attached in order to load the script.
Running scripts on startup can be achieved in a number of ways. I wish I could find a decent article somewhere that descripbes all the different methods and why you might choose one over the other. I have in the past modified the .profile file within the user's home folder, but in this case I need to run scripts using sudo, and I haven't been able to do that using the .profile. Therefore what I've done is used the guide from here. First I created a new file called rungui.
sudo nano /etc/init.d/rungui
and put this text into it
#! /bin/sh
# /etc/init.d/rungui
### BEGIN INIT INFO
# Provides: noip
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Simple script to start a program at boot
# Description: A simple script which will start / stop a program a boot /$
### END INIT INFO
echo 'called rungui script'
sudo killall gpsd
sudo gpsd /dev/ttyUSB0 -F /va
sudo python /home/pi/test_gui3.py
exit 0
The important lines are at the bottom
The two lines that refer to gpsd have been added since for some reason my GPS has stopped working unless you do this on every boot. I have no idea why, I don't think I have changed anything since I first got this working, but eventually I found I could fix it with these two lines. So I'm calling them on every boot of the pi.
The script is then called suing python /home/pi/test_gui3.py. I should probably rename that something sensible at some point.
Once this file is created run:
sudo update-rc.d rungui defaults
and the script should be launched automatically when the pi boots.
For the GPS integration, the articles from Kevin Townsend have been invaluable. The hardware I'm using is the Ultimate GPS Breakout Board. Mine was from Cool Components in the UK.
As per the suggestion in Kevin's article I'm also using a USB to serial converter rather than using the GPIO pins directly. I got this from Amazon UK (http://www.amazon.co.uk/gp/product/B008AGDTA4)
This worked just by plugging it into the Raspberry Pi and is accessible probably as:
/dev/ttyUSB0
The instructions on Kevin's page are really comprehensive so I wont repeat them here. The only mistake I made was in connecting the GPS breakout to the serial.
The coloured cables from the USB to serial are:
Red VCC
Black GND
Green TXD
White RXD
Everytime I do something with serial I do this wrong, and it is completely logical I just seem to do it wrong every time! The TXD from the USB to serial needs to connect to the RX on the GPS breakout. I've put a picture below. Sorry the cables for TX and RX are both yellow, it doesn't help with the understanding but it's all I had.
Once you get it all working, on the Raspberry Pi if you run
# coding=UTF-8 import pygame import sys import datetime import gps def draw_borders(screen): """Draws some simple borders to the display""" pygame.draw.lines(screen, (255, 255, 255), False, [(0, 30), (width, 30)], 2) def draw_time(screen): """Draws the time to the display""" the_time = datetime.datetime.now() time_as_string = the_time.strftime('%H:%M') font = pygame.font.Font(None, 42) text = font.render(time_as_string, 1, (255, 255, 255)) textpos = text.get_rect(centerx=screen.get_width()/2, centery=15) screen.blit(text, textpos) # paste the text into the background def draw_speed(screen, the_speed): """Draws the speed to the display""" # get the speed... if the_speed: the_speed_string = '{} kph'.format(int(the_speed)) # display as whole number else: the_speed_string = '-- kph' font = pygame.font.Font(None, 160) text = font.render(the_speed_string, 1, (255, 255, 255)) textpos = text.get_rect(centerx=screen.get_width()/2, centery=screen.get_height()/2) screen.blit(text, textpos) # paste the text into the background def draw_altitude(screen, the_altitude): """Draws the altitude to the display""" if the_altitude: the_altitude_string = '{} m'.format(the_altitude) else: the_altitude_string = '-- m' font = pygame.font.Font(None, 65) text = font.render(the_altitude_string, 1, (255, 255, 255)) textpos = text.get_rect(centerx=120, centery=screen.get_height()-20) screen.blit(text, textpos) # paste the text into the background def draw_temp(screen): """Draws the temperature to the display""" the_temp = 0 the_temp_string = u'{}°C'.format(the_temp) font = pygame.font.Font(None, 65) text = font.render(the_temp_string, 1, (255, 255, 255)) textpos = text.get_rect(centerx=screen.get_width()-80, centery=screen.get_height()-20) screen.blit(text, textpos) # paste the text into the background if __name__ == '__main__': pygame.init() size = width, height = 650, 400 black = 0, 0, 0 screen = pygame.display.set_mode(size) # set up gps if possible gps_session = gps.gps("localhost", "2947") gps_session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE) speed = None altitude = None while True: # Checks for key presses, e.g. escape to quit for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() if event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE: sys.exit() # Fill the screen with black background screen.fill(black) # get GPS data gps_report = gps_session.next() altitude_temp = gps_report.get('alt') speed_temp = gps_report.get('speed') # need to do this temp stuff otherwise it flickers # back to '--' if gps is temporarily lost if altitude_temp: altitude = altitude_temp if speed_temp: speed = speed_temp # Draw all the stuff draw_borders(screen) draw_time(screen) draw_speed(screen, speed) draw_altitude(screen, altitude) draw_temp(screen) # Update the display pygame.display.flip()
And the output:
I haven't been able to test the speed yet until I get a battery pack, but you can see that the altitude has been updated.
It is also worth looking at the other details that are stored within the gps_report variable. The Python dictionary keys are in italics.
longitude lon
latitude lat
time time
altitude alt (m)
speed speed (kph)
climb climb (m/min)
heading track (degrees) (I think)
Might be able to add more of this information in later.