Introduction: Arduino Time-Lapse Controller

Picture of Arduino Time-Lapse Controller

This project originally started out with a few simple parts thrown together to create a very simple time-lapse controller for a DSLR camera. After I was happy with the initial prototype, I wanted to make a final version which the programming of the "lapse time" was self contained into one single entity instead of relying on a computer to re-program and change the delay between shooting sessions.

After adding in a display, a couple of buttons, and a more complex program, the self contained Arduino powered Time-Lapse Controller was born!

I have tried to make the instructions as clear and user-friendly as possible, but if any questions arise, feel free to ask!

Step 1: Parts

Picture of Parts

- Arduino
- 7 Segment Display
- 220 Ohm Resistor x2
- 10K Ohm Resistor x2
- 470 Ohm Resistor
- Hookup wire
- NPN Transistor
- 3/32 Phone-jack
- hookup wire
- mounting surface (i.e. perfboard, breadboard, PCB)

Step 2: Wiring Up the 7 Segment Display

Picture of Wiring Up the 7 Segment Display

After a bit of research, I found some sample code for a 7 segment display here. Taking a closer look at the first example, I noticed that each segment of the display need to be wired to a sequential pin on the Arduino. In the case of the example, pins 2-9 with pin 2 being the "dot" on the display.

Keep in mind that each display's pinout is different and may differ from the display I used (from Radioshack), make sure to pay attention to its datasheet.

- Wire both GND pins of the display to GND on the Arduino with a 220 Ohm resistors
- Wire the display pins to sequential Arduino pins. In my case I used pins 3-9
- Wire the "dot" pin to the Arduino. For me, pin 2

Step 3: Wiring Up the Buttons

Picture of Wiring Up the Buttons

Using this as a reference, I wired up the two buttons

Follow the pictures in the above link and the one enclosed and it should be pretty easy to figure out.
- using 10K Ohm resistors and hookup wire I connected the buttons to pins 11 and 12.

Step 4: Wiring Up Shutter Control

Picture of Wiring Up Shutter Control

After reading through rickadam's instructable on time lapse, I based my circuit off of his design.
A DSLR camera uses a 3/32 phono-jack to interface with this circuit, but this could easily be adapted to just about any camera

- Wire pin 1 of the phono-jack to Ardunio GND
- Wire the NPN transistor pin 1 to Arduino GND
- Wire 470 Ohm resistor from an open Arduino pin (in my case 13) to NPN transistor pin 2
- Wire pin 3 of phono-jack to pin 3 of the NPN transistor

(NOTE: the pin values given in this step are only used as identifiers and my not directly correspond with the values given on datasheets)

Step 5: Upload Blink and Create a Reference Sheet

Picture of Upload Blink and Create a Reference Sheet

My assumption is that the display I used and how it is wired up is different in comparison to your project. To make sure the final code runs properly, we need to change a few values within the program. To make that process easier, a reference sheet will be made.

- Open up Arduino's Blink example and change the value of "led" to one of your segment pins. Download and run the sketch to the Arduino.
- Change the value of "led" again to another pin, download and run
- Continue this process while documenting the location on the display each pin lights up. Reference the picture as an example.

Step 6: Modifying the Display Code to Fit Your Circuit

Picture of Modifying the Display Code to Fit Your Circuit

Open up the segment testing code and change "PIN" to the value of your lowest pin.

After uploading and running the code, the display should count down from 9 to 0. But instead your display will be showing a random collection of symbols

Using your reference sheet,  we will modify the existing code to be customized to your circuit.

- At the top of the program, locate this section of the code:
      byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 },  // = 0
                                                                 { 0,1,1,0,0,0,0 },  // = 1
                                                                 { 1,1,0,1,1,0,1 },  // = 2
                                                                 { 1,1,1,1,0,0,1 },  // = 3
                                                                 { 0,1,1,0,0,1,1 },  // = 4
                                                                 { 1,0,1,1,0,1,1 },  // = 5
                                                                 { 1,0,1,1,1,1,1 },  // = 6
                                                                 { 1,1,1,0,0,0,0 },  // = 7
                                                                 { 1,1,1,1,1,1,1 },  // = 8
                                                                 { 1,1,1,0,0,1,1 }   // = 9

We will be modifying the 1s and 0s in this section.

- Each row corresponds to the digit that will be displayed and set of data to properly display that digit. The data will be sent as 1s (on) and 0s (off)
- Each column correspond to the pin which the data will be written to. The left most number correlates the the lowest pin defined by "PIN" (in my case pin 3). Moving across the row to the right, the next value corresponds to the next pin value and so on and so on.

For example, in the case of my circuit:
- I would like to modify the code so that my circuit will properly display "4"
- Looking at my reference sheet, the following pins should be lit: 3,4,7,6
- Turning to the code, I will change the appropriate values:

                                  //Arduino pins: 3,4,5,6,7,8,9
byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 },  // = 0
                                                           { 0,1,1,0,0,0,0 },  // = 1
                                                           { 1,1,0,1,1,0,1 },  // = 2
                                                           { 1,1,1,1,0,0,1 },  // = 3
                                                           { 1,1,0,1,1,0,0 },  // = 4
                                                           { 1,0,1,1,0,1,1 },  // = 5
                                                           { 1,0,1,1,1,1,1 },  // = 6
                                                           { 1,1,1,0,0,0,0 },  // = 7
                                                           { 1,1,1,1,1,1,1 },  // = 8
                                                           { 1,1,1,0,0,1,1 }   // = 9
- Continue this process until all of the values have been changed. After downloading and running the program, the display should count down from 9 to 0. If not, change the appropriate values.

NOTE: If the "dot" is lighting up during any step of this process make sure the following things are true:
- "PIN" has been properly defined as the lowest value of your display pins, if the "dot" pin is the lowest make sure to use the next highest
- Make sure when wiring the display, the "dot" does not interrupt the sequential wiring of the display segment pins

Step 7: Modifying and Uploading the Final Code

We are now in the homestretch. Using the modifications made in the segment testing code, we will modify the final code so that your circuit will display the correct numbers.

- Copy the edited code from the previous step and replace it within the final code
- Change the pin value of "Bc" (cycle button)
- Change the pin value of "Ba" (accept button)
- Change the value "PIN" to the lowest display pin
- If you see fit, modify the function "lad" to your own custom animation to signify the accepting of the chosen value

After all of these changes are made, the final code should download and run smoothly.

Step 8: How to Use the Rig

Picture of How to Use the Rig

How the program works:
- Upon first powering up the circuit, the display should eventually come on and display "0"
- Pressing the cycle button will increase the value by one and display a "1"
- Continuing to press the cycle button will increase the displayed value by one until the value of "9" is reached
- Once "9" is reached and the cycle button is pressed again, the next value will loop back to "0"
- Pressing the accept button will store that value in the Arduino's memory and a accept animation will be displayed
- This process will repeat for a total of 3 times, each digit corresponding to a value within the wanted time delay
- After the final digit is stored, a count down will start, after the countdown the camera will then take pictures at the interval you specified in the input process
(NOTE: If a mistake is made while inputting the digits, the reset button can be pressed and the program will restart)

For example:
say you wanted the interval between shots to be 1 minute and 35 seconds
- Plug in the camera via the phono-jack
- Power up the circuit
- Press the cycle button until the number 1 is displayed
- Press the accept button
- Press the cycle button until the number 3 is displayed
- Press the accept button
- Press the cycle button until the number 5 is displayed
- Press the accept button
- After the process is complete, a countdown will start, and then the camera will take pictures with an interval of 1 minute and 35 seconds

Step 9: Final Thoughts

Picture of Final Thoughts
It had been a while since I had completed a project like this so it felt good do be actually making again.

I still have some more ideas for the design, mainly on the programming side, such as displaying the number of pictures taken since the start of the session. Who knows what else may pop into my head.

To close, here is a small test done in my backyard.

Stay tuned for possible updates!


UPDATE (12-12-13):
I have updated the code and now the intervalometer can count the number of pictures taken. It is attached below. Also included is a full time-lapse video of myself and a friend building a computer. 


Minecrafter4435 (author)2016-02-19

U did hookup wire twice! and where can you get an arduino?

adafruit is a good place to buy an arduino

R they expensive tho?

Thnx! I will try it!

KenConstruct (author)2015-10-19

