Raspberry Pi – C GPS NMEA library (Global Positioning System)
23 November 2013
A couple of weeks ago I bought a Raspberry Pi and it is an interesting board: ARM processor, 512MB RAM (v2) and many other things like GPIOs. I want to realize something that works with GPS and IMUs. This board, with raspbian and other linux based os, is not an embedded system, is more like a general purpose computer but with more interesting possibilities. First of all: Go programming language is designed also for this kind of platforms (ARM based) and this open a wide set of incredible projects and with GPIOs we can communicate easily with different peripherals.
Golang is not only designed also for ARMs but it has a very wonderful integration with C programs and libraries. For that reason I have decided to decouple the problem of realize something that can use GPS and IMUs boards in 2 main parts. The “lower part” developed in C that communicate and abstract the data layer and the second part (the general program) in Golang.
I bought a GPS board (in particular the: Adafruit Ultimate GPS Breakout – 66 channel w/10 Hz updates – Version 3) that supports the NMEA standard and can provides updates at a good rates (10Hz).
Before start buying things I have written the C library that I will use as the base layer for GPS (you can find the project here: https://github.com/wdalmut/libgps). The goal of this project is to simplify all the operation around the GPS board, for example see a GPS data logger implementation (in C).

GPS Data logger in 3 lines of code
Before starting, remember that you have to use the serial port of Raspberry Pi not through the console but with a peripheral and for that reason you have to configure your pi board (follow the manual: Connect Raspberry Pi to a microcontroller or other peripheral)
You just need the main entry point:
#include <stdio.h>
#include <stdlib.h>
#include <gps.h>
int main(void) {
// Open the communication
gps_init();
loc_t data;
while (1) {
gps_location(&data);
// You can extends adding data.speed, data.altitude, data.course (the direction)
printf("%lf %lf\n", data.latitude, data.longitude);
}
return EXIT_SUCCESS;
}
That’s all! You have just to compile your program directly on the Raspberry Pi!
gcc -o position_logger position_logger.c -lgps -lm
Now you have your compiled program (position_logger), run it!
./position_logger
You will see in the console something like this:
45.071060 7.646363
45.071082 7.646385
45.071078 7.646387
45.071060 7.646373
45.071048 7.646358
45.071052 7.646372
45.071057 7.646392
45.071062 7.646397
45.071062 7.646383
45.071073 7.646395
45.071082 7.646403
That’s all!! In just 3 lines of codes we have a GPS data logger!