Insoladora

De Proyectos
Saltar a: navegación, buscar

Propósito

He querido constrir mi propia insoladora UV para la creación de placas PCB electrónicas.
He diseñado un circuito que controlado con un arduino pro mini y con un lcd de 16x2, un joestick y dos botones me permiten controlar el tiempo de insolado. El circuito está preparado para una insoladora de doble cara, aunque yo de momento solo he construido una insoladora de una sola cara.
El programa contiene un pequeño menú con tres memorias para guardar tres tiempos diferentes y luego poder volver a cargarlos y una opción para activar las dos caras, solo la inferior o solo la superior.
He querido hacer un modelo que todo sea atornillable por si se tiene que desmontar por algún motivo y las piezas que utilizo para colocar los componentes (como los casquillos, las reactancias, etc) son impresas.

Teoria sobre la luz UV


Imagen que muestra el espectro visible por el ojo humano:

Espectro electromagnetico.png

Como vemos en la imagen las ondas que van desde los 750nm a los 400 nm es la luz que nuestros ojos ven.
La Luz actínica está comprendida entre los 480nm a los 400nm. Está dentro del espectro visible y los azules/vielotas forman parte de esta luz.
La Luz ultravioleta es la que está comprendida entre los 400nm y los 100nm. Dentro de la luz UV encontramos tres subdivisiones:

  • UV-A (400nm-315 nm): Es la menos destructiva de las tres.
  • UV-B (315nm-280 nm): Es biológicamente destructiva y la exposición directa puede causar daños y quemaduras en la piel.
  • UV-C (280nm-100 nm): Es absorvida por la atmosfera terrestre. Es la utilizada para la esterilización médica, del agua o del agua de los acuarios.


Para este proyecto necesitaremos de la Luz Ultravioleta tipo A. Cuando busquemos un tubo fluorescente no solo nos tenemos que fijar en la potnecia que nos da, sino en la potencia de luz Ultravioleta tivo A que tiene. Por ejemplo, en el tupo que yo he escogido (por tamaño y potnecia) tiene 11W de luz, de los cuales 2W son de UV-A. Los 11W no seran de luz UVA, solo una parte. Esto es lógico porque cuando encendemos el tubo vemos luz (violeta), esto por lo que he explicado antes es porque forma parte del rango 750nm-400nm, la ultravioleta no la podemos ver. Esto es algo a tener en cuenta a la hor ade escoger le tubo, porque lógicamente no es lo mismo un tuvo de 11W con 2W de UV-A que uno de 11W con 1W de UV-A.

Hardware

Fluorescentes y casquillos

Fluorescente Casquillos Soporte Casquillos
Ins Tubo.png Ins Casquillo.png Ins SoporteCasquillo.png
Tubo para reprografia con 2W de UV-A. 11W de potneci aen total Casquillo para tubo G5 Soporte para collar el casquillo a la base y darle altura al tubo. Se colocan dos insertos de M3, uno para collar el soporte al casquillo y el otro para collar el soporte a la base
Actinic BL TL 11W/10 Soporte Casquillo

Montaje

Detalle del montaje de los Sujeta Casquillos, los Casquillos y los Fluorescentes:

Ins Montaje01.png

Reactancias

Reactancias Soporte Reactancias
[[File:]] Ins SoporteReactancia.png
texto Soporte para collar las reactancias a la base. Las reactancias se colocan de dos en dos y se necesitan dos soportes por cada par de reactancias. En la parte superior del soporte van dos insertos de M3 para collar las reactancias y en la parte inferior del soporte va un inserto para collarlo a la base
http Soporte Reactancia

Montaje

Detalle del montaje de los Sujeta Reactancias y las Reactancias:

Ins Montaje02.png

Soportes Vidrio, vidrio y vidrio de ajuste

Soporte Vidrio Parte A Soporte Vidrio Parte B Vidrio Vidrio Ajuste Pinzas
Ins SujetaVidrioParteA.png Ins SujetaVidrioParteB.png Ins CristalInf.JPG Ins CristalInf.JPG Ins Pinzas.png
Soporte para el vidrio. Consta de dos partes. La parte A es donde se apoya el vidrio y está sujeta a la base. Se usan dos insertos, uno para collar la parte A a la base y la otra donde se collará la parte B Esta pieza sirve para sujetar el vidrio a la parte A. Con un tornillo M3 que pasa por la parte B se enrosca con la parte A y queda el vidrio sujeto. Vidrio que se usa como base donde apoyar el fotolito y el PCB. Dimensiones: 251mmx195mm Vidrio para apretar el fotolito a la PCB. Se crea un "sandwich" entre el vidrio inferior, el fotolito, el pcb y el vidrio superior Pinzas para juntar los dos vidrios
Soporte Vidrio Parte A Soporte Vidrio Parte B

Montaje

Detalle del montaje de los Sujeta Casquillos, los Casquillos y los Fluorescentes:

Ins Montaje03.PNG

Soportes PCB

Soporte para PCB
Ins SujetaPCB.png
Soporte para collar El PCB Base a la base. Se necesitan 2 soportes. En la parte superior del soporte van dos insertos de M3 para collar el PCB y en la parte inferior del soporte van dos insertos para collar el soporte a la base
Soporte PCB

Montaje

PCB LCD, embellecedores, botones y espaciadores

Embellecedor LCD Embellecedor Joestick Embellecedor Botón Botón Joestick Botón Espaciador LCD Espaciador PCB LCD Espaciador PCB a LCD
[[File:]] [[File:]] [[File:]] [[File:]] [[File:]] [[File:]] [[File:]] [[File:]]
Se usa para tapar los desperfectos en el corte para el LCD de la tapa. Se usa para tapar los desperfectos en el corte para el Joestick de la tapa. Se usa para tapar los desperfectos en el corte para el Botón de la tapa. El Joestick está a unos 10mm por debajo de la tapa, para poder accionarlo he creado un "alargador". El Botón está a unos 10mm por debajo de la tapa, para poder accionarlo he creado un "alargador" Espaciadores entre la tapa y el LCD. Espaciadores entre la tapa y el PCB. Espaciadores entre el PCB y el LCD.
Embellecedor LCD Embellecedor Joestick Embellecedor Botón Botón Joestick Botón Espaciador LCD a Tapa Espaciador PCB LCD a Tapa http

Montaje

Detalle del montaje del PCB LCD y espaciadores (Vista superior tapa):

Ins Montaje05.png

Detalle del montaje de los Embellecedores y los Botones (Vista inferior tapa):

Ins Montaje04.PNG

Demás acabados caja

Enchufe Cierres Bloqueador tapa Maneta
Ins BaseEnchufe.png File File File
Conjunto de enchufe, interruptor y fusible. Cierres tipo maletín. Bloqueador de la apertura de la tapa. Maneta para facilitar el transporte.
http http http http

Archivos

Fichero Descripción
Archivo:PlantillaAgujerosBase.PDF Indica donde van los agujeros para collar las piezas que sujetan el vidrio, las reactancias, los casquillos y la pcb
[[File:]] ""


Electrónica

Lista de componentes (BOM)


PCB Base
Componente Características Encapsulado Unidades
Regleta 2 posiciones PTH 3
Transformador 220V:9V 230Vac:9Vac - 2,8VA PTH 1
Fusible rearmable 1206L035/16YR SMD 1206 1
Puente de diodos RMB4S-E3/45 TO-269AA 1
Condensador electrolítico 470uF 16V SMD 8x10.2 1
Condensador electrolítico 100uF 16V SMD 6.3x5.8 1
Condensadores de 100nF 100nF 50V SMD 1206 2
Regulador de tensión de 9V a 5V MC7805BD2T DPAK 3 1
Diodo de protección S2G-E3/5BT DO214AA 3
Rele Relé Finder 40.52. PTH 2
Resistencia 240 SMD 1206 2
Resistencia 100k SMD 1206 2
Transistor NPN FMMTA42TA SOT23 2
Conector PTH 2
Arduino Pro Mini Arduino Pro Mini PTH 1


PCB LCD
Componente Caracterísitcas Encapsulado Unidades
Blue LCD Module HD44780 1602A v2.0 PTH 1
PCF8574 PTH 1
Push button KAN0610 PTH 2
Joestick SKQUCAA010 PTH 1
LED 5mm Rojo PTH 1
Resistencia 220 PTH 1
Conector PTH 2


Análisis de los bloques

Bloque 1 - Alimentación

Transformador
Primero hay que saber el consumo total del circuito para poder elegir el transformador que necesitaremos:

Arduino Pro Mini
Leds 20mA
Reles 260mA
LCD
Total

Condensadores
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 y C3 - 100nF.

Los demás componentes solo hay que buscar que aguanten los máximos de corriente, voltaje y potencia. En la sección Fuente Alimentación esta explicado como elegir cada componente para configurar una fuente lineal a tus necesidades.

Bloque 2 - Arduino

Como placa Arduino he escogido la Arduino Pro Mini de Sparkfun. En esta placa se usa el Atmega328 que se debe programar via FTDI, por lo cual he necesitado un programador externo. He usado este, USB 2.0 TO RS232 UART TTL Serial CP2102, que utiliza el integrado CP2102 para convertir la señal de USB a TTL.
Dejo un par de enlaces con los diferentes Arduinos y sus características:

Bloque 4 - Reles y transistor


Cada relé necesitará 130mA para activar bobina. Utilizando la teoria del apartado Circuito Relé calcularé la resistencia de base del transistor. No utilizaré un led para saber si está encendido el relé como en el apartado Circuito Relé.

I_C = I_{Rele} = \frac{V_{Rele}}{R_{Rele}} = \frac{5}{38} = 131 mA. Es el valor que nos indica en el datasheet del relé como corriente necesaria para activar la bobina

R_B = \frac {(V_{Control}-V_{BE})\cdot \beta}{I_C} = \frac {(5-0.6) \cdot 50}{0.13} = 1692 \Omega

Pero es una buena práctica multiplicar la corriente I_B por 5 para asegurarnos que el transistor se saturará aunque la \beta cambie. Por lo tanto:

I_B = \frac{I_C}{\beta} = \frac{0.13}{50} = 0.0026 \Rightarrow 5 \cdot I_B = 5 \cdot 0.0026 = 0.013 A
R_B = \frac{V_{Control}-V_{BE}}{I_B} = \frac {(5-0.6)}{0.013} = 338 \Omega

Yo he acabado poninedo una R_B = 240 \Omega

Bloque 5 - LCD y botones

El LCD me sirve para poder interactuar con el sistema. Me muestra el menu y el contador. Utilizo un lcd de 16x2 que es bastante sencillo pero no necesito nada mas complejo. Para conectarlo con el Arduino Pro Mini utilizo el inegrado 8574 que me permite conectar el lcd al arduino por i2c en vez de usar 7 de sus puertos.

Los botones que he puesto son 3, uno tipo joestick para moverme por el menu, configurar el tiempo, etc y otros dos que son el de empezar la cuenta atrás y el de cancelar. El de cancelar sirve tanto para salir del menu como para cancelar la cuenta atrás o borrar el tiempo introducido en el contador.

Esquemáticos


Archivos

Galería PCB

Galería de fotos de las diferentes etapas de la producción del PCB

Programación

Esquema menú y comportamiento lógico del menú

Funcionamiento sistema:

  • En modo reposo
    • Imprimir contador
    • Se entra directamente en el modo configurar el tiempo
    • Con las felcas de UP/DOWN y LEFT/RIGHT podremos movernos por el contador y modificar el valor
    • Con el botón Start empieza la cuenta atras
    • Con el botón Cancel se cancela la cuenta atras, si se ha iniciado, y se coloca el contador a 0
  • En modo menu
    • Se utilizan las flechas UP/DOWN para desplazarse por el menu
    • Se utiliza el boton ENTER para acceder a los submenus/opciones
    • Menu guardar tiempo en memoria
      • Se muestran tres memorias para guardar el tiempo
      • Se selecciona la memoria donde se quiere guardar y el tiempo que hay en el contador se guarda en la memoria
    • Menu cargar tiempo de memoria
      • Se muestran las tres memorias
      • Se selecciona la memoria que se desea y el tiempo se carga en el contador
    • Menu Doble Cara
      • Se muestran las opciones de insolado
      • Se selecciona el modo deseado y se guarda en memoria

Código


Archivo código: Insoladora.ino

Bloque 01 - Defines

  • Utilizo el define para dar un nombre más intuitivo a los pines de los botones, joystick y reles (Seccion Definicion pin arduino)
  • Lo mismo para los estados del menu (Sección Definicion estados)
  • El define INTERVAL_MILLIS y REBOUNCE_TIME son parametros de la libreria Bounce


Bloque 02 - Declaracion objetos

  • Declaro los objetos botones con el sistema debounce
  • Declaro el obejto lcd con la dirección i2c, las lineas que tiene y las filas


