This page is a tutorial I wrote to document the Lightweight Simple GPS Logger I use with my FPV racing mini-quad drone. The modules run at 3.3V and run independently of other systems on the drone (electrically isolated). This allows it to be installed and removed quickly and easily.
Physically, the finished design is 35mm x 24mm x 15mm without the battery and weighs 10.1 grams. The battery weighs an additional 18.4 grams as shown below.
Measurements with my DMM indicate that the entire system draws between 40-45 mA from the battery. This suggests that with the 300mAh battery at full capacity, it could conservatively run for upward of 6 hours. This is far more than the time I can fly my mini-quad with all of its flight batteries!
The u-blox NEO-6M is a 50 channel GPS receiver with the following specifications:
I used a GY-NEO6MV2 module like these ones on eBay.
This module allows a VCC of up to 5V, but the serial levels are not officially rated as 5V tolerant so serial transmitted to it should be at 3.3V.
The OpenLog is a serial logging device. Basically, any serial data you send it will be stored on its microSD card. At its core, it is a standard Arduino which can be reprogrammed via an FTDI module, meaning that the logging can be conditional if desired. Its specifications are as follows:
I bought a clone of this on eBay and was left very disappointed as it didn’t work at all. I subsequently bought and am using an authentic module (DEV-137) available at SparkFun here.
Any microSD card will work. Choose a large enough size (max 64GB) to store the data for the time period required and format it with FAT16/32.
There are many options to power these modules. I used an adjustable voltage module with a LiPo battery as follows.
This regulator is a buck converter with adjustable voltage output like these ones on eBay. Once set via the potentiometer, this produces a constant 3.3V output from an input voltage between roughly 5V and 20V.
I used a small 2 cell (2S) LiPo battery I had on hand. It is available from HobbyKing here.
A 2 cell LiPo outputs voltages from around 8.4V (4.2V per cell) and down as
low as 6V when completely empty.
I would advise not to run the battery lower than 6.6V (3.3V per cell) to avoid damaging the battery.
The u-blox module was connected to a PC via an FTDI breakout similar to this on from SparkFun.
In the u-blox software, u-center, the following were configured (hint: open the correct panel with F9):
I recommend this page for information on NMEA message structures.
The OpenLog is configured by powering the module with 3.3V and ground pins with the FAT formatted microSD card inserted.
Next, the microSD can be viewed on a computer and the config.txt file will have been created.
All that was modified was the baud rate, giving a config.txt file as follows:
The modules were wired as shown in the following image:
Here’s some photos showing how I soldered and mounted the modules using double sided tape:
Step 1: Apply power... Thats it!
Once the power is applied, all messages from the GPS are saved onto the microSD card. The LEDs on the OpenLog indicate “serial-data received” and “writing to microSD”. Once the GPS has a fix, it’s LED will flash. whilst it gains its first fix, it’s LED will be solid and it will still send serial messages but they will be sparsely populated.
Simply remove the power when finished!
An excerpt of the data seen in the 4S section of the flight in the below video is available here.
In order to make the NMEA data useful, I wrote a
small script which turns the TXT file into a CSV.
An example of the output (with some columns removed for brevity) can be found here.
# pip install git+https://github.com/bsdz/micropyGPS.git import sys import time from micropyGPS import MicropyGPS inputFile = sys.argv # eg: LOG00001.TXT outputCSV = inputFile.split(".")+'.csv' # eg: LOG00001.csv print("Input: " + inputFile) print("Output: " + outputCSV) fix_type_decode = ["","NO FIX","2D FIX","3D FIX"] my_gps = MicropyGPS() lastTime = 0 print("Processing...") with open(outputCSV, 'w') as out_file: # -- writing CSV header row -- out_file.write('DATE,TIME,SECS,LAT,LONG,"ALT\n(metres)",') out_file.write('"COURSE\n(deg, True)","GND SPEED\n(km/hr)",') # remove following line if using standard library... out_file.write('"LOCAL MAG VARIATION (deg, True)",') out_file.write('NUMBER SATS,FIX TYPE,HOR DOP,VERT DOP,POS DOP\n') # -- process the log file line by line -- with open(inputFile) as fp: for line in fp: for x in line: # -- update the GPS object with the NMEA data -- my_gps.update(x) # -- writing to CSV if required -- isNew = (lastTime != my_gps.timestamp) haveFix = (fix_type_decode[my_gps.fix_type] != "NO FIX") if isNew and haveFix: # -- saving a line to CSV. -- out_file.write(my_gps.date_string('s_dmy') + ",") out_file.write(str(my_gps.timestamp) + ":") out_file.write(str(my_gps.timestamp) + ",") out_file.write(str(my_gps.timestamp) + ",") out_file.write(my_gps.latitude_string() + ",") out_file.write(my_gps.longitude_string() + ",") out_file.write(str(my_gps.altitude) + ",") out_file.write(str(my_gps.course) + ",") out_file.write(str(my_gps.speed) + ",") # remove following line if using standard library... out_file.write(str(my_gps.mag_variation) + ",") out_file.write(str(my_gps.satellites_in_use) + ",") out_file.write(fix_type_decode[my_gps.fix_type] + ",") out_file.write(str(my_gps.hdop) + ",") out_file.write(str(my_gps.vdop) + ",") out_file.write(str(my_gps.pdop) + "\n") lastTime = my_gps.timestamp print("Done!")
I made a minor modification the micropyGPS library, to enable the local magnetic variation to be saved form the $GPRMC NMEA message. I’ve added the modified library file to the project repository. If you don’t require this information, remove the lines indicated from the file above.
I enjoy flying my mini-quad and I have wondered what speeds it achieves. This is how I use this module to answer this question.
I designed a simple 3D printed mount which suits my mini-quad as follows. It isn’t immensely strong, but my intention is to only fit the GPS for straight line speed tests so it shouldn’t need to withstand huge crashes (famous last words?).
These are some photos of it fitted to my mini-quad:
From one test flying session, I’ve found that with the type of flying I do and the setup I use, the normal maximum speeds the mini-quad does is around 110 km/hr.
As expected the data indicates that in my case, my maximum speed and average speed are impacted by the cell-count of the flight battery; increasing with more cells. The data was quite usable, buit I did find an obvious spike (around 29 seconds in the video below).
Below is a video of the test flights with logged speed overlaid.
I have found that with this CSV, the recorded track can be overlayed on
a Google Map via the GPS Visualizer website.
The code could easily be modified to produce a GPX data file or KML for use with Google Earth.