Home 物联·技术 arduino 用Arduino实现照相机高速快门拍摄闪电
用Arduino实现照相机高速快门拍摄闪电

用Arduino实现照相机高速快门拍摄闪电

0
3

用Arduino实现照相机高速快门拍摄闪电

我知道有这么些设备,在闪电劈下时,能让照相机瞬间拍摄,但它们的电路比我要做的复杂得多。我是个做软件的,而不是开发硬件的,于是我决定用Arduino实现它,不但不需要太多软件代码,而且电路也简单得多。

在开始之前,我在维基百科查阅了雷电的相关介绍,以确定这个想法是否可行。关于雷电有很多有意思的信息,但维基百科里最有用的信息条目是闪电延时摄影,我能确定闪电持续时间是100毫秒。根据这个信息,我注意到我的佳能30D照相机快门滞后时间是65毫秒。我知道以前有个项目,如果用反向偏置光电晶体管来检测光照度,相应时间是在1毫秒以内。最后涉及延迟的部分,是在Arduino板上运行的程序,因为这是在16MHz频率下运行,我很肯定能在1毫秒以内运行完成一个紧凑的流程。叠加了所有延迟,得到67毫秒这个时间,远比闪电持续时间100毫秒小。我很有把握我的计划能够实现,于是着手建造原型机。

用Arduino实现照相机高速快门拍摄闪电

用Arduino实现照相机高速快门拍摄闪电

用来检测闪电光照的电路很简单,就如上图所见到的。我用了一个廉价红外光电二极管,在无线电器材中能够找到。而阳光、室内照明还有闪电都释放出足够大量红外光,能被这个电路检测到。如果电路敏感度不够,那就尝试改变电阻值就行了。越大的电阻值在少量红外光情况下将提高其敏感度,而大量光照情况下,电阻值则反过来。

我同事需要触发照相机的一个电路。我在下面将阐述这个简短的教程。

用Arduino实现照相机高速快门拍摄闪电

用Arduino实现照相机高速快门拍摄闪电

这个电路也是用Arduino去触发照相机快门,例如在佳能DSLR照相机上,它有个N3接口。在佳能其他照相机,从10D到40D的都有这个接口,还有不少专业照相机也有类似这个接口,但你需要查阅资料做出一点改动。

这部分教程最难入手的是得到便宜的N3转接器。佳能设计的是专用接口,用到这个接头的设备都不是一般的贵。最便宜的N3接口设备或许是遥控快门了,那也要50美元一个。你不妨试试看做一个自己的接口出来,但我最喜欢的解决方法就是在购物网站上搜索,找到很多简单遥控快门的价格都在10美元以下。

用Arduino实现照相机高速快门拍摄闪电

有了插头,我开始分析不同线路的功能。这个草图里列明了每条不同颜色线在插头的位置。白色是地线,绿色是 3V,当接地形成回路时,照相机开始对焦(相当于你将快门按半下的结构)。红线是 4V,接地形成回路时就照相了(结果取决于照相机的摄影模式,还有要预先对焦)。如果你要保证快速抓拍效果,你需要预调焦距,设成手动对焦模式。

既然我们知道N3接头工作原理,那么我们要做的是接好电路,能让我们切换绿线(调焦)或红线(快门)。我觉得快门对焦线是个鸡肋,在拍照前我能用照相机随时对焦,但也有一些情况下用快门对焦线会比较好,所以就保留它,让整个照相装备成套了。我找到个很简单的开关晶体管2N2222,对这个电路来说堪称完美。请看下面的电路图。

用Arduino实现照相机高速快门拍摄闪电

下面的Arduino代码片段很简单,在你按下键盘“f”时对焦,按下空格键时拍摄。

// Maurice Ribble
// 4-28-2008
// http://www.glacialwanderer.com/hobbyrobotics

// This code just tests my camera trigger.  It lets you
// focus the camera by pressing the 'f' key and take a
// picture by pressing the space bar.

#define FOCUS_PIN 6
#define SHUTTER_PIN 7

void setup()
{
  pinMode(FOCUS_PIN, OUTPUT);
  pinMode(SHUTTER_PIN, OUTPUT);
  digitalWrite(FOCUS_PIN, LOW);
  digitalWrite(SHUTTER_PIN, LOW);
  Serial.begin(9600); // open serial
  Serial.println("Press 'f' to focus and 'spacebar' to trigger shutter");
}

void loop()
{
  int cmd;

  while (Serial.available() > 0)
  {
    cmd = Serial.read();

    switch (cmd)
    {
    case 'f':
      {
        digitalWrite(FOCUS_PIN, HIGH);
        delay(800); // May want to adjust this depending on focus time
        digitalWrite(FOCUS_PIN, LOW);
        break;
      }
    case ' ':
      {
        digitalWrite(SHUTTER_PIN, HIGH);
        delay(2000); // May want to adjust this depending on shot type
        digitalWrite(SHUTTER_PIN, LOW);
        break;
      }
    default:
      {
        Serial.println("Press 'f' to focus and 'spacebar' to trigger shutter");
      }
    }
  }
}

回到高速摄影上面。最后我们需要写软件部分。最初我想设定一个触发照相机的阈值。虽然这是可行的,但操作上我需要根据环境不断校正阈值。我实际上需要软件监控快速改变红外光的变化这个功能,而这个方案能很好完成,因为闪电能造成红外光量大量瞬间变化。

下面是代码。

// Maurice Ribble
// 6-1-2008
// http://www.glacialwanderer.com/hobbyrobotics

// This code uses my camera trigger and lightning detector.
// It waits for a sudden change in the light intensity
// and then triggers the camera.

#define SHUTTER_PIN 7
#define LIGHTNING_TRIGGER_ANALOG_PIN 0
#define TRIGGER_THRESHHOLD 5

int lightningVal;

void setup()
{
  pinMode(SHUTTER_PIN, OUTPUT);
  digitalWrite(SHUTTER_PIN, LOW);
  Serial.begin(9600); // open serial

  lightningVal = analogRead(LIGHTNING_TRIGGER_ANALOG_PIN);
}

void loop()
{
  int cmd;
  int newLightningVal = analogRead(LIGHTNING_TRIGGER_ANALOG_PIN);
  Serial.println(lightningVal, DEC);

  if (abs(newLightningVal - lightningVal) > TRIGGER_THRESHHOLD)
  {
    digitalWrite(SHUTTER_PIN, HIGH);
    delay(1000); // May want to adjust this depending on shot type
    digitalWrite(SHUTTER_PIN, LOW);
    Serial.println("Shutter triggered");
  }

  lightningVal = newLightningVal;
}

下面是几个实例图片,由Adam Bell拍摄。他根据本文做了个闪电快门。一般来说,闪电是在晚上拍摄的,这个闪电快门能在你睡觉时候为你值守。但根据本文同时有了个新的可能,在白天时也能拍摄到闪电。人们对这些图片往往会感到惊奇。感谢Adam拍摄的图片!

用Arduino实现照相机高速快门拍摄闪电

用Arduino实现照相机高速快门拍摄闪电

原文链接

附加教程参考链接

  1. Pingback: 用Arduino实现照相机高速快门拍摄闪电_器材DIY-影像极客