Cronometro

De Proyectos
Saltar a: navegación, buscar

Propósito

Este proyecto se trata de construir un cronometro que desconecte un aparato eléctrico (220V) en un tiempo determinado.
Se podria hacer con un 555 pero para aprender sobre la programación de un microcontrolador y sobre las pantalals LCDs he optado por utilizar un Arduino Leonardo y fabricar un shield que conecte la pantalla, botones, leds, etc.
El objetivo es tener un cronometro al que enchufaremos directamente el aparato a desconectar/conectar, es decir el aparato se alimentará a través del cronometro y un rele conectado al microcontrolador desconectará el aparato.

Circuito



General

Fuente Alimentación

Diseñar una fuente de alimentación para alimentar un arduino a 12V y 500mA. Colocar un fusible en el primario y un interruptor que corte la corriente del primario.
El transformador que he encontrado es de 400 y pico mA Crovisa 12V 5VA

Fusible


El fusible se puede poner en el circuito primario o el secundario. En mi caso lo pondré en el primario y para ello necesito calcular la corriente máxima que circulará por el primario.

Sabemos la corriente que irá por el secundario y la fórmula que relaciona ambas corrientes es:
 V_{pri} \cdot I_{pri} = V_{sec} \cdot I_{sec}

Hay que tener en cuenta que hay una pérdida de poténcia de un 60% del primario al secundario, solo es efectivo un 40% de la energia que transforma:
V_{pri} \cdot I_{pri} \cdot 40% = V_{sec} \cdot I_{sec}

Aqui despejamos:
I_{pri} = \frac{V_{sec} \cdot I{sec} \cdot 1.4}{V_{pri}} = \frac {12 \cdot 0.416 \cdot 1.4}{230} = 30 mA

En las hojas de especificaciones nos dicen que la corriente del primario es de 36mA, así que utilizaremos un fusible de ese valor o superior.

Elección Transformador


Voy a necesitar un transformador que el secundario tenga como mínimo el voltaje que alimentará al Arduino (9V) más 3V que es lo que va a caer en el regulador de tensión (7809).
V_{arduino} + V_{reg} = 9 + 3 = 12V

Los 12V son en valor eficaz, lo que significa que una vez pasados a valor de pico voy a tener:
V_{p} = V_{ef} \cdot \sqrt(2) = 16.97V

Como en el puente rectificador va a caer voltaje:
V_{p} - 1.4V = 15.57 V

Este será el voltaje que tendré a la entrada del regulador, y como se ve va de sobras para que en el regulador caigan 3V.

Por lo tanto utilizaré un transformador de 230V en el primario y 12V en el secundario. He escogido un transformador de Crovisa 12V 5VA

Elección Puente Rectificador


Al elegir el puente rectificador tenemos que tener en cuenta la corriente que puede aguantar en conducción y el voltaje que puede aguantar en corte. Como hemos visto en el apartado del transformador tendremos una tensión máxima de unos 17V y la corriente que nos suministrará el transformador es de unos 400mA.
También hay que tener en cuenta la corriente que circulará por el condesador que hace de filtro durante la carga. Este efecto está explicado en un apartado de la entrada Efecto del condensador en la conducción del diodo rectificador y en Corriente Inicial.

Corriente tension condensador.png

En esta imagen se ve en la linea verde la tensión que tiene el condensador con un rizado del 10% de la tensión máxima y la linea roja es la corriente que pasa por el condensador para cargarse. El primer pico que se ve es de 14A (el condensador es un corto circuito y se intenta cargar en el menor tiempo posible, así que pasa la máxima corriente). Los siguientes picos son de unos 4.3A.

El puente rectificador debe poder aguantar unos 14A (mejor más por seguridad) durante un periodo de 6ms como mínimo (es lo que dura el pulso).

El modelo de puente es el W08M. Aguanta una corriente directa de 1.5A, suficiente para nuestros 417mA y un voltaje en inversa 800V. También encontramos el dato de aguanta 50A en picos de 8.3ms, en principio suficiente para aguantar los picos que vemos en la imagen superior.

Cálculos Condensador Filtrado


En la sección Uso práctico del Filtro de la entrada Fuente de Alimentación comento la regla práctica de 1000uF por cada amperio de corriente en la salida.
En este caso tendré unos 400mA como máximo a la salida, por lo tanto escogeré un condensador de 470uF (que es el valor anterior a 1000uF).
También colocaré los condensadores que comenta el usuario Fogonazo en el forosdeelectronica.com con los valores de C2 - 100nF, C3 - 100nF y C4 - uF.

Elección Regulador de Tensión


Necesito un regulador de tensión que entre 9V en la salida y que aguante unos 400mA. El 7809 es un regulador de estas características.

Circuito Proteus

Para poder simular un transformador de 230V/12V se tiene que utilizar la fórmula L_2 = L_1 \cdot \left (\frac {V_2}{V_1} \right)^2
Fijamos L_1 = 20mH y entonces calculamos:

L_2 = 20mH \cdot \left (\frac{12V}{230V}\right)^2 = 54 \mu H

Relé


El relé se encargará de encender la carga conectada (una bombilla, insoladora, ...). Utilizaré un relé Serie 32 - Mini-relé para circuito impreso de 6A para poder conectar como máximo 230V \cdot 6A = 1380 W.
Debido a que necesito 40mA para poder activar el relé y la salida de un pin de Arduino entrega justo 40mA me quedo corto de corriente (además quiero encender un led cuando se encienda el relé y consume unos 10mA). Utilizaré un transistor controlado por el arduino para commutar el relé. El circuito que resulta está explicado en la sección Circuito Relé.
Voy a usar la fuente de 5V que provee el Arduino Leonardo para activar el relé. En cada pin el Arduino Leonardo entrega 5V y 40mA como máximo, pero en el pin de alimentación de 5V tengo más corriente.

Calculo resistencia base

Utilizando la teoria del apartado Circuito Relé calcularé la resistencia de base.

I_C = I_{Rele} + I_{Led} = \frac{V_{Rele}}{R_{Rele}} + I_{Led} = \frac{5}{125} + 15 = 55 mA

R_B = \frac {(V_{Control}-V_{BE})\cdot \beta}{I_C} = \frac {(5-0.6) \cdot 50}{55} = 4k \Omega

El valor normalizado es 3k9 \Omega

Según la fórmula de arriba podemos sacar la corriente que pasará por el relé:

I_{Rele} = \frac {V_{Rele}}{R_{Rele}} = \frac {5}{125} = 40mA

La I_B la calcularemos a través de la relación de corrientes del transistor:

I_C = \beta \cdot I_B \rightarrow I_B = \frac{I_C}{\beta} = \frac {55mA}{50} = 1,1 mA

Calculo de la resistencia de masa


La resistencia a masa la pondré como mínimo de 39k \Omega o 100k \Omega.

Calculo resistencia led


La tensión de trabajo del led rojo es de 1.5v - 2.2v y consume una corriente entre 10mA y 20mA. Para nuestro caso escogeremos una tensión de 2v y corriente de 15mA.

R_{LED} = \frac {V_{RELE} - V_{LED}} {I_{LED}} = \frac {5 - 2}{0.015} = 200 \Omega

Pondré una resistencia de 220 \Omega.

Comparativa Medidas

Calculada Medida
R_{Rele} 125 \Omega 64 \Omega
V_{Rele} 5 V 4.4 V
I_{Rele} 40 mA 65 mA
V_{Led} 2 V 2 V
I_{Led} 15 mA 10.5 mA
R_{Led} 200 \Omega 215 \Omega
I_C 55 mA 75.5 mA
I_B 1.1 mA 1.06 mA
R_B 4k4 \Omega 3K6 \Omega
\beta 50 313

LCD via I2C


Para no gastar tantos pines del Arduino he utilizado el integrado PCF8574. Este integrado es un expansor de 8 bits via i2c. Con esto puedo conectar un LCD via i2c al arduino, ahorrandome 7 puertos del arduino.
En la sección Circuito se ve el esquematico de conexión del LCD al PCF8574. Básicamente utilizo el LCD en el modo de 4 hilos y juntamente con las señales RS, EN y RW las envio por i2c al Arduino.
Para que el Arduino se pueda comunicar con el módulo PCF8574 necesito la libreria Wire.h y utilizar una libreria para controlar el LCD que lo haga a través del i2c, no a través de los pines digitales del arduino.
En la sección Comunicación I2C de la página HD44780U está explicado más detalladamente como funciona.

Archivos Kicad


Shield Arduino
Fotolito Shiel Cronometro
Archivos Kicad del Shield Arduino

PCB LCD y botones
Fotolito PCB del LCD y los botones
Archivos del PCB del LCD y los botones

imagenes


Código

Explicación código


Archivo código: Cronometro.ino

Bloque 01 - Defines, declaraciones variables

  • Las primeras tres lineas son los includes. Voy a usar la comunicación I2C para conectar el lcd al arduino por lo tanto hago un include de la libreria Wire.h. Tambien hago un include de la libreria para controlar el lcd y por último utilizare la libreria Bounce.h para poder hacer Debounce en los botones
  • El siguiente mini-bloque es el encargado de definir los pines que usaré del arduino para los botones
  • Un define de la "varaible" INTERVAL_MILLIS que usaré más adelante
  • Otros defines que sirven para "traducir" el numero del estado en palabras mas entendibles
  • Configuración del parámetro REBOUNCE_TIME para los Debounce
  • Declaración del objeto lcd con la dirección I2C y las lineas y caracteres que tiene el lcd
  • Creación de los objetos debounce (uno por cada boton)
  • Creación de la variable tiempo que es un struct dónde almacenaré el tiempo que he configurado como cuenta atrás
  • Creación de una variable que almaceno los milisegundos que pasan desde que enciendo el cronómetro


Bloque 02 - Setup

En el setup voy a configurar los pines del arduino e iniciar el objeto lcd:

  • Lo primero que hago es activar el pin RELE como OUTPUT y ponerlo como LOW porque lo quiero desactivado
  • Con un bucle configuro los 6 botones como INPUT_PULLUP (este modo es para ahorrarme colocar las pullup en la placa, ya que el arduino ya lleva integrada resistencias pullup en cada entrada/salida digital
  • Llamo a la función init() del obejto lcd que inicia el LCD


Bloque 3 - Loop

El bloque del Loop consiste en un switch en donde cada case corresponde con un estado y la variable estate almacena en que estado se encuentra el programa.
Hay 3 estados:

  • Estado 0 - Inicial
    • Es el primer estado cuando encendemos el cronometro
    • En este estado lo que hacemos es:
      • Mostrar el tiempo por pantalla (la función imprimirTiempo()
      • Pasar directamente al siguiente estado (state = E_CONFIG_TIME;)
  • Estado 1 - Configurar tiempo
    • Lo primero es llamar a la función configTiempo(), que sirve para configurar los minutos y segundos de cuenta atrás
    • Luego tenemos dos if's
      • El primero (ev_reset()) hace que si apretamos el botón reset reiniciamos el cronometro a 0 y volvemos al estado inicial
      • El segundo (ev_start()) hace que si apretamos el botón start activamos el relé y vamos al estado cuenta atras (state = E_CUENTA_ATRAS;)
  • Estado 2 - Cuenta atras
    • En este estado hay un if que miras si se ha acabado la cuenta atrás o se ha pulsado el boton reset. Si no pasa ningun de estas dos acciones empezamos la cuenta atrás (llamando a la función cuentaAtras();) y la seguimos ejecutando hasta que uno de estos dos eventos ocurran
    • Si se acaba la cuenta atrás o se aprieta el botón reset lo que haremos es:
      • Desactivar relé (desactivarRele();)
      • Reiniciar el contador a 0 (resetTiempo();)
      • Dirigirnos al estado inicial (state = E_INICIAL;)


Bloque 4 - Funciones

En el bloque 4 nos encontramos todas la funciones que utilizamos durante el loop. Las voy a listar y explicar brevemente:

  • boolean ev_start()
    • Utilizando las fórmulas del objeto Bounce miramos si se ha apretado el botón start
    • Si se ha apretado se devuelve true (ATENCIÓN si el pulsador está en LOW quiere decir que está pulsado. Esto es debido a que la lógica se invierte porque utilizo resistencias pullup en vez de pulldown)
    • Sino se ha apretado se devuelve false
  • boolean ev_reset()
    • Lo mismo que en la función de ev_start pero con el botón reset
  • void imprimirTiempo()
    • Función que se encarga de escribir en el LCD el tiempo
  • void configTiempo()
    • Configura el tiempo de la cuenta atrás según los botones que apretamos
    • Si se llega a 59 segundos se pasa a 1 minuto y los segundos pasan a 0
    • Si se llega a los 59 minutos se pasa a 1 hora y se pone 0 en minutos
    • Tengo en cuenta que no se puede bajar de 0 segundos ni de 0 minutos
    • Cuando acabo de configurar el tiempo llamo a la función imprimirTiempo() para actualizar la pantalla
  • void resetTiempo()
    • Coloco a 0 los campos del struct cuenta (horas, minutos, segundos y decimas)
  • boolean ev_fin_cuenta_atras()
    • Si los minutos, segundos y decimas llegan a 0 devuelve true
  • void cuentaAtras()
  • void activarRele()
    • Escribe HIGH en el pin RELE
  • void desactivarRele()
    • Escribe LOW en el pin RELE


Máquina de estados


Maquina estados cronometro.png

Galeria