First of all, let me qualify my definition of “Hacker”. While people reading this will immediately think of “web hacker”, “maker hacker”, etc., I'm a “Golf Hacker” – When I play, I get to see ALL of the course and use ALL of my clubs many, many times. I truly “hack” my way around.
That said, this (my first) instructable will explain how I made a golf gps system that calculates the distance from my current position to the front, center and back of the green (as estimated using googlemaps) in a “close enough for a hacker” manner. While there are lots of commerical laser range finders and software driven android solutions, the expense of buying an overpriced laser or having to use expensive data on a cell phone did not impress me (I'm retired and cheap). The costs of using those commercial solutions inspired me to take a shot at creating a budget friendly GPS range calculator based on an arduino and a couple of other odds and ends. The finished product produces a distance calculation that is close enough (within a couple yards) for my use. I had most of this laying around, but if you were to purchase all of it new, total cost should be less than $100.
Step 1: Gather Your Parts and Tools
For my build, I used:
an Arduino clone;
a 4X20 LCD;
a rotary encoder (mine did not have a built in button) and knob;
a momentary push button;
double female jumpers;
an Adafruit Ultimate GPS breakout board;
a 2 cell 800mah lipo battery and JST connector with a 2.1mm barrel connector;
some header pins and shrink tubing; and
a hard shell GPS case I found on clearance at RadioShack.
For tools you will need:
solder and a soldering iron;
a wire cutter/stripper;
small pliers (for working with header pins);
shrink tubing and heat source (I used a lighter);
blue painters tape, straight pins, hobby knife, drill and bits and a helping hand/magnifier.
Step 2: Wiring Harnesses
Depending on the enclosure you use, straight headers on the GPS, LCD and encoder may interfere with clearance tolerances. In mine, I didn't have enough clearance, and I already had headers soldered in (straight, breadboard style ones), but I didn't have any 90 degree headers on hand, so I just used the female jumper leads to bend the existing headers over.
Since I had no desire to create a pcb, I decided to make wiring harnesses out of double female jumpers and header pins. Basically, I just cut the jumpers to the length I wanted, stripped the bare end and soldered on a header pin. I used shrink tubing to cover the exposed joints. Then I assembled the various jumpers into "harnesses" in order to try and keep the rat's nest somewhat orderly.
To make the power "bus bar" harnesses, I used an empty piece of the header plastic to receive the pins I previously soldered to the female jumpers, but I left one pin in the center which connects to the matching arduino power pin. I inserted the jumper pins into the plastic and then wrapped a short piece of bare wire around all of the pins and solder bridged the pins together. For the arduino harnesses, I simply reused the plastic carrier to "gather" the pins together.
Step 3: Butcher Your Enclosure and Install the Parts
My case was a really tight fit, so the first thing I did was trial fit the LCD, encoder, gps and push button. The clearance was really tight on the three larger parts, but worked with a little "press fit" pressure. Once I was satisfied I could make it work, I covered the top of the case with blue painters tape and snugged the LCD as tightly as possible to the front of the case. I then stuck straight pins through the interior of case at the corners of the LCD display, leaving tell tale holes in the painters tape.
I then cut out the area from the top, using the tell tales as a guide. I purposely made the initial cuts smaller than the needed size so I could make adjustments for the final position. I repeated this process with the gps module. By the time I got the final trimming done, both the LCD and the gps were a reasonably tight "press fit".
For the button and the encoder I used a drill and worked my way up the bit sizes until I had a similar press fit. These two are not as critical for sizing as they are both secured to the top of the case by washers and nuts.
I mounted the arduino to the bottom of the case with a couple of small bolts from the outside through the existing mounting holes on the arduino. Rather than using nuts, I used a couple of small pieces of hard plastic tubing (nyrod from my r/c parts stash) and cut them somewhat long to provide for a "reverse standoff" to help prevent movement of the arduino and/or the parts above.
The battery slips into a little mesh baggie that was part of the case and I put a small buffer of foam between the battery and the arduino. Everything is solidly in place and nothings "rattles".
Step 4: General Thoughts and Info
The schematic for the hardware is attached and is pretty straight forward. I use digital pins to drive the LCD and to receive data from the GPS, and analog pins to interpret the encoder and push button states. Since I was building this from parts I had around, and I was to lazy to use a perf board or try to etch a circuit board, I used point to point wiring by cutting double female jumpers in half and then soldering header pins to the bare ends. This lets me plug the pins into the arduino, and use the remaining female end to connect to the hardware. I did it this way to allow for easy future modifications to the hardware, or to be able to use the hardware in other projects if needed. No messy de-soldering, no pulling up pcb pads, but a definite tradeoff since the inside of the case looks like a rat's nest.
I have attached the arduino sketch which I have tried to annotate as completely as possible. Note that the sketch is pretty long (lots of floating data with 3 aiming points on each of 18 holes) and will eat virtually all of the memory in an arduino. Also attached is a text file explanation of how the sketch works, the libraries I used and an explanation of how I gathered the gps data to construct my menuing system. As this is my first attempt at writing a sketch (I know, kinda complicated for a rookie), I'm sure my code could use some work.
I really enjoyed learning Kicad and the arduino IDE in the process of building this gizmo. Needless to say, it took me awhile to produce the finished product, but from my viewpoint it was time well spent.
Any suggestions, critiques and general input will be welcomed.
Thanks for reading this instructable.