Focus Speed

From rev0wiki
Jump to: navigation, search

This is a method that I used to benchmark the focusing speed (originally from MFD to ~1.7m target, in the new setup from fixed FD of 14" to FD of 8') of several lenses/motor technologies. The setup involves using a DSLR, Arduino (used a Maple Mini clone for the hardware) connected to an LED, and a PC for setting the delay. The Arduino triggers the shutter and turns on the LED after a set delay, if the LED is not on by the time the picture is taken, the delay should be increased, and vice versa until the focus time is converged.

Picture of the test setup with a 700D and Canon EF-S 17-55mm IS USM lens.

Results (New)

Setup was revised to the following conditions:

  • Focus speed measured from 14″ distance to 8′ distance.
  • Lighting (per 700D metering sensor): 1/60s at f/2.8, ISO200 (HTP on).
  • Lens set to ~50mm focal length.

1. Canon EF-S 17-55mm f/2.8 IS USM (Ring USM with FTM) -> 227ms

2. Sigma DG 17-50 f/2.8 OS HSM (Micro HSM without FTM) -> 262ms

3. Canon EF 50mm f/1.8 (DC micro motor) -> 311ms

4. Canon EF-S 18-55mm IS STM (Stepper motor) -> 204-222ms (204ms with equivalent available light as above f/2.8 lenses)

The numbers above do not include the native shutter lag, which for the 700D measured (lens set to MF, manual mode 1/60s shutter, f/2.8): 162-163ms. From this more controlled test it appears that ring USM is ~13% faster than micro HSM, ~27% faster than micro motor, and micro HSM is ~16% faster than micro motor.

Results (Old)

1. Canon EF-S 18-55 IS STM -> 500ms

2. Canon EF-S 17-85 IS USM (Ring USM with FTM) -> 307ms

3. Sigma DG 17-50 f/2.8 OS HSM (Micro HSM without FTM) -> 472ms

The numbers above do not include the native shutter lag, which for the 7D measured (in manual focus) at: 120-125 ms. The native shutter lag was also measured for the 450D at 171ms.

Arduino Code

Justin Kenny 2017
AF Speed Tester

  uint32 delaytime = 100;
void setup() {
  Serial.begin(115200); // Ignored by Maple. But needed by boards using hardware serial via a USB to Serial adaptor
  // Initialize the built-in LED pin as an output:
  pinMode(20, OUTPUT);
  pinMode(10, OUTPUT);
  // Initialize the built-in button (labeled BUT) as an input:
  pinMode(32, INPUT);

uint8 isButtonPressed() {
    if (digitalRead(32) == 1) {
        while (digitalRead(32) == 1);
        return true;
    return false;

void loop() {
  while (Serial.available() > 0) {
    // look for the next valid integer in the incoming serial stream:
    delaytime = Serial.parseInt();
    // look for the newline. That's the end of your
    // sentence:
    if ( == '\n') {
  Serial.print("Using ");
  Serial.println("ms delay.");
    // Check if the button is pressed.
    if (isButtonPressed()) {
        // Trigger camera
        digitalWrite(10, HIGH); // Trigger shutter release
        digitalWrite(20,HIGH); // Turn LED on
        digitalWrite(10, LOW); // Let off shutter release
        digitalWrite(20,LOW); // Turn LED off

Improvements and Notes

  • The setup should be better controlled, the following conditions need to be fixed:
    • Start and end focus distances should be equivalent (MFD as start distance is not "fair" as it varies from lens to lens)
      • Adjust start focus by using a fixed target near the camera
    • Lighting conditions should be fixed, along with shutter speed
    • Target (high contrast) is fixed and camera is pointing at same part of the target from lens to lens
    • Focal length is common between lenses compared (if possible)