Building a DIY Shutter Speed Tester
With a little adventurousness, a few Euros, and a handful of Lego, you too can have your very own (if somewhat janky) shutter speed tester.
My collection of analog cameras is in a state. Specifically, in the state of âI have no idea whether the shutter speeds on these things are the least bit reliableâ. I also donât have a ton of money to throw at just getting everything CLAâd. And sometimes getting a CLA isnât a guarantee that the shutter is actually working as expectedâŠugh.
So what is an ex-electrical engineer to do? Build their own shutter speed tester. Follow along, and learn how to shoot lasers at your cameras for fun.
Theory
The idea is that we can shoot a laser through the shutter at a high-speed laser detector. Then we can time how long the detector is activated to calculate the shutter speed. Laser detectors are much faster than other kinds of light detectors, and weâll need that speed to accurately measure shutter speeds of 1/1000 or faster. weâll also need a small computer to measure the speed, and calculate and display the results.
Shopping List
Hereâs what we need to get started.
- Arduino Uno. This is a basic, inexpensive microcomputer to coordinate everything. There are thousands of cheap clones on the market that are just as good as the original: You donât have to get the brand name.
- Arduino Prototyping Shield (or small breadboard). This is a small expansion board for the Arduino that breaks out a few connectors that we need. You can also use a small breadboad if you like. Again, you can get the cheapest one. Just make sure it comes assembled if youâre not up for soldering.
- Jumper wires. These are the wires to connect all the things together. Youâll need a handful of male-to-male and male-to-female. Try to get longer ones, at least 20cm, ideally more.
- KY-008 Laser Transmitter module. This is our laser beam!
- ISO203 Laser Receiver module. This will detect our laser beam. Both of the laser modules are available cheaply from China.
- Something to hold it all together. Maybe you own a 3D printer and can whip something up? Or maybe youâre basic like me, and only have some Lego lying around. Whatever it is, you need to find a way to hold the Laser Transmitter so it points at the Laser Receiver, and has room to place your camera between them.
Wire it Up
First, letâs wire all the bits together.
- If your Laser Receiver came unassembled, this guide will set you right.
- If youâre using a Proto Shield, stack it on top of your Arduino like in the image above.
Youâll need six male-to-female jumper cables, three for each module. Each module needs a connection to power (5V
), ground (GND
) and one of the signal lines (Pin2
and Pin5
). A bare Arduino only has one place for the 5V
line, which is why I am using a Proto Shield, which breaks it out into several outputs. You can also use a small breadboard to break out the 5V
line into more than one. (Note that the colors donât actually matter, but it helps to keep things straight!)
Assemble the Rig
Next, letâs build a rig to hold everything together. Unfortunately this part is up to you. But hereâs a photo illustrating how I did it with some Lego Technic pieces I had lying around:
Notice that the Laser modules are raised up a bit, and can be adjusted vertically. Notice the rather large gap between themâthis is so I can fit my Mamiya RB67 lenses between them! If youâre only testing 35mm camera bodies, you donât have to go this big.
Upload and Run the Software
You will need to download and install the Arduino IDE (Integrated Development Environment). This software tool letâs you create new software for your Arduino (which they call a âsketchâ), upload sketches to the Arduino, and monitor the text output from the run.
Once installed, plug in your Arduino, create a new sketch in the Arduino IDE, and copy-paste the code below into editor. Then hit the play button in the Arduino IDE to upload the sketch and set it running.
// pins for KY-008 Laser Diodes
#define LASER_DIODE_1_OUTPUT 5
// pins for ISO203 Laser Receivers
#define LASER_RECEIVER_1_INPUT 2
volatile uint32_t ts_1_start_us = 0;
volatile uint32_t ts_1_end_us = 0;
volatile bool speed_1_measured = false;
volatile bool curtain_1_measured = false;
// variables for calculated values
double shutter_speed_1_ms = 0.0;
double fractional_shutter_speed_1 = 0.0;
//---------------------------------------------------
// Detector 1 interrupt handler
//---------------------------------------------------
void detector1(void)
{
if (digitalRead(LASER_RECEIVER_1_INPUT))
{
ts_1_end_us = micros();
speed_1_measured = true;
curtain_1_measured = true;
}
else
{
ts_1_start_us = micros();
speed_1_measured = false;
curtain_1_measured = false;
}
}
void setup() {
Serial.begin(115200);
Serial.flush();
pinMode(LASER_RECEIVER_1_INPUT, INPUT);
pinMode(LASER_DIODE_1_OUTPUT, OUTPUT);
attachInterrupt(digitalPinToInterrupt(LASER_RECEIVER_1_INPUT), detector1, CHANGE);
digitalWrite(LASER_DIODE_1_OUTPUT, HIGH);
Serial.print("Starting up");
}
void loop() {
// put your main code here, to run repeatedly:
if(speed_1_measured) {
speed_1_measured = false;
double shutter_speed_us = (double)(ts_1_end_us - ts_1_start_us);
shutter_speed_1_ms = shutter_speed_us / 1000.0;
fractional_shutter_speed_1 = 1000000.0 / shutter_speed_us;
// Serial.print("t1_s=");
// Serial.print(ts_1_start_us);
// Serial.print("us t1_e=");
// Serial.print(ts_1_end_us);
// Serial.println("us");
Serial.print("Speed 1 = ");
Serial.print(shutter_speed_1_ms, 1);
Serial.println(" ms");
Serial.print("Fractional Speed 1 = 1/");
Serial.println(fractional_shutter_speed_1, 1);
}
}
Running a Test
Make sure the laser beam is hitting the receiver. The place your camera with the back open in your testing apparatus. Make sure the laser is hitting the shutter, roughly in the center. Then fire off a test shot!
The output from the sketch will arrive in the Arduino IDE in the âserial monitorâ, which is a window showing text sent back by the Arduino. If youâve set your shutter speed to 1/500, for example, in the serial monitor, you should see something like this:
Speed 1 = 2.0ms
Fractional Speed 1 = 1/500
Of course, your shutter speed wonât be spot onâŠso maybe it will be more like this:
Speed 1 = 1.85ms
Fractional Speed 1 = 1/540,54
How Bad Is It?
I am a sucker for a good spreadsheet. So I made one to capture my test results. I recorded three samples per shutter speed setting, and then set the times in milliseconds into a spreadsheet I made to analyze the results. You can download the template I made for yourself!
The spreadsheet averages the three samples, then calculates both the difference between the actually measured speed and the nominal speed in stops, as well as the sample variation. It then charts out the results, and calls out abnormal values.
As you can see, I need to contact my shop that repaired my Canon Pâitâs already fallen out of calibration. At the top end, the shutter is much, much too slowâa stop and a half at 1/1000!âand the variability in shutter speeds is slightly too high at 1/1000.
Troubleshooting Your Shutter Speed Tester
If you arenât seeing any output on the Serial Monitor in the Arduino IDE, the serial port might be misconfigured. Make sure the port speed is set to 115200, as in this screenshot:
Source Code and Credits
This project is adapted and simplified from Stuart Brownâs excellent (and much more comprehensive) shutter testing project. If you want to go deeper with this, and maybe build something more sophisticated, his project has got the good stuff. Thank you Stuart!
Support this blog
If you enjoy reading this blog, I encourage you to consider purchasing a book or print to show your support. And if you're into analog photography, check out my new mobile app Crown + Flint.