Timer para ampliadora fotográfica

Recientemente empece a dedicarme a la fotografía analogica. Luego de un tiempo solamente escaneando mis negativos, decidi que era hora de empezar a hacer copias fotograficas, en papel quimico. Para esto me compre una Meopta Axomat II, una ampliadora sencilla para 35mm. Como no tenia temporizador, lo hago de la manera tradicional (a mano).

Pero como contar 10 segundos en la cabeza es muy aburrido, decidi construirme mi propio timer con cosas que tenia en la casa.

Aqui un video del proyecto durante la fase de debugging. El LED rojo simboliza la luz de seguridad, y el amarillo la ampliadora.

Como se puede ver en el video, consiste basicamente de un microcontrolador (en este caso, un PIC16F628A), que maneja los displays, buzzer, botones, pedal, y las luces.

Operación

Los 3 modos en los que opera son:

Foco: al presionar el pedal, se enciende la ampliadora. Al presionar otra vez, se apaga. Esto da tiempo de hacer el enfoque. Tiene un timeout de seguridad: transcurridos 60 segundos, se apagará la ampliadora.

Cronómetro: mientras se tenga presionado el pedal, la ampliadora permanecera encendida y el cronometro contará hacia arriba en incrementos de 1 segundo, con un “bip”  por cada segundo transcurrido.

Timer: al presionar el pedal se enciende la ampliadora, y se apagará transcurrido el tiempo pre configurado. O bien, se puede abortar el proceso al presionar el pedal. Tambien hace un “bip” por cada segundo para facilitar tareas de dodging and burning y poder hacerlo sin mirar el display.

Extras

Posee 2 displays de 7 segmentos, que obviamente limitan la exposicion a 99 segundos, pero no veo esto como un impedimento. De cualquier manera, seria muy sencillo ampliar el circuito a 3 displays y hacer la exposicion maxima de 999 segundos.

El buzzer es una caracteristica muy práctica que permite hacer operaciones como dodging y burning sin necesidad de mirar el display. Suponiendo que quiero hacer un dodge de 5 segundos simplemente cubriria la parte que quiero afectar, presionaria el pedal, y al transcurrir 5 “bips” saco mi herramienta de dodge. De esa manera puedo estar pendiente de la exposicion y no del display.

El timer, en mi caso, se opera mediante un pedal. Simplemente porque lo veo mas comodo, y porque tenia un pedal de una estacion de soldadura por aire que ya no sirve. No hay ningun impedimento tecnico para operar el timer con un boton. O con un control remoto…

Salidas

El timer posee dos salidas: una que maneja la luz de seguridad del laboratorio, y otra que maneja la ampliadora. Esto por varios motivos:

  • Enfoque: es mas facil enfocar con la luz de seguridad apagada, ya que la luz de seguridad encendida reduce el contraste.
  • Medidor de exposicion: estos son sensibles a la luz de seguridad, y tenerla encendida daria una lectura incorrecta.
  • Velado: ninguna luz de seguridad es totalmente segura, y la sensibilidad del papel “arranca” cuando el papel se expone. La luz podria, en algunos casos (exposiciones largas) velar ligeramente el papel y reducir el contraste.

Considero ademas que es una caracteristica util, y que no molesta. Al menos yo no necesito andar caminando por el cuarto oscuro mientras estoy haciendo una exposicion. Y por último, es facil desactivar esta carcteristica con una solucion “low tech”: simplemente enchufar la luz en un enchufe comun.

Descripción del circuito

CPU

La CPU del circuito es un microcontrolador PIC16F628A. Se utiliza el oscilador RC interno para el control de tiempo, ya que considero que es lo “suficientemente bueno” para esta aplicacion, ya que las exposiciones normalmente serán cortas, y el error introducido por este tipo de oscilador, en este caso, es irrelevante, considerando que siempre se debe hacer un “test strip” de las imagenes al buscar la exposicion correcta. Dado que el unico factor que altera al oscilador RC interno del PIC es la temperatura, no es de importancia en este caso, ya que la temperatura ambiente no variara en gran medida durante los minutos posteriores al test strip. No considero necesario utilizar un oscilador de cristal, y de hacerlo, necesitaria un pic aun mas grande (o probablemente mas trabajo en el software).

Respecto del software, originalmente fue hecho en ASM pero luego lo pasé a C, ya que al agregarle funcionalidades empezo a volverse muy complejo.

Display

Los displays son a LED, de 7 segmentos, catodo comun, color rojo (importante en el cuarto oscuro. Definitivamente NO pueden ser azules, ya que el papel ortocromático es sensible al azul). Los segmentos estan manejados directamente desde la salida del PORTB del PIC, a traves de resisitencias limitadoras de corriente. El multiplexado se logra con un transistor NPN en el pin CC de cada display, que hace que se active en el momento correspondiente.

