This is Project Neptune: an Arduino-based GPS data-logger for Nikon D300, D300S and D700 cameras with USB and Bluetooth connectivity.
I'm an active travel photographer, and use various hardware & software-based GPS solutions to geo-tag my images, all with distinct shortcomings when paired with my ancient (but lovely) Nikon D700. So, I've built a geo-tagging device to meet my own specific needs. (See Disclaimer.)
Leveraging what I've learned from an earlier attempt at a mobile GPS-solution (see Project Pluto), I've affectionately named this Project Neptune.
- Mounts to the bottom of a Nikon D300(S)/D700
- Powered directly from camera independent of it being on or off
- Geo-tagging of captured images directly into EXIF metadata via USB-to-10-pin cable
- Logging of co-ordinates to microSD card at 2-second intervals
- Waypoint-marking of points of interest
- Bluetooth pairing with mobile phone or Serial Port Profile (SPP)NMEA 0183-compatible device/DSLR (PIN/passkey 0000)
- LEDs to indicate satellite and Bluetooth fix, and microSD card activity
- Individual features (microSD logging, Bluetooth and LEDs) may be toggled on or off, with settings retained across power-cycles
- Arduino Sketch for uploading to an Arduino Nano or compatible clone
- Gerber file for printing a PCB
- EasyEDA project for modifying the PCB schematic
- STL file for 3D-printing a cover
Project Neptune uses the following libraries:
I had to do the following to compile against the Arduino Nano Every, though these changes may no longer be required and are not needed if an older Arduino Nano is used:
- NeoGPS: remove the
class Print
forward declarations from the following files:- DMS.h
- NeoTime.h
- SdFat: set
SPI_DRIVER_SELECT
to1
in SdFatConfig.h per greiman/SdFat-beta#42 - Change
#define F(str) (str)
in Arduino.h to#define F(str) (const __FlashStringHelper*)(str)
- Upload nikon-d300-s-d700-gps-logger.ino to an Arduino Nano or Arduino Nano Every
- Print a PCB from this repository's Gerber file, with the following settings:
- 2 layers
- 1.6mm PCB thickness
- Due to close proximity of other components on the top-side of the PCB, first solder the 5-position 2.5mm pitch female blade socket connector to the bottom-side of the board, ensuring connector's pins are facing toward the centre of the PCB
- Solder remaining components to their respective place on the PCB according to their footprint (see image of PCB's top-side)
- Find a place to secure your GPS antenna of choice; I've elected to sandwich mine between the 3.3V/5V/12V 6-color LED board and SPI microSD card adaptor using velcro (see image of PCB's top-side)
- Attach Project Neptune to your Nikon D300(S)/D700 using a 1/4-inch tripod screw. In order to ensure a secure connection, I've had to experiment with tripod screws of various sizes along with using a rubber washer (see image of completed Project Neptune). Many holes are situated along the perimeter of the PCB to allow the use of M2 screws and standoffs should additional support be needed
- Plug the Mini-USB to 10-pin cable into the PCB's USB port (not the Arduino's USB port!) and the camera
- Insert a FAT32-formatted microSD card and power on Project Neptune
- Any user-changed settings are restored from EEPROM
- If Waypoint-Marker button is held, the HC-05 Bluetooth module is re-configured as follows:
- Baud rate set to 4800 as required for Nikon D300(S)/D700 connectivity
- PIN set to 0000
- Device name set to Nikon-D300(S)-D700-GPS-Logger
- Initialize access to microSD card if one's inserted; else disable logging
- Set baud rate of u-blox NEO-6M GPS module to 4800 as required for Nikon D300(S)/D700 connectivity
- Set compatibility mode on u-blox NEO-6M GPS module and co-ordinate-system to 4-decimal places as required for Nikon D300(S)/D700 connectivity
- Up-and-running
Button | Long-Press (3-seconds) |
---|---|
Logging Button (K1 on button-board; D5 on PCB) | Toggle logging to microSD card on and off |
Bluetooth Button (K2 on button-board; D6 on PCB) | Toggle Bluetooth on and off |
Waypoint-Marker Button (K3 on button-board; D7 on PCB) | During normal use: - Record current co-ordinates in file on microSD card, regardless of logging state - Requires a satellite-fix and microSD card inserted at boot During startup: - Re-configure HC-05 Bluetooth module as follows: baud rate set to 4800 as required for Nikon D300(S)/D700 connectivity; PIN set to 0000; device name set to Nikon-D300(S)-D700-GPS-Logger |
LED Button (K4 on button-board; D8 on PCB) | Toggle LEDs on and off |
- GPS (red LED on LED board)
- Blink: No satellite-fix
- Solid: Satellite-fix
- Logging (yellow LED on LED board)
- Blink: microSD card activity
- Solid: microSD card not inserted at boot or error writing to card
- Bluetooth (blue LED on LED board)
- Blink: Searching
- Solid: Paired
- Off: Bluetooth is disabled
- Long-pressing a button to toggle individual settings on and off results in the respective LED being lit for 2-seconds to visually indicate a state change
- When logging is on:
- File yymmdd_log_nn.txt is created in the root of the microSD card with a header row each time logging state is changed to ON and a date & time is acquired from the GPS (where yymmdd equals current UTC date, and nn equals incrementing number beginning with 00)
- Given a satellite-fix, the following comma-delimited fields are appended to the file at 2-second intervals
- Latitude
- Longitude
- Speed (km/h)
- Heading (degrees)
- Altitude (floating-point meters)
- Date and Time (UTC)
- Waypoint-markers are appended to file waypoints.txt in the same format as above, regardless of logging state
Build and use at your own risk. I am not an electrical engineer, nor a working C++ developer; this is a passion-project constructed in between numerous daddy duties, household chores, and long working hours. That said, it functions as intended, and has yet to blow up.