huborarduino.com

La web de Hubor para la simulación de Arduino con Proteus

Banner Guia Programacion Arduino Con Proteus

[Proteus versión 8.1]

En esta lección vamos a recopilar muchos de los conocimientos adquiridos durante el curso hasta este momento para realizar un proyecto que se encarge de la gestión de un depósito de agua alimentado por una bomba. El siguiente esquema muestra un esquema de los equipos y nos servirá para fijar nuestros objetivos.

Lec19 001

Nuestro depósito de agua se rellena con ayuda de una bomba y se vacía a medida que se va utilizando el agua de su interior.

Para conocer con exactitud el nivel del agua contamos con un sensor analógico de nivel del agua. Dicho sensor nos devuelve una salida comprendida entre 0 y 5V correspondiéndose el valor de 0 con el depósito vacío y el valor de 5 con un nivel de agua de 5mts (la altura de nuestro depósito). Por supuesto, las lecturas intermedias son proporcionales a la altura del agua dentro de nuestro depósito.

Además disponemos de cuatro boyas digitales que nos indican cuando el agua alcanza cuatro niveles concretos dentro del depósito y que utilizaremos para el mando de la bomba. Dos marcas en la zona inferior que denominamos nivel extra-bajo y nivel bajo. Y dos marcas en la zona superior que llamamos nivel alto y nivel extra-alto. En control industrial es una buena práctica utilizar siempre para el mando sensores digitales y para la medida sensores analógicos, puesto que los segundos están mucho más expuestos a las interferencias y pueden generar arranques o paradas intempestivas. El hecho de que utilicemos dos sensores para la zona superior y dos para la zona inferior es únicamente para implementar un sistema redundante y aumentar la seguridad de que el depósito no se quede vacío (evitando que no arranque la bomba porque el detector de nivel bajo se estropee) ni desborde por la parte superior (descartando que la bomba no se detenga porque el sensor del nivel alto no funcione correctamente).

Para el gobierno y protección eléctrico de nuestra bomba de carga del depósito, hemos diseñado un circuito formado por un interruptor magnetotérmico de mando manual y un contactor gobernado eléctricamente. El primero se encarga de la vigilancia eléctrica del motor de la bomba protegiéndolo de posibles sobrecargas y cortocircuitos. El segundo nos permite su gobierno mediante la alimentación o corte de la corriente. El contactor se gobierna de forma eléctrica para permitir su control por parte de nuestro ARDUINO. El interruptor sólo se gobierna de forma manual porque es conveniente que si se produce un fallo por cortocircuito o sobrecarga, el operador realice una inspección de la instalación para encontrar el motivo del fallo.

Las órdenes de marcha y parada de la bomba se realizan de dos formas:

Automáticamente, según el estado de los niveles digitales. Cuando se deje de recibir la señal de nivel bajo se procederá a arrancar la bomba para llenar el depósito. Ya hemos explicado que, por si acaso fallará el sensor, se ha dispuesto un segundo denominado nivel extra-bajo con la misma función. Cuando se reciba la señal de nivel alto se detendrá la bomba. Igual que en el caso de los niveles inferiores, se ha dispuesto un segundo nivel extra-alto con la misma función como sistema redundante de seguridad.

De forma manual, cuando se utiliza el pulsador de marcha del panel de mando (y siempre que no estén activos los niveles alto o extra-alto porque de otra forma, el agua desbordaría por la zona superior del depósito) se arrancará la bomba. Si la seta de emergencia de parada se pulsa, la bomba se detendrá en todo momento y la bomba no se arrancará aunque se pierda la señal de los niveles bajos.

Antes de proceder a arrancar la bomba, se genera un aviso (acústico o luminoso) de pre-arranque con objeto de prevenir de la maniobra a cualquier persona que pudiera estar trabajando en el depósito. Realmente en este caso es un poco exagerado generar un aviso de pre-arranque, puesto que la ley sólo obliga a hacerlo en los casos de máquinas móviles, pero nos resultará interesante por motivos pedagógicos.

En el panel de señalización se mostrará con ayuda de pilotos luminosos la siguiente información: fallo por cortocircuito en el interruptor, fallo por sobrecarga en el interruptor, estado del interruptor (cerrado o abierto) y estado del contactor (cerrado, abierto o intermitencia cuando se produjo un fallo de confirmación). Cuando el interruptor y el contactor estén cerrados, la bomba estará en marcha.

Por último, utilizaremos el terminal para enviar cada cinco segundos la información completa del estado de nuestros equipos. De esta forma podemos disponer a distancia de todos los datos para conocer en todo momento cómo se encuentra el sistema.

Para gestionar todo este conjunto con nuestro Arduino, necesitamos utilizar una entrada analógica (el medidor analógico de nivel de agua en el depósito), seis salidas digitales (una para el contactor, otra para el aviso de pre-arranque y cuatro para los indicadores luminosos del panel de señalización) y diez entradas digitales (sobrecarga, cortocircuito, estado interruptor, estado contactor, marcha, parada, nivel extra-alto, nivel alto, nivel bajo y nivel extra-bajo). Si alguien las ha contado, observará que nuestro Arduino no tiene suficientes pines digitales, pero encontraremos la forma de obviar esta dificultad.

En la imagen siguiente mostramos todo el conjunto.

Lec19 002

Los pines IO0 e IO1 los utilizamos para el terminal de datos que vamos a utilizar para enviar la información de monitorización del conjunto al exterior.

Lec19 007

Los pines IO2 a IO7 los utilizamos como entradas digitales. Los tres primeros para recibir la información del interruptor (fallo por sobrecarga, fallo por cortocircuito y estado). El cuarto para la información del estado del contactor. El quinto y sexto para el panel de mando (pulsador de marcha y seta de parada). 

Lec19 003

Los pines IO12 e IO13 como salidas digitales. Les conectaremos a dos relés con los que gobernaremos el contactor del motor de la bomba y la señal de pre-aviso. Para ayudar visualmente durante la simulación, hemos colocado una lámpara conectada al contactor normalmente abierto del relé que nos muestra la orden de cierre del contactor y del dispositivo de pre-aviso.

Lec19 004

Los pines IO8 a IO11 harán las funciones de salidas digitales para los pilotos luminosos del panel de señalización. Así podemos indicar cuándo se produce un fallo por cortocircuito, un fallo por sobrecarga y el estado del interruptor y del contactor. Este último lo utilizamos para mostrar tres estados: cuando el contactor está cerrado el piloto está encendido, cuando está abierto el piloto está apagado y cuando se ha producido un fallo de confirmación el piloto parpadeará.

Lec19 005 

Este es un buen momento para explicar que entendemos por fallo de confirmación del contactor y porque razón lo utilizamos.

Los contactores suelen venir provistos de un contacto auxiliar que sirve para monitorizar su estado. Este contacto es el que utilizamos para indicar si el contactor está cerrado o abierto. Seguimos aquí un procedimiento diferente al que siguen otros ingenieros de procesos que utilizan la salida de mando del Arduino como indicador del estado del contactor. Pero no siempre la activación de nuestra orden de mando significa que el contactor haya cerrado realmente. Un fallo en el contactor o en el cableado puede significar que estemos generando la orden y no se produzca el efecto deseado. Otro fallo puede provocar que el contactor siga cerrado (porque se han pegado sus contactos, por ejemplo) aunque la orden no se esté generando. Por esta razón es una buena práctica que la información de los estados de los dispositivos del proyecto se facilite siempre con datos procedentes de sensores y no suponer que una salida de nuestro Arduino suscita automáticamente el cambio del dispositivo gobernado.

Ahora ya se entiende mejor porque surge la necesdidad de utilizar un fallo de confirmación. Se produce este tipo de fallo cuando generamos la orden de cierre y no se recibe la señal de que el contactor está cerrado durante un segundo.

Por último, los cinco primeros pines analógicos (AD0-AD4) los utilizaremos para conocer el nivel de llenado del depósito. Los cuatro primeros para señalizar el estado de las boyas de nivel y el quinto para el indicador analógico de nivel.

Lec19 006 

En condiciones normales, deberíamos utilizar entradas digitales para las boyas de nivel, puesto que son elementos digitales. Pero como nuestro ARDUINO no dispone de pines digitales suficientes, utilizaremos para este fin los pines analógicos, aunque sólo indicaremos dos estados (cuando tengamos una medida de menos 2,5V entenderemos que la boya indica que no se alcanzó el nivel en ese punto y una medida superior a 2,5V que sí).

Ya podemos analizar el software que se encargará de controlar todo nuestro sistema. Como en ocasiones anteriores vamos a verlo por trozos para facilitar su comprensión. Algunas de las funciones que utilizamos ya se vieron en lecciones anteriores por lo que obviaremos su explicación.

Lec19 008

Lo primero que hacemos es llevar a cabo una serie de definiciones. Los tres operadores lógicos y cuatro valores que nos ayudarán a parametrizar nuestra aplicación de forma sencilla sin tener que navegar por el código. El primero es el tiempo de parpadeo que utilizaremos para gobernar un piloto informativo (encendido o apagado cada medio segundo). El segundo el tiempo que pasará entre cada refresco de la información que mandaremos al terminal (5 segundos). El tercero el tiempo del aviso de pre-arranque (3 segundos). Y el cuarto y último, el factor de conversion de la medida analógica.

Como nuestro Arduino tiene una entrada analógica que puede leer valores entre 0 y 1023 y el sensor de medida del nivel de agua en el depósito nos devuelve 0V cuando el nivel es 0 metros y 5V cuando el nivel es 5 metros, el factor de conversión se obtiene con una sencilla regla de tres.

Si 1023 unidades son 5 metros, cada unidad serán 5 / 1023, es decir que el factor de conversión es 0.004887.

El lector podrá adecuar estos valores a las necesidades reales de su proyecto de forma sencilla y cómoda.

Lec19 009

Luego definimos una estructura a la que le daremos el nombre de MotorDatosControl. Las estructuras en el lenguaje C se utilizan para agrupar variables que se usan para una misma finalidad y que se pueden pasar entre las funciones con un sólo paso. En este caso la estructura se utilizará para el control del motor. Más adelante veremos su uso.

Lec19 010

Luego definimos las variables que vamos a utilizar en el control de nuestro proceso. Llamamos especialmente la atención sobre la variable m1 que utilizamos para controlar el motor de la bomba y que es del tipo de la estructura que definimos con anterioridad.

Lec19 011

A continuación figura la función setup() con la configuración. En este caso definimos qué pines se utilizarán como entradas y cuáles de salida. Además fijamos la velocidad del terminal en 9600 baudios.

Lec19 012

La función loop() con el código del bucle de control repetitivo lo hemos dividido en cuatro partes. La primera se encarga de leer todas las entradas y almacenar en variables su estado. En primer lugar, las seis variables digitales. Luego las cuatro variables analógicas que utilizaremos como lecturas digitales para mostrar el estado de las boyas de nivel y, por último, la lectura del sensor de nivel del depósito. Destacar el uso de las funciones if() para recibir una señal digital a través de una entrada analógica.

Lec19 013

La segunda parte contiene la lógica de gobierno del motor de la bomba.

La línea 83 contiene las condiciones de arranque de la bomba (bien una orden manual o que no existe señales en las boyas Nivel bajo o Nivel extra-bajo).

La línea 84 las condiciones que generarán la parada de la bomba (seta de parada, fallos eléctricos, interruptor abierto o niveles alto y extra-alto).

Las líneas 85 y 86 generan el aviso de prearranque con un pulso de duración 5 segundos (recordar las definiciones) desde el momento que se genera la orden de arranque hasta que el motor se pone en marcha o se produce una orden de parada.

La línea 87 genera el parpadeo cuando se produce un fallo de confirmación para su utilización con el piloto de señalización del panel de estados.

Las líneas 88 a 91 se utilizan para llamar a la función ctrlMotor (más adelante la veremos cuando tratemos de las funciones auxiliares) con ayuda de la estructura m1 del tipo MotorDatosControl. La función ctrlMotor() se encarga de todo y nos facilita nuestro trabajo. El uso de la estructura nos permite pasar toda la información junta y no tener que ir especificando todos los datos cada vez. Además, si tuvieramos que controlar dos motores, aislarían totalmente la información de uno y otro motor, permitiéndonos utilizar el mismo código en la función auxiliar.

Lec19 014

La tercera parte se usa para activar las salidas digitales cuando las condiciones así lo determinan. Las líneas 93 a 95 gobiernan los pilotos que indican los fallos y el estado del interruptor. Las línes 96 y 97 los relés de mando. Y la línea 98 el piloto que indica el estado del contactor que será fijo o parpadeante según el estado del contactor o la variable que utilizamos para indicar un fallo de confirmación.

Lec19 015

La cuarta parte envía la información por el puerto serie al terminal. Lo hace cada 5 segundos (definición de tiempoRefrescoMonitor) y, como vimos en lecciones anteriores, no utiliza la función delay() para no interrumpir el control de los dispositivos gobernados durante la espera.

Las funciones auxiliares que se utilizan en el programa son las siguientes:

Lec19 016

Las funciones iniTemp() y chkTemp() ya las vimos en lecciones anteriores y nos ayudan a implementar múltiples funciones temporales utilizando un único reloj maestro (timer) del microprocesador.

Lec19 017

La función báscula() implementa una báscula de tipo flip-flop con reset dominante que genera una salida desde que se produce la señal set hasta que se se produce la señal reset. En caso de que se reciban las dos señales al mismo tiempo, se impone el reset. Con ella se lograr implementar la utilización de 'memorias' (retención de un dato durante un determinado espacio de tiempo) en nuestro código. En nuestro caso la utilizamos para memorizar la pulsación sobre la marcha hasta que el aviso de prearranque concluye o se produce una condición de parada.

Lec19 018

La función pulso() genera una señal de una duración determinada mientras se produce una condición. Con ella conseguimos generar el aviso de pre-arranque de la duración deseada.

Lec19 019

La función parpadeo() nos ayuda a generar la intermitencia en los indicadores de salida. Genera un parpadeo de frecuencia constante mientras esté activa la señal de lanzamiento. Así, podemos generar una intermitencia en el piloto que muestra el estado del contactor cuando se ha producido un fallo de confirmación.

Lec19 020

Lec19 021

La función ctrlMotor() realiza todas las tareas de gobierno de un motor. Transforma la orden de arranque en un pulso, limpia el fallo de confirmación con cada nueva orden de arranque o parada, genera el fallo de confirmación cuando no llega la confirmación del contactor en el tiempo prefijado y genera la salida de control del motor.

Ya está todo listo para simular nuestro proyecto y comprobar que todo funciona. No es una simulación sencilla y daremos unas pautas para llevarla a cabo.

Lec19 022

Lo primero es asegurar todas las condiciones de inicio. Nos aseguraremos que no hay fallo de sobrecarga, ni de cortocircuito. Que el interruptor está cerrado y el contactor abierto. Que la seta de parada está cerrada (los dispositivos de parada siempre son normalmente cerrados por razones de seguridad). Las boyas de nivel estarán cerradas para los niveles EB y B y abiertas los niveles A y EA. El nivel del depósito lo situaremos a la mitad con ayuda del potenciómetro. Las dos lámparas que simulan el contactor y la señal de preaviso tienen que estar apagadas y el único piloto encendido será el que muestra el estado del interruptor (cerrado).

Ya podemos arrancar la bomba con el pulsador de marcha. Si lo hacemo se generará un aviso de prearranque durante 3 segundos y luego se generará la orden de cierre del contactor. Al segundo el contactor se abrirá y el piloto del estado del contactor parpadeará (se ha producido un fallo de confirmación).

Volvamos a generar la orden de marcha. Cuando observemos que se genera la salida de cierre del contactor, cerraremos el interruptor digital CONTACTOR. Ahora la bomba funciona normalemente.

Cuando la queramos parar, actuaremos sobre la PARADA abriendo el contacto. El relé de gobierno del contactor se abrirá (tenemos que simular manualmente que el contactor se abre, actuando sobre la señal del contactor).

También podemos probar a arrancar de forma automática abriendo las señales de las boyas de nivel B o EB. Y a parar de forma automática con las boyas de nivel A y EA. No se olvide de cerrar y abrir la señal del CONTACTOR cada vez.

También podemos simular el comportamiento del sistema cuando se produce un fallo o se abre el interruptor.

El sensor analógico nos indica (recordar que sólo indica y no gobierna) el nivel de agua del depósito. El potenciómetro nos ayuda a simularlo.

El monitor nos muestra toda la información del sistema. Si se modifica su altura se puede lograr que la información de cada refresco se muestre en una sóla pantalla.

En la siguiente pantalla se muestra la simulación en marcha con la bomba arrancada.

Lec19 023

Cuando todo funcione a nuestro gusto, ya podemos implementar la utilización de nuestro ARDUINO para el control del llenado de un depósito de agua por medio de una bomba. Esperamos que os haya gustado la lección de hoy.

 

Comparte este artículo en redes sociales

Submit to FacebookSubmit to Google PlusSubmit to TwitterSubmit to LinkedIn


Esta página es propiedad de Hubor.

2014.

¡Atención! Este sitio usa cookies y tecnologías similares. Si no cambia la configuración de su navegador, usted acepta su uso. Ampliar información