用这台机器,你能拍出以任何探测传感到物体的动作、声音,也许还有别的……用来触发照相机的装置,而且你不必为此改装照相机或闪光灯,用旧式高压闪光灯或新式的点晶体管闪光灯都可以。
为啥我做这个玩意儿呢?
我的一个摄影发烧友给我秀了些高速摄影图片样本。那机器,无缘于非土豪人群。
而我认为,用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
发表评论
要发表评论,您必须先登录。