Botones de entrada

Los botones son simplemente pulsadores, conectados a GND. Los pins de entrada poseen una resistencia pull-up de valor alto (47K) a VDD, por lo que, en estado normal, el puerto tiene un valor alto. Al presionar el pulsador, se cortocircuita a GND, y aparece un valor bajo en el pin. El debouncing es manejado por software.

Buzzer

El buzzer marca cada segundo durante las exposiciones. Consiste simplemente de un buzzer, que, no se como funciona =) pero que encontre en un motherboard. No posee circuito oscilador, asi que probablemente sea solo un piezoelectrico o un parlante. En mi caso lo conecte a través de una resistencia de bajo valor (unos 47R) al puerto CCP1 del PIC. Esta es la salida del PWM.

Para hacer sonar el buzzer, el PWM esta configurado con una frecuencia de 1000Hz y un ciclo de trabajo del 50%. El “bip” emitido clasico de una onda cuadrada, pero hace perfectamente su trabajo. Debido al diseño del programa, se producen 16 “ticks” del reloj en cada segundo. El buzzer se activa en el momento que comienza el  siguiente segundo, y se desactiva en el tick inmediatamente posterior. La duracion del bip es por lo tanto de 1/16s, o 62,5ms.

Control de las lamparas

Para controlar las lamparas elegí una salida de estado sólido (TRIACs). El PIC activa el optotriac MOC3041, que a su vez activa el triac de potencia BTB08-600. El diseño no contempla la red de “snubber” (un RC en paralelo con la carga) ya que las lamparas incandescentes son, por definicion, cargas puramente resistivas. El snubber en este caso no aporta ninguna mejora. En caso de usar lamparas fluorescentes (no veo motivo para usarlas) se deberia agregar un snubber.

El triac es un BTB08-600, simplemente porque tenia dos en mi caja de “cosas”. Si fuera a comprar un triac nuevo, elegiria el mas economico que soporte el voltaje de linea. Las caracteristicas “maximas” del triac son irrelevantes para la aplicacion ya que la lampara mas grande es de 75W, y los triacs manejan, normalmente, 1500W.Recordar que el voltaje de la linea es el voltaje PICO, no RMS. Multiplicar el voltaje de linea por 1.4142. En mi caso, el voltaje nominal es 220V por lo que 220V x 1.4142 = 311. Un BTB08-400 de 400V hubiera sido suficiente, aunque cerca del limite.

El MOC3041 (toda la serie MOC304x y MOC306x) tienen la particularidad de incorporar un circuito de “deteccion de cruce por cero”. Esto garantiza que las lamparas se activaran cuando el voltaje de linea se encuentre en 0V (recordemos que esto es corriente alterna). Esto reduce el “shock” sobre el filamento de la lampara. Cuando la lampara esta fria, la resistencia es baja. Si se aplica corriente en el momento del voltaje maximo (~310V), se produce, en efecto, un cortocircuito hasta que la lampara caliente. Debido a que el calentamiento es muy rapido, el filamente sufre un “shock” termico importante que va reduciendo su vida util. Es el motivo por el cual, generalmente, las lamparas de filamento se queman al momento de encenderlas (y debido al vacio de la lampara se produce un arco bastante espectacular).

Si bien las lamparas de filamento son muy economicas, el opto triac sigue siendo necesario para manejar el triac. Y el costo de un MOC304x/306x es unos centavos mayor que el de un MOC302x. No veo  ningun motivo para no usarlo.

Por ultimo, en caso de no gustar una salida a triac, se puede convertir muy sencillamente a relays, cambiando todo desde el optotriac en adelante, por un relay y un transistor para comandarlo (generalmente esto es mas economico que un relay de 5V compatible con la salida del PIC).

Circuito

Como el circuito posee 2 partes, una “caliente”, que maneja voltajes de linea, y la otra que posee controles que van en contacto con el usuario, se hizo en 2 placas separadas. Esto esta ilustrado por la linea que divide a las 2 mitades del diagrama.

Circuito del timer de ampliadora

PCB

Este es el layout que yo hice:

PCB de ejemplo para el timer.

Para imprimir

Incluye el artwork en PS, PS en Negativo, y BMP a 300dpi.

Descargar

Programa

El programa esta hecho en C para PIC16, compilado con HITECH C compiler. Usa librerias propietarias por lo que es necesario. Incluye source y compilado para 16F628A.

Descargar

/*
* File: main.c
* Author: hjf
*
* Created on 26 de julio de 2012, 22:53
*/

#define _XTAL_FREQ 8000000
#include
#include
#include

__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF & BOREN_ON & LVP_OFF & CPD_OFF & CP_OFF);

unsigned char const displaylut[10] = {0xB7, 0x22, 0xD3, 0x73, 0x66, 0x75, 0xF5, 0x23, 0xF7, 0x77};
void inicializar(void);
void dispout(char, char);
void dispout_full(char);
void pedal_toggle();
char getpedal();
char pedal_prev;
unsigned char tickcount;
bit running_prev;
bit running;

unsigned char mode;
unsigned char curtime;
unsigned char preset;
unsigned char debounce;

/*
*
*/
int main(int argc, char** argv) {
inicializar();
while (1) {
CLRWDT();
switch (mode) {
case 0:
/* Modo 0: “FOCUS”. el display muestra “Fo”, un toque del pedal
* enciende la lampara, y un toque del pedal la apaga.
* Pasado 1 minuto, la lampara se apaga sola. */
dispout(0xc5, 1);
dispout(0xf0, 0);
if (!running) {
preset = 60;
curtime = 0;
}
if (debounce == 0) {
pedal_toggle();

}
break;
case 1:
/* Modo 1: “Contador”. el display muestra “00”. Mientras el pedal
este activado, la lampara esta encendida, y el display cuenta hacia
arriba. Al liberar el pedal, el contador se resetea. */
dispout_full(curtime);
if (!running) {
curtime = 0;
preset = 99;
}
if (debounce == 0) {
running = getpedal();
}

break;
case 2:
/* Modo 2: “Timer”. El display muestra el preset de tiempo
(por defecto 10 segundos). Un toque del pedal enciende la lampara
y se apaga cuando pasa el tiempo, o cuando se vuelve a tocar
el pedal. */
dispout_full(curtime);
if (!running) {
curtime = preset;
}
if (debounce == 0) {
pedal_toggle();

}
break;
}

RA6 = running;
RA7 = !running;
di();
if (debounce == 0 && !running) {
if (RA5 == 0) {

if (mode == 0) {
mode = 1;
} else {
mode = mode << 1; preset = 10; } debounce = 10; } if (mode == 2) { if (RA3 == 0) { preset–; debounce = 10; } if (RA4 == 0) { preset++; debounce = 10; } if (preset == 100 ) { preset = 1; } if (preset == 255|| preset==0) { preset = 99; } } } else { if (debounce > 0) {
debounce–;
}
}
if (running_prev == 0 && running == 1) {
TMR1 = 0x0BDE;
TMR1ON = 1;
tickcount=16;
debounce = 10;
}

if (running_prev == 1 && running == 0) {
TMR1 = 0x0BDE;
TMR1IF = 0;
TMR1ON = 0;
TMR2ON = 0;

}

running_prev = running;
ei();

}
return (EXIT_SUCCESS);
}

void interrupt intsrv(void) {
if (TMR1IF) {
TMR2ON = 0;
tickcount–;
if (tickcount == 0) {
tickcount = 16;

if (mode == 2) {
curtime–;
if (curtime == 0) {
running = 0;
}
} else {
curtime++;
if (curtime == preset) {
running = 0;
}
}
if (mode != 0 && running==1) {
TMR2ON = 1;
}
}
TMR1IF = 0;
TMR1 = 0x0BEE;
}
}

void pedal_toggle() {
char pedal_actual = getpedal();
if (pedal_prev == 0 && pedal_actual == 1) {
running = !running;
}
pedal_prev = pedal_actual;
}

void dispout(char symbol, char pos) {
PORTB = symbol;
if (pos == 0) {
RA1 = 1;

} else {
RA0 = 1;
}
TRISA2 = 0;
RA2 = 1;
__delay_ms(5);

PORTB = 0x00;
RA0 = 0;
RA1 = 0;

}

void dispout_full(char salida) {
char digito = salida % 10;

dispout(displaylut[digito], 0);
salida = salida / 10;
digito = salida % 10;
dispout(displaylut[digito], 1);
}

char getpedal() {
char retval = 0;
TRISA2 = 1;
if (RA2 == 0) {
retval = 1;
}
TRISA2 = 0;
return retval;
}

void inicializar() {
TRISA = 0x38;
TRISB = 0x00;
CMCON = 0x07;
VRCON = 0x00;
T1CON = 0;
TMR1IF = 0;
PEIE = 1;
TMR1IE = 1;
CCP1CON = 0x3C;
CCPR1L = 0x7C;
CCP1CON = 0x3C;
PIE1 = 0x81;
PR2 = 0xF9;
T2CON = 0x05;
PORTB = 0x00;

TMR2ON = 0;
PORTA = 0x00;
mode = 0;
curtime = 0;
preset = 10;
pedal_prev = 0;
running_prev = 0;
tickcount = 16;
debounce = 0;
}

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *