Connect to almost any camera!

The Open Camera Controller uses your camera’s remote shutter release cable port. We’ve tested with the Canon 30D,40D,50D, 5D, & 5D Mark II (check the forum to see what cameras our users have also tried.) The fastest shutter speed we’ve been able to obtain is about 1/200 using a Canon 5D, though our bracketing software has placed the limit at 1/20 of a second because that has been the most reliably reproducible shutter speed.

Sigma DSLR’s, the Casio EX-FX1, and the Olympus E-P1 also work with a few quirks and limitations.
The E-P1, for example, works reliably unless the live histogram view is displayed, it seems that the camera’s cpu is too busy updating that information to pay attention to shot requests.

Some cameras don’t work well, particularly older Canon “Rebel” or 300-series SLR’s, because their internal Digic processors are too slow to give accurate timing. We have used a few Nikon cameras that have MC-DC1 connectors, although Nikon has built in a firmware limit which does not allow a shot faster than 1/10th of a second. Although this may seem like an unacceptable limitation, keep in mind that every muti-shot HDR sequence consists of multiple shots that take place over a small extended period of time. Using a neutral density filter allows just about any DSLR to work with the OCC. Some Nikons, though, do not have a remote release cable connection, and can use only an IR infrared remote. It is possible to add an IR circuit to the OCC, but that’s beyond the scope of this article.

The Concept

Our primary consideration is to keep the camera safe and protected, using an isolation circuit.

The design uses two optical isolator chips to fire the camera’ shutter, one for the half-press and one for the full-press signals. The camera’s wires are protected from reverse voltages using diodes on both shutter signals. By doing this, we’ve made controllers that can safely fire multiple cameras without danger of electrical crosstalk.

That being said, remember that you undertake this project at your own risk, if you are not sure of any procedure described in this article, consider buying a pre-made controller cable.

It is perfectly acceptable to use just one isolator to signal the camera, though with some camera bodies it may be possible to achieve faster shutter speeds by “readying” the camera with a short half-press before the full-press, the DS software simply needs to have the shutter-speed header file modified to account for the additional half-press delay. For special situations, one could also modify the software to allow time for autofocusing, although for consistent HDR shooting the camera should be set to manual focus.

Getting started

The easiest way to construct a cable for your camera begins by obtaining a wired shutter release cable.
You can use the more expensive cable from the camera manufacturer, or buy a cheaper clone. The clones use very cheap connectors, but seem to work well enough. Of the two dozen or so cables we’ve bought on eBay, two arrived defective, so check that the switch works as-is with your camera before deconstructing it to make a DS controller.

The pin layout of the N3 connector on many Canon DSLR’s.

Take note of the construction! Most remote release switches are made with metal leaves that are designed to make contact with the half-press wire touching ground first, then finally the full-press wire makes contact with both the half-press and ground.

The wires are usually coded with white as GND, red full-press, and yellow half-press, but there’s no guarantee yours will follow this scheme.

Download the OCC board design and order yours from

We designed a circuit board and had ours made at If you're able to etch the board yourself, download the Rev 3.2b Solder Stopmask.

Note: Revision 3.2b is an updated board, double-check the onboard label when in doubt.

When ordering, specify that the board must be 1/32” in thickness, or it won’t fit into the DS card-edge connector. The design is a single-sided board to save cost, and we tried to reduce the manufacturing workload to a minimum. The three cables from the shutter release cable have to be soldiered on, that’s it.

More Electronics Shopping

An Atmel microcontroller chip is used to monitor the DS cartridge pin for a signal to begin shooting. The Arduino hardware/software provides an easy method to program the chip. The chip will use an interrupt to detect the DS pin transitioning to a low state and begin firing. When the DS pin returns to a high state the shutter is disconnected.

Parts list:

  • Atmega 168 or 328 DIP package Microcontroller
    (Included with the Arduino development board)
  • 1 16Mhz Resonator
  • 2 Zener Diodes 3V ( D1 & D2 )
  • 2 Resistors ~ 39ohm 1/4Watt ( R1 & R2 )
  • 2 Resistors ~ 2K7ohm 1/4Watt ( R3 & R4 )
  • 2 NTE 3041 Optical Isolation chips
  • 1 LED 3V ( D3 ) If you’re using a 2V LED on the pad „R5“ instead, a 56ohm resistor has to be installed. With a 3V LED the pads have to be covered with solder.
  • 1 Oscillator 16Mhz ( Ceramic ). If using a 16Mhz Crytal Oscillator two 22pf SMD caps (see rough scheme below) have to be installed (CHIP 0603 NP0 22PF 5% 50V)

You’ll also need a large GBA (Game Boy Advance) cartridge.

Highslide JS
The GBA cartridge WarioWare Twisted has plenty of room for our microcontroller.
We’ve been able to pack the entire circuit into a standard-sized game housing, but it’s a very tight fit, so you should start with an odd-sized cartridge like "WarioWare: Twisted!". We will use this one, because it has an open space that allows us to socket the microcontroller so that it can be easily removed to update the internal firmware.

If you use a different cartridges, you might need to rework the circuit design to fit it. Game stores usually have a selection of used GBA cartridges, or of course you could try eBay, where the game sells for around ten U.S. dollars.

Putting it together

Here is an assembly map by forum member bennygod, updated by Achim Berg:
  • Purple = IC (Atmega 168 or 328)
  • Blue = NTE3041
  • Orange = Resistor
  • Red = Diode ( Zener Diode 3V )
  • Green = Resonator ( 16Mhz oscillator)
  • Yellow = 22pF/50V SMD capacitor C1 & C2 (only needed if a crystal oscillator is installed / when used a ceramic oscillator C1 & C2 are not needed)
  • Cyan = LED ( 3V Type / D3 )