Fall is here and my transistor would not turn off (close) at low temperature. Also it seemed to have trouble after a few hundred shots... Either way, after building two of these I finally just replaced the transistor with an optocoupler (817) recycled from an old monitor and a 220 Ohm resistor to protect the LED side from PIN13 power and threw it in the refrigerator overnight. So far so good. (I also changed the code to show thousands.) If it keeps working I may streamline the form factor and do a separate Instructable.

hacker3455 (author)KenConstruct2015-10-21

Glad to hear about the improvements that you have made. I haven't "stress tested" my setup so I am glad that you have found some of the bugs, and solutions. Send me a link of the improved design when it is up.

KenConstruct made it! (author)2015-09-29

First shot using the timer. North Star is on the left. If this doesn't upload in HD, you won't be able to see the stars. Clip is 6 seconds with 187 frames collected over 109 minutes (battery died). Images Batch adjusted for levels in Photoshop then compiled with GoPro Studio. (Fingers crossed for HD...)

hacker3455 (author)KenConstruct2015-10-05

Those results look amazing!

KenConstruct (author)2015-09-17

Update - Finished connection to camera. A few unusual items - I found that on my Digital Rebel T3i that mic jack pin 3 (tip) to ground (base) is focus and pin 2 (middle) to ground (base) is shutter. The focus and shutter were independent. I added another push button for the focus and left it unattached to the shutter. Basically, I suggest shorting tip and middle to ground while jacked into your camera to see what does what before final wiring.

hacker3455 (author)KenConstruct2015-09-18

A perfect example of testing your hardware and the differences between cameras.

KenConstruct made it! (author)2015-09-13

The hacker3455 Time Lapse Shield! The 3 digit LED is in a socket so I can remove it and use it elsewhere. (Note - With the Uno I had to protect some of the connections on the back with hot glue. Strange things would happen if the power connection touches the 6 pin set at the center board edge.)

hacker3455 (author)KenConstruct2015-09-18

Your final product looks amazing! By tweaking the code, you can definitely utilize all three displays. I am glad that you found my documentation helpful in your endevors.

KenConstruct made it! (author)2015-09-12

Thanks hacker3455! This is my first non-packaged Arduino project. (I've loaded gimbal controller scripts before, but that's it.) and it works great! So for those that don't know, the setup basically shorts the Remote 3 pin to ground, which means "take a picture" to most cameras (an analog feature, to do focus and stuff you need to be able to send camera specific commands - if your camera has those features). I haven't set up the 3/32 Phone-jack yet, but I'm familiar with Remote/Lanc analog functionality. I testing the switching operation, which gives a connection every 5 or 10 or whatever seconds (I tested 5 and 10 seconds so far). I only had the 3 digit display, so I used that - using the center 7 LEDs. I assume I could set it up to display the duration between shots (all 3 digits) or something. The goal is time-lapse of stars spinning over a mountain, so I'll need the extra time for long exposures. (I'm aware that stars will smear in a photo longer than a few seconds, but I'm just trying to get started. Plus I can catch planes and meteors too.) The pictures below are the 5 second input and then I caught one of the "short" actions.

KenConstruct (author)2015-09-09

Hi! So it sounds like you can do any interval? So 2.5 min is okay?

hacker3455 (author)KenConstruct2015-09-10

With my given code, the interval can be set from 1 sec up to 10min 39sec (9min 99sec).

Fefetron (author)2015-05-12

Hello, I'm putting together my stuff, i have one question. Step 4, what is that mmm.. button? and you labeled as they should be connected to pin 3 and 1. I don't get that part, PWM pins?

Thank you, nice project.

hacker3455 (author)Fefetron2015-05-17

The parts used in step 4 are as follows:

NPN Transistor

3/32 phone jack

470 ohm resistor

The third contact of the phone jack is connected to pin 13 of the arduino. Hopefully that answers any of your questions.

Fefetron (author)hacker34552015-05-18

Thank you.

I mean the black square with a grey button. What is that? is that connected to the NPN?

Thank you.

hacker3455 (author)Fefetron2015-05-19

I believe you are referring to the 3/32 phone jack. For more details no how it is connected, refer to the schematic in step 1.

usangani (author)2014-04-25

For This Project/Circuit, which cable is used to connect NIkon D3200 camera ?

