Long-time remote shooting with Canon EOS 400D

Problem: Shooting with exposure times 30 and more is required and this process must be automated.
Solve: using soldering iron, common chips and bash script in Linux, it is possible to make PC-driven remote control device.

What we have

We have Canon EOS 400D, Debian-powered notebook and necessity of shooting pictures with exposure longer than 30 seconds. There is good scheme proposed by Michael A. Covington here. Anyway, mirroring it here:

Pretty good scheme, but it doesn’t work for Canon EOS 400D – shutter will lift up bot not down.

Scheme for Canon EOS 400D

After some fruitless trying, I am with my colleague Alexey Ropyanoi, found out why proposed scheme not work and propose new one:

And it works! Our laboratory Canon EOS 400D begin open and close shutter by computer command.

Necessary electric components
To do the same remote shooting wire, you need 4-wire cable (from audio devices or from telephone cable), 2.5mm jack (or 3/32 inch jack), mentioned in scheme chips, 9-pin COM-port and USB-COM adapter (for using this remote shooting wire on novel computers).

The best USB-COM adapter is on Profilic 2303 chip – it is the most common chip and it works in Linux, like practically all, “out of the box”.


For remote control of camera, little program on C is needed. It is setSerialSignal and it source code is placed here. It can be compiled with GCC, which is part of any UNIX-like OS distribution.

gcc -o setSerialSignal setSerialSignal.c

Works on Debian GNU/Linux v4.0 r.0 “Etch”, gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21).

This is the code:

* setSerialSignal v0.1 9/13/01
* www.embeddedlinuxinterfacing.com
* The original location of this source is
* http://www.embeddedlinuxinterfacing.com/chapters/06/setSerialSignal.c
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* Library General Public License for more details.
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/* setSerialSignal
* setSerialSignal sets the DTR and RTS serial port control signals.
* This program queries the serial port status then sets or clears
* the DTR or RTS bits based on user supplied command line setting.
* setSerialSignal clears the HUPCL bit. With the HUPCL bit set,
* when you close the serial port, the Linux serial port driver
* will drop DTR (assertion level 1, negative RS-232 voltage). By
* clearing the HUPCL bit, the serial port driver leaves the
* assertion level of DTR alone when the port is closed.

gcc -o setSerialSignal setSerialSignal.c


/* we need a termios structure to clear the HUPCL bit */
struct termios tio;

int main(int argc, char *argv[])
int fd;
int status;

if (argc != 4)
printf("Usage: setSerialSignal port                  DTR RTSn");
printf("Usage: setSerialSignal /dev/ttyS0|/dev/ttyS1 0|1 0|1n");
exit( 1 );

if ((fd = open(argv[1],O_RDWR)) 

Sending signals
Compiling program and making it executable, and below listed signals which will open and close shutter:

setSerialSignal /dev/ttyS0 1 0

Clear DTR
setSerialSignal /dev/ttyS0 0 0

setSerialSignal /dev/ttyS0 0 1

Clear RTS
setSerialSignal /dev/ttyS0 1 1

Shutter opens at DTR and closes at RTS.

Shell script for remote shooting
Next, it is comfortable to use bash script by Eugeni Romas aka BrainBug, but for Canon 400D script was edited and here it is:


for i in `seq $3`; do
setSerialSignal /dev/ttyUSB0 0 0 &&
sleep $1 && setSerialSignal /dev/ttyUSB0 0 1 &&
sleep 0.3 && setSerialSignal /dev/ttyUSB0 0 0 &&
sleep $2 && setSerialSignal /dev/ttyUSB0 1 1 && echo “One more image captured!” &&
sleep $4;


echo “Done!”

Script parameters:
1: shutter opening delay
2: exposure time in seconds
3: amount of shots
4: delay between shots


make_captures 4 60 30 2

Script is written to work with USB-COM adaptor, and you need to edit it if you have different port.

How it works

Remote shooting wire is ready, inserting USB-COM adapter with wire and next:

  • Turn on camera, setting BULB mode, setting aperture size and ISO speed.
  • Inserting jack into the camera, another and in COM-USB adapter and then in USB-port.
  • Looking at logs: kernel must recognize chip and write something like this:

usb 2-1: new full speed USB device using uhci_hcd and address 2
usb 2-1: configuration #1 chosen from 1 choice
drivers/usb/serial/usb-serial.c: USB Serial support registered for pl2303
pl2303 2-1:1.0: pl2303 converter detected
usb 2-1: pl2303 converter now attached to ttyUSB0
usbcore: registered new interface driver pl2303
drivers/usb/serial/pl2303.c: Prolific PL2303 USB to serial adaptor driver

  • Now shoot:

    make_capture 1 5 2 3

Here we make 2 images with 5 second exposure, delay between shots is 3 seconds, delay for shutter lifting 1 second.

Original post HERE

I would like to express my gratitude to:

  • Michael A. Covington for his original article “Building a Cable Release and Serial-Port Cable for the Canon EOS 300D Digital Rebel”.
  • Eugeni Romas aka BrainBug for link to original post and discussion.
  • Anton aka NTRNO for searching key posts at Astrophorum.
  • Alexey Ropjanoi, who experimentally found out problem and eliminated it, proposing new shceme for shooting.

And I deeply thankful to my colleagues for Solid State physic department of Moscow Engineer Physics Institute.

4 thoughts on “Long-time remote shooting with Canon EOS 400D

  1. This is awesome! do you know how the program would be written for a Mac running OS 10.4.11?

Leave a comment

Your email address will not be published. Required fields are marked *