Visserslatijn

29 november 2014

GPS track opslaan

Filed under: Geen categorie — visserslatijn @ 17:28

De hardware werkte al tijden en nu ook de code werkt,  werd het tijd om een professionele opstelling te maken en er mee naar buiten te gaan. De BeagleBoneBlack en de GPS module hebben 5V nodig en flink wat mA. Twee lipo batterijen parallel en een dc-dc convertor uit China regelen dat deel.

Nu nog een stabiele behuizing……. ok, elastiekjes werken ook.

IMG_4720

De laatste code:


#!/usr/bin/python3

import serial
import xml.etree.ElementTree as ET

# global varables
ser = 0

#init serialport
def init_serial():
	global ser
	ser = serial.Serial()
	ser.baudrate = 115200
	ser.port = '/dev/ttyUSB0'
	ser.timeout = 1
	ser.open()
	if ser.isOpen():
		print ("open: " + ser.name)

#setup
init_serial()

#main

tijd = ""
latitude = ""
longitude = ""
datum = ""
bestandsnaam = ""
gpsfix = 0
seconde = 0
opslaan = 0
nieuwefile = 1
sluitfile = 0

while 1:
	bytes = ser.readline()
	bytes = bytes.decode("utf-8")
	if '$GNGGA' in bytes:
		lijst = bytes.split(",")
		if lijst[6] == "1":		# gps fix
			gpsfix = 1
			tijd = lijst[1]
			seconde = int(tijd[4:6])
			tijd = datum + tijd[0:2] + ":" + tijd[2:4] + ":" + tijd[4:6] + "Z"

			latitude = lijst[2] + " " + lijst[3]
			latitude1 = int(latitude[0:2])
			latitude2 = latitude[2:10]
			latitude2 = float(latitude2)
			latitude2 = latitude2 / 60
			latitude = format((latitude1 + latitude2), '.6f')

			longitude = lijst[4] + " " + lijst[5]
			longitude1 = int(longitude[0:3])
			longitude2 = float(longitude[3:10]) / 60
			longitude = format((longitude1 + longitude2), '.6f')

#			print (seconde)
			if seconde == 0:
				nieuwefile = 1
			if seconde == 59:
				sluitfile = 1
			if (seconde % 2) == 0:
				opslaan = 1
		else:
			gpsfix = 0
			print ('no fix yet')

	if '$GNZDA' in bytes:
		lijst = bytes.split(",")
		datum = lijst[4] + "-" +  lijst[3] + "-" + lijst[2] + "T"

	if ((gpsfix == 1) and (opslaan == 1)):

		if sluitfile == 1:
			tree = ET.ElementTree(root)
			tree.write('/home/debian/' + tijd + '.gpx')
			sluitfile = 0

		if nieuwefile == 1:
			root = ET.Element('gpx')
			trk = ET.SubElement(root, 'trk')
			trkseg = ET.SubElement(trk, 'trkseg')
			nieuwefile =0

		trkpt = ET.SubElement(trkseg, 'trkpt')
		trkpt.set('lat', latitude)
		trkpt.set('lon', longitude)
		trkpt.text = ''
		time = ET.SubElement(trkpt, 'time')
		time.text = tijd
		opslaan = 0

#end

Dit stukje uit de code is alles dat nodig is voor het maken van de xml file (.gpx)

elementtree2-xml

En dan natuurlijk het eveneens professionele resultaat:

elementtree-track

Er worden steeds stukjes (gpx files) met één minuut track opgeslagen, die heb ik met de hand aan elkaar geplakt en het zou best kunnen dat het deel met de elkaar kruisende lijnen verkeerd om in elkaar is gezet. Maar verder is het exact zoals het uit de GPX logger is gekomen. Nooit geweten dat ik door huizen heen kon lopen….

EDIT: Het blijkt dat de HDMI interface van de BeagleBoneBlack flink kan storen in het frequentie gebied van GPS apparatuur. Eens zien of ik dat kan uitschakelen.

26 november 2014

ElementTree, het is nog veel whoo whoo.

Filed under: Geen categorie — visserslatijn @ 22:15

Met ElementTree moet het maken van een xml simpel zijn, en waarschijnlijk is het dat ook.   Voor een gevorderde.

Mijn test programma:


import xml.etree.ElementTree as ET

root = ET.Element('gpx')
trk = ET.SubElement(root, 'trk')
trkseg = ET.SubElement(trk, 'trkseg')

trkpt = ET.SubElement(trkseg, 'trkpt')
trkpt.set('lat', '1234567890')
trkpt.set('lon', '0987654321')
trkpt.text = ''

time = ET.SubElement(trkpt, 'time')
time.text = '12:00'

trkpt = ET.SubElement(trkseg, 'trkpt')
trkpt.set('lat', 'abcdefghij')
trkpt.set('lon', 'jihgfedcba')
trkpt.text = ''

time = ET.SubElement(trkpt, 'time')
time.text = '13:00'

tree = ET.ElementTree(root)
print (ET.tostring(root))
tree.write('/tmp/output.xml')

Het resultaat:

elementtree-xml

23 november 2014

Bitbanging een XML document

Filed under: Geen categorie — visserslatijn @ 21:18

Zoals een GPIO-port door bitbanging kan veranderen in een seriele port, zo heb ik een xml document in elkaar geknutseld door strings achter elkaar te plakken en in een bestand op te slaan. Het werkt, maar fraai is het niet.

bitbang-xml

ElementTree is een betere oplossing denk ik, maar ik snap het (nog) niet.

Het resultaat:

gpx-manual

20 november 2014

Beter voorbeeld

Filed under: Geen categorie — visserslatijn @ 21:04

Dit is wat Google Earth minimaal nodig heeft om nog een track weer te geven.

gpx-minimaal

18 november 2014

Dit moet veranderen in dat.

Filed under: Geen categorie — visserslatijn @ 23:06

Het loggen werkt betrouwbaar en op de achtergrond, de code:

 


import serial

# global varables
ser = 0

#init serialport
def init_serial():
	global ser
	ser = serial.Serial()
	ser.baudrate = 115200
	ser.port = '/dev/ttyUSB0'
	ser.timeout = 1
	ser.open()
	if ser.isOpen():
		print ("open: " + ser.name)

#setup
init_serial()

#main
word1 = "$GNGGA"
word2 = "$GNZDA"

tijd = ""
latitude = ""
longitude = ""
datum = ""

gpsfix = 0
seconde = 0
opslaan = 0

while 1:
	bytes = ser.readline()
	bytes = bytes.decode("utf-8")
	if word1 in bytes:
		lijst = bytes.split(",")
		if lijst[6] == "1":		# gps fix
			gpsfix = 1
			tijd = lijst[1]
			latitude = lijst[2] + " " + lijst[3]
			longitude = lijst[4] + " " + lijst[5]
			satelliet = lijst[7]
			
			seconde = int(tijd[4:6])
			if seconde == 0:
				opslaan = 1

			tijd = tijd[0:2] + ":" + tijd[2:4] + ":" + tijd[4:6]
			latitude = latitude[0:2] + chr(176) + latitude[2:]
			longitude = longitude[0:3] + chr(176) + longitude[3:]
		else:
			gpsfix = 0

	if gpsfix == 1:
		if word2 in bytes:
			lijst = bytes.split(",")
			datum = lijst[4] + "-" +  lijst[3] + "-" + lijst[2]

	if gpsfix == 1 and opslaan == 1:
		opslaan = 0
		with open ("/media/sdcard/output.txt", "a", encoding='utf8') as bestand:
			bestand.write(datum)
			bestand.write(", ")
			bestand.write(tijd)
			bestand.write(", ")
			bestand.write(latitude)
			bestand.write(", ")
			bestand.write(longitude)
			bestand.write("\n") 
#end

De output ziet er zo uit:

2014-11-18, 19:34:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:35:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:36:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:37:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:38:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:39:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:40:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:41:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:42:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:43:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:44:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:45:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:46:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:47:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:48:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:49:00, 52°13.1973 N, 004°30.3781 E
2014-11-18, 19:50:00, 52°13.1973 N, 004°30.3781 E

Maar ik wil er iets zoals dit van maken:

gpxcode

(het lukte niet om het als tekst hier in te plakken)

16 november 2014

Python script dat NMEA data verwerkt

Filed under: Geen categorie — visserslatijn @ 09:58

Python3 op een Beaglebone Black met GPS module

bbb+gps

Dit is de data die elke seconde uit de GPS module komt:

$GNGGA,210535.000,5213.1998,N,00430.3858,E,1,12,0.9,-1.9,M,44.5,M,,0000*65
$GNGLL,5213.1998,N,00430.3858,E,210535.000,A,A*4A
$GNGSA,A,3,21,13,26,30,05,28,15,,,,,,1.7,0.9,1.4*2B
$GNGSA,A,3,77,69,67,85,68,,,,,,,,1.7,0.9,1.4*2B
$GNRMC,210535.000,A,5213.1998,N,00430.3858,E,000.0,000.0,151114,,,A*7C
$GNVTG,000.0,T,,M,000.0,N,000.0,K,A*13
$GNZDA,210535.000,15,11,2014,00,00*4B
$GNGGA,210536.000,5213.1998,N,00430.3858,E,1,12,0.9,-1.9,M,44.5,M,,0000*66
$GNGLL,5213.1998,N,00430.3858,E,210536.000,A,A*49
$GNGSA,A,3,21,13,26,30,05,28,15,,,,,,1.7,0.9,1.4*2B
$GNGSA,A,3,77,69,67,85,68,,,,,,,,1.7,0.9,1.4*2B
$GNRMC,210536.000,A,5213.1998,N,00430.3858,E,000.0,000.0,151114,,,A*7F
$GNVTG,000.0,T,,M,000.0,N,000.0,K,A*13
$GNZDA,210536.000,15,11,2014,00,00*48

Daarvan ben ik alleen (nog) geinteresseerd in de regel die start met $GNGGA omdat daar voor mij de meest interessante data zit. Tijd, latitude en longitude, GPS-lock, aantal zichtbare satellieten.


import serial

# global varables
ser = 0

#init serialport
def init_serial():
	global ser
	ser = serial.Serial()
	ser.baudrate = 115200
	ser.port = '/dev/ttyUSB0'
	ser.timeout = 1
	ser.open()
	#print if port is open or closed
	if ser.isOpen():
		print ("open: " + ser.name)

#setup
init_serial()

#main
word = "$GNGGA"
while 1:
	bytes = ser.readline()
	bytes = bytes.decode("utf-8")
#	print (len (bytes))
	if word in bytes:
#		print (bytes)
		lijst = bytes.split(",")
		if lijst[6] == "1":		# gps fix
#			print (lijst)
			tijd = lijst[1]
			latitude = lijst[2] + " " + lijst[3]
			longitude = lijst[4] + " " + lijst[5]
			satelliet = lijst[7]

			print ("time =      ", tijd)
			print ("latitude =  ", latitude)
			print ("longitude = ", longitude)
			print ("satelliet = ", satelliet)
#end

debian-bbb-gps-01

Het Rubric thema. Maak een gratis website of blog op WordPress.com.

Volg

Ontvang elk nieuw bericht direct in je inbox.