Is It Compatible With NikonD3200 Camera Model ?!!

hacker3455 (author)usangani2014-05-01

This instructable will point you in the right direction concerning pin-outs and cables.

ap0plectic (author)2013-12-25

I am new to Arduino and this looks lie a really cool project to try for myself! A couple of questions:
- which NPN transistor are you using here? Radioshack has a whole bunch of them.
- I can't find this 2/32 phono jack anywhere online (including Radioshack) - is it known by a different name?
- can you please provide a schematic of this so that I can build the prototype on a breadboard first?

hacker3455 (author)ap0plectic2014-01-06

1. Bipolar 200mA 40V NPN
2. That was an error on my part, it was supposed to measure 3/32
3. A schematic is now included in step 1

ap0plectic (author)2013-12-25

I am new to Arduino and this looks really cool to try for myself! A couple of questions:
- which NPN transistor are you using here? Radioshack has a whole bunch of them.
- I can't find this 2/32 phono jack anywhere online (including Radioshack) - is it known by a different name?
- can you please provide a schematic of this that I can build the prototype on a breadboard?

bpetty3 (author)2013-09-14

Awesome! I'm currently working on a motorized timelapse dolly. I found a thrown away giant Epson printer. The machined aluminum slider inside is perfect. Fantastic ible, I will probably be referencing it during my project.

Edgar (author)2013-08-28

Nice bit of work, voted, and Blogged it:

acobalto (author)2013-08-27

Very, cool liked it.
Already you are in the business of programmatically as well, you will be able to develop a fuel gauge for automobile, with a display similar to this, show how many gallons of gas in this tank?

hacker3455 (author)acobalto2013-08-28

Gas tanks and gauges work together in a somewhat similar way a potentiometer and an Arduino work togeather, one is variable resistance and the other reads that resistance. It could be possible to make a display to show the current number of gallons in a tank, but it would take a good amount of work.

acobalto (author)hacker34552013-08-28

Yeah I know, the truth of the very same work. I just figured you had a simpler way of doing. :-D

flevin58 (author)2013-08-27

Very nice work.
Just one improvement: you should use the standard naming convention of "a,b,c,d,e,f,g" for the 7-segment display, so that your code will be more clear.
Have a look here:

hacker3455 (author)flevin582013-08-28

I decided to forgo the standard naming convention due to possible confusion that could arise from different components and different pin-outs, but to instead go for the visual route of the reference sheet which could be easily made and used.

Sembazuru (author)2013-08-28

Very nice work. I agree with flevin58 that you should use the standard naming convention for 7-segment displays (and take advantage as using your learning as a teaching opportunity for your audience). Also, for the two switches you can eliminate the resistors if you use the internal "pull-up" resistors of the AVR chip on the Arduino. The resistors you are using are being used as "pull-down" resistors so the logic in your code should look for the switch pin states to go LOW instead of HIGH if you change to "pull-up".
See for a decent video about floating pins.

blutoh (author)2013-08-27

True, but ML is only available for Canon cameras, and certain models at that. hacker3455's solution is adaptable to any camera. Great job hacker3455.

hacker3455 (author)blutoh2013-08-27

Thanks for the support

Nickmensch (author)2013-08-24

Seems nice! But have you heard of Magic Lantern software for Canon cameras? With that you are also able to shoot intervals and you can take pictures in bulb mode for hours you should check it out!

SDX42 (author)Nickmensch2013-08-24

I can only agree on that, and ML comes with tons of options (bulb ramping, focus ramping) you won't, and will never get with this (due to a lack of a interface to those options. On the other side: it's fun to have made this kind of controller yourself and actually use it.

hacker3455 (author)SDX422013-08-24

I would need to do a bit more research in it, but I believe that pin two handles the focus of the camera. And possibly through some PWM one could pull off effects such as focus ramping. Then again for me a physical piece of hardware is a bit more exciting.

kenbob (author)2013-08-23

Great detail! love this.

hacker3455 (author)kenbob2013-08-24


bwh13 (author)2013-08-23

Great augmented graphics

hacker3455 (author)bwh132013-08-24

Glad to hear it was worth the extra effort

About This Instructable




More by hacker3455:Arduino Time-Lapse ControllerArcade MachineT-shirt Cannon
Add instructable to: