友情提示点击顶部放大镜 可以使用站内搜索 记住我们的地址 www.hainabaike.com
用这台机器,你能拍出以任何探测传感到物体的动作、声音,也许还有别的……用来触发照相机的装置,而且你不必为此改装照相机或闪光灯,用旧式高压闪光灯或新式的点晶体管闪光灯都可以。
为啥我做这个玩意儿呢?
我的一个摄影发烧友给我秀了些高速摄影图片样本。那机器,无缘于非土豪人群。
而我认为,用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



评论列表