用 Arduino 捕捉水滴
组件和用品
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 3 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
应用和在线服务
![]() |
|
关于这个项目
这个项目是由于渴望尝试这个摄影领域而诞生的。下面您将看到我构建的一个基于 Arduino 的简单设置,用于制作水滴的高速照片。
首先你应该有一个手动设置的相机和一个外接闪光灯,它们都必须支持遥控。我有带电缆的 Sony DSC-HX300(图 1)和 GODOX SY8000(图 2)。


在图 2 中,可以看到两根 Arduino 电线仔细绝缘并连接到 SyncCable 的 PC 连接器。
我决定通过添加一个简单的 3 针接头来修改遥控器(图 3)。

遥控器内部(图 4)有三个弹性金属条(快门的 1 – «+»;2 – GND;自动对焦的 3 – «+»)将两个电路(«2-3»、然后 «1–2») 当按钮被按下时。

由于现在安装了引脚接头,我们可以使用 Arduino 以编程方式模拟按钮按下。
SyncCable 的工作原理相同:PC 连接器中的触点必须短路才能闪光。
我的目标是捕捉水滴落到水面时溅起的瞬间。
为了简化设置,我使用了组装在一起的药物滴管的一些部件(图 5)。

激光模块KY-008和基于LM393的光传感器模块将检测液滴掉落(图6)。

可以以这样的方式布置这些模块,即落下的水滴会中断激光束,从而断开电路。光传感器能够通过旋转模块上的可变电阻器来调整其对激光功率的灵敏度。此外,模块之间可以放置很远的距离。
拍摄是在黑暗中进行,长时间曝光几秒钟,所以只有短时闪光灯才对最终结果有影响。
电路图如图7所示。

设置不是完全自动化的。在可观察到的液滴分离之前,用户按下按钮。通过自动对焦触发和快门触发连续缩短遥控器中的触点,这会打开快门几秒钟。按下按钮还可以触发闪光灯。当液滴穿过激光束时,闪光灯触发器使 PC 连接器中的触点短路,闪光灯闪光。穿过激光束和缩短 SyncCable 中的触点之间的时间由电位计在 1 到 500 ms 的范围内调整。 (可以在代码中更改限制)。通过这种方式,可以捕捉到飞溅的不同时刻。下一滴不会触发闪光灯:要激活此功能,必须再次按下按钮。
组装如图8所示。

可在上述电路中加入光耦合器,将高压闪光灯与低压电子设备分开。
主要代码参数如图9所示。项目基于Arduino Nano。

标志«DBG_MODE» 用于激光模块和光传感器模块的初步布置和调整。在此模式下,既不使用相机也不使用闪光灯。 Arduino 板内置 LED 作为指示灯。
要调整设置,取消注释标志,编译代码并刷新 Arduino。如果设置正确,当按下按钮时 LED 灯亮(快门模拟),当水滴穿过激光束时 LED 灯灭(闪光灯发射模拟)。
当设置运行良好时,注释标志,编译代码并再次刷新 Arduino。
代码还包含以下常量:
· 本项目组件所连接的Arduino引脚;
· 自动对焦、快门或闪光灯触点短路时应用的延迟;
· 电位器可调的时间范围限制。
部分结果如图 10-12 所示。



代码
- 无标题文件
无标题文件Arduino
//#define DBG_MODEconst byte BUTTON_PIN =2;const byte FOCUS_PIN =3;const byte SHUTTER_PIN =4;const byte FLASH_PIN =5;const byte SENSOR_PIN =6;const byte RESISTOR_PIN =A5;const unsigned int FOCUS_DELAY =10; const unsigned int SHUTTER_DELAY =100;const unsigned int FLASH_DELAY =10;const unsigned int FIRE_DELAY_MIN =1;const unsigned int FIRE_DELAY_MAX =500;boolean prevButton, currButton;boolean prevSensor, allowDelay Flash #ifndef DBG_MODE digitalWrite(FOCUS_PIN, HIGH);延迟(FOCUS_DELAY);数字写入(SHUTTER_PIN,高);延迟(快门延迟);数字写入(SHUTTER_PIN,低);延迟(FOCUS_DELAY);数字写入(FOCUS_PIN,低); #else digitalWrite(LED_BUILTIN, HIGH); #endif}void fireFlash() { #ifndef DBG_MODE digitalWrite(FLASH_PIN, HIGH);延迟(FLASH_DELAY);数字写入(FLASH_PIN,低); #else digitalWrite(LED_BUILTIN, LOW); #endif }void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(FOCUS_PIN,输出); pinMode(SHUTTER_PIN, OUTPUT); pinMode(FLASH_PIN, OUTPUT); pinMode(SENSOR_PIN, INPUT); #ifdef DBG_MODE pinMode(LED_BUILTIN, OUTPUT); #endif digitalWrite(FOCUS_PIN, LOW);数字写入(SHUTTER_PIN,低);数字写入(FLASH_PIN,低); prevButton =digitalRead(BUTTON_PIN); prevSensor =digitalRead(SENSOR_PIN); allowFlash =false;}void loop() { currButton =digitalRead(BUTTON_PIN); if (prevButton !=currButton) { prevButton =currButton; if (currButton ==LOW) { allowFlash =true; prevSensor =HIGH; fireDelay =map(analogRead(RESISTOR_PIN), 0, 1023, FIRE_DELAY_MIN, FIRE_DELAY_MAX);打开快门(); } else { 延迟(50); } } currSensor =digitalRead(SENSOR_PIN); if (prevSensor !=currSensor) { prevSensor =currSensor; if (currSensor ==HIGH) { if (allowFlash) { allowFlash =false;延迟(火延迟);火闪(); } } }}
示意图

制造工艺
- 使用 Arduino 控制硬币接收器
- 利用物联网和人工智能拯救水生生物和防治水污染
- JX 波形发生器
- Arduino 带蓝牙控制 LED!
- 使用 Arduino Cloud 随时随地了解您家的温度!
- 如何将 Arduino Mega 与 NEO-6M GPS 模块连接
- u-blox LEA-6H 02 GPS 模块,带有 Arduino 和 Python
- 使用 MAX30100 可穿戴脉搏传感器和 Arduino
- 使用 Nextion Display 构建 Fridgeye 应用程序
- 使用 YL-39 + YL-69 土壤湿度传感器和 Arduino
- 使用 Arduino 测量太阳辐射
- 使用 SmartThings ThingShield 构建 IR 桥