The main documentation repository for the 🍭☁️
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.


Location fun. Tracking, logging, etc

Inspiration / Further Reading


The author chose the Adafruit Ultimate GPS Breakout (link) for this guide. YMMV with other boards.


  • Connect vcc to a 3v source on the main expansion header
  • Connect gnd to a gnd on the main expansion header
  • Connect tx to rx pin of uart2 on the main expansion header
  • Connect rx to tx pin of uart2 on the main expaions header
  • Connect pps to the PA6 pin on the main expansion header


armbian-config # Enable hardware uart2 and pps-gpio
    # System
    # Hardware
    #   Enable uart2 option
    #   Enable pps-gpio option
    # Save/reboot
apt install gpsd gpsd-clients python-gps gpsbabel # necessary software
systemctl stop gpsd # stop gpsd to help with testin
gpsd -n -N -D 2 /dev/ttyS2 # run gpsd by hand
cgps -s # run a cli client to verify it works

Setup necessary gpsd defaults (daemon that provides location data to programs).

Edit /etc/default/gpsd

  • Add /dev/ttyS2 to DEVICES
  • Add -n to GPSD_OPTIONS


Setup PPS for chrony

cat >> /boot/armbianEnv.txt <<EOF
# Orange Pi PC 2e PPS Pin
# param_pps_pin=PA6
# Pine64 PPS Pin
# param_pps_pin=PH9

systemctl reboot
demsg | grep -i pps # Verify pps is enabled and shows in the kernel

Add GPS as a time source to chrony

cat >> /etc/chrony/chrony.conf <<EOF
# set larger delay to allow the NMEA source to overlap with
# the other sources and avoid the falseticker status
refclock SHM 0 refid GPS precision 1e-1 offset 0.9999 delay 0.2
refclock PPS /dev/pps0 lock NMEA


systemctl restart chrony
cgps # look for ```Status:     3D FIX```
chronyc sources -v # Should show PPS and GPS time sources as having a recent reading
chronyc tracking # Further details

NTP For Network

To enable chrony on your lollipop as the ntp server for your local clients…

cat > /etc/Networkmanager/dnsmasq-shared.d/ntp.conf <<EOF

GPX Tracks


GpxPod for NextCloud is a good viewer for GPX track recordings


### GPX Files

You can convert raw ```nmea``` data from ```gpspipe``` using ```gpsbabel```


- ```gpsbabel -t -r -w -i nmea -f /tmp/xxx.nmea -o gpx -F xxx.gpx```
- ```gpsbabel -t -i nmea -f /tmp/xxx.nmea -x track,pack,split=5m,title="LOG # %Y%m%d-%H%M" -o gpx -F out.gpx```

## Automatic Logging

The Python program used here is in the ```scripts``` directory.

``` bash

mkdir -p /tank/gps_data
chown -R gpsd:root /tank/gps_data
# put at /usr/local/bin
cat > /etc/systemd/system/gps-logger.service <<EOF
Description=Simple gps logger
After=gpsd.service gpsd.socket



systemctl daemon-reload
systemctl enable gps-logger
systemctl start gps-logger

Setup Auto GPX Track Creation/Upload

A handy trick for auto-converting your GPS log data as well as uploading it to NextCloud. The Python program used here is in the scripts directory.

cat > /etc/systemd/system/gpsconvert.service <<EOF
Description=Merge GPS logs and upload to NextCloud


cat > /etc/systemd/system/gpsconvert.timer <<EOF
Description=Run GPS log merge



systemctl daemon-reload
systemctl enable gpsconvert.timer
systemctl start gpsconvert.timer


This sets up a form of A-GPS to speed locks when indoors or having a hard time getting a lock in general.

This setup is specific to the Adafruit Ultimate GPS modules. You’ll need to adapt this if using a different GPS receiver.

Setup mt3339 utils and get latest sattelite hints

apt install python-pip python-setuptools python-wheel python3-pip python3-setuptools python3-wheel geoip-bin
pip install -U pyserial && pip3 install -U pyserial
cd /opt
git clone
cd /opt/mt3339-utils

Get your current ip address

Note: this MUST be done from your main internet connection, NOT VPN


Setup Maxmind GeoIP database

mkdir GeoLite2
cd GeoLite2
tar -xzf GeoLite2-City.tar.gz
cd ..

Get IP Address Location

pip3 install -U maxminddb
import maxminddb
reader = maxminddb.open_database('./GeoLite2/GeoLite2-City_20190402/GeoLite2-City.mmdb')
rec = reader.get('anipaddress')
print('%s,%s,0' %(rec['location']['latitude'], rec['location']['longitude']))

Seed GPS Unit With Rough Location and System Time

systemctl stop gpsd gpsd.socket gpsconvert.timer gpsconvert.service gps-logger
./epoloader --speed 9600 --time - --location python_output ./MTK14.EPO /dev/ttyS2
systemctl restart gpsd gpsd.socket gpsconvert.timer gpsconvert.service gps-logger