Sunday, November 18, 2018

DIY GPS for Nikon D7000

Hello All,

With this unit plugged in, all pictures will be geo-tagged automatically secondly, camera clock will automatically be synced. Though there are GPS unit available in market for camera but for me it was fun to put it all together and do it as DIY project.

Here is how you can build your own unit.

Tech details before we proceed

Nikon D7000 → GPS input should be plugged into shutter release cable. Shutter release cable uses two wires which triggers Focus and Shutter release. GPS data needs another wire, only input, and data needs to go in TTL input with 4800 baud rate.

Adafruit GPS breakout board →  Works with 3.5V/5V input. Default baud rate of the unit is 9600. To get it to work at 4800, we need to have backup battery (CR1220 coin cell). Arduino / USB to TTL adapter to send GPS command to change baud rate of the unit.

MC-DC2 to USB Mini pin cable → Use multimeter to to figure out which MC-DC2 pin leads to USB pin.



USB Mini B breakout board

  • VCC → this draws power from camera
  • D - → shutter
  • D + → GPS Data in @ 4800 baud rate
  • ID → Focus 
  • "ID" pin is "D-" pin is for Shutter release

Once USB breakout board is connected to camera, it starts drawing power. There is no off switch. You can have GPS data flow in continuously or add a switch. I didn't add switch on purpose as I won't leave cable connected to camera on continuous basis.

If you are planning to use camera with shutter release cable, you will have to extend this circuit to have addition connections/controls for cable release. Have your cable control connected to PIN ID and D-. The way it works is with half shutter button press, Focus pin(ID pin on USB breakout) needs to be active and with full press Shutter pin needs to be active (D- pin on USB breakout). Note that with full press both(ID and D-) pins should be active.

As of now, I have only GPS data flowing in and I will not be using cable release controls.

Circuit

Components
  1. Nikon D7000 camera
  2. Adafruit GPS breakout (https://learn.adafruit.com/adafruit-ultimate-gps)
    • Mount header pins
    • Add coin cell at the back of the unit
  3. USB Mini B breakout board (https://core-electronics.com.au/breakout-board-for-usb-mini-b.html)
  4. MC-DC2 to Mini USB B cable (Search ebay for "Micnova GPS-N-7 Camera GPS cable for Nikon")
  5. A protoyping board
  6. CR1220 coin cell
  7. 9 PIN female header pin (to make GPS breakout board plug-n-play. I intend to use GPS in other applications as well)
  8. USB to TTL Converter (Amazon link) / Arduino Uno
Prototyping
First we need to get GPS unit working at 4800 baud rate. Adafruit GPS unit by default runs at 9600 baud rate. I ended up using Arduino Uno board and modified echo example to set set baud rate of GPS unit to 4800. The command we need to send it to GPS RX terminal is "$PMTK251,4800*14". Alternatively, you can use USB to TTL converter with any program which can communicates over TTL.

Arduino Code for ref.
#include 
// Connect the GPS Power pin to 5V
// Connect the GPS Ground pin to ground
// If using software serial (sketch example default):
//   Connect the GPS TX (transmit) pin to Digital 3
//   Connect the GPS RX (receive) pin to Digital 2

// If using software serial, keep these lines enabled
// (you can change the pin numbers to match your wiring):
#if ARDUINO >= 100
  SoftwareSerial mySerial(3, 2);
#else
  NewSoftSerial mySerial(3, 2);
#endif
Adafruit_GPS GPS(&mySerial);

#define GPSECHO  true

// this keeps track of whether we're using the interrupt
// off by default!
boolean usingInterrupt = false;
void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy

void setup() {    
  // connect at 115200 so we can read the GPS fast enuf and
  // also spit it out
  Serial.begin(115200);
  Serial.println("Adafruit GPS library basic test!");

  // 9600 NMEA is the default baud rate for MTK - some use 4800
  GPS.begin(9600);
  GPS.sendCommand("$PMTK251,4800*14");
  delay(1000);
  // You can adjust which sentences to have the module emit, below
  
  // uncomment this line to turn on RMC (recommended minimum) and GGA (fix data) including altitude
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_5HZ);
  GPS.sendCommand(PMTK_API_SET_FIX_CTL_5HZ);
}

void loop() {

}


Please note: changing baud rate is one time activity - until backup battery on GPS unit runs out.

Verify the data that it works at 4800 baud rate. I have used USB to TTL converter.

Assembly
Let's put everything on breadboard to verify all connections work as expected.




Finished Product

Once everything is verified on breadboard, I hardwired the connection on prototyping board. And last is field test. :)




Field test


No comments: