Sei sulla pagina 1di 6

Arduino - Detección de presencia y activación de Cámara Reflex con

parpadeo de un led.
Objetivo
El objetivo final de este proyecto es modelar un sistema capaz de detectar la
presencia de cualquier elemento en movimiento para fotografiarlo. El sistema se
puede utilizar como parte de un sistema de vigilancia, o bien, para realizar
fotografías sin la presencia del fotógrafo (por ejemplo, automóviles en un
parqueadero).
Para ello se empleará un sensor volumétrico, modelo HC-SR04, capaz de medir las
distancias con respecto a objetos próximos. Si la distancia, entre medidas
consecutivas, supera un umbral, el sistema debe accionar una cámara réflex. La
distancia o valor umbral debe ser configurable y se hará mediante el uso de un
potenciómetro. Para evitar el accionado continuo de la cámara durante el tiempo en
el que un objeto esté cercano a la cámara, se toma como criterio que el objeto haya
superado una distancia entre dos medias consecutivas. Es decir, si un objeto pasa
de estar situado de 50 cm de la cámara a 10cm, se realizará una fotografía; pero no
volverá a accionarse mientras permanezca a 10 cm. Para ello, será necesario que
el objeto vuelva a moverse y producir un cambio en el valor de la distancia.
El accionado de la cámara se hará mediante el sensor de infrarrojo incorporado a la
cámara y el uso de un led normal.
Finalmente, cada uno de los disparos realizados por la cámara quedará registrados
en la memoria EEPROM de Arduino. Mediante un pulsador, controlado por
interrupciones, se mostrará en la pantalla del equipo el número de fotografías
realizadas hasta el momento. Es decir, cada vez que se presiona el botón conectado
a la placa base, el sistema debe capturar una interrupción y realizar las acciones
oportunas. En este caso, sumar el número total de fotografías y mostrarlas por la
pantalla del computador.
Montaje
Elementos a utilizar:
Potenciómetro
Pulsador
Toma de tierra
Sensor volumétrico, modelo HC-SR04.
Cámara Kodak
Montaje realizado en tinkercad

Este sensor dispone de 4 pines, dos de ellos son para la alimentación de 5v y la


toma de tierra. Los otros dos son: TRIG y ECHO. El primero de ellos es para enviar
o lanzar las ondas de ultrasonido y el segundo para analizarlas a su vuelta,
siguiendo el clásico efecto Doopler.
Accionado de cámara
Uno de los medios de comunicación de los que disponen las cámaras reflex es
mediante un canal de infrarrojos, las cuales pueden ser ordenadas de forma remota.
Una de ellas es el simple accionado de la cámara para tomar un nuevo fotograma.
Aunque lo apropiado es utilizar un emisor de infrarrojos, en este proyecto se ha
probado un led normal y situándolo lo suficientemente cerca del sensor de la
cámara, el sistema funciona correctamente. Para que la cámara entienda
correctamente la orden, se debe seguir el mismo sistema de codificación que se ha
utilizado en la propia cámara. En este caso particular, el led debe iluminarse
siguiendo la siguiente secuencia:
2 ms on
27.8 ms off
0.39 ms on
1.580 ms off
0.410 ms on
3.58 ms off
0.4 ms on
Esperar apagado 63 ms hasta el próximo accionado.
La siguiente figura muestra la sucesión de pulsos que se deben dar y el ancho de
los mismos.

Software desarrollado
En el software desarrollado se declaran las siguientes variables globales:
pinPotenciometro: Entrada analógica donde está conectada el potenciómetro,
empleado para determinar el valor umbral de distancia. Cuando ese umbral se
supera la cámara realiza una nueva fotografía.
PinLed: pin donde está conectado el led que, según su parpadeo, accionará la
cámara fotográfica.
PinEcho: pin para conectar la salida ECHO del sensor volumétrico empleado para
medir las distancias.
PinTRIG: pin para conectar la salida TRIG del sensor volumétrico.
Dirección: dirección de la celda de memoria EEPROM donde se almacena el
número de fotografías realizadas hasta el momento.
Nfotos: número de fotografías realizadas.
Última_distancia: última medida de la distancia mediante el sensor volumétrico.
penultima_distancia: medida anterior de distancia. El sistema evalúa si la
diferencia entre la última y penúltima medida supera el valor umbral.
En la función setup() se realiza la siguiente configuración:
Potenciómetro como entrada analógica.
Led como salida digital
ECHO como entrada digital
TRIG como salida digital.
Además, se inicializa la comunicación en serie con el PC para poder imprimir por
pantalla información (número de fotografías) y se inicializan las interrupciones, en
concreto, la número 0 (pulsador conectado al pin dos de la placa).
En la función loop() siempre se repite el mismo proceso:
Se pone en funcionamiento el sensor volumétrico para realizar una medida.
Se realiza una lectura del valor dado por el potenciómetro (en cualquier momento
se podría girar el potenciómetro para modificar el valor umbral de distancia).
Se calcula la diferencia entre la penúltima medida y la última.
Se evalúa si esta diferencia es mayor que el valor umbral.
En caso afirmativo
Realizar la fotografías (mirar función hacerFoto()).
Incrementar el número de fotografías y guardar dicho valor en memoria (función
mirar escrituraMemoria()).
Se actualiza penúltima_distancia pasando a ser la última medida obtenida en la
iteración actual del bucle.
Inicialmente comienza a escribirse la cantidad de fotografías en la primera celda de
memoria (dirección 0). Estas celdas son de 1 byte, por lo que el rango de valores
que puede almacenarse es de 0 a 255. Cuando la cantidad de fotos supera el valor
255, el contador se pone a cero y comienza a guardarse la nueva cantidad en la
siguiente celda de memoria (quedando la anterior con el valor 255). Para
contabilizar el número total de fotos, se recorren las celdas desde la 0 hasta la
dirección que indique la variable dirección acumulando la suma de los valores que
almacenan.
Código fuente
#include <EEPROM.h>
int pinPotenciometro = A0;
int pinLED = 13;

//pines para el volumetrico

int pinECHO = 5;
int pinTRIG = 4;

//variables relacionadas con la memoria EEPROM


int direccion = 0; //direccion de memoria en EEPROM
int nfotos = 0; //numero de fotos

//ultima y penultima medida de distancia


float ultima_distancia=-1;
float penultima_distancia=-1;

void setup() {

// declare the ledPin as an OUTPUT:


pinMode(pinPotenciometro, INPUT);
pinMode(pinLED, OUTPUT);
pinMode(pinECHO, INPUT);
pinMode(pinTRIG, OUTPUT);

//inicializacion de la salida estandar


Serial.begin(9600);

//definicion de interrupcion
//pulsador conectado en pin 2
attachInterrupt(0, pulsacion, CHANGE);
}

void loop() {

digitalWrite(pinTRIG, LOW);
delayMicroseconds(2);
digitalWrite(pinTRIG, HIGH);
delayMicroseconds(2);
digitalWrite(pinTRIG, LOW);
//calculo de distancia
ultima_distancia = pulseIn(pinECHO, HIGH);
ultima_distancia = ultima_distancia / 58.2;

//lectura del potenciometro


//con el potenciometro se controla el cambio de distancia deseado
int valor_limite = analogRead(pinPotenciometro);
valor_limite = map(valor_limite, 0, 1023, 0, 255);
float diferencia = penultima_distancia - ultima_distancia;

//si la diferencia entre medidas realizadas por el sonar es mayor que


el
//valor limite controlado mediante el potenciometro, se activa el led
//con el codigo IR para camaras nikon para realizar la fotografia
if (diferencia > valor_limite){
hacerFoto();
escrituraMemoria();
}
//actualizacion de medidas
penultima_distancia = ultima_distancia;
delay(100);
}

//función para escribir en memoria

void escrituraMemoria(){

nfotos = nfotos + 1;
if (nfotos > 255){
//en una celda de memoria solo se puede guardar valores
direccion = direccion + 1;
//si la direccion sobrepasa el maximo (512) volvemos a la
direccion cero
if (direccion == 512)
direccion = 0;
nfotos = 1;
}
EEPROM.write(direccion, nfotos);
}
//funcion a la que se llama cuando se presiona el pulsador
void pulsacion(){
//se muestra el total de fotografías realizadas
int total = 0;
for (int i = 0; i <= direccion; i++)
total = total + EEPROM.read(i);
Serial.println("Numero total de fotos:");
Serial.println(total);
}

//funciones para activar el led en base al código infrarrojo que usan las
cámaras
//nikon
void hacerFoto() {
for (int i=0; i < 2; i++) {
pulseON(2000);
pulseOFF(27850);
pulseON(390);
pulseOFF(1580);
pulseON(410);
pulseOFF(3580);
pulseON(400);
pulseOFF(63200);
}
}

void pulseON(int pulseTime) {


unsigned long endPulse = micros() + pulseTime;
while( micros() < endPulse) {
digitalWrite(pinLED, HIGH);
delayMicroseconds(13);
digitalWrite(pinLED, LOW);
delayMicroseconds(13);
}
}

void pulseOFF(unsigned long startDelay) {


unsigned long endDelay = micros() + startDelay;
while(micros() < endDelay);
}

Potrebbero piacerti anche