Forum member o12 made a handy project at with most parts in a cart (except the Atmega). Read o12's building report here.

FAQ: Where are the isolation caps?
A: Nintendo put them inside the DS for us.

Highslide JS
Highslide JS
The curcuit plan shows where to connect the wires.

The case is held closed by a tri-wing screw, but can usually be coaxed open with a small flat-bladed jewelers screw driver. Highslide JS
Once inside, you’ll need to remove all of the plastic bosses to make room for the camera board. Highslide JS

Building the circuit board

Step One

First you take the drilled board and solder on
  • four Resistors
  • two Diodes
  • two SMD Caps if using a crystal oscillator
  • C1 & C2 are not needed if a ceramic oscillator is used
If you want to use SMD Resistors instead of the normal ones you can do so. The circuit coard supports both types.
Highslide JS

Step Two

Solder the microcontroller socket before adding the LED. Since we could not find 28 pin narrow IC sockets anywhere in the valley, 2x 14-pin sockets are used here instead. Front left is pin one.

Highslide JS
Now you can solder the LED.
Left is plus. Right is minus.

If using a 3V LED Type you have to close the solder pad. If using a 2V Type solder a 56Ohm resistor.

Step Three

Now you have to solder the Oscillator and bridge the above pad. (Here we used a 2V LED Type so we soldered a 56Ohm resistor instead).
Highslide JS

Step Four

Solder the NTE3041 isolators making sure the notched edge (if you have this type) is aligned to the pin-one marking (the squared pads.)

If you don´t get this type of isolator Chip you can use the 4N48 type (used here) instead.
Highslide JS


Programming the MC

Before inserting the microcontroller, program the chip using the Arduino developer environment.

This is the Arduino sketch we use to put the shutter release under DS control:
int FullPressPin = 13;
int HalfPressPin = 12;
int ShutterState=LOW;
int IsShooting=0;
int x = 0;
int HeartbeatPin = 4;
volatile int state = LOW;
void setup()
  pinMode(HalfPressPin, OUTPUT);     
  pinMode(FullPressPin, OUTPUT);
  pinMode(HeartbeatPin, OUTPUT);
  attachInterrupt(0, ProcessDSSignalRising, RISING);
  attachInterrupt(1, ProcessDSSignalFalling, FALLING);
  ShutterState=LOW; // de-depress shutter button if it is an unknown state
  digitalWrite(FullPressPin, ShutterState); 
  digitalWrite(HalfPressPin, ShutterState);
  //May 2010 Heartbeat code variation
	digitalWrite(HeartbeatPin, HIGH);
	digitalWrite(HeartbeatPin, LOW);
	digitalWrite(HeartbeatPin, HIGH);
	digitalWrite(HeartbeatPin, LOW);
	digitalWrite(HeartbeatPin, HIGH);
	digitalWrite(HeartbeatPin, LOW);
void loop()                     
   if (IsShooting = 0){
      digitalWrite(FullPressPin, ShutterState); 
      digitalWrite(HalfPressPin, ShutterState);
    // Essentially we are doing nothing here, but could use 
    // the time to monitor external sensors or input
    // Perhaps there is a power-saving mode we could utilize
void ProcessDSSignalRising()
   digitalWrite(FullPressPin, ShutterState); 
   digitalWrite(HeartbeatPin, LOW);
   digitalWrite(HalfPressPin, ShutterState);
void ProcessDSSignalFalling()
   // add a delay here to make HalfPress a tad longer
   for (x=0;x< 5; x++){
     digitalWrite(HalfPressPin, ShutterState); 
   digitalWrite(HeartbeatPin, HIGH);
   digitalWrite(FullPressPin, ShutterState);

Highslide JS

The microcontroller’s interrupt circuits are used to provide immediate attention to the DS’ shutter release request.

Once the shutter wires have been soldered to the board it can be placed into the cartridge housing.

A nibbler is used to cut a notch to hold the camera cable’s strain relief molding. Try not to pinch the wires between the IC chips and the case. Once test-fitting proves OK, the board is super-glued from the back side to the cartridge case, making sure it is evenly centered from left to right.

In this example it took about an hour to put it together and test the soldered board. After some probing with a VOM meter, the case was ready to close.

Hurray - Done!


Since the Atmel microcontroller is essentially a stand-alone computer, there are many other possibilities that remain untapped. Additional input pins, both analog and digital, can be used to signal the camera based on external input. Circuitry can be added to detect light, movement, or sound. The microcontroller can also be modified to attach to more outputs to the camera, depending on which body is used. See the “$15 HDR camera” for one possibility.

The cartridge can now be used with any of the PanoCamera Nintendo DS software, such as the sound trigger, intervalometer, and of course the HDR bracketing program. It works with the Nintendo DS “Phat” or “Lite” models, which are functionally identical, however we’ve noticed that the older Phat device can be more easily read in daylight.

Now that you have an Open Camera Controller device, the world is your camera store.

Highslide JS

Nintendo DS cases and accessories are now camera accessories, and electronic sensors now have the potential to be camera sensors. A search of web articles shows ways to connect the microcontroller to GPS’, accelerometers, tilt sensors, web servers, and more. It is even possible to add more extensive USB based camera control using the PTP protocol. We’ve provided here simply a seed to get you shooting HDR’s and thinking about the things you want cameras to be able to do in the future.

Whatever you come up with here today will inevitably find its way into the mainstream devices of tomorrow. Until then, you'll be the one with the most bad-ass remote release!

For collaborating with other developers and sharing your modifications please visit our forum.

Next: Fill your Nintendo with Open Source Apps