Captura Gotas de Agua en Acción con Arduino Nano: Fotografía de Alta Velocidad DIY
Componentes y suministros
| Componente | Cantidad |
|---|---|
| Arduino Nano R3 | 1 |
| Módulo láser KY-008 | 1 |
| Módulo sensor de luz LM393 | 1 |
| Transistor NPN de propósito general | 3 |
| Potenciómetro rotativo | 1 |
| Pulsador C&K PTS 645 | 1 |
Aplicaciones y servicios en línea
- Arduino IDE
Sobre este proyecto
Este proyecto nació de las ganas de probar la fotografía de alta velocidad. Aquí presento un montaje sencillo basado en Arduino para fotografiar gotas de agua.
Requisitos previos
- Cámara con ajustes manuales y control remoto (ej. Sony DSC-HX300).
- Flash externo con control remoto (ej. GODOX SY8000) y cable de sincronización (PC-sync).
Modifiqué el mando remoto de la cámara añadiendo un header de 3 pines para emular la pulsación del botón vía Arduino. Dentro del mando hay tres láminas metálicas: común (GND), autofoco y obturador. Al pulsar, cierran primero autofoco+GND y luego obturador+GND. El cable de sincronización del flash funciona igual: cerrar contactos dispara el flash.
Detección de la gota
Objetivo: capturar el instante del chapoteo al caer la gota sobre la superficie del agua. Para simplificar, usé partes de un gotero médico ensambladas.
Un módulo láser KY-008 y un sensor de luz LM393 detectan la caída: la gota interrumpe el haz láser al pasar. El sensor LM393 permite ajustar sensibilidad con su potenciómetro integrado. Los módulos pueden separarse a gran distancia.
Principio de disparo
La foto se toma en oscuridad con exposición larga (varios segundos), de modo que solo la luz del flash (duración ~1/10.000 s) congela la imagen.
- El usuario pulsa el Botón antes de que caiga la gota observable.
- Arduino cierra contactos de autofoco y obturador en el mando → la cámara abre obturador (exposición larga).
- Al mismo tiempo, Arduino habilita el disparo del flash.
- Cuando la gota cruza el haz láser, el sensor lo detecta.
- Tras un retardo ajustable (1-500 ms, vía potenciómetro), Arduino cierra contactos del cable PC-sync → flash dispara.
- Ese retardo permite capturar distintas fases del chapoteo.
- Las siguientes gotas no disparan el flash; hay que pulsar de nuevo el Botón.
El esquema del circuito se muestra en la figura 7. Un acoplador óptico puede aislar el flash (alta tensión) de la electrónica de baja tensión.
Parámetros principales del código
DBG_MODE: descomenta para modo depuración (LED integrado simula obturador/flash sin usar cámara ni flash real).- Pines: Botón (2), Autofoco (3), Obturador (4), Flash (5), Sensor (6), Potenciómetro (A5).
- Retardos: autofoco (100 ms), obturador (100 ms), flash (10 ms).
- Rango retardo disparo: 1-500 ms (ajustable en código).
Resultados
Las figuras 10-12 muestran ejemplos de gotas capturadas: corona, columna, doble gota...
Código
Código principal (Arduino)
//#define DBG_MODE
const 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 = 100;
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, currSensor;
boolean allowFlash;
unsigned long fireDelay;
void openShutter() {
#ifndef DBG_MODE
digitalWrite(FOCUS_PIN, HIGH); delay(FOCUS_DELAY);
digitalWrite(SHUTTER_PIN, HIGH); delay(SHUTTER_DELAY);
digitalWrite(SHUTTER_PIN, LOW); delay(FOCUS_DELAY);
digitalWrite(FOCUS_PIN, LOW);
#else
digitalWrite(LED_BUILTIN, HIGH);
#endif
}
void fireFlash() {
#ifndef DBG_MODE
digitalWrite(FLASH_PIN, HIGH); delay(FLASH_DELAY);
digitalWrite(FLASH_PIN, LOW);
#else
digitalWrite(LED_BUILTIN, LOW);
#endif
}
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(FOCUS_PIN, OUTPUT); pinMode(SHUTTER_PIN, OUTPUT);
pinMode(FLASH_PIN, OUTPUT); pinMode(SENSOR_PIN, INPUT);
#ifdef DBG_MODE pinMode(LED_BUILTIN, OUTPUT); #endif
digitalWrite(FOCUS_PIN, LOW); digitalWrite(SHUTTER_PIN, LOW);
digitalWrite(FLASH_PIN, LOW);
prevButton = digitalRead(BUTTON_PIN);
prevSensor = digitalRead(SENSOR_PIN);
allowFlash = false;
}
void loop() {
currButton = digitalRead(BUTTON_PIN);
if (prevButton != currButton) {
prevButton = currButton;
if (currButton == LOW) { // Botón pulsado (pull-up)
allowFlash = true;
prevSensor = HIGH;
fireDelay = map(analogRead(RESISTOR_PIN), 0, 1023, FIRE_DELAY_MIN, FIRE_DELAY_MAX);
openShutter();
} else { delay(50); }
}
currSensor = digitalRead(SENSOR_PIN);
if (prevSensor != currSensor) {
prevSensor = currSensor;
if (currSensor == HIGH && allowFlash) { // Flanco subida: gota cruza haz
allowFlash = false;
delay(fireDelay);
fireFlash();
}
}
}
Esquemáticos
Esquema del circuito (imagen adjunta).
Proceso de manufactura
- Alcancía Inteligente: Controla un Aceptador de Monedas con Arduino Nano
- Monitorización IoT y IA de calidad del agua para proteger la vida acuática
- Generador de Ondas JX – Oscilador DDS Compatible con Arduino con Pantalla OLED
- Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
- Monitoriza la Temperatura de tu Hogar desde Cualquier Lugar con Integración Arduino Cloud
- Conectar Arduino Mega a módulo GPS NEO‑6M: Guía paso a paso
- Módulo GPS u-blox LEA‑6H 02: Guía de integración con Arduino y Python
- Integración del Sensor de Pulso MAX30100 con Arduino: Guía Paso a Paso
- Construye la App Fridgeye con una Pantalla Nextion: Guía Paso a Paso
- Guía Paso a Paso: Conectar Sensor de Humedad de Suelo YL-39/YL-69 a Arduino UNO
- Medición Precisa de Radiación Solar con Arduino UNO y Shield Ethernet