定格瞬间:用Arduino玩高速摄影


用这台机器,你能拍出以任何探测传感到物体的动作、声音,也许还有别的……用来触发照相机的装置,而且你不必为此改装照相机或闪光灯,用旧式高压闪光灯或新式的点晶体管闪光灯都可以。
为啥我做这个玩意儿呢?
我的一个摄影发烧友给我秀了些高速摄影图片样本。那机器,无缘于非土豪人群。
而我认为,用DIY手段肯定能解决,于是就做了。
然后我们做了一些试验,就有了下面的图片了。


而照着本教程,你能做出这样一台摄影工具!

第一步:激光触发器(光屏障)





激光触发器包括以下两个部分:

  • 传感器(这一步的内容)
  • 激光(下一步的内容)

在图中所示的电路中,你需要:

  • 一个光敏电阻/光敏二极管
  • 10千欧电阻

第二步:激光发生器





用下列算式计算所需的电阻:R = 1.25V / A电路中的电流

所需元件:

  • 一个激光二极管(淘宝入手)
  • LM317
  • 一个电阻

撇开模块LM317,直接将电阻和激光二极管串联起来也可以。

第三步:建立电路(Arduino)






将所有元件连到Arduino或做一个PCB板来进行摄影工作。具体步骤如下:
将LCD按电路图所示连到Arduino板上。
将传感器电路输出端连到模拟输入端0。
将数字端12连在闪光灯开关电路上。
将下调电阻的4个按钮分别连接到:

  • pin6 (延迟 )
  • pin7 (延迟-)
  • pin8 (传感器 )
  • pin9 (传感器-)

而草图上,是我设计用的PCB板草图,附上下载电子版本。
Eagle Files phototrigger.zip 82 KB

第四步:将所有东西封入外壳


第五步:上载程序代码

// code from geobruce (Bruce Helsen, Belgium)
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define DEBOUNCE_DELAY 5
#define REPEAT_DELAY 250
int analogInPin = 0;
int ledpin = 12;
int meanSensorValue;
String f = "splash";
int sensitivity = 125;
unsigned int delayTime = 25;
int photoCount = 0;
unsigned long lastLowTime; // last time that all readings were low
boolean repeatMode = 0;
int lastDisplayUpdateTime = 0;

void setup()
{
  Serial.begin(9600); 
  lcd.begin(16, 2); 
  calibrateSensorMean();
  updateDisplay();
}

void loop()
{
   readButtons();
   readTrigger();
}

void readTrigger() {
   int sensorValue = analogRead(analogInPin);

   if (sensorValue > (meanSensorValue + sensitivity) || sensorValue < (meanSensorValue - sensitivity)) {
     takePicture();
     Serial.println(sensorValue);
     Serial.println(meanSensorValue);
     delay(500);
     f = "cal";
     calibrateSensorMean();
   } else {
     meanSensorValue = (sensorValue+meanSensorValue)/2;
   }
}

void calibrateSensorMean() 
   {
   int i;
   if(f == "splash"){
   splashScreen();
   f = "";
   }
   if (f == "cal"){
   displayTwoLines(String("Calibrating..."),String(""));
 }
   
   for (i=0;i<200;i++) {
     delay(10);
     meanSensorValue = (analogRead(analogInPin)+meanSensorValue)/2;
   }
     updateDisplay();
 }

void takePicture() {
     delay(delayTime);
     digitalWrite(13,HIGH);
     delay(10);
     digitalWrite(13,LOW);

     
}

void readButtons() {
   boolean delayAdd = digitalRead(6);
   boolean delaySub = digitalRead(7);
   boolean sensAdd = digitalRead(8);
   boolean sensSub = digitalRead(9);
 
   if (delayAdd || delaySub || sensAdd || sensSub) {

     if ((millis() - lastLowTime) > DEBOUNCE_DELAY) {
       // stable reading
       unsigned long delayIncrement ;
       // initially you are not in repeat mode, after 1 time, you are in repeat mode and you must wait for the repeat time to lapse
       
       if (!repeatMode || (millis() > (lastLowTime + REPEAT_DELAY))) {

         delayIncrement = 1;
         if (delayTime >= 200) {
           delayIncrement = 5;
         }
         
         if (delayAdd) {delayTime += delayIncrement;}
         if (delaySub) {delayTime -= delayIncrement;}
         if (sensAdd) {sensitivity++;}
         if (sensSub) {sensitivity--;}
         updateDisplay();
         repeatMode = 1;
       }
     }
   } else {
     lastLowTime = millis();
     repeatMode = 0;
   }
}
void splashScreen(){
  displayTwoLines(String("High Speed Flash"),String("Trigger V0.3"));
  }
void updateDisplay() {
    //if ((millis() + 100) > lastDisplayUpdateTime) {
   displayTwoLines(String("Delay = " + String(delayTime)), String("Sensitiv = " + String(sensitivity)));
  //}
   lastDisplayUpdateTime = millis();
}
void displayTwoLines(String one, String two){
  
  lcd.clear();
  lcd.print(one);
  lcd.setCursor(0, 1);
  lcd.print(two);
  Serial.println(one);
  Serial.println(two);
  one = "";
  two = "";
  }

第六步:安装过程



用一根滴管或一个顶部钻了小孔的瓶子来制造液滴。
确保液滴下落经过激光束。
X是滴管口和激光束的距离。
Y是激光束和液面的距离。(本文的例子是一盘牛奶)
外接闪光灯通过PC连接线和Arduino连接在一起。

第七步:一些计算


现在我们要知道液滴从开始至落到液面上所需时间。
根据照片所示,使用下列算式计算:(y2)/(sqrt(2xA) sqrt(2A(x y)))1000 (注:sqrt是开算术平方根,这其实是自由落体公式,液滴所受空气阻力极小,而且距离短,对试验无甚影响。)
算式中的A代表重力加速度。
Wolframalpha可以找到自己国家的重力加速度。例如[中国](http://www.wolframalpha.com/input/?i=Gravitational acceleration china)的。(原来我国的重力加速度很多地区都没到9.8,偏低纬度国家啊)这个网站列了很多物理常量可供查询。(注:因为高速摄影毕竟需要精密计算,所以物理常量还是取多点小数位为好。)
你不用费尽心机计算,我在这里送上excel表格方便计算时间。
Calculations flash trigger.xls 6 KB

第八步:拍摄结果


你也能做到!

via原作:Geo Bruce



坐沙发

发表评论