Intervalómetro para fotografía


Sistema con microprocesador para realizar fotografías a intervalos desde un segundo a 24 horas con programación del número de disparos a realizar.


Se trata de poder realizar un número determinado de fotos a intervalos fijos para poder apreciar sucesos que se desarrollan con gran lentitud. Estas fotografías pueden después unirse en una secuencia continua para mejor visualización por medio de programas específicos que generan un video a partir de la serie de fotografías tomadas, ejemplos son JPGVideo y JPGAvi. Aunque la toma de imágenes a intervalos puede hacerse con cámaras de video de gama media-alta, desde luego la definición que aportan no puede compararse con la que da una cámara digital fotográfica.

Gracias al uso de un microprocesador, el circuito es muy simple. Un PIC 16F88,  un optoacoplador 4N25, una pantalla de dos líneas y 16 caracteres, 7 resistencias, dos condensadores y un regulador de voltaje.


Circuito
En aras de la simplicidad he elegido un microprocesador 16F88 ya que puede funcionar sin reloj externo con lo cual nos ahorramos el cristal y dos condensadores
La frecuencia de reloj de funcionamiento del PIC, se determina por software a 4Mhz en este caso. Además también puede funcionar por reloj interno a 31, 125, 250 y 500 kHz y a 1, 2, 4 y 8 MHz. Con cristal externo funciona hasta 20MHz.
Dispone el chip de una memoria de 7168 bytes para programa.  
Es un integrado de 18 pines y aunque es compatible en patillas con el 16F84, este último no funcionará con el programa suministrado ya que se utiliza algún comando específico del 16F88.  Así pues, en Fig1 vemos el circuito en una conexión clásica de este tipo de micros con un display LCD de 2x16 (2 líneas de 16 caracteres cada una) en formato de 4 bits. La resistencia VR1 sirve para ajustar el contraste del LCD.
Estos displays tienen 14 patillas, de las que se usan aquí solo las señaladas. Ya que la conexión es en modo de 4 bits, varias de las patillas no es necesario conectarlas. Algunos LCD  pueden tener además  los pines 15 y 16 que conectadas a los 5 voltios lo retroiluminan, lo cual puede ser útil si trabajamos de noche.

Hay tres pulsadores

SELE:Al arrancar el programa, alguno de los digitos queda intermitente para su modificación. Pulsando “Sele”, podemos cambiar a otro digito de forma cíclica.

SUBE: Aumenta el valor del digito seleccionado hasta alcanzar su valor máximo y comienza de nuevo de cero.

MARC: Pone en marcha el sistema haciendo la primera fotografía y hasta el final de las programadas y al intervalo previsto.

En la patilla 11, tenemos un voltaje durante 200 milisegundos para cada foto y que alimenta al 4N25 y provoca el cierre del circuito en patillas 4 y 5 de este optoacoplador. Es aquí donde se conecta el cable que irá a la cámara, a su conector de disparo por cable y que lógicamente varia según modelos.  Si al conectar el cable no funciona, deben intercambiarse los hilos que van al 4N25.
No hay ningún peligro para la cámara ya que esta totalmente aislada del circuito en sí.  El 4N25 actúa como un rele, es decir, como si fuese un simple pulsador
Por último queda el regulador de tensión 78L05 que proporciona los 5 voltios desde la pila de 9V.
Placa
En un circuito tan sencillo se ha optado por usar una placa Veroboard con el esquema de la Fig2. Es muy fácil de realizar porque las pistas de cobre y los taladros ya están realizados. 
Recordar que hay cuatro cortes en las pistas, uno junto al 78L05, dos mas entre el PIC y el 4N25 y otro bajo R6. Y por supuesto el corte bajo los dos integrados que separan sus pines. También fijarse en los cuatro puentes. El LCD y los pulsadores (de buena calidad) se sueldan a la placa por medio de cablecillos y espadines. En un circuito de baja frecuencia no hay componentes críticos ni se necesitan disposiciones especiales.


Programa
El sistema esta programado en PicBasic, especifico para el micro 16F88 a 4Mhz por medio de su reloj interno. Se proporciona el fuente y el fichero HEX listo para programar el micro, que puede hacerse con el popular programador  TE-20 y el ICProg.


Funcionamiento
Repasadas las conexiones y dada la simplicidad del circuito, debe funcionar a la primera, así, conectada la alimentación, en la fila superior de la pantalla aparece “Interv.=00:00:00” y en la inferior “Fotos=001Paro”. Pulsando el botón SELE, seleccionamos el digito que deseamos modificar con el botón SUBE. Podemos llegar hasta 23:59:59 en intervalo y a 999 en fotos. Seguidamente pulsamos el botón Marcha y comenzara el conteo a la baja de las fotos. Por ejemplo “Fotos=090Marc082”.
La precisión del intervalo no es exacta ya que por simplicidad no se usa un reloj de tiempo real, pero es mas que suficiente para el propósito perseguido. La precisión es mejor del 3% en la mayoría de intervalos.
Para periodos tan largos o muchas fotos seria conveniente prever una alimentación externa en vez de la pila de 9V del prototipo.
Si deseamos interrumpir el proceso, basta con apagar el dispositivo. Al volver a conectarlo, aparecen los valores que teníamos la última vez, ya que se guardan en la Eprom del PIC.
Si se desea tener una opción de puesta a cero de los contadores se tendría que hacer un RESET del PIC llevando a masa la patilla cuatro.
LISTA DE COMPONENTES

5 resistencias de 10K ¼ vatio
1 resistencia de 120 ohmios ¼
1 resistencia variable de 5k
1 condensador de 0,1 uF
1 condensador de 1 uF
1 regulador tensión 78L05
1 PIC 16F88 con su zócalo
1 Display LCD 2x16
1 4N25
3 Pulsadores
1 Interruptor
1 Pila 9v


'*************************************************************
' INTERVALOMETRO

'Intervalometro para fotografia.Desde 1 segundo hasta 24 horas.
'Autor: Joaquín Paredes Pardo
'email: micloa@telefonica.net
'Fecha: 2008
'Compilador: PicBasic Pro
'Procesador: 16F88 a 4Mhz interno
'Fichero: Intervalometro.BAS
'*************************************************************


DEFINE LCD_BITS 4  'indicamos que el bus de datos del lcd sera de 4bit
DEFINE LCD_DREG PORTA  'el bus de datos sera el puerto A
DEFINE LCD_DBIT 0  'el bus de datos seran los 4 bit menos significativos del puerto A
DEFINE LCD_RSREG PORTA  'el bit de control RS sera del puerto a
DEFINE LCD_RSBIT 4  'se usara el RB4 como RS
DEFINE LCD_EREG PORTB  'el bit de control E sera del puerto B
DEFINE LCD_EBIT 3  'se usara el RB3 como E
'DEFINE LCD_RWREG  PORTA  'el bit de control RW sera del puerto A (si se suprime el compilador no protesta)
'DEFINE LCD_RWBIT  5  'se usara el RA5 como RW (si se suprime el compilador no protesta)
DEFINE LCD_COMMANDUS 2000 'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
DEFINE LCD_DATAUS 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg.
DEFINE LCD_INITMS 1  '(50) 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg.
OSCCON = %01101000  ' 4 mhz
CMCON = 7
ANSEL = 0  'Solo para 16F88 Fuerza salidas digitales
TRISA = 0

TRISB.3 = 0
TRISB.4 = 0
TRISB.0 = 1  'Star
TRISB.1 = 1  'Selecciona horas, minutos, etc
TRISB.2 = 1  'Sube valor
TRISB.5 = 0  'Salida al 4N25
TRISB.6 = 0  'Salida adicional
                                     Time CON 1000  'PONER PARA PROGRAMA FINAL
                                                                    
horauni VAR BYTE: horadec VAR BYTE
minuuni VAR BYTE: minudec VAR BYTE
seguuni VAR BYTE: segudec VAR BYTE
tiempo VAR WORD  'Tiempo total de intervalo
fotocen VAR BYTE: fotodec VAR BYTE: fotouni VAR BYTE: fotos VAR WORD: fotos = 1
posi VAR BYTE: posi = 1  'posicion en bucle de horas, minutos, etc
i VAR WORD
tempal VAR WORD: tempba VAR WORD  ' TempAl, si pasa de 65525 (18h) word
itemp VAR WORD

PORTB.5 = 0      'evita disparo camara al iniciar
Read 1, horadec: Read 2, horauni
Read 3, minudec: Read 4, minuuni
Read 5, segudec: Read 6, seguuni
Read 11, fotocen: Read 12, fotodec: Read 13, fotouni
Pause time  'Inicializa LCD
LCDOut $fe, 1
IF horadec > 2 Then horadec=0
IF horauni > 9 Then horauni=0
IF minudec > 5 Then minudec=0
IF minuuni > 9 Then minuuni=0
IF segudec > 5 Then segudec=0
IF seguuni > 9 Then seguuni=1
LCDOut "Interv.=", DEC horadec, DEC horauni, ":", DEC minudec, DEC minuuni, ":", DEC segudec, DEC seguuni
LCDOut $fe, $c0  'Segunda linea
IF fotocen > 9 Then fotocen=0
IF fotodec > 9 Then fotodec=0
IF fotouni > 9 Then fotouni=1
LCDOut "Fotos=", DEC fotocen, DEC fotodec, DEC fotouni, "Paro"

seleccion:
IF PORTB.1=1 Then
  Pause 20  'antirebote ajuste personal
  pulsadaSe:
  IF PORTB.1=1 Then GoTo pulsadaSe
  posi = posi + 1
EndIF
select case posi
LCDOut $fe, $0f  'cursor blinking
case 1
  LCDOut $fe, $80 + 8
  GoTo horade
case 2
  LCDOut $fe, $80 + 9
  GoTo horaun
case 3
  LCDOut $fe, $80 + 11
  GoTo minude
case 4
  LCDOut $fe, $80 + 12
  GoTo minuun
case 5
  LCDOut $fe, $80 + 14
  GoTo segude
case 6
  LCDOut $fe, $80 + 15
  GoTo seguun
case 7
  LCDOut $fe, $c0 + 6  'Segunda linea
  GoTo fotoce
case 8
  LCDOut $fe, $c0 + 7 
  GoTo fotode
case 9
  LCDOut $fe, $c0 + 8 
  GoTo fotoun
case Else
posi = 1
End select
GoTo seleccion


marchaparo:
tempal = 0: tempba = 0
Write 1, horadec: Pause 10: Write 2, horauni: Pause 10: Write 3, minudec: Pause 10: Write 4, minuuni: Pause 10:
Write 5, segudec: Pause 10: Write 6, seguuni: Pause 10
Write 11, fotocen: Pause 10: Write 12, fotodec: Pause 10: Write 13, fotouni: Pause 10  'Guarda en EEPROM los valores para proxima vez
tiempo = (horadec * 10 + horauni) * 60 * 60  'Pasa los valores a tiempo total en segundos
tiempo = tiempo + ((minudec * 10 + minuuni) * 60)
tiempo = tiempo + (segudec * 10 + seguuni)
fotos = fotocen * 100 + fotodec * 10 + fotouni
LCDOut $fe, $c0 + 9
LCDOut "Marc"  'Marcha
LCDOut DEC fotocen, DEC fotocen, DEC fotouni
LCDOut $fe, $0c
IF tiempo > 65535 Then  'TempAl, si pasa de 65525 (18h) word
tempba = 65535
tempal = tiempo - 65535
Else
tempba = tiempo
EndIF
For i = (fotos - 1) To 0 Step -1
IF i > 99 Then  'cuadrar digitos
  LCDOut $fe, $c0 + 13
EndIF
IF i > 9 AND i < 100 Then  'cuadrar digitos
  LCDOut $fe, $c0 + 13
  LCDOut "0"
  LCDOut $fe, $c0 + 14
EndIF
IF i < 10 Then  'cuadrar digitos
  LCDOut $fe, $c0 + 14
  LCDOut "0"
  LCDOut $fe, $c0 + 15
EndIF
PORTB.5 = 1               'Dispara camara
Pause 200
PORTB.5 = 0
LCDOut DEC i
IF i=0 Then   'regresa si no mas fotos
  LCDOut $fe, $c0 + 9
  LCDOut "Paro"
  GoTo seleccion
EndIF
For itemp = 1 To tempal
  IF PORTB.0 = 1 Then
   Pause 3000          'Para el conteo y da tiempo a soltar el boton
   GoTo seleccion
  EndIF
  Pause time
