Building a Shutter Speed Tester for Film Cameras
This is a project I’ve been wanting to start for a while, and at the end of 2024, I finally decided to execute on it. This post serves as the documentation for the project. The code and case model files can be found on GitHub.
People have built film camera shutter speed testers with Arduino, oscilloscopes, and other tools. Their sharings on various forums have been an invaluable source of knowledge helping me along the way.
Background
Many vintage mechanical 35mm film cameras have focal plane shutters consisting of two curtains that travel horizontally across the film gate. At slower shutter speeds, the first curtain fully opens to let light through, before the second curtain follows up. At faster shutter speeds, the two curtains travel together with a slit between them to allow light through.
Over time, the curtains may go out of calibration, causing inaccurate shutter speeds and uneven exposures across the frame.
When using sensors and a light source to calibrate shutter speeds, the exposure time should be measured at minimally three locations: the two opposite edges of the film gate and the center. This way we can measure along the full range of the frame and the readings will indicate if at any point the curtains are out of calibration.
I looked around online and couldn’t find a shutter speed timer that’s cheap to build and able to measure shutter speeds at different locations across the frame in one go, so I thought I would give it a try and hopefully contribute to the topic.
This shutter speed timer is built with Arduino Micro/Pro Micro and provides three readings of shutter speeds, it’s a cheap and compact design that can measure down to 1/1000s.
Parts List
- 1 Pro Micro Board
- 3 BPW34 Photodiodes
- 1 SSD1306 OLED Display
- 1 Tactile Push Button
- 4 10k ohms resistors
Building the Timer
The circuit is simple and straightforward.
For the photodiodes, I chose BPW34 for the fast rise/fall time, sensitivity to visible light, and small size. I wired them in reverse-bias. Take note of the polarity, the cathode is marked with a small tip on the side. From what I’ve read, an op-amp configuration could deliever better performance, but I don’t have one, and it would’ve been more complicated and taken up more space.
The SSD1306 display is easy to wire up and code. Mine has four pins: VCC, GND, SDA, SCL. Simply refer to the board’s pinout diagram for the correct pins. For my Pro Micro board, pin 2 is SDA, pin 3 is SCL.
The push button is there to offer additional functionalities, I currently use it to simply reset and start a new measurement. Initially it was used to display the last recorded measurements, but I didn’t find it very useful.
I started off by building the circuit on a breadboard. Once I was happy with its performance, I built it into the 3D-printed case. I cut off some resistor legs to use as wires, and wrapped them with Kapton tape for insulation when needed.
The cased assembly was built from the base plate up:
-
Place the three photodiodes over the windows and superglue their backsides to the prongs holding them. Solder the resistors and wires to them.
-
Sit the Arduino board on top, solder the photodiodes’ resistors and wires to the corresponding pins on the board.
-
Solder the button to its wires and resistor, insert and superglue it into its seat on the side of spacer plate. Then place the spacer plate on top of Arduino board. Here wrapping the assembly with some masking tape can help keep everything aligned before soldering. Solder the button connections to the board pins.
-
Solder the wires for the display to the Arduino pins, the other ends of the wires need to be placed where the display pins would sit under the spacer plate’s open slot.
-
Sit the display on top of the spacer plate and solder the four connections.
-
Fit the case top over the assembly, press them together to engage the snap fit between base plate and case top.
Because the USB port on the Pro Micro is fragile, I use a USB extension port to avoid plugging into the board directly.
Code
The code was written in Arduino IDE, I also ported it to PlatformIO on VSCode.
There are three states for each photodiode:
DETECTING
: I usedanalogRead()
and a threshold value to detect light falling on photodiodes, once reading exceeds threshold, light is detected, the start time is recorded and state changes toMEASURING
.MEASURING
: Once reading fromanalogRead()
drops below threshold, the duration of exposure can be calculated by subtracting the start time from the current time. The state changes toRESULT
.RESULT
: When all three photodiodes are in this state, the timed durations are displayed in milliseconds with a timeout of 10 seconds. After which the states reset back toDETECTING
.
Notes: To be able to measure down to 1 ms, the DETECTING
and MEASURING
cycle should be enclosed in a while loop without any slow operations, like println
.
Testing on Cameras
To use the timer, power it on via USB, open the camera back, press it up against the film rails, make sure the photodiodes are aligned with the edges of film gate, shine a flashlight from the lens mount towards the film gate. Reset the timer, then fire the shutter and check the displayed readings.
I have tested on my Leica M3 and Canon A1 with lens off. It doesn’t seem to work as well with lens on. I’m not sure why, maybe I need to use a better light source than my iPad’s flashlight.
Discussions
A more sophisticated design could measure faster shutter speeds, possibly with higher accuracy. It’s a topic that goes surprisingly deep, and lots of great resources have been shared by people online.
When I designed the case, I only considered horizontal shutter curtains, so the photodiodes are placed on a horizontal line. If they were placed along the diagnal of the film gate instead, with two in opposite corners, and one in the center, it would allow full-range measurement for both horizontal and vertical shutter curtains.
All in all, it’s been a fruitful learning experience for me, and I’m happy with how my shutter speed timer turned out. The project is open-source, so feel free to check it out!