Bloque 03 - Declaracion variables

  • Declaración variable state donde almaceno en que estado estoy. Inicializo en el estado inicial, E_INICIAL
  • Declaración de un struct para almacenar el tiempo e inicializado a 0
  • Variable posicionCursor que almacenara donde esta el cursor para cambiar los digitos de los minutos y segundos. Inicializo a 9 que es dond estan las unidades de segundo
  • Variable milisegundos que almacena los milisegundos transcurridos cuando el cronometro está en marcha
  • Declaración de las variables para almacenar los textos de los diferentes menus
  • Variable posMenu para guardar el menu que tenemos seleccionado
  • Declaración de la variable reles que almacenará que cara de la insoladora queremos encender


Bloque 04 - Setup

  • Configuro los pines RELE1 y RELE2 como output y los inicializo en low
  • Configuro los pines de los botones como input activando los pull-up internos del arduino pro mini. Hay que tener en cuenta que la lógica sera negativa. Cuando se apriete un boton la señal de entrada será LOW y en modo reposo será HIGH


Bloque 05 - Loop

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

  • Estado 0 - Inicial
  • Estado 1 - Configurar Tiempo
  • Estado 2 - Cuenta atras
  • Estado 3 - Menu
  • Estado 4 - Menu Guardar
  • Estado 5 - Guardar en memoria
  • Estado 6 - Menu Cargar
  • Estado 7 - Cargar de memoria
  • Estado 8 - Menu Doble Cara
  • Estado 9 - Guardar Doble Cara
  • Estado 10 - Acción cancelar dentro del menu


Bloque 06 - Funciones

  • imprimirTiempo()
    • Muestra el tiempo por pantalla
    • Si solo hay unidades de segundos o minutos inserta un 0, sino escribe directamente lo que hay en el struct cuenta
  • limpiaLCD()
    • Función que uso para limpiar el lcd al pasar del modo temporizador al modo menu
    • Tambien quita el cursor
  • configuraTiempo()
    • Esta función es la encargada de modificar el tiempo cuando utilizamos los botones UP/DOWN y /LEFT/RIGHT
    • Consta de 4 ifs que son los encargados de controlar que boton se ha pulsado
    • El comportamiento lógico se divide en dos bloques
      • 2 ifs que controlan LEFT/RIGHT, que son los que desplazan el cursor entre los segundos y minutos
        • Se tiene en cuenta que la posicion del cursor solo pueda "navegar" por los segundos
        • Las posiciones son de la casilla 9 (unidades de segundo) a la casila 5 (decenas de minutos). Se saltan los ":" que hay entre segundos y minutos
      • 2 ifs que controlan UP/DOWN, que son los que aumentan el numero de segundos y minutos
        • Se controla que los minutos ni los segundos pasen de 59
        • Se utilizan ifs para saber si estamos en unidades o decenas y en segundos o minutos (es decir se utilizan para saber donde esta el cursor). Dependiendo de donde esta el cursor de aumenta el numero de minutos o segundos de unidad en unidad o de 10 en 10
        • Al acabar de modificar el tiempo se llama a la funcion imprimirTiempo() para actualizar el valor por pantalla
  • resetTiempo()
    • Encargada de poner el tiempo a 0
    • Tambien pone el cursor en la posicion inicial, que es la de unidades de segundo
  • cuentaAtras()
    • Encargada de hacer la cuenta atras cuando se presiona el boton start
    • Utiliza la funcion millis() de arduino como "reloj" y compara el valor del temporizador que hemos puesto con el valor de millis()
    • Actualiza el valor del contador en cada cambio de decimas


  • activaReles()
    • Activa los reles que encienden la cara superior, inferior o ambas a la vez.
    • Utiliza la funcion EEPROM.gets() para leer de memoria que cara ha de encenderse
    • Mediante un switch enciende un rele u otro
  • desactivaReles()
    • Desactiva los dos reles sin importar cual estaba activo


  • funciones menu
    • Las explico en la sección Menu porque utilizaré gráficos para que sea más entendible


  • guardaMemoria()
    • Se ocupa de guardar el tiempo que introducimos en la Memoria 1, o la Memoria 2 o la Memoria 3
    • Lo primero que hace es convertir los segundos y minutos que son un struct a un int (es la variable que creamos segundosTotales)
    • Mediante la funcion EEPROM.put() guardamos en la memoria el valor del tiempo
      • El primer argumento de la función es la posicion de la memoria eeprom donde se guardará el dato. Vemos que este primer argumento es posMenu*16
      • Las tres memorias (Memoria 1, Memoria 2 y Memoria 3) se guardan consecutivamente por eso utilizamos el valor de la variable posMenu (el cual nos indica en que Memoria queremos guardar el dato) y lo multiplicamos por el tamaño que ocupa la variable segundosTotales. Sabiendo que es un int ocupa 16bits
      • El segundo argumento es la variable a guardar, segundosTotales
  • cargaMemoria()
    • Funciona igual que guardaMemoria() pero haciendo el trabajo inverso
    • Leemos de la eeprom con la funcion EEPROM.get()
      • El primer argumento es la memoria que queremos cargar (Memoria 1, 2 o 3)
      • El segundo argumento es es una variable que creo para guardar esa informacion leida de la eeprom
    • Luego divido los segundosTotales en segundos y minutos y lo almaceno en el struct cuenta
  • caraGuardar()
    • Guardamos la opción escogida en la memoria eeprom con la funcion EEPROM.put()
      • Como hemos dicho antes la información guardada esta consecutivamente, por lo tanto teniendo en cuenta que hay tres Memorias del tiempo (Memoria 1, 2 y 3) y que cada Memoria es un int de 16 bits (2 bytes), en la casilla que tenemos que guardar la opción escogida sera 3*16 (o 3*2*8)
      • El segundo parametro de la función es la opción que hemos escogido (Inferior, Doble Cara o Superior). Esta información la tiene la variable posMenu.


Bloque 07 - Funciones eventos

  • funciones de los eventos de todos los botones (Start, Cancel, Enter, Up, Down, Left y Right)
    • Controlan mediante las funciones del objeto Bounce si se ha presionado un boton o no
    • la funcion boton.update() devuelve TRUE si se ha cambiado el estado del boton
    • si se ha cambiado el estado miramos si es LOW (se ha activado el boton) y entonces devolvemos TRUE
    • sino se ha cambiado el estado del boton o no es LOW se devuelve FALSE
    • sino utilizamos la funcion boton.update() lo que obtendriamos es que si apretamos un boton (por ejemplo UP), solo con una presion las unidades no pararian de subir. Al utilizar esta funcion nos obliga a que cada vez que queramos subir una unidad tenemos que hacer una presion al boton UP
  • ev_fin_cuenta_atras()
    • Controla que si la variable cuenta llega a 0 devuelve TRUE y significaria que se ha acabado la cuenta atras

Menu


imprimirMenu(char* menu[])

  • Distingo con un if si la posición del menú es la 0, es decir el cursor está en la primera posición del menú, o si está en las demás posiciones
  • Si la posición del menú es 0:
    • En la primera fila imprimo el cursor y luego el nombre del primer ítem
    • En la segunda fila imprimo el siguiente ítem, que es la posición + 1
  • Si la posición del menú es cualquiera menos 0:
    • En la primera fila imprimo el ítem de la posición - 1
    • En la segunda fila imprimo el ítem de la posición


Explicación gráfica:

Ins ImprimirMenu.png

El porqué en cualquier posición del menú que no sea la 0 imprimo en la primera fila la posición -1 y en la segunda fila la posición es porque una vez que se ha desplazado una posición a partir de la 0 el cursor siempre estará en la segunda fila. El menú irá avanzando, es decir el ítem que había en la segunda fila pasará a la primera y aparecerá un nuevo ítem en el segunda fila, y el nuevo ítem siempre estará en la segunda fila.

Explicación gráfica:

Ins ImprimirMenu Desp.png

desplazarMenu(int numMenu)

interactuarMenu()
Esta función consta de un switch con tantos case como ítems tiene el menú. Como tengo sólo 3 ítems en el menú se ponen 3 case.
Con el valor de la variable PosMenu iremos a la función de ese submenú.

limpiaMenu()
En esta función simplemente se pone a 0 la variable posMenu (que nos indica en que posición del menú estamos).

Mejoras

  • Conectore LCD en la otra cara y a 90º
  • Conector PCB a 90º
  • Botones en placa separada para que esten lo mas cerca posible de la tapa, lo de usar botones de plastico no es buena solucion


Enlaces

http://i.stack.imgur.com/oOtkU.png
http://arduino.cc/en/uploads/Main/Arduino-Pro-Mini-schematic.pdf
http://aquaflash.blogspot.com.es/2009/04/34-luz-ultravioleta-tratamiento.html