I have long appreciated the art of making timelapses. They can reveal motion in the world on timescales that are not normally noticeable like clouds forming and evaporating in the sky or the Earth rotating against the stars. In theory, timelapses are simple enough to create: one simply takes a sequence of images and stitches them together into the frames of a movie using free software. However in practice I have found them tricky to make well.
The ambient brightness of the environments I want to capture will be continuously changing. Since I'm looking to produce timelapses with a roughly constant apparent brightness, I can't use the manual mode on my camera as it won't adapt:
Manual mode
Automatic exposure (AE) mode isn't an option either because it causes the frames to flicker:
AE mode
The ambient brightness throughout sunrise and sunset does not follow a straight line with respect to time. Instead, it forms a logistic curve:
Brightness with respect to time inferred from real-world data
To shoot well-exposed timelapses around these times I will compensate by using a complimentary shutter speed curve, one that decays as the brightness increases and vice-versa:
Shutter speeds needed to maintain a constant image brightness (range of ~15s to ~1/320s)
Certain intervalometers offer the possibility of varying the shutter speed during the capture sequence, but none offer enough control over how the shutter speed changes. I have only seen models that interpolate linearly between given starting and ending speeds, which is too slow for this purpose.
I chose to build my own shutter release circuit as it can be operated programmatically via an Arduino microcontroller:
(1) Arduino, (2) shutter release circuit, (3) 2.5mm TRS post adapter, (4) 2.5mm shutter cable, (5) interface, (6) 7-segment display
I feed what time I plan to start recording and other parameters into a Python script, and a list of appropriate shutter speeds is returned:
>>> speeds_ms
[5855, 4269, 2970, 1993, 1302, 835, 530, 334, 210, 132, 83, 53, 34, 22, 15]
I then just copy these values into my Arduino script and ensure I start recording at exactly the time I specified.