Introduction: Wireless Mechanical Shutter Release

Edit (3/29/2014): When I first posted this instructible earlier this month I didn't describe what I was going to be using this rig for or where my requirements were derived from, but now that I have gotten some film back I thought I would share.

I needed a way to take low volume high resolution photos of liquid rocket launches and static fire (hold down) tests in the Mojave desert. Last weekend was my first opportunity to photograph such tests with this wireless shutter release on my Pentax film camera and I was very pleased with the results. I have added a results section at the end of this instructable that reflects some of my lessons learned from that weekend.


I needed to take high resolution photos remotely with my Pentax 645 medium format film camera. I could not find any off the shelf solution, let alone one that meet my requirements, so I decided to build my own.


  1. Triggered by a remote TTL level signal or a remote break-wire
  2. Wireless trigger range >100 ft. (expandable to 1000ft.)
  3. Robust method of serial communication to avoid inadvertent shutter actuations.
  4. Mount to camera in less than 30 seconds


  1. A 2.4GHz xBee modem DIO pin changes state based on a user defined input
  2. The xBee modems are configured for DIO line passing, which sets up virtual wires between matching DIO pins on two paired modems, so when the DIO line on the remote node changes so does the matching DIO line on the camera node
  3. The output of the Camera node DIO line pulls a pin high on a simple microcontroller
  4. The microcontroller issues a command to a servo
  5. The servo depresses a shutter release cable
  6. The shutter release cable trips the shutter of the attached camera.

Step 1: List of Required Materials and Rational for Selection



Any small enclosure will work. I selected the small plastic model from Adafruit because I was already ordering parts from there and I liked the captive screws. I always recommend plastic enclosures for electronics projects because they are easier to machine, and there is less risk of shorting out components due to conductive FOD; the modem will also have trouble transmitting out of a completely metal enclosure.

Series 1 xBee Modem with Wire Antenna
Are xBee units overkill for this simple 1 channel DIO line passing project? Yes, they absolutely are, but the environment it needs to operate in will have many other RF sources on bands that I can not always know ahead of time. The xBee modems use packetized transmissions that are unicasted to specific modem, this makes it nearly impossible for to recieve a false positive signal and actuate the shutter. This also provided me my first opportunity to learn how to do DIO line passing with an xBee modem, a very handy feature which I explain in great detail in a few steps. If you are looking for a less robust and much cheaper RF transmitter option sparkfun has a few options here, here and here; I can't vouch for them, but if you use them successfully post a comment and let us know how they work.

If you want more range and power consumption is not a constraint to your design you could also get the Series 1 xBee Pro which has a Line Of Site (LOS) range of 1 Mile, compared the regular xBee (which I used) with a LOS range of 300ft. If I ever need more range I can easily swap out my current xBees for xBee Pro's because the adafruit adapter can accept both.

Wire (whip) antenna vs. Chip Antenna - Wire (also know as whip) antennas will get you better range, reference here figure 1 on page 3.

Unless you have a special application only get "Series 1" xBee modems, not Series 2 or ZB or any other types.

xBee Adapter
Any xBee adapter will work, I just prefer the one that Adafruit makes. Sparkfun also sells one here.

FTDI Interface to configure xBee
You need some way to connect the xBee unit to a USB port so you can configure it. There are many different flavors of these, but I prefer the one that Adafruit makes because it simply plugs into their xBee adapter. Sparkfun also makes one here.

The shutter release cable does not require a great deal of throw or force to actuate the shutter, so nearly any servo should do the job, I selected this primarily due to its small size.

The microcontroller doesn't need to do much, it only needs two DIO pins and a servo library. The Adafruit Trinket fit the bill perfectly and only cost $8.

7.4V Li-Polymer Battery
Any batteries will work as long as they fit your power budget and size constraints. I had one of these little Lithium batteries from Sparkfun lying around so I used it. I did buy a back-up AA holder just in case I ran into trouble here. I also used a 8.4V Ni-Mh battery for my remote (sensor) node. 

Shutter Release Cable
No special requirements here, unless you want it to look extra cool, then get it in red.

I got one free with may Adafruit order. Now I see why she gives these way, they are pretty nice will need to order more. You will need two, one for the sensor (remote) node and one for the base (camera) node.

Wire to board connectors
Use whatever flavor you prefer, I had these big screw terminals lying around so I used them. If I was to do this again I would have used these.

Wire to wire connector 
Once again whatever flavor you prefer, I had 0.062" Molex connectors on hand, so I used them. 

Whenever I do board level work I try to use the nice stuff: Mil-Spec M22759/16.

Hot Shoe to 1/4-20 adapter
This is how we will mount the box to the top of nearly any film camera.

5V Linear Regulator
To regulate the battery voltage down to 5 volts.

10k Resistor
You need one 10k resistor to pull up (or down) the DIO7 pin on the remote (sensor) node, because it does not have an internal pull-up. 


1. Soldering Iron
2. Drill
3. Assorted drill bits, up to 1/2"
4. Dremel with cut-off disks
5. Wire stripper
6. Diagonal Cutters
7. Multimeter
8. Breadboard
9. Windows Computer
10. Small piece of plastic, wood, or rigid foam
11. Epoxy / Hot glue
12. Super Glue

Step 2: XBee DIO Line Passing

Series 1 xBee modems support a very hand and seemingly very simple feature called DIO line-passing that allows the user to pull any of 8 DIO pins high or low on one xBee module and the corresponding DIO pin on another xBee module will mirror it, basically creating a "virtual wire" free from any external microcontroller support or serial parsing.

I dug through several references including the xBee manual to determine how to configure the modems for DIO line passing initially with no success. I finally built a reference table to help me sort all of the configuration options which helped immensely.

I have included that table that documents all 67 configuration option, my module version, firmware and quotes from all the relevant dispersed manuals on what the relevant configurations do and how they interact.

Of all the 67 configuration options there only 7 that are are important for defining DIO line passing here they are with mode details on how they function and interact with each other.

Destination Address High and Low Address [DH / DL]

This defines what modem you are transmitting too. You have the option to use a 16 or 32 bit address I always use 16-bit because it is fewer numbers to keep track of. You just set the Destination high address (DH) to zero and define a 4 digit hexadecimal Destination Low address, mine is 8008 for the remote (sensor) node and 2002 for the base (camera) node.

Source Address [MY]

This is the 16-bit address (or name) of the xBee unit that the destination address of the xbee units paired mate talks too. So for example my remote nodes source address (name) is 2002 and my base nodes destination address is 2002, so that the base node only sends packets to the source node.

DIO7 Configuration [D7]

You need to tell the xBee modems that you want them to be in DIO line passing mode, what pin you want them to use and which module will be the input and which module will be the output. All of that is done my setting the DIO configuration, in our case for DIO7 (the CTS pin) that is broken out on the Adafruit adapter. I will set my remote (sensor) node DIO7 to 3 which tells that modem that its DIO7 is a digital input pin, and I will set my base (camera) node DIO7 to 4 which tells that modem that its DIO7 is a digital output pin.

DIO Change Detection [IC]

This option sets the remote (sensor) node to send a packet to the base (camera) node updating the value of the digital output pin whenever the digital input pin changes state. This gives you the fastest response and is exactly what I want for tripping the camera with the shortest delay. Data for this configuration is input as an 8-bit mask where DIO0 is the LSB and DIO7 is the MSB in HEX, for those of you who don't know what that means don't worry you can either turn all of the pins to monitor for DIO change detection by inputting FF, or you can use the converter I included at the bottom of the configuration table to do the conversion from binary to HEX for the specific pins you want to turn on. You only need to so this on the remote unit.

D7 Output Timeout [T7]

Each of the Digital output pins has a timer that starts after the pin has been updated, when this timer expires the pin reverts back to its default state (either high or low you can configure it in DIO7 configuration). This is annoying because it means the remote (sensor) node must periodically update the base (camera) which eats up battery life. The next configuration setting defines this periodic update rate.

Sample Rate [IR]

This setting is configured on the remote (sensor) node and defines the the timing of the periodic packets sent to the base (camera) node in addition to the packets sent on DIO change detection. The xBee manual does not recommend that this value be set higher than 20ms (0x14) I don't know why. Because ever transmission draws more power and decreases my battery life, I set this parameter to the highest recommended value of 20ms.

I/O Output Enable [IU]

This configuration option had me going around in circles for an hour, it wasn't until I read through the entire xBee manual that I finally found it and was able to successfully get DIO line passing to work. The default state of this setting sends all the packetized digital input states of the remote (sensor) node to the serial output of the base (camera) node instead of the corresponding digital output pin. You simply have to change this configuration from 1 to 0 on the base (camera) node and then everything works.

If all of that was over your head and you just want to copy and paste the settings I used without having to understand how they all work right now just input the exact values from my xBee reference table and you will be good.

Step 3: XBee Configuration Set-up

The following instructions on how to set-up an xBee modem are abridged. If you run into trouble refer to the excellent instructions on Ladyada's site here

  1. Download and install X-CTU (the old version) here
  2. Follow the instructions that came with your FTDI cable / adapter regarding driver installation.
  3. With the FTDI cable connected open X-CTU and verify that you see the virtual COM port that it has created. This confirms that the FTDI cable is working correctly and that the driver has gone in.
  4. Connect the xBee with the FTDI cable / adapter.
  5. Re-open xCTU
  6. With the default serial settings (9600-8-n-1) click "Test Query". This will verify that you are talking to the xBee.
  7. Under the modem configuration tab click "Restore" this will bring all modem configurations back to default.
  8. Label your "Base" (Camera) and "Remote" (Sensor) xbee modems so that you don't mix them up.
  9. Configure the xBees per the my reference table.
  10. Click "Write" to write the parameters to the modem

I will be using DIO7 (CTS) on the xBee modem because it has a pin-out on the edge header of the Adafruit xBee adapter. DIO7 does not support an internal pull-up resistor, so on the remote nodes digital input pin I needed to add one externally.

Step 4: Programming the Microcontroller

The trinket is a cute little packaged up ATiny85 microcontroller that Ladyada's team whipped up and it fits perfectly in this project because of its diminutive size and servo library support.

There are some special instructions for setting up the Trinket for programming that you can find on Ladyada's site here.

The all important Trinket Servo library can also be found on Ladyada's site here.

The code I am currently using is very simple, when the Trinket DIO #1 pin goes high it actuates turns 20 degees clockwise, and when DIO #1 pin goes low the servo goes 20 degrees counterclockwise.

Code is derived on Adafruit sample code:

SoftServo sketch for Adafruit Trinket.

Required library is the Adafruit_SoftServo library
available at
The standard Arduino IDE servo library will not work with 8 bit
AVR microcontrollers like Trinket and Gemma due to differences
in available timer hardware and programming. We simply refresh
by piggy-backing on the timer0 millis() counter

As written, this is specifically for the Trinket although it should
be Gemma or other boards (Arduino Uno, etc.) with proper pin mappings

Trinket: USB+ Gnd Pin #0 Pin #2 A1
Connection: Servo+ - Servo1 Potentiometer wiper


#include // SoftwareServo (works on non PWM pins)

#define SERVO1PIN 0 // Servo control line (orange) on Trinket Pin #0

Adafruit_SoftServo myServo1; //create servo object

void setup() {
// Set up the interrupt that will refresh the servo for us automagically
pinMode(1, INPUT);
OCR0A = 0xAF; // any number is OK
TIMSK |= _BV(OCIE0A); // Turn on the compare interrupt (below!)

myServo1.attach(SERVO1PIN); // Attach the servo to pin 0 on Trinket
myServo1.write(150); // Tell servo to go to position per quirk
delay(15); // Wait 15ms for the servo to reach the position

void loop() {

if (digitalRead(1) == 1)
myServo1.write(170); // tell servo to go to position
delay(15); // waits 15ms for the servo to reach the position

// We'll take advantage of the built in millis() timer that goes off
// to keep track of time, and refresh the servo every 20 milliseconds
// The SIGNAL(TIMER0_COMPA_vect) function is the interrupt that will be
// Called by the microcontroller every 2 milliseconds
volatile uint8_t counter = 0;
// this gets called every 2 milliseconds
counter += 2;
// every 20 milliseconds, refresh the servos!
if (counter >= 20) {
counter = 0;

Step 5: Electrical Schematics

Step 6: Fabricating the Camera Node

Step 7: Solder It Up

Step 8: Bonding in the Shutter Release

The shutter release cable needs to be bonded into its pass through hole very securely, whichever way that you choose to do this make sure that there is no slop, because it could result in misfires of the camera.

There were two methods I considered for bonding in the cable release:

1. Hot Glue -- This is definitely the simplest option and if you have a hot glue gun lying around I suggest you try it first. I did not have a hot glue gun available, and I work with Mechanical engineers who find creative ways to break things, so I looked for a more bulletproof solution.

2. Epoxy -- I did have some epoxy lying around and the help of the composites experts over at the CSULB rocket lab who helped me with the lay-up. The most important thing I learned was that I couldn't expect to fill the void between the shutter release "handle" and the enclosure with epoxy, the void was too large, so I needed to find a filler. The filler I used was some high density foam that was very easy to mold with a hacksaw blade and sandpaper, but a similarly shaped piece of wood or plastic would have worked just as well. I molded the foam into a horseshoe shape that I could slide between the shutter release cable "handle" and the inside of the enclosure. When it came time for bond it I lathered the piece of foam with 5-minute epoxy and slid it between the enclosure wall and the shutter release cable "handle".

Step 9: Installing the D-Sub Connector and Hot Shoe Mount

I wanted to avoid using a mechanical switch because I was concerned about it getting turned on inadvertently and I would arrive to the field with a dead battery, so I opted for a D-Sub connector that will act as my switch, and provide me with extra pin-outs if I ever want to additional functionality to the box.

Mounting D-Sub connectors is always challenging, because there is no great way to drill out a D-shaped hole without a mill. The best way I have found using a dremel is as follows.

  1. Drill out a hole the height of the D-Sub connector (just under 1/2")
  2. Using the router bit or an endmill in the dremel route out the D-shape
  3. Test- fit often.
  4. With the connector clamped or held in position match drill the mounting holes.

The hot shoe mount has a 1/4-20 stud that is just long enough to get a jam nut on one side of the lid a lock-nut on the other side of the lid and still have enough room to slide it onto the camera and tighten down the locking ring.

Step 10: Remote (Sensor) Node Fabrication

My remote (sensor) node is pretty bare bones, it is just a protoboard with an xBee modem on one side a battery taped to the other side and a breakwire cable dangling out of it. I later plan on integrating this into a larger system where the xBee will receive a digital signal from a microcontroller, but for now this works great for testing.

The break wire is connected to DIO7 via a pull-up resistor, so when the Molex connector gets pulled DIO7 goes high and the camera takes a picture, or a series of pictures if I have it in continuous.

Step 11: Results

Pictured above is the Prospector-17 launch vehicle which features an all composite air-frame and a LOX / Ethanol 500 lbf engine build by students at California State University Long Beach. That picture was taken by my Pentax 645 film camera and triggered wirelessly by the vehicles lift-off. 

I positioned the Pentax 645 on a tripod about 50ft. away from the launch rail. The remote sensor node was magnetically attached to the launch rail and I ran a wire out to a loop-back connector on the vehicle. When the vehicle took off if pulled about a foot of slack and then disconnected the loop-back connector triggering the shutter on the Pentax. I was a little surprised by the system delay, the loop-back connector disconnected when the vehicle was about 6 feet lower on the launch rail than what is seen in the photo. 

While I was out in the field I did some crude range checks with the system and was a little disappointed to find that I couldn't get the max 300 ft. range claimed by the xbee datasheet, the max I could get was about 150ft. still good enough for my current testing until I upgrade to an xBee Pro.

I also added a magnet to the back of the remote sensor node, which made it simple to position anywhere I wanted to on the structure of the steel launch rail.

As it got later in the evening and my 160 speed flim was no longer usable I hooked up the shutter release to my Fuji x100s. While I could actuate the Fuji's shutter just fine, I couldn't mount the camera node onto the Fuji's hotshoe without interfering wih the shutter release button. This is a simple fix, on the next version I make I will change where I mount the 1/4-20 to hot shoe adapter on the lid to avoid the clearance issue.

Overall I was very happy with the system performance and plan to use it going forward for future launch vehicle testing and will post any photos taken with the system that I am able to.

123D Circuits Contest

Third Prize in the
123D Circuits Contest

Full Spectrum Laser Contest

Participated in the
Full Spectrum Laser Contest