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, animales).

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. Para ello, será necesario investigar el modo en el que las cámaras Nikon tienen codificada cada acción en el canal IR (número de parpadeos, tiempos, frecuencias, etc).

Finalmente, cada uno de los disparos realizados por la cámara quedarán registrados en la memoria EEPROM de Arduino. Mediante un pulsador, controlado por interrupciones, se mostrará en la pantalla del PC 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

Tal como muestran las figuras 1 y 2, el montaje del proyecto está formado por un potenciómetro, un pulsador, un led conectado directamente al pin número 13 y la toma de tierra situada justo al lado y un sensor volumétrico, modelo HC-SR04.

La forma de conectar el potenciómetro, led y pulsador es la misma que se indica en los apuntes del curso. En cuanto al sensor volumétrico, el esquema que se ha seguido es el que se muestra en la figura 3.

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ámaras Nikon mediante Infrarrojos

Uno de los medios de comunicación de los que disponen las cámaras reflex de la marca Nikon es mediante un canal de infrarrojos. Cualquiera de estas cámaras puede realizar diversas acciones, 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 propio 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:

    1. Se pone en funcionamiento el sensor volumétrico para realizar una medida.

    2. 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).

    3. Se calcula la diferencia entre la penúltima medida y la última.

    4. Se evalúa si esta diferencia es mayor que el valor umbral.

    5. En caso afirmativo

        1. Realizar la fotografías ( mirar función hacerFoto()).

        2. Incrementar el número de fotografías y guardar dicho valor en memoria (función mirar escrituraMemoria()).

    6. 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); } //funcion para escribir en memoria

void escrituraMemoria(){

nfotos = nfotos + 1; if (nfotos > 255){ //en una celda de memoria solo se pueden 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 fotografias 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 codigo infrarrojo que usan las camaras //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); }