定格瞬間:用Arduino玩高速攝影

海椰人 發佈 2022-08-06T07:33:12.700174+00:00

用這台機器,你能拍出以任何探測傳感到物體的動作、聲音,也許還有別的……用來觸發照相機的裝置,而且你不必為此改裝照相機或閃光燈,用舊式高壓閃光燈或新式的點電晶體閃光燈都可以。為啥我做這個玩意兒呢?我的一個攝影發燒友給我秀了些高速攝影圖片樣本。那機器,無緣於非土豪人群。


用這台機器,你能拍出以任何探測傳感到物體的動作、聲音,也許還有別的……用來觸發照相機的裝置,而且你不必為此改裝照相機或閃光燈,用舊式高壓閃光燈或新式的點電晶體閃光燈都可以。

為啥我做這個玩意兒呢?
我的一個攝影發燒友給我秀了些高速攝影圖片樣本。那機器,無緣於非土豪人群。
而我認為,用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連接在一起。

第七步:一些計算


現在我們要知道液滴從開始至落到液面上所需時間。
根據照片所示,使用下列算式計算:(y
2)/(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

第八步:拍攝結果

你也能做到!

關鍵字: