UNIVERSIDAD SAN FRANCISCO DE QUITO USFQ Colegio de Ciencias e Ingenierías Farmacia robot: cómo la automatización cambiará radicalmente la distribución de medicamentos Trabajo Experimental . Diego Ricardo Larrea Cueva Carlos Daniel Navarrete Gando Ingeniería Electrónica Trabajo de titulación presentado como requisito para la obtención del título de Ingeniero Electrónico Quito, 11 de diciembre de 2015 2 UNIVERSIDAD SAN FRANCISCO DE QUITO USFQ COLEGIO DE CIENCIAS E INGENIERÍAS HOJA DE CALIFICACIÓN DE TRABAJO DE TITULACIÓN Farmacia robot: cómo la automatización cambiará radicalmente la distribución de medicamentos Diego Ricardo Larrea Cueva Carlos Daniel Navarrete Gando Calificación: Nombre del profesor, Título académico Diego Benítez, Ph.D. Firma del profesor Quito, 11 de diciembre de 2015 3 Derechos de Autor Por medio del presente documento certifico que he leído todas las Políticas y Manuales de la Universidad San Francisco de Quito USFQ, incluyendo la Política de Propiedad Intelectual USFQ, y estoy de acuerdo con su contenido, por lo que los derechos de propiedad intelectual del presente trabajo quedan sujetos a lo dispuesto en esas Políticas. Asimismo, autorizo a la USFQ para que realice la digitalización y publicación de este trabajo en el repositorio virtual, de conformidad a lo dispuesto en el Art. 144 de la Ley Orgánica de Educación Superior. Firma del estudiante: _______________________________________ Nombres y apellidos: Diego Ricardo Larrea Cueva Código: 00103810 Cédula de Identidad: 1717260234 Firma del estudiante: _______________________________________ Nombres y apellidos: Carlos Daniel Navarrete Gando Código: 00106283 Cédula de Identidad: 1713937421 Lugar y fecha: Quito, diciembre de 2015 4 RESUMEN La distribución es un punto crítico en la cadena de suministro de fármacos dado que los mismos requieren: un manejo preciso de inventario, poca manipulación y un ambiente controlado. Por otra parte los usuarios requieren de un sistema que sea confiable, con atención indefinida (24/7) y que disponga de varios puntos de venta. En el presente trabajo se ha desarrollado un prototipo de maquina dispensadora de medicamentos tomando en cuenta las necesidades expuestas y un presupuesto limitado. Se ha logrado crear un sistema que utiliza componentes de bajo costo que ofrece confiabilidad, estabilidad y precisión en su operación. Además el diseño asegura un control de inventario certero que reduce al mínimo la necesidad de que varios operadores tengan acceso a los medicamentos en bodega. Finalmente se ha garantizado las condiciones ambientales adecuadas para la conservación de los productos al interior del equipo. Se ha concluido que es posible desarrollar localmente una maquina dispensadora que satisfaga las necesidades actuales del sector farmacéutico a un costo apegado a la economía ecuatoriana. El prototipo puede ser rediseñado en un futuro para su fabricación en masa, lo cual implicaría la generación de un nueva forma de distribución de medicamentos en el mercado tanto para venta directa como indirecta al consumidor. Palabras clave: Dispensador, automatización, medicinas, farmacia, inventario, Arduino MEGA, microcontrolador. 5 ABSTRACT Distribution is a key point in medicine’s supply chain. Drug’s distribution requires: precise inventory control, limited human manipulation and specific environmental conditions. On the other hand, customers need a distribution system which is: reliable, 24/7 and with variety of selling points. Considering these needs and a limited budget, a medicine vending machine prototype has been developed with a low cost design that offers precision, stability, reliability and inventory control with less handling required. Finally, environmental product conditions have been satisfied with the integration of a temperature control system. In conclusion, it has been possible to develop a vending machine prototype that satisfies the Ecuadorian market necessities. For the future the prototype could be redesigned for mass production, which means that a new way of drugstore would be introduced to the existing market. Key words: Vending Machine, automation, medicines, drugstore, inventory, Arduino MEGA, microcontroller. 6 TABLA DE CONTENIDO Introducción......................................................................................................................................9 DesarrollodelTema....................................................................................................................12 PruebasyResultados..................................................................................................................47 Conclusiones..................................................................................................................................53 DIscusiones.....................................................................................................................................55 Referenciasbibliográficas.........................................................................................................57 AnexoA:prototipo.......................................................................................................................62 AnexoB:FigurasAdicionales...................................................................................................71 AnexoC:CódigoMicrocontrolador.........................................................................................75 7 ÍNDICE DE TABLAS Tabla 1. Denominaciones y características de tiras LED SMD………………………. 26 Tabla 2. Lista y descripción de terminales del circuito diseñado..……………………. 35 Tabla 3. Codificación de mensajes entre el microcontrolador y el microcomputador……………………………………………………………………… 38 Tabla 4. Consumo de corriente y potencia de motores Servo………………………… 49 8 ÍNDICE DE FIGURAS Figura 1. Modelo General del Proyecto ……………………………………………….. Figura 2. Diagrama de bloques del sistema de control de la máquina……………..…... Figura 3. Diagrama esquemático de un motor de pasos de imán permanente bifásico... Figura 4. Diagrama esquemático de motor de pasos híbrido…………………………... Figura 5. Diagrama de devanados con código por color de motor de paso hibrido……. Figura 6. Diagrama de cableado mínimo para el modulo DRV8825 de motores a pasos……………………………………………………………………………………. Figura 7. Estándar de simbología NEMA para interruptores de limite………………... Figura 8. Esquema de fotodiodo.………..………..………..………..………………... Figura 9. Símbolo de fotodiodo. ………..………..………..………..………………… Figura 10. Esquemático de fotodiodo conectado con polarización inversa a la fuente.………..………..………..………..………..………..………..………………... Figura 11. Esquema de lazo con retroalimentación……………………………………. Figura 12. Multiplexor 2:1 y su tabla de verdad……………………………………….. Figura 13. Esquemático de multiplexado para LEDs de 12V………………………….. Figura 14. Interruptor magnético con posiciones normalmente cerrado y normalmente abierto…………………………………………………………………………………... Figura 15. Circuito para control de seguro eléctrico mediante un microcontrolador…. Figura 16. Diseño básico de fuente de alimentación DC con rectificador de onda completa y regulador de voltaje……………………………………………………….. Figura 17. Conexión de un regulador de voltaje………………………………………. Figura 18. Vista frontal de la máquina en movimiento………………………………… Figura 19. Vista superior de la caja de entrega………………………………………... Figura 20. Fin de carrera superior para el movimiento horizontal…………………….. Figura 21. Fin de carrera para el movimiento vertical…………………………….…... Figura 22. Luces de entrega exitosa……………………………………………….…... Figura 23. Luces de fallo de entrega………………………………………………….. Figura 24. Luces indicadoras traseras……………………………………………..…... Figura 25. Ubicación del sensor de temperatura…………………………………..….. Figura 26. Ubicación del ventilador en el prototipo…………………………………... Figura 27. Ubicación de pines para shield RAMPS 1.4……………………………….. Figura 28a. Esquema del circuito impreso diseñado (Parte 1)……………………..…... Figura 28b. Esquema del circuito impreso diseñado (Parte 2) ………………………... Figura 29. PCB diseñado…………………………………………………………...….. 10 12 17 18 19 21 22 24 24 25 27 29 30 31 32 33 34 62 63 64 65 66 67 68 69 70 71 72 73 74 9 INTRODUCCIÓN Justificación e Importancia del Proyecto La falta de control en el manejo de almacenamiento y distribución de medicamentos en varios hospitales y centros médicos en el Ecuador ha llevado a que se den varios casos de robo de los mismos. Evidencia de ello es la sustracción de medicamentos del hospital del Instituto ecuatoriano de seguridad social (IESS) Teodoro Maldonado Carbo en Guayaquil en Febrero de 2015 (“Detienen sospechosos", 2015). Además se encontraron medicamentos del IESS en una clínica clandestina en Ambato (“Medicamentos IESS”, 2015). De igual forma, en una entrevista con el Gerente General del Hospital de los Valles y profesor de la USFQ, Jaime Ocampo, se determinó que también existían problemas con el manejo de inventario en dicho hospital. Fue iniciativa de Jaime Ocampo la creación de un equipo de trabajo conformado por estudiantes para diseñar un dispensador automático de medicamentos que permita llevar de mejor manera el inventario de medicamentos y limitar el manejo de los mismos por parte de los funcionarios del hospital. En un principio el dispensador diseñado será utilizado como modelo en los sistemas médicos de la USFQ y dependiendo de su utilidad y funcionamiento se evaluará la posibilidad de producir dispensadores para ser distribuidos a varios hospitales del país. Este es un proyecto multidisciplinario que combina el trabajo de estudiantes de ingeniería mecánica, electrónica y de sistemas de la universidad. En la Figura 1 se muestran las partes de las que está compuesto el proyecto. 10 FarmaciaRobot IngenieríaMecánica Estructurade SoporteInterna Ingenieríaen Sistemas Ingeniería Electrónica Microcomputador Microcontrolador BrazoMecánico InterfazGráfica CajadeEntrega BasedeDatos ActuadorMecánico NotificacionesSMS DiseñoIndustrial EstructuraExterna Administracióny Derecho ModelodeNegocios SistemadeControl General Estantes Figura 1. Modelo General del Proyecto La parte mecánica del proyecto fue desarrollada como tesis por parte de Esteban Egüez, mientras que la parte de ingeniería en sistemas fue desarrollada por David Villacis. Además el proyecto cuenta con la asistencia de estudiantes de diseño gráfico, derecho y administración que colaboran con la parte estética de la máquina además de la parte legal y administrativa para la colocación de la máquina como producto en el mercado. Este trabajo se centra principalmente en la parte de diseño e implementación eléctrica y electrónica del dispensador. Antecedentes No se conoce que existan antecedentes de dispensadoras automáticas de medicamentos en los hospitales del Ecuador (Ocampo, comunicación personal, Diciembre 2014). A nivel internacional, existen varios mecanismos similares que han sido desarrollados por universidades o por empresas privadas. En el Centro Médico de la Universidad de California en San Francisco, UCSF, las medicinas almacenadas son manipuladas por un brazo robot que selecciona y empaqueta la medicinas de acuerdo a la prescripción médica de cada 11 paciente (Rush-Monroe, 2011). Un mecanismo similar de empaquetamiento fue diseñado por la empresa italiana Ingegneria Biomedica Santa Lucia para Leicester General Hospital, en el cual el código de barras de cada dosis está relacionado con el código de barras en el brazalete que tiene cada paciente (Buss, 2015). El dispensador del Wokingham Medical Centre tiene un funcionamiento similar, adicionalmente chequea la fecha de expiración de los medicamentos y de acuerdo a esto reordena el stock de medicinas (Nurse, 2014). Robot similares se han desarrollado en Penn State (Ingram, 2015), James Cook University Hospital (Hetherington, 2015) y Nash General Hospital (“Pharmacy robot”, 2011). Objetivo del proyecto Este trabajo tiene como finalidad el diseño e implementación de un sistema de control y alimentación para un dispensador automático de medicamentos mediante el uso de controladores y sensores. Para lograr esta meta se establecieron los siguientes objetivos específicos: 1. Diseñar e implementar un sistema de control que permita el movimiento de un brazo mecánico para obtener y despachar los medicamentos almacenados. 2. Utilizar sensores para asegurar el correcto funcionamiento de la máquina. 3. Diseñar e implementar un sistema de control para mantener constante la temperatura de los medicamentos. 4. Diseñar e implementar luces indicativas para las distintas funciones de la máquina. 5. Utilizar comunicación serial para enviar y recibir instrucciones desde el computador de la máquina. 6. Diseñar un sistema de seguridad para la máquina. 12 DESARROLLO DEL TEMA Modelo de Funcionamiento El sistema de control general se implementó utilizado un microcontrolador Arduino MEGA. El microcontrolador utiliza comunicación serial para comunicarse con el microcomputador (Raspberry Pi), encargado del manejo de base de datos, interfaz gráfica y notificaciones SMS. El microcontrador recibe los comandos desde el microcomputador y envía de vuelta mensajes de estado o de error. El sistema de control general se divide en tres sistemas principales: sistema de entrega de medicamentos, sistema de seguridad y abastecimiento y sistema de control ambiental. El diagrama de bloques del sistema de control se muestra en la Figura 2. SistemadeControl General SistemadeControl Ambiental Temperatura Iluminación TirasLED ambientales TirasLED indicadorasde estado Sensorde Temperatura Ventilador Sistemade Entrega Sistemade Seguridady Abastecimiento Sensoresde Presencia Seguros Electromecánicos Sensoresde Posicióndefinde carrera Sensoresde Seguridad Motoresapasos MotoresServo Figura 2. Diagrama de bloques del sistema de control de la máquina 13 El sistema de entrega de medicamentos esta compuesto por 2 motores de pasos de 12V en eje horizontal de coordenadas, 1 motores de pasos en eje vertical de coordenadas, 2 servo motores para actuador de brazo mecánico, sensores de presencia en actuador de brazo mecánico, sensores de fin de carrera horizontal y vertical. Este sistema toma los productos en las distintas posiciones según la petición que se ha ingresado por el usuario. De forma paralela a la operación del sistema de entrega de medicamento, se encuentran activos el sistema de control de temperatura y seguridad. El algoritmo del sistema de entrega de medicamentos es el siguiente: Una vez que el suministro de energía se ha activado, el brazo mecánico procede a ubicarse en posición inicial ubicada en la esquina superior izquierda de la máquina. Durante este proceso el brazo se dirige hasta el tope mecánico horizontal y vertical, una vez que estos han sido accionados, se envía una señal de estado del microcontrolador al microcomputador que indica que la máquina se encuentra lista para operar. Cuando el microcomputador envía la señal, el brazo mecánico procede a moverse hasta la posición indicada del medicamento. Una luz indicadora color blanco se enciende en el brazo mecánico para indicar que el mismo se encuentra en movimiento. Cuando el brazo mecánico ha arribado a la coordenada solicitada, un actuador mecánico automatizado por un servo motor se acciona para que el medicamento caiga por acción de gravedad a la caja en el brazo mecánico. En el caso que el medicamento se encuentra dentro de la caja, una luz indicadora color verde se enciende dentro de la misma. Mientras que si existe algún problema con la posición del medicamento dentro de la caja o la misma no ha caído dentro de la caja, se enciende una luz indicadora color rojo. Si no ha existido ningún error con el medicamento dentro de la caja, el brazo mecánico se dirige hasta la coordenada de posición de entrega de medicamento donde se 14 deposita el producto para que el usuario lo pueda recoger. Para aquello se acciona un compartimiento de la caja por medio de un servo motor de tal forma que el mismo se abra cuando el brazo mecánico ha llegado a la coordenada de entrega de medicamento. Si ha existido un problema con el medicamento dentro de la caja, el actuador mecánico hará un par de intentos para reacomodar el medicamento. Si no lo logra, se envía una señal de error de entrega desde el micro controlador y se reinicia el algoritmo de entrega. El microcomputador se encargará en este caso de alertar al usuario de que existe un problema con la entrega de ese medicamento, se procederá a continuar con el proceso de entrega del siguiente medicamento y se enviará una notificación vía SMS al supervisor de la máquina para la revisión del problema. Una vez culminado el proceso de entrega, el algoritmo de entrega se reinicia para esperar una nueva petición de entrega de medicamento hasta el punto de selección de medicamento por parte del usuario. El sistema de seguridad y abastecimiento está compuesto por un sensores magnéticos y un seguro electromecánico. El sistema de seguridad se encuentra en estado “stand by” mientras el sensor magnético ubicado en la puerta posterior de la maquina no se accione. Esto quiere decir que el sistema de entrega de medicamento puede operar de forma habitual. Si el sensor magnético se acciona debido a una apertura no autorizada de la puerta posterior, el sistema de entrega de medicamento se pausa y se envía una alerta inmediatamente al microcomputador. Este encenderá una alarma sonora y alertará visualmente o remotamente al usuario. El sistema de abastecimiento permite abrir el seguro eléctrico posterior de la máquina ante el pedido del microcomputador. Una vez abierto, el microcomputador enviará una señal al microcontrolador de la posición en la que se debe colocar el medicamento. El controlador encenderá una luz indicadora en la posición deseada. El operador deberá ingresar 15 al computador el número de medicamentos que va a colocar y deberá alertar al mismo cuando haya finalizado la colocación de un medicamento. El sistema de control ambiental esta compuesto por: Tiras LED color azul, blanco, rojo y verde, sensor de temperatura LM35 y un ventilador de 12V. El sistema de temperatura verifica los valores de temperatura registrados por el sensor de temperatura y los compara con el valor de temperatura ideal. A partir de la diferencia de estos valores el sistema realiza un control PID y acciona un ventilador para el proceso de control de temperatura. La verificación de la temperatura se la hace continuamente si no existe otro requerimiento por parte del microcomputador, caso contrario el control de temperatura se lo realiza antes de procesar cada una de las acciones recibidas. El sistema de iluminación controla las luces indicativas para los procesos de entrega y abastecimiento. Así mismo permite el control por comando de las luces ambientales. Marco Teórico Motores a Pasos. En mecanismos donde se requiere una alta precisión de movimiento tales como máquinas de coordenadas o impresoras, los motores de paso son ideales dado que es posible moverlos un paso a la vez por cada pulso que se aplique. (Velasco, 2003) Existen varios tipos de motores de pasos en el mercado, “Los motores a pasos vienen en una amplia variedad de diseños y configuraciones. Además de las configuraciones de reluctancia variable también existen configuraciones de imán permanente e híbridas.” (Fitzgerald, 2005). En términos generales este tipo de motor se elabora con el fin de producir un gran número de pasos por revolución con la mayor precisión posible, esto permite que sean empleados en sistemas de control digital de lazo abierto tales como impresoras y 16 graficadores. (Fitzgerald, 2005). Entre los más comunes se pueden encontrar de 50, 100 0 200 pasos por revolución, lo que equivale a 7.2, 3.6 o 1.8 grados por paso respectivamente. Las características esenciales del motor tales como el numero de pasos o tamaño del mismo se encuentran descritos bajo la norma americana NEMA (National Electrical Manufactures Association). (RepRap, 2014) Como ya se dijo anteriormente, existen varias configuraciones de motores de pasos. Un motor de pasos de máquina de reluctancia variable, que se abrevia como VRM por sus siglas en inglés, esta formado por un estator con bobinado de excitación con fases múltiples y rotor magnetizado. Dado que el torque es generado por la búsqueda de alineamiento del rotor con la onda de flujo magnético producida por parte del estator no es necesario que el rotor posea conductores. Los motores a pasos con esta configuración aprovechan el hecho que cuando una VRM es energizada en secuencia de una manera gradual apropiada, la máquina entonces gira un ángulo especifico por paso. Existe también una variación de este tipo de configuración que se conoce motor de pasos de reluctancia variable de escalonamiento múltiple. En este caso el motor esta compuesto por un conjunto de VRM monofásicas axialmente desplazadas y montadas en un eje único. (Fitzgerald, 2005) Por otra parte también existe la configuración de motor de pasos bipolar con imán permanente y rotor bipolar. Este tipo de máquina es muy similar a una máquina de corriente alterna de imán permanente trifásica. No obstante a diferencia de la maquina de ca que impulsa una carga a una velocidad específica, el motor a pasos esta diseñado para controlar la posición de una carga. La secuencia necesaria para que los rotor gire un ángulo, o se produzca un paso es la siguiente: 1. Corriente positiva en la fase 1 2. Corriente positiva de igual magnitud en ambas fases. 17 3. Corriente positiva en la fase 2 4. Corriente de igual magnitud en fase 1 y corriente positiva en fase 2. 5. Corriente negativa en fase 1 6. Repetir paso 1 Un motor de este tipo también puede operar de forma unipolar si las bobinas son excitadas alternadamente de manera independiente. (Fitzgerald, 2005). En la Figura 3 se muestra un diagrama de un motor a pasos con imán permanente de tipo bifásico. Figura 3. Diagrama esquemático de un motor de pasos de imán permanente bifásico. Tomado de Máquinas Eléctricas, Fitzgerald, p. 439 El torque para un motor de pasos con imán permanente como se muestra en la figura anterior esta dado por: 𝑇"#$ = 𝑇& 𝑖( 𝑐𝑜𝑠𝜃" + 𝑖. 𝑠𝑒𝑛𝜃" (1) Donde T0 es un valor constante que esta dado por las propiedades físicas del imán permanente y la geometría del motor. (Fitzgerald, 2005). El Torque producido por un motor de pasos es proporcional a la intensidad de campo magnético del devanado del estator, por 18 tanto para incrementar el torque del motor es necesario o añadir mas devanados o incrementar la corriente. (SGS-Thomson, 1995). No obstante se debe tener mucho cuidado al momento de incrementar la corriente en los devanados del estator dado que se puede alcanzar una saturación del núcleo y también aumentar la temperatura del motor. Por tanto se debe aplicar un máximo de corriente según las especificaciones dadas por el fabricante del motor. Es claro que el circuito de control del motor requerirá un limitador de corriente. (SGS-Thomson, 1995). Finalmente existe la configuración de motor de pasos híbrido. Esta última es una combinación de un motor de pasos con configuración de imán permanente y uno de reluctancia variable. En la Figura 4 se muestra un diagrama de un motor con esta configuración. Figura 4. Diagrama esquemático de motor de pasos híbrido. Tomado de Máquinas Eléctricas, Fitzgerald, p. 444 En este tipo de configuración existen dos escalonamientos de rotor idénticos que están angularmente desplazados de forma axial una distancia de medio paso del polo del rotor. 19 Además los escalonamientos del rotor están separados por un imán permanente. Para el diagrama que ese muestra en la Figura 2 el estator posee un total de cuatro polos, dos por cada fase y ubicados de forma frontalmente opuesta. Como se puede observar cuando la fase 1 es excitada por una señal de entrada, de tal forma que el polo superior del estator es un polo sur al mismo tiempo que el inferior es norte. “La excitación del estator interactúa con el flujo del imán permanente del rotor para alinearlo con un polo en su extremo de polo norte verticalmente hacia arriba y un polo en el entre de su polo sur verticalmente hacia abajo.” (Fitzgerald, 2005). En la Figura 5 se muestra un diagrama del bobinado de un motor de pasos bipolar: Figura 5. Diagrama de devanados con código por color de motor de paso hibrido. Tomado de Pololu Resources. Como se puede observar de la figura anterior, el motor hibrido puede conectarse como bipolar o unipolar dependiendo de si los cables centrales de las bobinas se toman como punto común en la conexión (bipolar) o sencillamente no se los toma en cuenta (unipolar). Las principales ventajas que ofrece un motor con este tipo de configuración son que se requiere menor excitación en el estator para la producción de torque y que el motor tiende a mantener su posición cuando se elimina dicha excitación. (Fitzgerald, 2005). Sin embargo 20 para una correcta operación del motor y evitar que se produzca un salto de paso se debe considerar que los motores deben vencer ciertas fuerzas inerciales además que el tiempo y frecuencia de los pulsos permitan al motor alcanzar el paso antes que se envíe un nuevo pulso. (Velasco, 2003) “Si la frecuencia de pulsos es muy elevada, el motor puede reacción de la siguientes formas: Puede que no realice ningún movimiento en absoluto, puede comenzar a vibrar pero sin llegar a girar, puede girar erráticamente o puede llegar a girar en sentido opuesto” (Velasco, 2003) Controlador de motor de pasos. Como se ha podido ver los motores de pasos requieren una señal especifica para su correcta operación. Por tanto el uso de un circuito que maneje esta señal, conocido como “driver” es necesario. “Los circuitos integrados han simplificado dramáticamente el manejo de motores de pasos” (SGS-Thomson, 1995). Un controlador típico para un motor de pasos esta compuesto por uno o varios puente H, un circuito limitador de corriente, transistores de tipo MOSFET y opcionalmente un indexador para micro-pasos (Texas Instruments, 2014). Uno de los controladores con mayor uso en el mercado para motores a pasos es el DRV8825 de Texas Instruments. El controlador permite controlar un motor a pasos bipolar de hasta una corriente de salida de 2.2A por bobina. Además el controlador permite realizar 6 distintos tipos de resolución de pasos: paso completo, medio paso, ¼ de paso, 1/8 de paso , 1/16 de paso y 1/32 de paso (Pololu Resources, 2015). El esquema de conexión del módulo para el driver DRV8825 se muestra en la Figura 6. 21 Figura 6. Diagrama de cableado mínimo para el modulo DRV8825 de motores a pasos. Tomado de: Pololu Resources Servomotores. Un motor servo es un dispositivo utilizado para posicionar superficies de control de forma angular. Por esta razón un servo esta compuesto por un eje de rendimiento controlado, lo que quiere decir que su posición angular puede ser controlada por una señal codificada. Mientras esta señal se mantenga el motor servo mantiene la posición indicada. (El servomotor, 2015). “El ángulo está determinado por la duración de un pulso, a esto se le llama modulación codificada de pulsos” (El servomotor, 2015). También es posible controlar la velocidad a la que gira un motor servo: “La cantidad de voltaje aplicado al motor es proporcional a la distancia que éste necesita viajar. Así, si el eje necesita regresar una distancia grande, el motor regresará a toda velocidad. Si este necesita regresar sólo una pequeña cantidad, el motor correrá a una velocidad más lenta.” (El servomotor, 2015) Sensores mecánicos. Los sensores mecánicos o interruptores de límite se utilizan para detectar la presencia de un objeto en una punto en particular. Pueden ser activados por el movimiento de una maquinaria o por la presencia o ausencia de un objeto en especifico. Los sensores mecánicos poseen un brazo de parachoques que varía según el tipo de aplicación. 22 Cuando el parachoques es accionado por la presencia de un objeto los contactos al interno del sensor cambian de posición, lo cual permite enviar una señal de presencia o no presencia de un objeto en determinado punto. (Herman, 2009) El estándar NEMA de simbología para sensores mecánicos se muestra a en la Figura 7. Figura 7. Estándar de simbología NEMA para interruptores de limite. Tomado de Herman. Para aplicaciones donde se disponga de espacio limitado para los sensores se utiliza micro interruptores de límite. Además de su diseño compacto, este tipo de interruptor requiere una menor distancia de accionamiento en el embolo de activación, equivalente a el parachoques en los interruptores normales. Para ser accionado el embolo necesita ser desplazado únicamente 0.015 pulgadas aproximadamente. Además existen micro interruptores que disponen de un resorte para el retorno a su posición inicial después de ser accionados. (Herman, 2009) 23 Microcontrolador. Un microcontrolador es un chip que contiene en su interior un procesador (CPU), memoria no volátil para el programa (ROM o flash), memoria volátil para entradas y salidas (RAM), un reloj y una unidad de control de entradas y salidas (“Definition of: microcontroller”, s.f.). Para este proyecto se utilizó una tarjeta Arduino Mega 2560, que contiene un microcontrolador ATmega2560 (“Arduino MEGA 2560”, s.f.). Cuenta con 54 entradas/salidas digitales,16 entradas análogas, un cristal oscilador de 16MHz, memoria flash de 256 KB, SRAM de 8 KB y memoria EEPROM de 4KB (“Arduino MEGA 2560”, s.f.). Tiene un voltaje de operación de 5V y se alimenta con un voltaje de 6-20V (“Arduino MEGA 2560”, s.f.). Incluye un bootloader, un pedazo de firmware del microcontrolador que permite cargar nuevo código sin la necesidad de un programador de hardware externo (“Arduino MEGA 2560”, s.f.). El microcontrolador ATmega2569 incluye también cuatro UARTs para la comunicación serial TTL (transistor-transistor logic) de 5V. Un UART es un dispositivo periférico que permite la comunicación serial entre dos sistemas con una velocidad de transferencia de datos preestablecida (Harris & Harris, 2013). Las tarjetas de marca Arduino se caracterizan por la posibilidad de utilizarlos junto con un “shield”. Un “shield” es una tarjeta que se conecta encima de la tarjeta Arduino para extender las capacidades de la misma (“Shields”, s.f.). Para este proyecto se utilizó un RepRap Arduino Mega Pololu Shield (abreviado RAMPS), el cual está diseñado para controlar impresoras 3D RepRap mediante el uso de controladores Pololu para motores de pasos (“Arduino Mega Pololu Shield ”, s.f.). La facilidad que otorga este “shield” para trabajar con motores de pasos es la razón por la que se decidió utilizarlo. 24 Sensores de Presencia. Un fotodiodo esta conformado por un bolsillo de material dopado tipo P, el cual es fusionado a un substrato de tipo N de tal forma que se forma una unión tipo PN. El material tipo P tiene exposición directa a la luz por medio de una ventana. (Cox, 2001). En la Figura 8 se muestra la unión tipo PN de un fotodiodo y su ventana. Figura 8. Esquema de fotodiodo. Tomado de Cox. J. En la Figura 9 se muestra el símbolo utilizado para un fotodiodo en circuitos: Figura 9. Símbolo de fotodiodo. Tomado de Cox. J Se debe considerar que un fotodiodo esta diseñado para operar en polarización inversa. Esto significa que la parte dopada P debe conectarse al polo negativo de la fuente, mientras que la zona dopada N debe conectarse con el polo positivo. (Cox, 2001) Este tipo de polarización y el fotodiodo se muestra en el esquemático de la Figura 10. 25 Figura 10. Esquemático de fotodiodo conectado con polarización inversa a la fuente. Tomado de Cox, J. Cuando se realiza polarización inversa en la unión tipo PN, la misma se encuentra con polarización directa para los portadores minoritarios. Si se considera que la cantidad de corriente que fluye por la unión es una función del número portadores minoritarios presentes, y que en un fotodiodo la cantidad de portadores minoritarios depende directamente de la cantidad de luz que atraviesa la ventana, entonces se puede concluir que la corriente es una función directa de la luz que alcanza al fotodiodo. En otras palabras, a mayor intensidad de luz existe una menor resistencia de la polarización inversa. (Cox, 2001). Luces LED. Existen varios tipos de LED en el mercado que pueden ser utilizados para la iluminación que varían según las características ambientales y otros factores. En el caso de las tiras de LED la sigla “SMD significa Surface Mounted Device o Dispositivo de Montaje Superficial” (Ledbox, 2012). Además existen varias denominaciones de SMD que especifican las propiedades técnicas del dispositivo, o LED para el caso. Para el presente análisis se realiza un enfoque especial a las tiras LED de tipo SMD3528. Una tira LED SMD3528 se caracteriza por un consumo bajo y por ser de media potencia. Son las tiras de menor consumo que se pueden encontrar en el mercado, dado que su consumo promedio (W/metros) es muy bajo. Son de formato monocolor y además son la solución más económica para decoración de ambientes. (Ledbox, 2012). 26 A continuación se muestra una tabla donde se resume las principales características de las tiras LED, incluyendo las tipo SMD3528. Tabla 1 Denominaciones y características de tiras LED SMD. Tomado de: Ledbox, 2012 Como se puede observar en la Tabla 2, las tiras de LED SMD3528 consumen a penas 4,8W/m, es decir menos del 50% de consumo que las SMD3014. Por otra parte, como era de esperarse, su luminosidad es de 4Lm/m. Es decir a penas la mitad de luminosidad que las SMD3014. (Ledbox, 2012) Sensores de Temperatura. En varias aplicaciones industriales es de vital importancia conocer el valor de temperatura. Un sensor de temperatura es un elemento diseñado de tal forma que una variable electrónicamente medible varié según los cambios de temperatura. El método utilizado para medir temperatura es seleccionado según la precisión requerida y rangos de operación. Entre los métodos más conocidos están: expansión de metal, variación de resistencia, expansión por presión y otros sensores de estado solido. (Herman, 2009) El LM35 es un circuito integrado diseñado para la medición precisa de temperatura. El voltaje de salida es linealmente proporcional con la temperatura en grados centígrados. La 27 ventaja con otros sensores con calibración en grados Kelvin es que no es necesario restar una constante al voltaje de salida para obtener la temperatura en escala de centígrados. El LM35 no requiere ningún tipo de calibración externa y posee una precisión de ¼ C a temperatura ambiente y ¾ C en valores cercanos a los -55C y 150C. Por otra parte el circuito es de bajo consumo en potencia y ocupa solamente 60uA de la fuente. (Texas Instruments LM35 Technical Description, 1999) Control PID. El control PID es ampliamente utilizado para procesos industriales donde se requiere retroalimentación. Para aplicar un control PID adecuado se debe tener conocimiento sobre el sistema y decidir cual es la acción de control apropiada. Luego se proceda a ajustar los parámetros de constantes: proporcional, derivativa e integral, para estabilizar el sistema. (Araki, 2000) El esquema de un lazo de control con retroalimentación se muestra en la Figura 11. Figura 11. Esquema de lazo con retroalimentación. Licencia GNU de distribución libre. 2015. Como se puede ver en la figura anterior, el error es igual al valor de referencia restado el valor medido por el sensor en la planta. La entrada del sistema pasa por una regla computacional en el controlador la cual se ajusta según los parámetros de diseño (Akai, 2000). Para el caso de un controlador PID los tres parámetros son los siguientes: 28 Parámetro P: Proporcional al error medido en el instante t, el cual es el error actual. Parámetro I: Proporcional al integral del error medido hasta el instante t, es decir la acumulación de error en un periodo determinado de tiempo. Parámetro D: Proporcional a la derivada del error en el instante t, es decir es la razón de cambio del error. (Akai, 2000) Uso de Transistores como Interruptores. Un multiplexor, también conocido como “mux”, es un componente electrónico que selecciona como salida a una y solamente una de las múltiples señales de entrada según una señal de control. (Dean, 2010). El tipo de multiplexor se lo define según el número de entradas. Por ejemplo un multiplexor 26 , posee 26 entradas y requiere de n señales de control. (Debashis, 2010). Multiplexores de mayor tamaño pueden ser construidos ya sea utilizando técnicas lógica de suma de productos o una combinación de varios multiplexores más sencillos. (Harris, 2013). En la Figura 12 se muestra el esquemático para un multiplexor 2:1 y de forma adjunta su tabla de verdad respectiva. 29 Figura 12. Multiplexor 2:1 y su tabla de verdad. Tomado de Harris & Harris. (2013). En la Figura 12, S corresponde a la señal de control. D1 y D0 son las entradas y la salida del multiplexor. La técnica de multiplexado puede ser utilizada para manejar grandes cantidades de LEDs. Para el caso en el cual se requiera controlar LEDs que operen con alimentación 12 voltios se puede hacer uso de transistores. Suponiendo el caso de que se van a controlar 25 LEDs es necesario utilizar 10 transistores, 5 del tipo NPN y 5 PNP. (García, 2015) La diagramación y circuito se muestra en la Figura 13. 30 Figura 13. Esquemático de multiplexado para LEDs de 12V. Tomado de García, A. Un MOSFET es un tipo de transistor compuesto por una unión Metal-Oxido. Son conocidos como Metal Oxide Field Effect Transistor. La principal ventaja de utilizar MOSFET es que requieren una corriente muy pequeña en su compuerta para activarlo. Y una vez activo, este puede entregar hasta 50 amperios para la carga. (The MOSFET, 2010) Sensor magnético. Sensores de ventana pueden ser utilizados para un sistema de seguridad y alarma. Estos sensores consisten en un interruptor con dos contactos. Cuando un imán permanente se encuentra suficientemente cercano el interruptor cambia su posición al contacto normalmente cerrado, mientras que cuando el imán se aleja el interruptor regresa al contacto normalmente abierto. (LaLena, 2015) El sistema mencionado se muestra en la Figura 14. 31 Figura 14. Interruptor magnético con posiciones normalmente cerrado y normalmente abierto. Tomado de LaLena. Seguro Eléctrico. Un tipo de seguro eléctrico que puede ser activado con voltaje DC es aquel que es basado en solenoides. Un solenoide es una bobina hecha de hilo conductor que es capaz de producir un campo magnético (“Solenoide”, s.f.). En un seguro de este tipo el solenoide actúa como un electroimán que, cuando es energizado, atrae al seguro de metal hacia su centro permitiendo que se abra la puerta (“Lock-style Solenoid - 12VDC”, s.f.). Si el solenoide no está energizado, la puerta permanece cerrada y no se consume energía (“Lockstyle Solenoid - 12VDC”, s.f.). Un seguro de este tipo utiliza alrededor de 650 mA a 12 V y tiene un tiempo de activación de 1 a 10 segundos (“Lock-style Solenoid - 12VDC”, s.f.). Para su implementación, se necesita utilizar un transistor de potencia y un diodo de protección (“Lock-style Solenoid - 12VDC”, s.f.), como se muestra en la Figura 15. 32 Figura 15. Circuito para control de seguro eléctrico mediante un microcontrolador. Tomado de “How to Drive Solenoids with the Arduino”. (s.f.). Fuente de Alimentación. “Virtualmente todo equipo electrónico como computadoras, calculadores, TV e instrumentos son alimentados por una fuente de poder DC, ya sea una batería o una fuente de alimentación DC. La mayoría de estos equipos no solamente requieren un voltaje directo si no también un voltaje adecuadamente filtrado y regulado” (Texas Instruments, 2004). Los equipos de conversión de energía eléctrica son clasificados en tres categorías: conversor DC/DC, fuente de alimentación AC/DC y inversor DC/AC. Una fuente de alimentación AC/DC debe realizar las siguientes funciones: Rectificación, transformación de voltaje, filtrado, regulación, aislamiento y protección. (Texas Instruments, 2004). Sin embargo es posible realizar diseños más sencillos. El diseño básico de una fuente de alimentación DC consiste en un rectificador de onda completa, compuesto por un arreglo de diodos, y un regulador de voltaje, para el cual se puede utilizar un circuito integrado como por ejemplo el LM317. (DuBois, 2009). El diseño se muestra en la Figura 16. 33 Figura 16. Diseño básico de fuente de alimentación DC con rectificador de onda completa y regulador de voltaje. Tomado de DuBois. Reguladores de Voltaje. En términos generales, un regulador de voltaje es un circuito que provee una salida de voltaje constante independiente de las fluctuaciones de voltaje en la entrada (Poornachandra, Sasikala, y Khan, 2005). Un regulador de voltaje de circuito integrado tiene circuitos de fuente de referencia, amplificador comparador, dispositivo de control y de protección contra sobrecarga dentro del mismo integrado (Boylestad & Nashelsky, 2009). Los reguladores de la serie 78XX proporcionan voltajes constantes de 5V a 24V (Boylestad & Nashelsky, 2009). El circuito integrado se conecta como se muestra en la Figura 17. Se utilizan capacitores para filtrar la señal de entrada y la de salida (Boylestad & Nashelsky, 2009). 34 Figura 17. Conexión de un regulador de voltaje. Tomado de “3-Terminal 1 A Positive Voltage Regulator”, 2014 Descripción del diseño Descripción General. El sistema electrónico encargado del movimiento y control general de la máquina está compuesto por tres partes principales: 1. Un microcontrolador Arduino Mega con un “shield” RAMPS 1.4. 2. Una circuito impreso que conecta las entradas/salidas del Arduino con los actuadores y sensores de la máquina. 3. Actuadores y sensores que permiten el funcionamiento de la máquina. La ubicación de los pines de entrada y salida del Arduino con respecto al “shield” RAMPS 1.4 se muestran en la Figura 27 del Anexo B. El esquema del circuito impreso se muestra en la Figura 28 del Anexo B. El circuito está alimentado por una fuente de poder de 12VDC. Se utilizan además reguladores 7805 y 7806 para alimentar con 5VDC y 6VDC, respectivamente, a los sensores y actuadores que 35 necesitan de alimentación con estos voltajes. En la Tabla 2 se detalla la función de cada una de las terminales del circuito, junto a donde van conectadas. Tabla 2 Lista y descripción de terminales del circuito diseñado. Terminal MOTXOUT Conectada a Descripción MOTUP RAMPS driver eje Z pines 2B,2A,1A,1B RAMPS driver eje X pines 2B,2A,1A,1B Motor mov. eje X superior MOTDOWN Motor mov. eje X inferior MOTY Motor mov. Eje Y TEMPIN Microcontrolador pin A13 TEMP Sensor LM35 MGSECIN Microcontrolador pin 19 MGSEC Seguro magnético ENDSTOPINX Microcontrolador pin 18 ENDSTOPINY Microcontrolador pin 3 Señal de salida para el movimiento horizontal de motores. Señal de salida para el movimiento vertical de motores. Señal para el movimiento de bobinas del motor horizontal superior. Señal para el movimiento de bobinas del motor horizontal inferior. Señal para el movimiento de bobinas del motor vertical. Señal de entrada de temperatura del sistema. Alimentación y medición del sensor de temperatura. Señal de entrada del estado de sensor magnético. Conexión del sensor magnético de la puerta trasera al circuito lógico. Señal de entrada de fines de carrera horizontales. Señal de entrada de fin de carrera vertical. ENDSTOPX ENDSTOPY Fines de carrera eje X (en paralelo) Fines de carrera eje Y Conexión de los fines de carrera del eje X al circuito lógico. Conexión del fin de carrera del eje Y. SERVOSOUT Microcontrolador pin 11 y pin 6 SERVOACT Servomotor actuador SERVOCOM Servomotor compuerta IR LED LED infrarrojo Señales de salida para el movimiento de servomotores. Alimentación y señal de control para servomotor de actuador. Alimentación y señal de control para servomotor de compuerta. Alimentación LED infrarrojo. FOTOIN Microcontrolador pin A15 Señal de entrada del sensor de presencia. FOTOD Fotodiodo infrarrojo REDLEDOUT Microcontrolador pin 25 REDLED LEDs rojos (caja de entrega) GREENLEDOUT Microcontrolador pin 23 GREENLED LEDs verdes (caja de entrega) BLUELEDOUT Microcontrolador pin 27 Conexión del fotodiodo (sensor de presencia) al circuito lógico. Señal de salida para control de luces indicativas de error de entrega. Conexión de luces de error al circuito de prendido y apagado. Señal de salida para control de luces indicativas de entrega exitosa. Conexión de luces de entrega exitosa al circuito de prendido y apagado. Señal de salida para control de luces laterales. MOTYOUT 36 BLUELED LEDs azules (laterales) FANOUT Microcontrolador pin 29 FAN Ventilador LOCKOUT Microcontrolador pin 31 LOCK Seguro eléctrico WHITELEDOUT Microcontrolador pin 33 WHITELED LEDs blancos (brazo) BLIGHTSOUT1 Microcontrolador pines 35,37,39,41,43,45,47,32,5,4 Microcontrolador pines 1,0,63,59,40,64,42,44,65,66 BLIGHTSOUT2 BLIGHTSPLUS Luces traseras (positivo) BLIGHTSMINUS Luces traseras (negativo) Conexión de luces laterales al circuito de prendido y apagado. Señal de salida para control de ventilador. Conexión de ventilador al circuito de control. Señal de salida para control de seguro eléctrico. Conexión de seguro eléctrico de la puerta trasera al circuito de control. Señal de salida para control de luz indicativa de mov. del brazo Conexión de luces de mov. del brazo al circuito de prendido y apagado. Señales de salida para control por filas de luces indicativas de abastecimiento Señales de salida para control por columnas de luces indicativas de abastecimiento Conexión del contacto positivo de las luces traseras al circuito de control. Conexión del contacto negativo de las luces traseras al circuito de control. El código utilizado para la programación del Arduino Mega se muestra en el Anexo C. El programa se encuentra dividido en funciones de acuerdo a cada una de las acciones que realiza la máquina y que se detallan en las secciones siguientes. Los sensores y actuadores de la máquina se encuentran ubicados de la siguiente manera: • Dos motores de pasos ubicados en el borde derecho de la máquina encargados del movimientos horizontal del brazo mecánico. • Un motor de pasos en la parte superior del brazo mecánico que permite el movimiento vertical de la caja de entrega. • Un diodo infrarrojo y un fotodiodo en el interior de la caja actuando como sensor de presencia. 37 • Dos fines de carrera en el borde izquierdo de la máquina para limitar el movimiento horizontal del brazo y un fin de carrera en la parte superior del brazo para limitar el movimiento de la caja. • Dos servomotores en la caja de entrega, uno para activar el actuador y otro para abrir la compuerta de entrega. • Un sensor de temperatura y un ventilador en la parte superior de la máquina para el control de temperatura. • Luces azules en los costados de la máquina para iluminación general, luces blancas en la parte trasera del brazo para indicación de movimiento, luces rojas y verdes dentro de la caja de entrega para alerta de error o entrega exitosa, luces verdes en la parte trasera para indicación de abastecimiento. • Un sensor magnético y un seguro eléctrico en la puerta trasera de la máquina para control de seguridad. Comunicación con el computador. La comunicación entre el microcontrolador utilizado y la computadora interna de la máquina se hace mediante comunicación serial por medio de un módulo TTL-USB PL2303HX. Para una comunicación efectiva entre las partes, se desarrolló la codificación serial que se muestra en la Tabla 3. Una explicación más detallada de la función que cumplen cada una de estas instrucciones se encuentra en las secciones siguientes. 38 Tabla 3 Codificación de mensajes entre el microcontrolador y el microcomputador. Código HEX Instrucción Receptor Descripción Mensaje de inicio cuando se prende el microcontrolador. El microcontrolador está listo para recibir instrucciones. Instrucción ejecutada (o recibida en el caso de movimiento de motores). Notificación de la temperatura actual. Advertencia de valor crítico de temperatura. Pedido de la temperatura actual. Pedido para reiniciar el microcontrolador. Pedido de desbloqueo de puerta trasera para el modo de abastecimiento. Encendido de luces laterales. Apagado de luces laterales. Se detectó el medicamento y se lo entregó exitosamente. El medicamento no fue detectado. Pedido para entregar medicamento desde posición inicial. x1 Encendido del sistema Computador x2 Sistema listo Computador x3 OK (Orden Recibida/Ejecutada) Computador x4 Computador x7 Notificación de Temperatura Advertencia de Temperatura Pedido de Temperatura Pedido de Reseteo x8 Desbloqueo de Puerta Arduino x9 Encendido de Luces Arduino xA Apagado de Luces Arduino xC Entrega exitosa Computador xD Entrega fallida Computador xE Pedido primer medicamento Arduino xF Pedido medicamentos subsecuentes Arduino Pedido para entregar medicamento desde posición de entrega. x10 Finalizar entrega Arduino x11 Encendido luz de abastecimiento Arduino Pedido para retornar desde posición de entrega a posición inicial. Encendido de luz en la posición a abastecer x12 Apagado de luz de abastecimiento Arduino x5 x6 Computador Arduino Arduino Apagado de luz en la posición a abastecer Parámetro Ejemplo Mensaje Final x1x0 x2x0 x3x0 Temperatura x4x18 Temperatura x5x1B x6x0 x7x0 x8x0 x9x0 xAx0 xCx0 xDx0 Posición de entrega (valor en X, valor en Y) Posición de entrega (valor en X, valor en Y) xEx42 xFx34 x10x0 Posición luz de abastecimiento (valor en X, valor en Y) Posición luz de abastecimiento x11x42 x12x34 39 x13 Estado puerta Arduino Notificación de cambio de estado de la puerta trasera (valor en X, valor en Y) Estado puerta (0=cerrado, 1=abierto) x13x1 Control del Movimiento de Motores. La máquina cuenta con dos motores a pasos encargados del movimiento horizontal del brazo mecánico y un motor adicional para el movimiento vertical. Los motores de pasos están conectados directamente al circuito impreso, el cual a su vez los conecta con las salidas correspondientes del RAMPS. La conexión está hecha de tal manera que los dos motores para el movimiento horizontal reciban la misma señal de control desde uno de los controladores DRV8825. El otro controlador maneja el movimiento del motor vertical. El control de la distancia recorrida tanto horizontal como verticalmente se lo realiza con la función movMot(). Esta función recibe como parámetros la dirección y el número de pasos en los que se moverán cada uno de los motores, en dirección horizontal y vertical. Basándose en evidencia experimental realizada, se determinó que la velocidad a la cual el sistema operaba sin problema era de 37.5 r/min en el arranque y 44.6 r/min en movimiento para el eje horizontal. Para el eje vertical, estos valores son de 18.75 r/min en arranque y 22.3 r/min en movimiento. Esta función esta diseñada para emitir pulsos de forma casi simultánea a ambos controladores a la velocidad establecida, esto permite un movimiento simultáneo en dirección horizontal y vertical. La máquina utiliza dos servomotores para recoger una medicina. Uno de los servos acciona un actuador en forma de varilla que empuja la caja del medicamento desde abajo de la bandeja haciendo que caiga por gravedad dentro de la caja de metal ubicada en el brazo mecánico. El otro servomotor permite abrir una compuerta en el otro extremo de la caja para que el medicamento caiga dentro del ducto de entrega. Ambos servomotores están 40 conectados de igual forma al circuito impreso. Están alimentados a 6 voltios que provee el regulador LM7806 y están conectados a la tierra común del circuito. La señal de control de ambos servos proviene directamente del Arduino a través del terminal SERVOSOUT en el circuito. Para el control de los servomotores, se utilizó la librería Servo de dominio público. Esta librería facilita el control de los servomotores ya que se necesita pasar como parámetro el ángulo al que se desea mover a los servomotores. Los ángulos para abrir y cerrar la compuerta y para accionar y regresar al actuador mecánico se determinaron de forma experimental. El primer uso del movimiento de motores en el funcionamiento de la máquina es cuando esta está recién encendida y se ejecuta la función setup() de Arduino. Además de definir variables y objetos de distintos procesos, en esta función se coloca al brazo en la posición inicial. Después de enviar la señal x1x0 al computador para indicar que ha comenzado la inicialización, se inicializa el servo del actuador hasta su posición inicial. De igual forma, se realiza abre y cierra la compuerta de la caja para que en caso de que algún medicamento haya quedado dentro de la misma al realizar el reset de la máquina, este medicamento caiga en la parte inferior de la máquina y no ocasione problemas con las siguientes entregas. Después de esto, el microcontrolador utiliza la función movMot() para mover el brazo hacia la izquierda y hacia arriba simultáneamente. El movimiento horizontal se da hasta que detectan los fines de carrera ubicados en el borde izquierdo de la máquina. Lo mismo sucede con el movimiento vertical cuando de activa el fin de carrera ubicado en la parte superior del mismo brazo mecánico. Esto garantiza que siempre el brazo se encuentre en la posición inicial después de este proceso. Para mejorar la eficiencia del proceso general, la detención del movimiento de los motores solo se hace cuando se produce un cambio en el estado de los fines de carrera. Esto ocasiona que, durante el desarrollo de la máquina, los 41 motores no se detuvieran si se hacía un reset a la máquina cuando alguno de los fines de carrera se encontraba activado. Por esta razón, antes de realizar el movimiento de inicialización, se realizan pequeño movimientos hacia abajo y hacia la derecha. Así se asegura que ninguno de los fines de carrera estén activados. Cuando el microcontrolador recibe la señal serial del tipo xExXX, se ejecuta la función stepper_ini(). Para esta función, se asume que el actuador se encuentra en la posición inicial en la esquina superior izquierda de la máquina. El brazo se mueve desde la posición inicial hasta la posición deseada. Se activa el servo del actuador para recoger la medicina. Si los sensores de presencia detectaron la medicina, el brazo se mueve hasta la posición predefinida de entrega, donde se activa el otro servo para abrir la compuerta y entregar el medicamento. Se enviará la señal xCx0 si se cumplió una entrega exitosa. Durante la construcción de la máquina se pudo apreciar que en ocasiones imperfecciones mecánicas o físicas de la máquina o de los medicamentos hacen que este último se que atascado y no caiga dentro de la caja metálica . Para evitar esto, se programó la función de tal manera que, si no se detecta el medicamento dentro de la caja, se realicen pequeños movimientos verticales (primero hacia arriba y luego hacia abajo) para mejorar la posición del brazo y volver a accionar el actuador. Si a pesar de esto no se detecta ningún medicamento, se envía la señal xDx0 de error y, por convención, se mueve el brazo hasta la posición de entrega. Cuando el microcontrolador recibe la señal serial del tipo xFxXX, se ejecuta la función stepper(). Está función difiere de la función stepper_ini() en que se asume que antes de ejecutarse el brazo robótico se encuentra en la posición de entrega del medicamento. Esta distinción permite reducir el tiempo de entrega total de medicamentos ya que el brazo mecánico no tienen que volver a la posición inicial antes de buscar otro medicamento. Por lo demás, las funciones stepper() y stepper_ini() funcionan de forma idéntica. 42 Al recibir la señal x10x0, se ejecuta la función regresar(). Esta función regresa al brazo robótico a la posición inicial. El movimiento es similar al realizado al inicializar la máquina, de forma que el brazo se mueve hasta detectar los fines de carrera. Sensores de Movimiento. Se cuenta con dos fines de carrera para el movimiento horizontal, los cuales están conectados en paralelo y en configuración normalmente cerrado, de forma que los dos deban estar activados para recibir una señal en el microcontrolador. Para el movimiento vertical se cuenta solo con un fin de carrera en configuración normalmente cerrado en la posición descrita en el apartado anterior. Los fines de carrera para limitar el movimiento horizontal y vertical se encuentran conectados en los terminales ENDSTOPX y ENDSTOPY de la placa, respectivamente. Para ambos terminales, se cuenta con un circuito similar como se aprecia en la Figura 28 del Anexo B. Un extremo está conectado directamente al terminal (ENDSTOPX o ENDSTOPY según sea el caso) conectado al microcontrolador. El mismo extremo del terminal está también conectado a 5 voltios a través de una resistencia de 10 kΩ. El otro extremo está conectado directamente a tierra. Este circuito permite que cuando se activen los fines de carrera, estos pasen a estado abierto y, por tanto, se tenga una señal de 5 voltios a la entrada del microcontrolador. El ruido en la señal a la entrada del microcontrolador se filtra mediante un capacitor de 1µF (valor determinado experimentalmente). Los fines de carrera función como interrupciones en el código. Cuando se detecta un cambio lógico en el valor de los sensores, se interrumpe el código que se está ejecutando y se ejecutan las funciones inicioX() e inicioY(), respectivamente, que se encargan de detener el movimiento de los motores a pasos. 43 La máquina utiliza adicionalmente sensores de presencia para determinar si el actuador mecánico pudo obtener exitosamente el medicamento desde la posición de almacenamiento. El sistema de detección está conformado por un LED infrarrojo y un fotodiodo infrarrojo. El LED está conectado a la placa a través del terminal IRLED. El LED está alimentado por 5 voltios (obtenidos a través del regulador 7805), con la presencia de una resistencia limitadora de corriente de 150Ω. El circuito del fotodiodo es similar al de los fines de carrera, con una resistencia de 3.3kΩ que conecta al terminal negativo del fotodiodo a 5V y el terminal positivo conectado a tierra. El fotodiodo se conecta a la placa a través del terminal FOTOD. El terminal negativo del fotodiodo está de igual forma conectado al terminal FOTOIN, el cual se conecta al microcontrolador. La función sensor() del programa se encarga de discriminar la presencia o no del medicamento. Está función toma como entrada el valor análogo de voltaje de la terminal FOTOIN. Si el valor medido es mayor o igual a un valor umbral (establecido experimentalmente), la función devuelve un valor booleano de true. Caso contrario, se devuelve el valor false. Está función es utilizada durante la ejecución de las funciones stepper_ini() y stepper() , como se detalló en el apartado anterior. Control de Temperatura. Este control se realiza utilizando un sensor de temperatura LM35. El sensor se conecta a la placa a través del terminal TEMP del circuito. El sensor está alimentado con 5V a través del pin 1 del terminal y está conectado a tierra a través del pin 3 del mismo. El pin 2 del terminal TEMP está conectado directamente al terminal TEMPIN, que se da la señal de temperatura para el microcontrolador. Para disminuir la temperatura se utiliza como actuador un ventilador. Este se conecta al circuito a través del terminal FAN del circuito. El pin 1 de esta terminal está conectado a 44 12V, mientras que el pin 2 está conectado al drenaje de un MOSFET IRF530N. La fuente del MOSFET está conectada a tierra, mientras es la señal de control que proviene de la terminal FANOUT conectada al microcontrolador. Para el control PID de la temperatura se utiliza como base la librería PID de Arduino (Beauregard, 2015). Adicionalmente se desarrollo la función ventilador() que se ejecuta cada vez que la función loop() empieza a correr. La función ventilador() lee el valor de entrada dado por el sensor de temperatura. Si este valor es superior al valor de advertencia preestablecido, se envía una señal al computador de tipo x5xXX, cuyo parámetro es la temperatura medida en hexadecimal. El valor medido de temperatura es utilizado como parámetro por objeto de la librería PID para compararlo con el valor deseado, que en este caso es 25°C, y obtener el error (Beauregard, 2015). Las constantes proporcional, diferencial e integral son valores constantes preestablecidos (Barnes, 2011). La salida que produce el control PID es utilizada para establecer el valor analógico de voltaje utilizado para mover el ventilador. Adicionalmente a la función anterior, la función medirTemperatura() es ejecutada cuando se recibe un mensaje de tipo x6x0. Esta función lee la temperatura actual del sistema y la envía al computador con un mensaje de tipo x4xXX, cuyo parámetro es la temperatura medida en hexadecimal. Control de Luces. El control de las diferentes luces con las que cuenta la máquina se realizan mediante el uso de transistores como interruptores. Las tiras de LED utilizadas para el proceso de entrega sirven para iluminación general (azules), movimiento del brazo (blancas), notificación de entrega exitosa (verdes) y notificación de error (rojas). Cada una de estas luces son controladas por un MOSFET IRF530N cuya señal de control está dada por el 45 microcontrolador, como se aprecia en el esquema de la Figura 28 del Anexo B. Como se aprecia en la Tabla 2, las terminales que se conectan al microcontrolador para el control de estas luces son BLUELEDOUT, WHITELEDOUT, GREENLEDOUT y REDLEDOUT, respectivamente. Dentro del programa, el computador puede prender o apagar las luces laterales (azules) de la máquina utilizando los comandos x9x0 y xAx0, respectivamente. Estas acciones son realizadas por la función controlLuces() y, en cualquier caso, se envía una señal de OK una vez realizada la acción. La luz blanca ubicada detrás del brazo mecánico se prende antes de realizar cualquier movimiento del brazo mecánico y se apaga cuando este finaliza. La luz verde indicativa ubicada dentro de la caja de entrega se prende cuando se ha detectado que el medicamento ha caído dentro de la caja durante el proceso de entrega. En cambio, la luz indicativa roja se prende cuando el medicamento no fue obtenido y la respectiva señal de error fue enviada. El control de las luces indicativas traseras para el proceso de abastecimiento utiliza el esquema matricial de la Figura 11. Ya que se consideran 100 luces diferentes para cada posición de los medicamentos, el circuito cuenta con 10 transistores LM3904 y 10 transistores LM3906, como se muestra en el esquema de Figura 28 del Anexo B. Los terminales para la conexión tanto de las luces indicativas como de las señales de control para el modo abastecimiento se detallan en la Tabla 2. La función cargarMed() utiliza los comandos del tipo x11xXX y x12xXX para prender y apagar, respectivamente, las luces de abastecimiento de una terminada posición. La función devuelve un mensaje de OK después de realizar esta operación. 46 Sensor magnético y seguro eléctrico. El circuito diseñado está programado también para controlar la seguridad de la puerta trasera de la máquina para su abastecimiento. Mediante el uso de un sensor magnético como el que se trató en la sección anterior permite saber el estado actual de la puerta. El sensor se conecta en la terminal MGSEC de la placa. El sensor cuenta con un circuito similar al de los fines de carrera, con un extremo conectado a la terminal de entrada al microcontrolador y a 5V (con una resistencia de 10kΩ) y el otro extremo conectado a tierra. Cuando la se cierra la puerta, la terminal MGSECIN que se conecta al Arduino se encuentra a 0V. Caso contrario, el sensor actúa como circuito abierto y la terminal MGSECIN se encuentra a 5V. Se colocó de igual forma un capacitor de 1µF para filtrar la señal de entrada al microcontrolador. El sensor magnético función como una interrupción al código, como los fines de carrera. Inmediatamente después de producirse un cambio de estado en el sensor (de cerrado a abierto o viceversa) se ejecuta la función magSec(). Esta función envía al computador un mensaje de tipo x13xX, cuyo parámetro es 0 si la puerta está actualmente cerrada o 1 si está abierta. La cerradura eléctrica se encuentra conectada al circuito por medio de la terminal LOCK. El voltaje entre las terminales se controla utilizando un MOSFET IRF530N. La señal de control para el MOSFET se obtiene desde el microcontrolador por medio de la terminal LOCKIN. Adicionalmente, se coloca un diodo 1N4004 por protección del solenoide (“How to Drive Solenoids with the Ardiuno”, s.f.). Cuando el computador envía una señal x8x0, el microcontrolador ejecuta la función unlock(), que envía una señal lógica de 1 al terminal LOCKIN durante 1.2 segundos para que se pueda abrir el seguro eléctrico. 47 PRUEBAS Y RESULTADOS Tal y como se ha visto en secciones anteriores, el equipo esta compuesto por un sistema de control general el cual se puede categorizar en: sistema de control ambiental, sistema de seguridad y sistema de entrega de medicamentos. Para el correcto funcionamiento del equipo en general se han llevado a cabo pruebas y experimentos para encontrar el punto de operación optimo de cada sistema. Una vez que se ha probado el funcionamiento de cada sistema se ha procedido a probarlos en conjunto y reevaluar dichos puntos de operación óptimos. Los procesos llevados a cabo se describen a continuación: Sistema de control ambiental Parámetros PID. Como se vio anteriormente, el controlador PID posee tres parámetros por defecto, estos son: Proporcional, Integral y Derivativo. La forma más eficiente de calibrar estos parámetros es experimental. La variación de dichas constantes puede hacer que el control sea más o menos agresivo. Si el control es más agresivo el mismo tendrá problemas para controlar variaciones pequeñas de temperatura. Del mismo modo si el control es muy dócil, este no podrá controlar cambios bruscos de temperatura. Por tanto es necesario encontrar un punto medio de funcionamiento donde el sistema de control pueda ser lo suficientemente sensible a cambios pequeños de temperatura pero al mismo tiempo sea capaz de controlar las variaciones considerables. Cabe mencionar que los parámetros deben tener una inclinación hacia los cambios sensibles, considerando que la variación de temperatura ocurre de forma lenta y los cambios bruscos de temperatura son menos probables. Para calibrar estos parámetros, se los ha ido variando uno por uno y se ha hecho variar la temperatura del sensor con una fuente de calor para que el control PID accione el ventilador. Por inspección visual del funcionamiento del ventilador se ha encontrado el punto optimo de 48 operación del control PID. Luego se ha probado el funcionamiento del sistema haciendo variar unos pocos grados el “set point” asignado y se ha comprobado con un termómetro digital que la acción del ventilador estabiliza la temperatura del sistema al valor de “set point”. Cabe destacar que para realizar estas pruebas se simularon las condiciones de la máquina utilizando un sistema cerrado con una bombilla como fuente de calor, el sensor LM35 y el ventilador como actuador. Los parámetros para el modelo real del prototipo podrían cambiar. Punto óptimo de lectura del sensor de temperatura y ubicación de ventilador. Se ha realizado medición de voltaje del sensor de temperatura en distintos puntos del equipo para establecer donde se obtiene una mejor estimación de la temperatura promedio. Así mismo se ha probado en el diseño distintos puntos donde el ventilador pueda crear un mayor flujo de aire. Se ha probado que el punto óptimo de colocación del sensor de temperatura es en la parte interna de los racks donde se ubican los medicamentos, es decir en el centro del equipo. Sin embargo puesto que esto dificultaba la instalación del sensor y dado que los resultados obtenidos no variaban considerablemente, se ha optado por instalarlo en la parte superior del equipo. Por otra parte se ha comprobado que el ventilador puede distribuir una mayor cantidad de flujo de aire al colocarlo en la parte superior, es decir en el techo, del equipo. También se ha probado experimentalmente que es necesario incluir ventiladores con mayor capacidad y potencia. En ambientes con mayor concentración de humedad y calor también puede ser necesario que el ventilador sea remplazado por un aire acondicionado. Consumo de potencia de luces LED ambientales. Dado que las luces LED ambientales, cuyo color es azul, deben estar encendidas en todo momento cuando la máquina 49 se encuentre energizada, es de suma importancia que el consumo de potencia de las mismas no afecte el rendimiento de elementos de otros sistemas como por ejemplo los motores de pasos, los cuales en reiteradas ocasiones deben mantener su posición y por ende tienen picos de consumo de corriente considerables. Ambos elementos, tanto las cintas LED como los motores, son los elementos de mayor consumo en el equipo. Por tanto, como una primera práctica experimental se ha procedido a alimentar los motores a pasos con una fuente de alimentación de laboratorio la cual permite dimensionar la cantidad de corriente consumida durante su funcionamiento. Se ha tomado nota del consumo de corriente de los motores y se ha llegado a los resultados de la Tabla 4. Tabla 4 Consumo de corriente y potencia de motores Servo Consumo por motor Servo Corriente (A) Consumo de potencia (W) Standby 3A 36 W En movimiento 0.8 A 9.6W Considerando que la fuente utilizada por el equipo puede otorgar hasta 360W en consumo de potencia y el consumo de los motores es el mostrado en la tabla anterior, se ha procedido a elegir el tipo de cinta de LED para la ambientación. Se ha probado la luminosidad ambiental con dos distintos tipos de tiras LED de bajo consumo: 4,8 W/m y de 12W/m. Se ha comprobado experimentalmente que aunque la cinta LED de 4.8W/m consume menor cantidad de potencia, es necesario colocar un mayor número de metros de cinta LED para alcanzar la misma luminosidad que con la cinta de 12W/m. Y como resultado al colocar la cinta de 12W/m se requiere menos consumo de potencia, por lo tanto se ha elegido la cinta LED de 12W/m. 50 Sistema de entrega de medicamentos Frecuencia de motores. La frecuencia de la señal con la que operan los motores a pasos es de suma importancia para el correcto funcionamiento del equipo. Además el sistema requiere que los motores funcionen a la mayor rpm posible para poder entregar los medicamentos con la mayor rapidez. Para encontrar la frecuencia a la que los motores operan de forma correcta, se los ha conectado a un generador de señales en el laboratorio. Se ha ido variando la frecuencia de la señal hasta llegar al punto cuando los motores dejaban de funcionar por completo, esta frecuencia fue de 400Hz. Luego se ha comenzado a disminuir dicha frecuencia hasta llegar a un punto en que los motores funcionen de forma correcta nuevamente, de esta forma se ha encontrado la mayor frecuencia posible a la que pueden operar dichos motores. El valor elegido fue de 280Hz, a esta frecuencia los motores tienen una rpm de 84 rev/min. Luego se ha realizado esta misma prueba con los motores instalados y con la carga de los brazos mecánicos. Se ha encontrado que la frecuencia a la que operan los motores ha disminuido, sobre todo en el motor del eje vertical. Para solucionar este problema podría incluirse un motor adicional en el eje vertical para que asista al motor existente en el movimiento de la carga del brazo mecánico. Adicionalmente para dar una solución al problema rapidez de los motores, se los ha hecho trabajar con aceleración. En un inicio los motores operan a una frecuencia menor, una vez que la inercia del brazo mecánico ha sido superada se comienza a subir la frecuencia de la señal. Esto permitió mejorar la rpm a la que funcionan los motores en hasta un 25%. Ángulo de movimiento de motores servo para actuador. Es de vital importancia para evitar que se estropeen las piezas mecánicas del actuador, donde se acciona una perilla que empuja los medicamentos a una caja con una compuerta que se abre cuando el actuador ha llegado a las coordenadas establecidas para entrega de medicamento, que los servos que 51 controlan tanto la perilla como la compuerta estén perfectamente calibrados para que se desplacen una cantidad exacta angular. Si el servo posee una mala calibración podría dañarse y en el peor de los casos echar a perder todo el mecanismo mecánico. Por esta razón se ha hecho variar los valores angulares de movimiento de ambos servo en pocos grados hasta establecer el punto óptimo. Después de algunas pruebas se ha concluido que el ángulo necesario para la posición inicial es: 145 grados para servo de la perilla y 160 grados para el servo de la compuerta. Para cuando se accionan ambos servos, es decir cuando se levanta la perilla o se abre la compuerta, los ángulos son: 25 grados para servo de la perilla y 66 grados para el servo de compuerta. Adicionalmente se ha realizado una prueba de movimiento continuo de los servo para comprobar que no exista calentamiento por fricción en las partes mecánicas ni motores. Calibración de cantidad de pasos por posición en motores a pasos. Los motores a pasos deben moverse una cierta cantidad de pasos tanto en el eje vertical como en el horizontal para que el brazo mecánico llegue a una coordenada determinada. Para encontrar esta cantidad de pasos se ha definido la posición (1,0) (posición 1 horizontal, 0 vertical) y se ha ido variando los valores hasta el punto en el que la perilla del actuador del brazo mecánico se encuentre exactamente en el punto medio de los racks de dicha posición. Se ha concluido que los valores de pasos por posición son: 625 para X y 559 para Y. De tal forma que para llegar a la posición (5,6), los pasos requeridos en X son 625*5 y 559*6 en Y. Cabe mencionar que para mejorar la eficiencia de operación de los motores se los ha hecho funcionar con la opción de microstepping 1/32. En esta función, como se explico anteriormente, los motores se mueven 1/32 de paso en lugar de un paso completo. Esto permite que los motores operen de forma más silenciosa y precisa. Cuando los motores operan con microstepping para llegar a la posición (5,6), los pasos requeridos en X son 625*5*32 y 559*6*32 en Y. 52 Sistema de seguridad Accionamiento de interruptores magnéticos. Con el fin de evitar que alarmas falsas se accionen, se ha realizado varias pruebas de desconexión del interruptor magnético ubicado en la puerta posterior. Adicionalmente se ha probado que no exista ningún efecto adverso en la operación de los mismos por campos magnéticos provenientes de los estatores de los motores de pasos. Como resultado se ha comprobado que los interruptores funcionan sin ningún inconveniente y la señal es recibida por el micro controlador sin ruido de consideración. 53 CONCLUSIONES Con este proyecto se pudo lograr la creación de un sistema de control electrónico para la operación de un dispensador automático de medicamentos en base al presupuesto limitado con el que se contaba. El prototipo creado cumplió con las expectativas iniciales con las que fue creado. Su uso futuro dentro de la clínica de la Universidad San Francisco de Quito permitirá determinar las correcciones que pueda necesitar el sistema. Con respecto a los sistemas específicos que conforman el sistema general de control, se obtuvieron las siguientes conclusiones: • Se optimizó el movimiento de los motores de pasos de forma que estos actuarán a la mayor velocidad posible sin perder el torque necesario para mover el brazo mecánico. De igual forma se consiguió un movimiento horizontal y vertical simultáneo de los motores y se optimizó el código para eliminar movimientos innecesarios del brazo mecánico, lo cual redujo el tiempo total de entrega del medicamento. • Con el uso de sensores de presencia y fines de carrera, se creó un control de lazo cerrado para el proceso de entrega de medicamentos que sea lo suficientemente confiable reduciendo la cantidad de errores y fallas al mínimo dentro de los parámetros de trabajo. • Se implementó un sistema de control PID de temperatura en el microcontrolador con una revisión casi continua del nivel de temperatura de la máquina. La suspensión del control de temperatura se da únicamente para evitar el retardo de las otras operaciones de la máquina. Si no existe otra acción por realizarse, el control es continuo. • Se diseñó un sistema de luces indicativas que mejoran la experiencia visual del usuario y le permiten saber de inmediato cuando existe un problema con la entrega de 54 medicamentos. De igual forma, se facilitó el trabajo del operador para el abastecimiento de la máquina por estos mismos medios. • Con el uso de una comunicación serial codificada entre el microcontrolador y el computador encargado del control de inventario e interfaz, se pudo garantizar el correcto funcionamiento de la máquina en función de las instrucciones recibidas. De igual forma, el uso de mensajes de OK o de error permite alertar al usuario de errores de ejecución por medio de una interfaz gráfica. • Se diseñó un sistema de seguridad capaz de controlar el acceso al interior de la máquina solo a personal autorizado mediante el uso de un seguro electromecánico y un sensor magnético. 55 DISCUSIONES A pesar de que se cumplieron los objetivos establecidos para este proyecto, existen algunas cambios que podrían optimizar el funcionamiento de un segundo prototipo: • Se puede notar que la desventaja de un sistema que emplee motores a pasos es el bajo rendimiento en velocidad. Para aumentar la velocidad del mismo se podría utilizar una fuente de mayor voltaje o trabajar con motores DC con encoders. • El uso de sensores de presencia en cada una de las posiciones de abastecimiento de la máquina permitiría hacer un conteo del número de medicamentos que son ingresados por el operador y compararlo con el número ingresado por el mismo operador mediante la interfaz gráfica. Esto aseguraría tener un control certero del inventario y evitaría posibles robos de medicamentos. • Por restricciones de tiempo y presupuesto, no se pudo probar el sistema de control de temperatura en el prototipo real, en lugar de esto se simularon las condiciones en las que se encuentra la máquina. Una vez que se disponga del prototipo de la máquina totalmente armado, se deberá ajustar los parámetros del control PID para optimizar el control de temperatura. Además, se utilizó un solo sensor de temperatura y un solo ventilador para el control. Para un control más efectivo de temperatura se podrían colocar varios sensores de temperatura en diferentes ubicaciones dentro de la máquina. Al mismo tiempo se podría utilizar varios ventilador distribuidos en la máquina o un sistema central de aire acondicionado. • Por motivos de tiempo no ha sido posible la implementación del sistema de seguridad de la máquina, por lo que se desconoce si pueda haber posibles fallos en el sistema. Adicionalmente, para el prototipo, no se consideró la necesidad de una puerta 56 delantera para el mantenimiento de la máquina. Por esta razón, se debería también duplicar el sistema de seguridad para esta puerta. • Además de los dispositivos utilizados para el sistema de seguridad, la adición de una sirena de alerta dentro del circuito podría mejorar la confiabilidad del mismo. • Cabe resaltar que se utilizó una tarjeta Arduino y un shield RAMPS 1.4 para facilitar el desarrollo del sistema de control. Una vez que se haya optimizado el sistema se puede optar por fabricar una sola PCB que contenga el microcontrolador, los controladores de los motores y demás circuitos necesarios para el sistema. Esto eliminaría la existencia innecesaria de conductores entre el microcontrolador y el resto del circuito. 57 REFERENCIAS BIBLIOGRÁFICAS “3-Terminal 1 A Positive Voltage Regulator”. (2014). Fairchild Semiconductor. Recuperado el 24 de noviembre de 2015 de https://www.fairchildsemi.com/datasheets/lm/LM7805.pdf. “Arduino MEGA 2560”. (s.f.). Arduino. Recuperado el 24 de noviembre de 2015 de hhttps://www.arduino.cc/en/Main/ArduinoBoardMega2560 “Arduino Mega Pololu Shield”. (s.f.). RepRap. Recuperado el 25 de noviembre de 2015 de http://reprap.org/wiki/Arduino_Mega_Pololu_Shield. “Definition of: microcontroller”. (s.f.). PC Magazine. Recuperado el 24 de noviembre de 2015 de http://www.pcmag.com/encyclopedia/term/46924/microcontroller. “Detienen a 7 sospechosos del robo de medicamentos en hospital del IESS.” (2015). Ecuavisa. Recuperado el 8 de abril de 2015 de http://www.ecuavisa.com/articulo/noticias/actualidad/100636-detienen-7-sospechososdel-robo-medicamentos-hospital-del-iess. “El servomotor”. (Sin fecha). Recuperado el 24 de noviembre de 2015 de http://www.infoab.uclm.es/labelec/solar/electronica/elementos/servomotor.htm “High Torque Hybrid Stepping Motor Specifications”. Recuperado el 7 de abril de 2015 de https://www.pololu.com/file/0J672/SY57STH56-1006A.pdf. “How to Drive Solenoids with Arduino”. (s.f.). Arduino. Recuperado el 24 de noviembre de 2015 de http://playground.arduino.cc/uploads/Learning/solenoid_driver.pdf “Lock-style Solenoid - 12VDC”. (s.f.). Adafruit. Recuperado el 24 de noviembre de 2015 de https://www.adafruit.com/products/1512. “Medicamentos del IESS fueron hallados en una clínica clandestina de Ambato”. (2015). ElComercio.com. Recuperado el 8 de abril de 2015 de 58 http://www.elcomercio.com/tendencias/medicamentos-iess-clinicaclandestina-ambatodelito.html. “Nema Motor”. (sin fecha). RepRap Org. Recuperado el 7 de Abril de 2015 de http://reprap.org/wiki/NEMA_Motor. “Pharmacy robot streamlines medication dispensing process”. (2011). Nash UNC Health Care. Recuperado el 10 de abril de 2015 de http://www.nhcs.org/press_releases/articletype/articleview/articleid/136. “RAMPS 1.4”. (s.f.). RepRap. Recuperado el 25 de noviembre de 2015 de http://reprap.org/wiki/RAMPS_1.4. “Shields”. (s.f.). Arduino. Recuperado el 25 de noviembre de 2015 de https://www.arduino.cc/en/Main/ArduinoShields. “Solenoide”. (s.f.). Real Academia Española. Recuperado el 24 de noviembre de 2015 de http://buscon.rae.es/drae/srv/search?val=solenoide Akai, M. (2000). “Control Systems, Robotics, And Automation”. Kyoto University Japan. Recuperado el 21 de noviembre de 2015 de http://www.eolss.net/ebooks/Sample%20Chapters/C18/E6-43-03-03.pdf Barnes, C. (2011). “Arduino Powered Smart Fan Controller”. Barnesian. Recuperado el 25 de noviembre de 2015 de https://www.barnesian.com/arduino-powered-smart-fancontroller. Beauregard, B. (s.f.). “Arduino PID Library”. Arduino. Recuperado el 20 de noviembre de http://playground.arduino.cc/Code/PIDLibrary. Boylestad, R., & Nashelsky, L. (2009). Electrónica: Teoría de circuitos y dispositivos electrónicos. México: Pearson Education. 59 Buss, C. (2015). “Robots to pack drugs for hospital patients”. Leicester Mercury. Recuperado el 10 de abril de 2015 de http://www.leicestermercury.co.uk/Robots-pack-drugshospital-patients/story-25943265-detail/story.html. Cox. J. (2001). Fundamentals of linear electronics: integrated and discrete. Segunda Edición. Dean, T. (2010). Network + Guide to Networks. Debashis, D. (2010). Basic Electronics. DuBois, J. (2009). “Design a simple DC power supply”. Recuperado el 21 de noviembre de 2015 de http://www.egr.msu.edu/classes/ece480/capstone/spring09/group06/power%20supply %20app%20note.pdf Fitzgerald, A. (2005). Máquinas Eléctricas. Sexta Edición. Mc Graw Hill. García, A. (2015). El Multiplexado de LEDs con Arduino. Recuperado el 20 de julio de 2015 de http://panamahitek.com/el-multiplexado-de-leds-con-arduino Harris, D., & Harris, S. (2013). Digital design and computer architecture. Amsterdam: Morgan Kaufmann. Herman, S. Industrial Motor Control. Sexta Edición. Delmar Cencage Learning. Hetherington, G. (2015). “Robotic dispenser is the modern arm of medicine”. The Northern Echo. Recuperado el 10 de abril de 2015 de http://www.thenorthernecho.co.uk/news/11796726.Robotic_dispenser_is_the_modern _arm_of_medicine. Ingram, L. (2015). “Robot at University Health Services is a counting machine”. Penn State News. Recuperado el 10 de abril de http://news.psu.edu/story/342735/2015/02/03/impact/robot-university-health-servicescounting-machine. 60 LaLena, M. (2015) “Tamper Proof Security System Wiring”. Structured Home Wiring. Recuperado el 24 de noviembre de 2015 de: http://www.structuredhomewiring.com/SecuritySystem/TamperProofWiring/ Ledbox. (2012). “Tiras Led 220V. Diferencias entre SMD3528, SMD3014 y SMD 5050”. Recuperado el 28 de julio de: http://blog.ledbox.es/informacion-led/diferencias-entrelos-modelos-de-tiras-led-flexibles-con-smd-3528-y-smd-5050. Nurse, J. (2014). “Rose Street robot whirr-king hard for Wokingham patients”. Getreading. Recuperado el 10 de abril de 2015 de http://www.getreading.co.uk/news/localnews/rose-street-robot-whirr-king-hard-6804122. Poornachandra, S., Sasikala, B. y Khan, A. (2005). Introduction to Electrical, Electronics and Communication Engineering. Nueva Delhi: Lama Publications. Rush-Monroe, K. (2011). “New UCSF Robotic Pharmacy Aims to Improve Patient Safety”. UCSF. Recuperado el 10 de abril de 2015 de http://www.ucsf.edu/news/2011/03/9510/new-ucsf-robotic-pharmacy-aims-improvepatient-safety. SGS-Thomson Microelectronics. Stepper Motor Driving. Recuperado el 8 de abril de 2015 de http://users.ece.utexas.edu/~valvano/Datasheets/Stepper_ST.pdf. Stephen Herman. (2009) Industrial Motor Control. Sexta Edición, Delmar Cengage Learning. Texas Instruments. Stepper Motor Controller IC. Recuperado el 8 de Abril de 2015 de https://www.pololu.com/file/0J590/drv8825.pdf. The MOSFET. (2010). How the MOSFET Works. Recuperado el 3 de agosto de 2015 de http://www.talkingelectronics.com/projects/MOSFET/MOSFET.html. Velasco, H. (Sin fecha). Motores Paso a Paso. Fecha de acceso: 7 de Abril de 2015. Recuperado de 61 http://www.docentes.unal.edu.co/hfvelascop/docs/CLASES/DIGITALES2/LA BORATORIO/Motor%20Paso%20a%20Paso.pdf 62 ANEXO A: PROTOTIPO Figura 18. Vista frontal de la máquina en movimiento. 63 Figura 19. Vista superior de la caja de entrega. El fotodiodo y el LED IR se observan en los costados en la parte inferior de la caja. El actuador está en la parte superior y la compuerta en la parte inferior de la misma. 64 Figura 20. Fin de carrera superior para el movimiento horizontal. 65 Figura 21. Fin de carrera para el movimiento vertical. Este fin de carrera está ubicado en el brazo mecánico. 66 Figura 22. Luces de entrega exitosa. Las luces verdes se prenden ante la presencia del medicamento en la caja. 67 Figura 23. Luces de fallo de entrega. Las luces rojas se prenden cuando no se detecta el medicamento en el proceso de entrega. 68 Figura 24. Luces indicadoras traseras. Indican al operador donde colocar el medicamento seleccionado. 69 Figura 25. Ubicación del sensor de temperatura. Se encuentra en la parte superior trasera de la máquina. En esta imagen el sensor LM35 no está colocado. 70 Figura 26. Ubicación del ventilador en el prototipo. Se encuentra en la esquina superior derecha en la parte de atrás de la máquina. Para la versión final se planea colocarlo en la parte superior central. 71 ANEXO B: FIGURAS ADICIONALES Figura 27. Ubicación de pines para shield RAMPS 1.4. Tomado de “RAMPS 1.4”, s.f. 72 Figura 28a. Esquema del circuito impreso diseñado (Parte 1) 73 Figura 28b. Esquema del circuito impreso diseñado (Parte 2) 74 Figura 29. PCB diseñado 75 ANEXO C: CÓDIGO MICROCONTROLADOR #include <Servo.h> #include <PID_v1.h> #include <stdlib.h> //Motores Servo y Stepper*********************** #define pinEnableY 38 // Enable Motor Y (X en Shield) #define pinStepY 54 // Step Motor Y #define pinDirY 55 // Direccion Motor Y #define pinEnableX 62// Enable Motor X (Z en shield) #define pinStepX 46 // Step Motor X #define pinDirX 48 // Direccion Motor X #define pinServo1 11 //Control Servo #define pinServo2 6 //Control Servo #define pinVent 29 #define LM35 A13 #define pinFotoDiodo A15 #define pinLedVerde 23 #define pinLedRojo 25 #define pinLedAzul 27 #define pinLock 31 #define pinLedBlanco 33 boolean interrupcionX = false; boolean interrupcionY = false; const long numPasosX = 625 * 32; const long numPasosY = 559 * 32; //570 const long entregaX = 7 * numPasosX; const long entregaY = 4 * numPasosY; const long x0 = 260 * 32; const long y0 = 22 * 32; //22 Servo servo1; 76 int posServo1 = 0; Servo servo2; int posServo2 = 0; const int limiteFotDio = 750; int pinesLucesX[10] = {35, 37, 39, 41, 43, 45, 47, 32, 5, 4}; int pinesLucesY[10] = {1, 0, 63, 59, 40, 64, 42, 44, 65, 66}; //************************************************ //Declaracion Reset ************************************************** void(* resetFunc) (void) = 0; //Ventilador************************************** double Setpoint, warning, Input, Output; double Kp = 40, Ki = 1.5, Kd = 10; PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, REVERSE); int temperatura; void stepper_ini(int); void ventilador(); //*********************************************************************** //******************************** S E T U P **************************** //*********************************************************************** void setup() { // Comunicacion Serial************************************************ //Serial.begin(9600); Serial2.begin(9600); //9600 baudios Serial2.print("x01x00\n"); //arduino encendido 77 // Interrupciones****************************************************** attachInterrupt(5, inicioX, RISING); //Interrupcion externa pin 18 attachInterrupt(1, inicioY, RISING); //Interrupcion externa pin 3 attachInterrupt(4, magSec, CHANGE); //Interrupcion externa pin 19 // Luces y Seguros************************************************************ pinMode(pinLedVerde, OUTPUT); digitalWrite(pinLedVerde, LOW); pinMode(pinLedRojo, OUTPUT); digitalWrite(pinLedRojo, LOW); pinMode(pinLedAzul, OUTPUT); digitalWrite(pinLedAzul, LOW); pinMode(pinLedBlanco, OUTPUT); digitalWrite(pinLedBlanco, LOW); pinMode(pinLock, OUTPUT); digitalWrite(pinLock, LOW); // Pin Motores ******************************************************** pinMode( pinEnableX, OUTPUT ); pinMode( pinDirX , OUTPUT ); pinMode( pinStepX , OUTPUT ); pinMode( pinEnableY, OUTPUT ); pinMode( pinDirY , OUTPUT ); pinMode( pinStepY , OUTPUT ); //******* digitalWrite(pinLedBlanco, HIGH); movMot(HIGH, HIGH, 1000, 1000); digitalWrite(pinLedBlanco, LOW); // Servo ************************************************************** 78 servo1.attach(pinServo1); //ACTUADOR servo2.attach(pinServo2); //COMPUERTA servo1.write(145); servo2.write(160); delay(1000); servo2.write(66); delay(1000); //*********Ventilador ******************************************************** temperatura = (5.0 * analogRead(LM35) * 100) / 1024; Input = temperatura; Setpoint = 25; warning = Setpoint + 5; myPID.SetMode(AUTOMATIC); pinMode(pinVent, OUTPUT); pinMode(LM35, INPUT); // Encerado************************************************************ digitalWrite( pinDirX , LOW); // Direccion Motor X para Retroceder digitalWrite( pinDirY , LOW); // Direccion Motor Y para Retroceder //Retroceder 10000 Steps digitalWrite(pinLedBlanco, HIGH); movMot(LOW, LOW, 10000000, 10000000); digitalWrite(pinLedBlanco, LOW); Serial2.print("x02x00\n"); //arduino listo } 79 //*********************************************************************** //******************************** L O O P **************************** //*********************************************************************** void loop() { int senalSerial = 0; long i = 0; String senal; byte senalHex[2]; digitalWrite( pinStepX , LOW); // Inicializacion de Step X digitalWrite( pinStepY , LOW); // Inicializacion de Step Y //CONTROL TEMPERATURA ventilador(); //LEER SERIAL if (Serial2.available()) { senal = Serial2.readString(); codSenal(senal, &senalHex[0]); switch (senalHex[0]) { case 0x6: medirTemperatura(); break; case 0x7: resetFunc(); break; case 0x8: unlock(); break; case 0x9: controlLuces(true); break; case 0xA: controlLuces(false); break; 80 case 0XE: stepper_ini(senalHex[1]); break; case 0xF: stepper(senalHex[1]); break; case 0x10: regresar(); break; case 0x11: cargarMed(true, senalHex[1]); break; case 0x12: cargarMed(false, senalHex[1]); break; } } } // MOV INICIAL MOTORES**************************************************** void stepper_ini(byte movimiento) { long stepsX = 0; // Inicializacion de Pasos X long stepsY = 0; // Inicializacion de Pasos Y stepsX = floor(movimiento / 16) * numPasosX; stepsY = (movimiento % 16) * numPasosY; digitalWrite(pinLedBlanco, HIGH); long i = 0; Serial2.print("x03x00\n"); //OK movMot(HIGH, HIGH, stepsX + x0, stepsY + y0); //Mover servo1 81 servo1.write(25); delay(1000); servo1.write(145); delay(1000); boolean hayMed = sensor(); if (hayMed) //Comprobar si cayo medicina digitalWrite(pinLedVerde, HIGH); else { movMot(HIGH, LOW, 0, numPasosY / 13); servo1.write(25); delay(1000); servo1.write(145); delay(1000); hayMed = sensor(); if (hayMed) { digitalWrite(pinLedVerde, HIGH); movMot(HIGH, HIGH, 0, numPasosY / 13); } else { movMot(HIGH, HIGH, 0, 2 * numPasosY / 13); servo1.write(25); delay(1000); servo1.write(145); delay(1000); hayMed = sensor(); if (hayMed) { digitalWrite(pinLedVerde, HIGH); movMot(HIGH, LOW, 0, numPasosY / 13); } else { digitalWrite(pinLedRojo, HIGH); movMot(HIGH, LOW, 0, numPasosY / 13); } } } 82 //Definir pasos regreso long pasosEntX = stepsX - entregaX; long pasosEntY = stepsY - entregaY; boolean dirX, dirY; if (pasosEntY < 0) { dirY = HIGH; pasosEntY = -pasosEntY; } else dirY = LOW; if (pasosEntX < 0) { dirX = HIGH; pasosEntX = -pasosEntX; } else dirX = LOW; movMot(dirX, dirY, pasosEntX, pasosEntY); digitalWrite(pinLedBlanco, LOW); digitalWrite(pinLedVerde, LOW); digitalWrite(pinLedRojo, LOW); if (hayMed) { //Mover servo2 servo2.write(160); delay(1000); servo2.write(66); delay(1000); Serial2.print("x0Cx00\n"); //Recepcion exitosa } 83 else Serial2.print("x0Dx00\n"); //NO HAY MEDICAMENTO } // MOV NORMAL MOTORES************************************************ void stepper(byte movimiento) { long i = 0; long stepsX = 0; // Inicializacion de Pasos X long stepsY = 0; // Inicializacion de Pasos Y boolean dirX, dirY; stepsX = floor(movimiento / 16) * numPasosX; stepsY = (movimiento % 16) * numPasosY; //Definir pasos regreso long pasosPosX = stepsX - entregaX; long pasosPosY = stepsY - entregaY; if (pasosPosY < 0) { dirY = LOW; pasosPosY = -pasosPosY; } else dirY = HIGH; Serial2.print("x03x00\n"); //OK digitalWrite(pinLedBlanco, HIGH); if (pasosPosX < 0) { dirX = LOW; pasosPosX = -pasosPosX; } else dirX = HIGH; 84 movMot(dirX, dirY, pasosPosX, pasosPosY); //Mover servo1 servo1.write(25); delay(1000); servo1.write(145); delay(1000); boolean hayMed = sensor(); if (hayMed) //Comprobar si cayo medicina digitalWrite(pinLedVerde, HIGH); else { movMot(HIGH, LOW, 0, numPasosY / 13); servo1.write(25); delay(1000); servo1.write(145); delay(1000); hayMed = sensor(); if (hayMed) { digitalWrite(pinLedVerde, HIGH); movMot(HIGH, HIGH, 0, numPasosY / 13); } else { movMot(HIGH, HIGH, 0, 2 * numPasosY / 13); servo1.write(25); delay(1000); servo1.write(145); delay(1000); hayMed = sensor(); if (hayMed) { digitalWrite(pinLedVerde, HIGH); movMot(HIGH, LOW, 0, numPasosY / 13); } else { digitalWrite(pinLedRojo, HIGH); movMot(HIGH, LOW, 0, numPasosY / 13); 85 } } } //Definir pasos regreso long pasosEntX = stepsX - entregaX; long pasosEntY = stepsY - entregaY; if (pasosEntY < 0) { dirY = HIGH; pasosEntY = -pasosEntY; } else dirY = LOW; if (pasosEntX < 0) { dirX = HIGH; pasosEntX = -pasosEntX; } else dirX = LOW; movMot(dirX, dirY, pasosEntX, pasosEntY); digitalWrite(pinLedVerde, LOW); digitalWrite(pinLedRojo, LOW); digitalWrite(pinLedBlanco, LOW); if (hayMed) { //Mover servo2 servo2.write(160); delay(1000); servo2.write(66); delay(1000); Serial2.print("x0Cx00\n"); //Recepcion exitosa } else Serial2.print("x0Dx00\n"); //NO HAY MEDICAMENTO 86 } // REGRESAR***************************************************** void regresar() { long i = 0; Serial2.print("x03x00\n"); //OK //OK digitalWrite(pinLedBlanco, HIGH); movMot(LOW, LOW, 10000000, 10000000); digitalWrite(pinLedBlanco, LOW); } // VENTILADOR***************************************************** void ventilador() { Input = temperatura = (5.0 * analogRead(LM35) * 100) / 1024; if (temperatura > warning) { Serial2.print("x05x" + String(byte(temperatura), HEX) + "\n"); //warning temperatura } myPID.Compute(); analogWrite(pinVent, Output); } // SENSOR MEDICAMENTO********************************************* boolean sensor() { int fotodiodo = analogRead(pinFotoDiodo); if (fotodiodo >= limiteFotDio) { return true; } if (fotodiodo < limiteFotDio) { 87 return false; } } // ABRIR PUERTA TRASERA********************************************* void unlock() { digitalWrite(pinLock, HIGH); delay(1200); digitalWrite(pinLock, LOW); Serial2.print("x03x00\n"); //OK } // TEMPERATURA******************************************************** void medirTemperatura() { temperatura = (5.0 * analogRead(LM35) * 100) / 1024; Serial2.print("x04x" + String(byte(temperatura), HEX) + "\n"); //enviar temperatura } //CONTROL LUCES LATERALES ******************************************* void controlLuces(boolean estado) { if (estado) digitalWrite(pinLedAzul, HIGH); else digitalWrite(pinLedAzul, LOW); Serial2.print("x03x00\n"); //OK } //CONTROL LUCES POSTERIORES ******************************************* void cargarMed(boolean estado, int posicion) { int posX = floor(posicion / 16); int posY = posicion % 16; digitalWrite(pinesLucesX[posX], estado); digitalWrite(pinesLucesY[posY], estado); 88 Serial2.print("x03x00\n"); //OK } //CONVERSION STRING A HEX ******************************************* void codSenal(String senal, byte *senalHex) { String numero1 = ('0' + senal.substring(0, 3)); String numero2 = ('0' + senal.substring(3, 6)); const char* numero11 = numero1.c_str(); const char* numero21 = numero2.c_str(); senalHex[0] = strtol (numero11, NULL, 16); senalHex[1] = strtol (numero21, NULL, 16); } // INTERRUPCION X***************************************************** void inicioX() { interrupcionX = true; } // INTERRUPCION Y***************************************************** void inicioY() { interrupcionY = true; } // SEGURO MAGNETICO***************************************************** void magSec() { byte estadoSec = byte(digitalRead(19)); //pin seguro magnetico Serial2.print("x13x" + String(estadoSec) + "\n"); //CAMBIO SEGURO MAGNETICO } //MOVIMIENTO MOTORES*************************************************** void movMot(boolean dirX, boolean dirY, long stepsX, long stepsY) { int delayX = 0; int delayY = 0; 89 long i = 0; interrupcionX = false; interrupcionY = false; digitalWrite( pinDirX , dirX); digitalWrite( pinDirY , dirY); digitalWrite( pinStepX, LOW ); digitalWrite( pinStepY, LOW ); long limMay, limMen; boolean yMen = true, onX, onY; if ((stepsX / 2) > stepsY) { limMay = stepsX / 2; limMen = stepsY; yMen = true; } else { limMay = stepsY; limMen = stepsX / 2; yMen = false; } onX = HIGH; onY = HIGH; for ( i = 0; i < limMay; i++) { if (i < 5000) { digitalWrite( pinStepX, onX ); digitalWrite( pinStepY, onY); delayMicroseconds(50); digitalWrite( pinStepX, LOW ); delayMicroseconds(50); digitalWrite( pinStepX, onX ); digitalWrite( pinStepY, LOW ); delayMicroseconds(50); 90 digitalWrite( pinStepX, LOW ); delayMicroseconds(50); } else { digitalWrite( pinStepX, onX ); digitalWrite( pinStepY, onY ); delayMicroseconds(42); digitalWrite( pinStepX, LOW ); delayMicroseconds(42); digitalWrite( pinStepX, onX ); digitalWrite( pinStepY, LOW ); delayMicroseconds(42); digitalWrite( pinStepX, LOW ); delayMicroseconds(42); } if ((interrupcionX) || ((i >= limMen - 1) && !yMen) ) onX = LOW; if ((interrupcionY) || ((i >= limMen - 1) && yMen) ) onY = LOW; if (onX == LOW && onY == LOW) break; } }