Next
For itemp = 1 To tempba
  IF PORTB.0 = 1 Then
   Pause 3000          'Para el conteo y da tiempo a soltar el boton
   GoTo seleccion
  EndIF
  Pause time
Next
Next
'LCDOut $fe, $c0 + 9
'LCDOut "Paro"
'GoTo seleccion


horade:
IF PORTB.2=1 Then
  Pause 20  'antirebote ajustar personalmente
  pulsadahd:
  IF PORTB.2=1 Then GoTo pulsadahd
  horadec = horadec + 1
EndIF
IF horadec > 2 Then
  horadec = 0  'limita a 24h
EndIF
LCDOut $fe, $80 + 8
LCDOut DEC horadec
IF horadec >= 2 AND horauni > 3 Then
  horauni = 0
  LCDOut $fe, $80 + 9
  LCDOut DEC horauni
EndIF
GoSub selectb
GoTo horade

horaun:
IF PORTB.2=1 Then
  Pause 20 'antirebote ajustar personalmente
  pulsadahu:
  IF PORTB.2=1 Then GoTo pulsadahu
  horauni = horauni + 1
EndIF
IF horauni > 9 Then horauni = 0
IF horadec = 2 AND horauni > 3 Then horauni = 0  'limita a 24h
LCDOut $fe, $80 + 9
LCDOut DEC horauni
GoSub selectb
GoTo horaun

minude:
IF PORTB.2=1 Then
  Pause 20  'antirebote ajustar personalmente
  pulsadamd:
  IF PORTB.2=1 Then GoTo pulsadamd
  minudec = minudec + 1
EndIF
IF minudec > 5 Then minudec = 0
LCDOut $fe, $80 + 11
LCDOut DEC minudec
GoSub selectb
GoTo minude

minuun:
IF PORTB.2=1 Then
  Pause 20  'antirebote ajustar personalmente
  pulsadamu:
  IF PORTB.2=1 Then GoTo pulsadamu
  minuuni = minuuni + 1
EndIF
IF minuuni > 9 Then minuuni = 0
LCDOut $fe, $80 + 12
LCDOut DEC minuuni
GoSub selectb
GoTo minuun

segude:
IF PORTB.2=1 Then
  Pause 20  'antirebote ajustar personalmente
  pulsadasd:
  IF PORTB.2=1 Then GoTo pulsadasd
  segudec = segudec + 1
EndIF
IF segudec > 5 Then segudec = 0
LCDOut $fe, $80 + 14
LCDOut DEC segudec
GoSub selectb
GoTo segude

seguun:
IF PORTB.2=1 Then
  Pause 20  'antirebote ajustar personalmente
  pulsadasu:
  IF PORTB.2=1 Then GoTo pulsadasu
  seguuni = seguuni + 1
EndIF
IF seguuni > 9 Then seguuni = 0
LCDOut $fe, $80 + 15
LCDOut DEC seguuni
GoSub selectb
GoTo seguun

fotoce:  'Centenas de fotos
IF PORTB.2=1 Then
  Pause 20  'antirebote ajustar personalmente
  pulsadafc:
  IF PORTB.2=1 Then GoTo pulsadafc
  fotocen = fotocen + 1
EndIF
IF fotocen > 9 Then fotocen = 0
LCDOut $fe, $c0 + 6
LCDOut DEC fotocen
GoSub selectb
GoTo fotoce

fotode:  'Decenas de fotos
IF PORTB.2=1 Then
  Pause 20  'antirebote ajustar personalmente
  pulsadafd:
  IF PORTB.2=1 Then GoTo pulsadafd
  fotodec = fotodec + 1
EndIF
IF fotodec > 9 Then fotodec = 0
LCDOut $fe, $c0 + 7
LCDOut DEC fotodec
GoSub selectb
GoTo fotode

fotoun:  'Unidades de fotos
IF PORTB.2=1 Then
  Pause 20  'antirebote ajustar personalmente
  pulsadafu:
  IF PORTB.2=1 Then GoTo pulsadafu
  fotouni = fotouni + 1
EndIF
IF fotouni > 9 Then fotouni = 0
LCDOut $fe, $c0 + 8
LCDOut DEC fotouni
GoSub selectb
GoTo fotoun

selectb
IF PORTB.1 = 1 Then GoTo seleccion
IF PORTB.0 = 1 Then GoTo marchaparo
Return

End
Menu