BoatGPS – Breadboard to Prototype


Last year I acquired a boat. As the saying goes, if it floats or flies, be prepared to invest a lot of time and money!

Since the boat had not been used in about 8 years, several parts of the boat needed servicing or replacing, so far this has included: replacing the trailer tires, outdrive impeller, rebuilding the carburetor, replacing the fuel lines, changing the oil, etc. etc.

When I managed to get the boat running, I noticed that a couple of the boat’s instruments are no longer functioning. One of these is the boat’s speedometer. Since the original speedometer used a pitot pickup, I thought I would upgrade this to a GPS based device.

Initially I looked at investing in an off-the-shelf solution, such as the Amega GPS speedometer from Seastar Solutions (Teleflex):

Amega GPS
Amega GPS Speedo


Since this instrument requires a GPS source, as in a GPS receiver to feed it with an NMEA stream, I looked at a rival product from Faria Instruments:

Faria Instruments GPS Speedometer
Faria Instruments GPS Speedometer


This Faria product had an inbuilt GPS receiver and depicted both the cardinal and decimal heading.

Since I had some surplus GPS receiver modules, I decided to start experimenting with an Arduino based speedometer.

The initial breadboard design used a graphic 128×64 pixel LCD panel from Sparkfun :

Sparkfun Graphic LCD
Sparkfun graphic LCD:

Since this display is based on the KS0108B driver, I was able to use the GLCD library. For parsing the GPS NMEA data, I initially used my own routines, though I found that the tinyGPS library did an excellent job, so I used that! This was then connected to an Arduino Uno clone.

I used a couple of different GPS receiver engines, including the Globalsat MR-350 (which outputs non-inverted TTL serial) and a Globalsat EM406A (shown below) which outputs standard TTL serial NMEA data:

BoatGPS Breadboard
EM-406A GPS connected to an Arduino Uno (clone) and a Sparkfun 128×64 graphic LCD.

For the graphical display, I had an idea of presenting an analog sweep arm to make it easy to read – it looked like this:


Sparkfun 128×64 LCD showing an analog sweep (0-50 knots) for speed and numeric readout.


After discussing this project with a friend, he suggested that I simply build my own Arduino style controller board, and have some fun. To entice me to experiment, he sent me an ATmega1284P based controller board that he assembled in about 2 hours. So, with this new found knowledge and some reference to the Arduino Workshop (ISBN: 978-1-59327-448-1) – I built an ATmega328P based board. Essentially this is just an Arduino Uno without the FTDI interface.

An ATmega328P based controller board.

The display was mounted to the rear of the board:

BoatGPS display.
KS0108A Display on rear of the ATmega328P board.

I changed the information being presented on the display. On the left side, I have a simple compass rose which depicts the course over ground (COG), below it is the cardinal text (N, NNE, NE etc), the speed is in the middle, and on the right the units. For debugging, I display a black dot on the top left of the display each time an NMEA string is received, along with the count of satellites too.

I then stuffed this in to a cardboard box to take the device for a test drive:

BoatGPS Box
The ATmega328P controller and LCD panel in a cardboard box.

Time to clean up the display graphics and mount the device in to a boat friendly enclosure….