TALLER DE
DOMÓTICA CON
ARDUINO
SISTEMAS REACTIVOS Y ESCENARIOS DE
CONTROL
JOSÉ LUIS POZA Y SERGIO SÁEZ
Taller de Domótica
con Arduino
José Luis Poza y Sergio Sáez
Julio 2015
Licencia
© Copyright 2015, José Luis Poza y Sergio Sáez
Reconocimiento – NoComercial – SinObraDerivada (by-nc-nd).
Índice de contenidos
Parte I Diseño de sistemas reactivos . . . 7
Capítulo 1 Un sistema reactivo sencillo . . . 9
1.1 Objetivos. . . 9
1.2 Lista de Material . . . 9
1.3 Etapas del desarrollo . . . 10
1.3.1 Ejercicio básico. . . 10
1.3.2 Control de led con sistema de apagado . . . 11
1.3.3 Control de led con acumulación . . . 12
Capítulo 2 Diseño de un sistema reactivo . . . 13
2.1 Objetivos. . . 13
2.1.1 Diseño del sistema reactivo de control de ráfagas . . . 13
2.1.2 Implementación del sistema reactivo. . . 15
Parte II Escenarios de control domótico . . . 19
Capítulo 3 Control de un sistema de motorización de persianas . . . 21
3.1 Objetivos. . . 21
3.2 Lista de Material . . . 21
3.3 Etapas del desarrollo . . . 22
3.3.1 Control manual. . . 22
3.3.2 Sensorización de la posición de la persiana . . . 24
3.3.3 Sistema de comunicaciones de control. . . 25
3.3.4 Control remoto . . . 26
3.3.5 Control inteligente . . . 27
Capítulo 4 Control de un sistema de motorización de puertas. . . 29
4.1 Objetivos. . . 29
4.2 Lista de Material . . . 29
4.3 Etapas del desarrollo . . . 30
4.3.1 Control manual. . . 30
4.3.2 Sensorización de la posición de la puerta . . . 32
4.3.4 Control remoto . . . 34
4.3.5 Control inteligente . . . 35
Capítulo 5 Control de un sistema de iluminación . . . 37
5.1 Objetivos. . . 37
5.2 Lista de Material . . . 37
5.3 Etapas del desarrollo . . . 38
5.3.1 Control manual. . . 38
5.3.2 Control conmutado . . . 40
5.3.3 Sensorización del estado del sistema de iluminación . . . 40
5.3.4 Sistema de iluminación regulada. . . 41
5.3.5 Sistema de comunicaciones de control. . . 42
5.3.6 Control remoto . . . 43
Parte I
Diseño de sistemas
reactivos
Capítulo 1
Un sistema reactivo
sencillo
Este capítulo describe un sistema reactivo sencillo, para implementar con un Arduino, pero lo suficientemente complejo como para valorar las bondades del diseño e implementación de sis-temas reactivos utilizando patrones.
1.1 Objetivos
Los objetivos que se pretenden conseguir con este ejercicio son:
• Plantear un ejemplo sencillo que contenga los elementos básicos de un sistema reactivo. • Valorar el uso de patrones de diseño para implementar sistema reactivos.
1.2 Lista de Material
El material que se va a utilizar durante la realización de este ejercicio es el siguiente: • Placa Arduino.
• 2 pulsadores.
1.3 Etapas del desarrollo
El desarrollo del presente ejercicio se va a dividir en diversas etapas. En cada etapa se irán aña-diendo nuevas funcionalidades al ejercicio.
1.3.1 Ejercicio básico
El montaje que se pretende realizar es un sistema de control de un led. El sistema, trás la llegada de un cierto evento, deberá generar una ráfaga intermitente en el led indicador. La ráfaga con-sistirá en tres pulsos del led encidido, con un ciclo de trabajo de un segundo, es decir, un segundo encendido, un segundo apagado, etc. Para generar el evento de activación de la ráfaga se utilzia-rá un pulsador.
Resultado esperado
Al finalizar este ejercicio el sistema deberá emitir, trás la recepción de la señal de activación, una ráfaga de 3 pulsos sobre el LED, con una duración de un segundo en cada estado.
Figura 1.1 Ráfaga de encendido-apagado del led
Para llevar a cabo este ejercicio se conectará un pulsador a una entrada digital del Arduino. De-nominaremosENCENDIDOENCENDIDOal pulsador conectado en la entrada digital yACTIVARACTIVARa la entrada
a la que se encuentra conectado dicho pulsador. Dicha entrada deberá ofrecer un valorHIGHHIGH
cuando el pulsadorENCENDIDOENCENDIDOesté pulsado. Para que el valor de la entrada seaLOWLOWcuando el
pulsador esté libre se deberá utilizar una resistencia de pull-down.
Figura 1.2 Resistencia de pull-down
El evento que debe activar el comienzo de la ráfaga será un flanco de subida en la entradaACTI- ACTI-VARVAR, es decir, cuando la entradaACTIVARACTIVARpase deLOWLOWaHIGHHIGH. Sólo ese caso se deberá comenzar la
ráfaga de iluminación del led (H-L-H-L-H-LH-L-H-L-H-L).
El sisteam sólo deberá emitir la ráfaga cuando la entradaACTIVARACTIVARpase deLOWLOWa HIGH
HIGH. Para comprobar el correcto funcionamiento se deberá mantener presionado
el pulsadorENCENDIDOENCENDIDOdurante toda la ráfaga (6 segundos) y comprobar que la
rá-faga no vuelve a comenzar hasta que no se suelta el pulsador y se vuelve a presionar.
Probad que si activamos el pulsadorENCENDIDOENCENDIDOdurante la ejecución de una ráfaga el sistema
no altera su comportamiento.
Comprobaremos que el comportamiento del sistema se corresponde con el
resulta-do esperaresulta-do.
1.3.2 Control de led con sistema de apagado
Ahora pretendemos añadir un segundo evento que permita interrumpir la ráfaga. Para generar el evento de interrupción de la ráfaga se utilizará un segundo pulsador.
Resultado esperado
Al finalizar este ejercicio el sistema deberá permitir, trás la recepción de la señal de interrupción, parar la ráfaga de iluminación en curso.
Para llevar a cabo este ejercicio se conectará un segundo pulsador a una entrada digital del Ar-duino. DenominaremosAPAGADOAPAGADOal pulsador conectado en la entrada digital eINTERRUMPIRINTERRUMPIRa
la entrada a la que se encuentra conectado dicho pulsador. Dicha entrada deberá ofrecer un va-lorHIGHHIGHcuando el pulsadorAPAGADOAPAGADOesté pulsado. Para que el valor de la entrada seaLOWLOW
cuan-do el pulsacuan-dor esté libre se deberá utilizar una resistencia de pull-cuan-down.
El evento que debe activar la interrupción de la ráfaga podrá ser tanto un flanco de subida en la señalAPAGADOAPAGADO, como un nivel alto en la misma.
Cuando se reciba la señal de interrupción, la ráfaga se deberá interrupir inmedia-tamente, incluso si se recibe la señal de interrupción mientras el led se encuentra encendido. En ese caso, el led deberá apagarse inmediatamente.
Probad que si activamos el pulsadorAPAGADOAPAGADOmientras el led está encendido, la ráfaga se detiene
inmediatamente. Comprad que esto sucede así incluso aunque la pulsación sea corta.
Comprobaremos que el comportamiento del sistema se corresponde con el
resulta-do esperaresulta-do.
1.3.3 Control de led con acumulación
Pretendemos añadir en esta ocasión un sistema de acumulación, de forma que cada vez que se presione el pulsadorENCENDIDOENCENDIDOdurante la ejecución de una ráfaga, el sistema hará un ciclo de
tres encendidos adicionales. Se deberá acumular una secuencia de tres encendidos adicionales cada vez que se presione el pulsador de activación. Por ejemplo, si se pulsa una única vez, la se-cuencia será de tres encendidos. Si se pulsa dos veces consecutivas, la sese-cuencia será de seis en-cendidos, etc. El número de veces que se debe encender el led no debe estar limitado.
En caso, de que se active el pulsador deAPAGADOAPAGADO, se interrumpirá la secuencia en curso y el led
de quedará inactivo hasta que se vuelva a presionar el pulsador deENCENDIDOENCENDIDO.
Capítulo 2
Diseño de un sistema
reactivo
Este capítulo describe como se puede diseñar e implementar un sistema reactivo sencillo, sobre la plataforma Arduino, utilizando patrones.
2.1 Objetivos
Los objetivos que se pretenden conseguir con este ejercicio son: • Conocer la estructura de un sistema reactivo.
• Utilizar un patrón de diseño para implementar un sistema reactivo.
2.1.1 Diseño del sistema reactivo de control de ráfagas
El resumen del problema planteado en el capítulo anterior podría ser el siguiente:
• El sistema debe emitir una ráfaga de tres destellos, con una duración de un segundo cada destello, cada vez que se presione el pulsadorENCENDIDO.
• Si se presiona el pulsadorENCENDIDOdurante una ráfaga activa, el sistema emitira tres
destellos adicionales al final de la misma. El número de destellos adicionales es acumulativo.
• Si durante una ráfaga se presiona el pulsadorAPAGADOla ráfaga se detendrá
Para resolver el problema vamos a plantear su implementación como un sistema reactivo y, por lo tanto, modelarlo con una máquina de estados finitos de UML.
El sistema tendrá dos estados principales:
EnEspera EnEspera
Representa al sistema cuando está a la espera de un evento y con el led apagado.
Rafaga Rafaga
El sistema está con una ráfaga activa.
El estadoRafagaRafagatiene a su vez dos subestados que indican si el led estáEncendidoEncendidooApagadoApagado.
Estos estados se pueden observar en la siguiente figura. Como era de esperar, al entrar en el esta-doEncendidoEncendidose ejecuta la ordenencenderLed()encenderLed()y al entrar en el estadoApagadoApagadose ejecuta la
ordenapagarLed()apagarLed(). Las transiciones entre ambos estados están temporizadas con11 segsegcon lo
que se construye la ráfaga sobre el led. La ráfaga termina cuando lacuentacuentallega a 0 o se activa
el eventopararparar. En ambos casos se cambia al estadoEnEsperaEnEspera. Lacuentacuentase pone a 0 cuando
entramos en el estadoEnEsperaEnEsperay se incrementa en 3 al entrar en el estadoRafagaRafagao cuando
dentro del estadoRafagaRafagase genera un nuevo eventoactivaractivar.
Figura 2.1 Máquina de estados del sistema reactivo
Dado que la definición de esta máquina de estados parece cumplir con las especificaciones del sistema reactivo, vamos a proceder a su implementación.
2.1.2 Implementación del sistema reactivo
A continuación vamos a definir cada unos de los elementos que nos permitirán implementar el sistema reactivo.
2.1.2.1 Eventos del sistema
El sistema reactivo sólo utiliza dos eventos posibles,ACTIVARACTIVARyPARARPARAR, y los vamos a definir
co-mo un enumerado. Se añade el evento especialNINGUNONINGUNOpara poder indicar que no se ha
produ-cido ningún evento externo.
typedeftypedef enumenum { EV_NINGUNO, EV_ACTIVAR, EV_PARAR,
EV_EVENTO_TEMPORAL } evento_t;
Se ha añadido un eventoEVENTO_TEMPORALEVENTO_TEMPORALque se asociará con la expiración de los eventos de
tipoafter Xafter X.
2.1.2.2 Estados del sistema
Los estados estables del sistema son los siguientes:
typedeftypedef enumenum { EST_INICIAL, EST_EN_ESPERA,
EST_RAFAGA_ENCENDIDO, EST_RAFAGA_APAGADO } estado_t;
Nótese que el estadoEST_RAFAGAEST_RAFAGAno está definido ya que no se puede estar en dicho estado sin
estar en el estado ENCENDIDOENCENDIDOoAPAGADOAPAGADO. Igualmente, el estadoINICIALINICIALsólo es un estado de
transición que nos permitirá inicializar el sistema. Podría implementarse dentro de la función
setup()setup().
2.1.2.3 Bucle principal del sistema reactivo
El bucle principal del sistema reactivo sería el siguiente:
estado_t estado= EST_INICIAL;
/* Estado interno del sistema */
unsignedunsigned intint cuenta= 0;
unsignedunsigned longlong comienza_after= 0; voidvoid setup() {
nivel_activar= LOW;
nivel_parar= LOW; }
void
void loop () {
evento_t evento= EV_NINGUNO;
/* Comprobar eventos */
entrada_activar= leer_pulsador_encendido(); entrada_parar= leer_pulsador_apagado(); if
if (nivel_activar == LOW && entrada_activar == HIGH) { evento= EV_ACTIVAR;
} elseelse ifif (nivel_parar == LOW && entrada_parar == HIGH) { evento= EV_PARAR;
} elseelse { if
if (estado == EST_RAFAGA_ENCENDIDO || estado == EST_RAFAGA_APAGADO) { if if (millis() - comienza_after >= 1000) { evento= EV_EVENTO_TEMPORAL; } /* endif */ } /* endif */ } /* endif */
/* Establece el nuevo nivel de las entradas activadas por flanco */
nivel_activar= entrada_activar; nivel_activar= entrada_parar;
/* Procesar los eventos */
switch switch (estado) { case case EST_INICIAL: if if (evento == EV_NINGUNO) {
apagar_led(); /* entry EN_ESPERA */
cuenta= 0; /* entry EN_ESPERA */
} /* endif */ break break; case case EST_EN_ESPERA: if if (evento == EV_ACTIVAR) {
cuenta += 3; /* entry RAFAGA */
encender_led(); /* entry ENCENDIDO */
/* Comienza la cuenta del evento after 1s */
comienza_after= millis(); /* Nuevo estado */ estado= EST_RAFAGA_ENCENDIDO; } /* endif */ break break; case case EST_RAFAGA_ENCENDIDO: switch switch (evento) {
casecase EV_ACTIVAR: /* Estado RAFAGA */
cuenta += 3; breakbreak;
casecase EV_PARAR:
apagar_led(); /* entry EN_ESPERA */
cuenta= 0; /* Ignoro la acción cuenta -- */ /* Nuevo estado */
estado= EST_EN_ESPERA; breakbreak;
casecase EV_EVENTO_TEMPORAL:
cuenta --; /* exit ENCENDIDO */
apagar_led(); /* entry APAGADO */
/* Comienza la cuenta del evento after 1s */
comienza_after= millis(); /* Nuevo estado */ estado= EST_RAFAGA_APAGADO; breakbreak; } /* endswitch */ breakbreak;
casecase EST_RAFAGA_APAGADO: switchswitch (evento) {
casecase EV_NINGUNO: /* Evento COMPLETION */
ifif (cuenta == 0) {
apagar_led(); /* No hace falta */
cuenta= 0; /* entry EN_ESPERA */ /* Nuevo estado */
estado= EST_EN_ESPERA; } /* endif */
breakbreak;
casecase EV_ACTIVAR: /* Estado RAFAGA */
cuenta += 3; breakbreak;
casecase EV_PARAR:
apagar_led(); /* No hace falta */
cuenta= 0; /* entry EN_ESPERA */ /* Nuevo estado */
estado= EST_EN_ESPERA; breakbreak;
casecase EV_EVENTO_TEMPORAL:
encender_led(); /* entry ENCENDIDO */
/* Comienza la cuenta del evento after 1s */
comienza_after= millis();
/* Nuevo estado */
estado= EST_RAFAGA_ENCENDIDO; breakbreak;
} /* endswitch */
break break; }
}
Parte II
Escenarios de control
domótico
Capítulo 3
Control de un sistema de
motorización de
persianas
Este documento describe un escenario en el que se va a utilizar una placa Arduino y diversos sensores y actuadores para realizar la motorización y control automático de un sistema de per-sianas.
3.1 Objetivos
Los objetivos que se pretenden conseguir con este escenario de domótica son:
• Aprender a resolver un escenario de control complejo mediante un proceso de desarrollo incremental.
• Conocer y utilizar los sensores sin contacto basados en efecto Hall para la detección de finales de carrera.
• Comprender y aplicar la estructura de un sistema reactivo al control automático de un sistema de motorización de persianas.
3.2 Lista de Material
El material que se va a utilizar durante la realización de este escenario es el siguiente: • Maqueta de una persiana con un motor de continua de 12v y 60 RPM.
• Relés para el control automático del motor. • 2 pulsadores.
• Fuente de alimentación de 12v para alimentar los motores.
• Sensores de efecto Hall e interruptores magnéticos para detectar los finales de carrera. • Imanes para indicar los finales de carrera.
• Sistema de control remoto: infrarrojos, bluetooth o placa ethernet. • Otros sensores opcionales: sensor de luz, de temperatura, etc.
3.3 Etapas del desarrollo
El desarrollo del presente escenario se va a dividir en diversas etapas. En cada etapa se irán aña-diendo nuevas funcionalidades al sistema de control o se irán haciendo mejoras al código de control utilizado dentro del Arduino.
3.3.1 Control manual
Como primer paso para el control del sistema de persianas se propone implementar el movi-miento del sistema de persianas mediante dos pulsadores. Para ello se utilizará un Arduino, dos pulsadores y las correspondientes resistencias de pull-down.
Resultado esperado
Al finalizar este ejercicio el sistema deberá permitir subir o bajar la persiana mien-tras el correspondiente pulsador de subir o de bajar este pulsado. Si no hay ningún pulsador activado la persiana deberá permanecer inmóvil.
Para llevar a cabo este ejercicio se conectarán los dos pulsadores a dos entradas digitales del Ar-duino. DenominaremosARRIBAARRIBAyABAJOABAJOa cada uno de los pulsadores y a las entradas
utiliza-das por dichos pulsadoresSUBIRSUBIRyBAJARBAJAR, respectivamente. Dichas entradas deberán ofrecer un
valorHIGHHIGHcuando el pulsador correspondiente esté pulsado. Para que el valor de la entrada sea LOW
LOWcuando el pulsador esté libre se deberá utilizar una resistencia de pull-down para cada
pulsa-dor.
Figura 3.1 Resistencia de pull-down
Una vez realizado este montaje, vamos a realizar un programa que lea las entradasSUBIRSUBIRyBA- BA-JARJARde los pulsadores y active dos salidas digitales del Arduino, que denominaremosSUBIENDOSUBIENDO
yBAJANDOBAJANDO. Una vez realizado el programa conectaremos las salidasSUBIENDOSUBIENDOyBAJANDOBAJANDOa las
entradasCH1CH1yCH2CH2de la placa de relés, respectivamente. Una vez alimentada la placa de relés
adecuadamente, comprobaremos el correcto funcionamiento del montaje, es decir, que cuando activamos el pulsadorARRIBAARRIBAse active la entradaCH1CH1de la placa de relés (señalizado en la placa
de relés mediante el correspondiente led) y análogamente para el pulsadorABAJOABAJOy la entrada CH2CH2.
Comprobado el correcto funcionamiento del montaje de control manual, pasaremos a realizar las conexiones finales. Para ello conectaremos la alimentación de los motores a la placa de relés uniendo el positivo de la fuente de alimentación a las dos entradasNCNCde los relés y el negativo a
las dos entradasNONO. Finalmente, conectaremos las entradas del motor a cada una de las entradas COMCOMde los relés, no sin antes comprobar qué polaridad de la alimentación del motor se
corres-ponde con cada sentido de giro y, por lo tanto, con una dirección de la persiana. En la siguiente figura se muestra un esquema de las conexiones de un relé.
Figura 3.2 Conexiones del relé
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremoscontrol-manualcontrol-manualal código de control
desarrollado en este apartado.
3.3.2 Sensorización de la posición de la persiana
En este paso se van a añadir al sistema de motorización de persianas los oportunos sensores para la detección de los finales de carrera. Ello nos permitirá poder enviarle al sistema órdenes para que suba o baje completamente la persiana.
Resultado esperado
Al finalizar este ejercicio el sistema deberá permitir subir y bajar la persiana me-diante una única pulsación en el botón correspondiente. La persiana se deberá de-tener automáticamente al final del recorrido. Una vez alcanzado cualquiera de los finales de carrera el sistema ignorará cualquier orden del usuario para sobrepasar dichos límites. Para realizar la detección de los finales de carrera se ha provisto al sistema de un imán colocado en la parte baja de la persiana. De esta forma, se podrá detectar el paso de dicho imán mediante sensores de efecto Hall colocados en las posiciones adecuadas del recorrido.
En el ejercicio se van a utilizar sensores de efecto Hall y/o interruptores magnéti-cos. Ambos tienen una salida digital que se activa con la presencia de un campo magnético lo suficientemente fuerte. En adelante utilizaremos el termino sensor
magnético para referirnos a cualquier sensor de este tipo que sea capaz de detectar la
presen-cia de un campo magnético.
Antes de realizar el montaje de los sensores magnéticos sobre el sistema de persia-nas se sugiere la implementación de un pequeño programa de prueba que lea la in-formación de los sensores y la muestre por la consola serie.
A continuación colocaremos los sensores magnéticos en las posiciones oportunas sobre la es-tructura del escenario. Una vez colocados los sensores conectaremos la salida digital de cada sen-sor a sendas entradas digitales del Arduino que denominaremosFIN_ARRIBAFIN_ARRIBAyFIN_ABAJOFIN_ABAJO, y
alimentaremos los sensores adecuadamente.
Una vez conectados los sensores, modificaremos el códigocontrol-manualcontrol-manualpara que el motor
de la persiana se detenga cuando se haya alcanzado un final de carrera, aunque el pulsador opor-tuno siga presionado.
Cuando se haya comprobado el correcto funcionamiento de la detección de los finales de carrera y la implementación de estos en el código de control del motor, tan sólo resta por añadir que el movimiento de la persiana se inicie mediante una única pulsación del botón correspondiente. Para ello habrá que modificar la máquina de estados del control del motor añadiendo nuevos estados, v.g.SUBIENDOSUBIENDOyBAJANDOBAJANDO. En dichos estados, la persiana seguirá moviéndose hasta
al-canzar el final de carrera o hasta que el usuario pulse el botón de la dirección contraria. En am-bos casos el motor pasará al estadoPARADOPARADO.
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremos control-sensorizadocontrol-sensorizado al código de
control desarrollado en este apartado.
3.3.3 Sistema de comunicaciones de control
Se pretende añadir un sistema de monitorización y envío de órdenes por el puerto serie. Este sis-tema nos permitirá monitorizar el estado del sissis-tema de control por la consola serie y enviarle órdenes de movimiento a la persiana por la misma consola.
Resultado esperado
Al finalizar este ejercicio el sistema deberá informar a través de la consola serie del estado del mismo, es decir,PARADOPARADO,ABAJOABAJO,SUBIENDOSUBIENDO,ARRIBAARRIBAoBAJANDOBAJANDO. Además
el sistema deberá aceptar órdenes desde la consola serie para bajar, subir o parar la persia-na. El sistema de control mediante pulsadores deberá seguir funcionan con normalidad. Inicialmente vamos a añadir al código decontrol-sensorizadocontrol-sensorizadodesarrollado en el apartado
anterior el sistema de monitorización mediante mensajes por la consola serie. Para ello, tras ini-cializar la consola serie ensetup()setup(), se enviará un mensaje con el nuevo estado del sistema cada
vez éste cambie por la recepción de una orden (por consola o mediante los pulsadores) o debido a un final de carrera.
Adicionalmente, en una segunda fase, se puede añadir al sistema de monitorización los mensa-jes que indiquen qué órdenes está recibiendo el sistema de control.
Una vez implementado y probado el sistema de monitorización, vamos a añadir un sistema de ordenes sencillo para enviar por la consola serie. Las órdenes se basarán en único carácter, segui-do de un retorno de carro. Un ejemplo de ordenes podría ser:
Carácter Acción a realizar
q subir persiana
a bajar persiana
p parar
Se debe tener cuidado durante la lectura de las órdenes provenientes de la consola serie para no dejar bloqueado el sistema de control a la espera de una orden. Se de-berán utilizar funciones de lectura o comprobación del buffer serie no bloquean-tes o con un timeout muy bajo.
Para la implementación de las órdenes remotas se sugiere que el código de lectura del puerto se-rie generé los mismos eventos que se han utilizado al detectar la activación de los pulsadores. De esta forma se minimiza considerablemente el esfuerzo de implementación de esta etapa y de las ampliaciones propuestas en las siguientes secciones.
Al añadir el soporte para las nuevas órdenes remotas también se deberá actualizar el sistema de monitorización con los mensajes correspondientes a dichas órdenes.
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremoscontrol-comunicacionescontrol-comunicacionesal código de
control desarrollado en este apartado.
3.3.4 Control remoto
Se pretende añadir un sistema de control remoto a nuestro sistema de persianas. En este caso, las órdenes podrán llegar desde uno de los sistemas de comunicaciones elegidos.
Resultado esperado
Al finalizar este ejercicio el sistema deberá aceptar órdenes desde un sistema de co-municaciones remoto permitiendo bajar, subir o parar la persiana. El sistema de control mediante pulsadores y órdenes por la consola deberá seguir funcionan con nor-malidad.
Para la implementación de este ejercicio se podrá escoger entre alguno de los sistemas de comu-nicaciones remotas disponibles. En la actualidad estos sistemas son:
1. Mando a distancia por infrarrojos y receptor. O receptor y emisor desde una segunda placas Arduino.
2. Módulos de comunicaciones por RF (433 MHz). 3. Módulo bluetooth.
La información necesaria para la implementación utilizando el sistema escogido se deberá ex-traer de la página del fabricante o mediante búsquedas en Internet.
Se debe que tener cuidado durante la lectura de las órdenes remotas de no utilizar funciones bloqueantes, que interfieran en el correcto funcionamiento del sistema de control
Al igual que en el ejercicio anterior, cuando se modifique el códigocontrol-comunicacionescontrol-comunicaciones
se sugiere que el código de lectura de las ordenes remotas genere los mismos eventos que se han
utilizado al detectar la activación de los pulsadores. De esta forma se minimiza considerable-mente el esfuerzo de implementación y se facilita la escalabilidad del sistema.
Al añadir el soporte para las nuevas órdenes remotas también se deberá actualizar el sistema de monitorización con los mensajes correspondientes a dichas órdenes.
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremoscontrol-remotocontrol-remotoal código de control
desarrollado en este apartado.
3.3.5 Control inteligente
En este último ejercicio se propone añadir alcontrol-remotocontrol-remotoun sistema de control
inteligen-te que genere los eventos de abrir y cerrar la persiana en función de un conjunto de condiciones ambientales.
Para este ejercicio se puede utilizar cualquiera de los sensores de interacción con el exterior: luz, temperatura, humedad, presencia, etc.
Un ejemplo de condiciones complejas podrían ser:
• Si es de noche (no hay luz) y hace calor subir la persiana.
• Bajar la persiana cuando comience a amanecer (aumenta la cantidad de luz) o cuando baje la temperatura de un cierto umbral
Se sugiere modelar el sistema inteligente como una máquina de estados independiente que le envía eventos al sistema del control del motor.
Capítulo 4
Control de un sistema de
motorización de puertas
Este documento describe un escenario en el que se va a utilizar una placa Arduino y diversos sensores y actuadores para realizar la motorización y control automático de un sistema de aper-tura de puertas.
4.1 Objetivos
Los objetivos que se pretenden conseguir con este escenario de domótica son:
• Aprender a resolver un escenario de control complejo mediante un proceso de desarrollo incremental.
• Conocer y utilizar los sensores de presencia y de detección de obstáculos.
• Comprender y aplicar la estructura de un sistema reactivo al control automático de un sistema de motorización de puertas.
4.2 Lista de Material
El material que se va a utilizar durante la realización de este escenario es el siguiente: • Maqueta de una puerta con un motor de continua de 3 a 9v.
• Relés para el control automático del motor. • 2 pulsadores.
• Fuente de alimentación de 9v para alimentar los motores.
• Sensores de infrarrojos y de ultrasonidos para detectar la presencia de personas. • Sistema de control remoto: infrarrojos, bluetooth o radio frecuencia.
• Otros sensores opcionales: sensor de luz, de temperatura, etc.
4.3 Etapas del desarrollo
El desarrollo del presente escenario se va a dividir en diversas etapas. En cada etapa se irán aña-diendo nuevas funcionalidades al sistema de control o se irán haciendo mejoras al código de control utilizado dentro del Arduino.
4.3.1 Control manual
Como primer paso para el control del sistema de apertura y cierre automático se propone imple-mentar el movimiento del sistema de puertas mediante dos pulsadores. Para ello se utilizará un Arduino, dos pulsadores y las correspondientes resistencias de pull-down.
Resultado esperado
Al finalizar este ejercicio el sistema deberá permitir abrir o cerrar la puerta mien-tras el correspondiente pulsador de abrir o cerrar este pulsado. Si no hay ningún pulsador activado la puerta deberá permanecer inmóvil.
Para llevar a cabo este ejercicio se conectarán los dos pulsadores a dos entradas digitales del Ar-duino. DenominaremosAPERTURAAPERTURAyCIERRECIERREa cada uno de los pulsadores y a las entradas
utili-zadas por dichos pulsadoresABRIRABRIRyCERRARCERRAR, respectivamente. Dichas entradas deberán ofrecer
un valorHIGHHIGHcuando el pulsador correspondiente esté pulsado. Para que el valor de la
entra-da seaLOWLOWcuando el pulsador esté libre se deberá utilizar una resistencia de pull-down para cada
pulsador.
Figura 4.1 Resistencia de pull-down
Una vez realizado este montaje, vamos a realizar un programa que lea las entradasABRIRABRIRyCE- CE-RRAR
RRARde los pulsadores y active dos salidas digitales del Arduino, que denominaremosABRIEN-
DODOyCERRANDOCERRANDO. Una vez realizado el programa conectaremos las salidasABRIENDOABRIENDOyCERRANDOCERRANDO
a una de las entradas de cada uno de los final de carrera por contacto. La función de estos finales de carrera es asegurar que la puerta nunca pueda sobrepasar los finales de carrera aunque el có-digo de control funcione incorrectamente.
Cada final de carrera está compuesto por un micro conmutador de contacto como el de la si-guiente figura:
Figura 4.2 Micro conmutador de fin de carrera
La señal de control para mover el motor en una dirección deberá entrar por el cable rojo del conmutador (la izquierda en la figura) y salir por el cable negro (la derecha en la figura) hacia una de las entradasCH1CH1oCH2CH2de la placa de relés. En el momento en que la puerta llegue al final
de carrera correspondiente y presione el conmutador, la señal de control se redirigirá a la salida
central del conmutador, quedando el canal de entrada de la placa de relés al aire y parando el
motor (las placas de relés suelen llevar incorporada una resistencia del pull-down en las entradas de los canales).
La salida central del conmutador se va a utilizar en el siguiente ejercicio como se-ñal de fina de carrera junto con la correspondiente resistencia de pull-down.
Una vez conectadas las señales de controlABRIENDOABRIENDOyCERRANDOCERRANDOa los finales de carrera y la
sa-lida a los canalesCH1CH1yCH2CH2de la placa de relés, habrá que alimentar la placa de relés
adecuada-mente. A partir de ahí comprobaremos el correcto funcionamiento del montaje activando los pulsadoresABRIRABRIRyCERRARCERRARy viendo que se activa la entradaCH1CH1oCH2CH2de la placa de relés
res-pectivamente. La activación de los canales de la placa de relés está señalizada mediante los co-rrespondientes leds.
Comprobad también, actuando manualmente sobre los conmutadores de fin de carrera, que con el pulsador activado, la señal de control se inhibe al cerrarse el final de carrera correspon-diente.
Comprobado el correcto funcionamiento del montaje de control manual, pasaremos a realizar las conexiones finales. Para ello conectaremos la alimentación de los motores a la placa de relés uniendo el positivo de la fuente de alimentación a las dos entradasNCNCde los relés y el negativo a
las dos entradasNONO. Finalmente, conectaremos las entradas del motor a cada una de las entradas
COM
COMde los relés, no sin antes comprobar qué polaridad de la alimentación del motor se
corres-ponde con cada sentido de giro y, por lo tanto, con una dirección de la persiana. En la siguiente figura se muestra un esquema de las conexiones de un relé.
Figura 4.3 Conexiones del relé
Es muy importante comprobar que la conexión de la alimentación del motor a la placa de relés coincide con las conexiones a través de los finales de carrera, con el objetivo de que cada fin de carrera inhiba la señal de entrada adecuada a la placa de relés.
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremoscontrol-manualcontrol-manualal código de control
desarrollado en este apartado.
4.3.2 Sensorización de la posición de la puerta
En este paso se van a añadir al sistema de motorización de puertas la lectura de los finales de ca-rrera. Ello nos permitirá poder enviarle al sistema órdenes para que abra o cierre completamen-te la puerta.
Resultado esperado
Al finalizar este ejercicio el sistema deberá permitir abrir y cerrar la puerta me-diante una única pulsación en el botón correspondiente. La puerta se detendrá au-tomáticamente al final del recorrido, desactivando la señal de control correspondiente y activando un led indicador. Una vez alcanzado cualquiera de los finales de carrera el siste-ma ignorará cualquier orden del usuario para sobrepasar dichos límites.
Para realizar la detección de los finales de carrera tan sólo hay que conectar la salida central de cada conmutador a sendas entradas digitales del Arduino que denominaremosFIN_ABIERTOFIN_ABIERTOy FIN_CERRADO
FIN_CERRADO. Se deberá utilizar una resistencia de pull-down para poder leer un valorLOWLOW
cuan-do el final de carrera no se encuentre activo.
Cuando se alcance uno de los finales de carrera se deberá indicar dicho estado iluminando un led, distinto en cada caso, mediante unas nuevas salidas digitales del Arduino que denominare-mosLED_ABIERTOLED_ABIERTOyLED_CERRADOLED_CERRADO.
Cuando se haya comprobado el correcto funcionamiento de la detección de los finales de carrera y la implementación de estos en el código de control, tan sólo resta por añadir que el movimien-to de la puerta se inicie mediante una única pulsación del botón correspondiente. Para ello ha-brá que modificar la máquina de estados del control del motor añadiendo nuevos estados, v.g.
ABRIENDOABRIENDOyCERRANDOCERRANDO. En dichos estados, la puerta seguirá moviéndose hasta alcanzar el final
de carrera, pasando en ese momento a uno de los nuevos estadosABIERTAABIERTAoCERRADACERRADA. Si durante
el movimiento el usuario pulsa el botón de la dirección contraria el motor se deberá parar y pa-sar al estadoPARADAPARADA.
En los estadosABIERTAABIERTAoCERRADACERRADA, la señal de control correspondiente,ABRIENDOABRIENDOoCERRANDOCERRANDO,
deberá desactivarse. Ello desactivará a su vez la señal de entrada del final de carrera,
FIN_ABIERTOFIN_ABIERTOoFIN_CERRADOFIN_CERRADO. Es probable que en este caso la iluminación de los leds
indicado-res del fin de carrera deje de funcionar. Modificar el código de control para que la iluminación de dichos leds esté asociada al estadoABIERTAABIERTAoCERRADACERRADAy no a las señales de fin de carrera.
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremos control-sensorizadocontrol-sensorizado al código de
control desarrollado en este apartado.
4.3.3 Sistema de comunicaciones de control
Se pretende añadir un sistema de monitorización y envío de órdenes por el puerto serie. Este sis-tema nos permitirá monitorizar el estado del sissis-tema de control por la consola serie y enviarle órdenes de movimiento a la puerta por la misma consola.
Resultado esperado
Al finalizar este ejercicio el sistema deberá informar a través de la consola serie del estado del mismo, es decir, PARADAPARADA, ABIERTAABIERTA, ABRIENDOABRIENDO, CERRADACERRADA o CERRANDOCERRANDO.
Además el sistema deberá aceptar órdenes desde la consola serie para abrir, cerrar o parar la puerta. El sistema de control mediante pulsadores deberá seguir funcionan con norma-lidad.
Inicialmente vamos a añadir al código decontrol-sensorizadocontrol-sensorizadodesarrollado en el apartado
anterior el sistema de monitorización mediante mensajes por la consola serie. Para ello, tras ini-cializar la consola serie ensetup()setup(), se enviará un mensaje con el nuevo estado del sistema cada
vez éste cambie por la recepción de una orden (por consola o mediante los pulsadores) o debido a un final de carrera.
Adicionalmente, en una segunda fase, se puede añadir al sistema de monitorización los mensa-jes que indiquen qué órdenes está recibiendo el sistema de control.
Una vez implementado y probado el sistema de monitorización, vamos a añadir un sistema de ordenes sencillo para enviar por la consola serie. Las órdenes se basarán en único carácter, segui-do de un retorno de carro. Un ejemplo de ordenes podría ser:
Carácter Acción a realizar
q cerrar puerta
w abrir puerta
p parar
Se debe tener cuidado durante la lectura de las órdenes provenientes de la consola serie para no dejar bloqueado el sistema de control a la espera de una orden. Se de-berán utilizar funciones de lectura o comprobación del buffer serie no bloquean-tes o con un timeout muy bajo.
Para la implementación de las órdenes remotas se sugiere que el código de lectura del puerto se-rie generé los mismos eventos que se han utilizado al detectar la activación de los pulsadores. De esta forma se minimiza considerablemente el esfuerzo de implementación de esta etapa y de Al añadir el soporte para las nuevas órdenes remotas también se deberá actualizar el sistema de monitorización con los mensajes correspondientes a dichas órdenes.
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremoscontrol-comunicacionescontrol-comunicacionesal código de
control desarrollado en este apartado.
4.3.4 Control remoto
Se pretende añadir un sistema de control remoto a nuestro sistema de control de puertas. En este caso, las órdenes podrán llegar desde uno de los sistemas de comunicaciones elegidos.
Resultado esperado
Al finalizar este ejercicio el sistema deberá aceptar órdenes desde un sistema de co-municaciones remoto permitiendo abrir, cerrar o parar la puerta. El sistema de control mediante pulsadores y órdenes por la consola deberá seguir funcionan con nor-malidad.
Para la implementación de este ejercicio se podrá escoger entre alguno de los sistemas de comu-nicaciones remotas disponibles. En la actualidad estos sistemas son:
1. Mando a distancia por infrarrojos y receptor. O receptor y emisor desde una segunda placas Arduino.
2. Módulos de comunicaciones por RF (433 MHz). 3. Módulo bluetooth.
La información necesaria para la implementación utilizando el sistema escogido se deberá ex-traer de la página del fabricante o mediante búsquedas en Internet.
Se debe que tener cuidado durante la lectura de las órdenes remotas de no utilizar funciones bloqueantes, que interfieran en el correcto funcionamiento del sistema de control
Al igual que en el ejercicio anterior, cuando se modifique el códigocontrol-comunicacionescontrol-comunicaciones
se sugiere que el código de lectura de las ordenes remotas genere los mismos eventos que se han utilizado al detectar la activación de los pulsadores. De esta forma se minimiza considerable-mente el esfuerzo de implementación y se facilita la escalabilidad del sistema.
Al añadir el soporte para las nuevas órdenes remotas también se deberá actualizar el sistema de monitorización con los mensajes correspondientes a dichas órdenes.
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremoscontrol-remotocontrol-remotoal código de control
desarrollado en este apartado.
4.3.5 Control inteligente
En este último ejercicio se propone añadir alcontrol-remotocontrol-remotoun sistema de control
inteligen-te que genere los eventos de abrir y cerrar la puerta en función de un conjunto de condiciones. Para este ejercicio se puede utilizar cualquier de los sensores de detección de obstáculos, como son los sensores de infrarrojos y los de ultrasonidos.
Un ejemplo de condiciones complejas podrían ser:
• Mientras se está cerrando la puerta, si se detecta un obstáculo en la trayectoria de la mis-ma, la puerta se detendrá y se abrirá completamente. Para ello se podría utilizar un sensor de infrarrojos.
• Si la puerta se encuentra abierta, cerrarla tras el trascurso de una cierta cantidad de tiem-po, v.g. 15 segundos, sin que se haya detectado ningún obstáculo en la trayectoria.
• Usar un sensor de ultrasonidos, que permite medir distancias, para determinar cuándo se está acercando alguien a la puerta, en cuyo caso hay que abrirla antes de que llegue. Se de-berá distinguir entre acercarse a la puerta y pasar por delante.
Se sugiere modelar el sistema inteligente como una máquina de estados independiente que le envía eventos al sistema del control del motor.
Capítulo 5
Control de un sistema de
iluminación
Este capítulo describe un escenario en el que se va a utilizar una placa Arduino y diversos sen-sores y actuadores para realizar el control automático de un sistema de iluminación.
5.1 Objetivos
Los objetivos que se pretenden conseguir con este escenario de domótica son:
• Aprender a resolver un escenario de control complejo mediante un proceso de desarrollo incremental.
• Conocer y utilizar los sensores de presencia, ambientales y de consumo eléctrico. • Comprender y aplicar la estructura de un sistema reactivo al control automático de un
sistema de iluminación.
5.2 Lista de Material
El material que se va a utilizar durante la realización de este escenario es el siguiente: • Maqueta de un sistema de iluminación: bombillas, halógenos y conmutador.
• Placa de control de motores para el control de la intensidad del sistema de iluminación. • Relés para el control automático de las luces.
• Sistema de control remoto: infrarrojos, bluetooth o radio frecuencia.
5.3 Etapas del desarrollo
El desarrollo del presente escenario se va a dividir en diversas etapas. En cada etapa se irán aña-diendo nuevas funcionalidades al sistema de control o se irán haciendo mejoras al código de control utilizado dentro del Arduino.
5.3.1 Control manual
Como primer paso para el control del sistema de iluminación se propone implementar el encen-dido del sistema de iluminación mediante un pulsador. Para ello se utilizará un Arduino, un pulsador y las correspondientes resistencias de pull-down.
Resultado esperado
Al finalizar este ejercicio el sistema deberá permitir encender las luces mientras el pulsador este pulsado. Si el pulsador no está activado las luces permanecerán apa-gadas.
Para llevar a cabo este ejercicio se conectará el pulsador a una entrada digital del Arduino. De-nominaremosLUZLUZal pulsador yACTIVARACTIVARa la entrada a la que esté conectado. Dicha entrada
de-berá ofrecer un valorHIGHHIGHcuando el pulsador esté pulsado. Para que el valor de la entrada sea LOW
LOWcuando el pulsador esté libre se deberá utilizar una resistencia de pull-down para cada
pulsa-dor.
Figura 5.1 Resistencia de pull-down
Una vez realizado este montaje, vamos a realizar un programa que lea la entrada ACTIVARACTIVAR
del pulsador y active dos salidas digitales del Arduino complementarias, que denominaremos
CONMUT_1
CONMUT_1yCONMUT_2CONMUT_2. CuandoACTIVARACTIVAResté aHIGHHIGH, pondremosCONMUT_1CONMUT_1aHIGHHIGHyCONMUT_2CONMUT_2
aLOWLOW. CuandoACTIVARACTIVAResté aLOWLOW, pondremosCONMUT_1CONMUT_1aLOWLOWyCONMUT_2CONMUT_2aHIGHHIGH. Se muestra
una resumen de la correspondencia de los valores en la siguiente tabla.
ACTIVAR
ACTIVAR CONMUT_1CONMUT_1 CONMUT_2CONMUT_2
HIGH HIGH LOW
LOW LOW HIGH
Una vez realizado el programa conectaremos la salidaCONMUT_1CONMUT_1a la entradaIN1IN1de la placa de
control de motores yCONMUT_2CONMUT_2a la entradaIN2IN2. Con ello podremos controlar la polaridad a las
salidas deMOTORAMOTORA. De momento, la entradaENAENAdel motorAAla conectaremos a+5v+5ven la placa
Arduino.
Se puede observar un imagen de la placa de motores en la siguiente figura.
Figura 5.2 Placa de control de motores
A continuación alimentaremos adecuadamente la placa de motores, conectando+5v+5vyGNDGND
(pi-nes amarillos) a la placa Arduino yVMSVMSyGNDGND(terminales de tornillo azules) a la alimentación
del sistema de iluminación. Se debe tener cuidado con la polaridad de la fuente de alimentación. Una vez alimentada la placa de motores adecuadamente, comprobaremos el correcto funciona-miento del montaje, es decir, que cuando activamos el pulsadorLUZLUZse activen los ledsL1L1oL2L2
(pero no ambos) en la placa de motores, señalizando así la dirección de la polaridad de salida de
MOTORAMOTORA.
Comprobado el correcto funcionamiento del montaje de control manual, pasaremos a realizar las conexiones finales. Para ello conectaremos las entradas de la bombilla con los cables rojo y amarillo a cada una de las salidas deMOTORAMOTORAy el cable negro a la entradaGNDGNDde los terminales
de tornillo azules o al negativo de la fuente de alimentación.
Dado que la estructura de la bombilla tiene incorporado un conmutador, puede darse el caso de que el comportamiento del pulsador sea el contrario del esperado: luz encendida con el pulsador desactivado y viceversa. De momento colocaremos el conmutador en la posición adecuada para que la luz se encienda al activar el pulsador.
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremoscontrol-manualcontrol-manualal código de control
desarrollado en este apartado.
5.3.2 Control conmutado
El siguiente paso será modificar el control de iluminación, para que el estado de luz conmute con cada pulsación.
Resultado esperado
Al finalizar este ejercicio el sistema de iluminación deberá cambiar de encendido a apagado y viceversa con cada pulsación del botónLUZLUZ.
El primer paso es modificar la lógica de control para que el Arduino detecto los flancos de subida del pulsador (paso deLOWLOWaHIGHHIGH) en vez del valor fijoHIGHHIGH.
En segundo lugar se definirá una variableconmutadorconmutador(con valores00o11) que mantendrá el
es-tado del conmues-tador lógico implemenes-tado por el Arduino y que cambiará su valor con cada flanco de subida detectado en el pulsadorLUZLUZ. Los valores de las salidasCONMUT_1CONMUT_1yCONMUT_2CONMUT_2
dependerán ahora del estado de dicha variable como se muestra en la siguiente tabla.
conmutadorconmutador CONMUT_1CONMUT_1 CONMUT_2CONMUT_2
0 HIGH LOW
1 LOW HIGH
Una vez implementada la nueva lógica de control, comprobad que el estado de la bombilla con-muta con cada pulsación independientemente de la posición del concon-mutador externo.
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremoscontrol-conmutadocontrol-conmutadoal código de
con-trol desarrollado en este apartado.
5.3.3 Sensorización del estado del sistema de iluminación
En este paso se va a añadir al sistema de iluminación un sistema de monitorización de su estado que permita determinar si la luz está encendida o apagada.
Resultado esperado
Al finalizar este ejercicio el sistema deberá ser capaz de informar del estado del sis-tema de iluminación, indicando su estado mediante un led. El estado deberá co-rresponderse con la realidad independientemente de que el estado se cambie mediante el pulsadorLUZLUZo mediante el conmutador externo.
Para realizar la detección del estado de la iluminación utilizaremos un sensor de consumo para monitorizar la actividad de la fuente de alimentación. Dado que las bombillas utilizadas hasta este momento no pueden alterar el consumo de la fuente de alimentación externa al activarse, se utilizarán en su lugar (o simultáneamente) luces halógenas de 50W.
Inicialmente conectaremos el sensor de consumo a la entrada de la fuente de alimentación para poder calibrar el consumo de corriente alterna del sistema con la luz encendida y apagada. Para ello se utilizará el código de ejemplo suministrado por el fabricante del sensor y se escribirán los valores obtenidos en la consola serie (o por la pantalla LCD).
Una vez calibrado el sistema, se obtendrá el valor intermedio de ambos consumos como valor de corte y se modificará la lógica de control y el montaje para que encienda un led, que deno-minaremosTESTIGOTESTIGO, cuando el sistema de iluminación esté encendido y lo apague cuando esté
apagado. Dicho valor deberá corresponderse con el estado de las luces independientemente de como se haya cambiado el estado de las luces (pulsador o conmutador externo).
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremos control-sensorizadocontrol-sensorizado al código de
control desarrollado en este apartado.
5.3.4 Sistema de iluminación regulada
Se va a incorporar alcontrol-sensorizadocontrol-sensorizadoun mecanismo que permita controlar la
intensi-dad del sistema de iluminación mediante un sensor rotatorio.
Resultado esperado
Al finalizar este ejercicio el sistema deberá permitir al usuario controlar la intensi-dad del sistema de iluminación mediante un sensor rotatorio. Igualmente, el siste-ma de monitorización deberá ser capaz de estisiste-mar el porcentaje de intensidad que se está aplicando en base al sensor de consumo.
El pulsador y el conmutador se deben poder seguir utilizando para apagar o encender la luz, aunque ésta funcione con una intensidad reducida.
Para llevar a cabo está modificación se conectará el sensor rotatorio a una de las entradas analó-gicas del Arduino, que denominaremosPOTENCIAPOTENCIA. El valor obtenido de dicho sensor, una vez
mapeado al rango 0-2550-255, se utilizará para generar una onda PWM, mediante la función
analogWrite()
analogWrite(), que se aplicará a través de una nueva salida que denominaremosINTENSIDADINTENSIDAD
a la entradaENAENA(pines amarillos) de la placa de motores, sustituyendo así la conexión a+5v+5vque
se estaba utilizando.
Se debe tener en cuenta que el valor regulado sólo se podrá aplicar cuando el con-mutador y/o el pulsador se hayan utilizado para encender la luz. Si la intensidad está al mínimo, el efecto del conmutador y/o el pulsador no se podrá apreciar.
Una vez implementadas y probadas las modificaciones anteriores, se procederá a modificar el sistema de monitorización mapeando el rango existente entre el consumo mínimo y el máxi-mo en el intervalo de 0 a 100 %. Se deberá informar del porcentaje de intensidad a través de la consola cada vez que éste cambie.
La iluminación del ledTESTIGOTESTIGOpasará a estar activa a partir de un porcentaje de intensidad del
10 %. Modifíquese la lógica de control para que se tenga en cuenta este nuevo umbral.
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremoscontrol-reguladocontrol-reguladoal código de control
desarrollado en este apartado.
5.3.5 Sistema de comunicaciones de control
Se pretende añadir un sistema de envío de órdenes por el puerto serie. Este sistema nos permiti-rá enviarle órdenes de cambios en el sistema de iluminación utilizando la consola.
Resultado esperado
Al finalizar este ejercicio el sistema deberá aceptar órdenes desde la consola serie para encender, apagar, aumentar intensidad o reducir intensidad de las luces. El sistema de control mediante el pulsador y el sensor rotatorio deberá seguir funcionan con normalidad.
Inicialmente vamos a añadir al código decontrol-reguladocontrol-reguladodesarrollado en el apartado
ante-rior un sistema de monitorización mejorado mediante mensajes por la consola serie. Para ello, tras inicializar la consola serie ensetup()setup(), además de los mensajes con los estado del sistema,
también se enviarán mensajes que indiquen qué órdenes está recibiendo el sistema de control. Una vez implementado y probado el sistema de monitorización, vamos a añadir un sistema de ordenes sencillo para enviar por la consola serie. Las órdenes se basarán en único carácter, segui-do de un retorno de carro. Un ejemplo de ordenes podría ser:
Carácter Acción a realizar
0 apagar
1 encender
q más intensidad (+ 10%)
a menos intensidad (- 10%)
Se debe tener cuidado durante la lectura de las órdenes provenientes de la consola serie para no dejar bloqueado el sistema de control a la espera de una orden. Se de-berán utilizar funciones de lectura o comprobación del buffer serie no bloquean-tes o con un timeout muy bajo.
Para la implementación de las órdenes remotas se sugiere que el código de lectura del puerto se-rie generé los mismos eventos que se han utilizado al detectar la activación del pulsador. De es-ta forma se minimiza considerablemente el esfuerzo de implemenes-tación de eses-ta ees-tapa y de las ampliaciones propuestas en las siguientes secciones. En el caso de la intensidad, ésta se almace-nará en una variable inicializada con el valor del sensor rotatorio. Téngase en cuenta, que una vez modificada la intensidad mediante las ordenes enviadas por la consola serie, la intensidad almacenada y la especificada en el sensor rotatorio diferirán.
Al añadir el soporte para las nuevas órdenes remotas también se deberá actualizar el sistema de monitorización con los mensajes correspondientes a dichas órdenes.
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremoscontrol-comunicacionescontrol-comunicacionesal código de
control desarrollado en este apartado.
5.3.6 Control remoto
Se pretende añadir un sistema de control remoto a nuestro sistema de iluminación. En este caso, las órdenes podrán llegar desde uno de los sistemas de comunicaciones elegidos.
Resultado esperado
Al finalizar este ejercicio el sistema deberá aceptar órdenes desde un sistema de co-municaciones remoto permitiendo encender, apagar, aumentar intensidad o re-ducir intensidad de las luces. El sistema de control mediante pulsador y órdenes por la consola deberá seguir funcionan con normalidad.
Para la implementación de este ejercicio se podrá escoger entre alguno de los sistemas de comu-nicaciones remotas disponibles. En la actualidad estos sistemas son:
1. Mando a distancia por infrarrojos y receptor. O receptor y emisor desde una segunda placas Arduino.
2. Módulos de comunicaciones por RF (433 MHz). 3. Módulo bluetooth.
La información necesaria para la implementación utilizando el sistema escogido se deberá ex-traer de la página del fabricante o mediante búsquedas en Internet.
Se debe que tener cuidado durante la lectura de las órdenes remotas de no utilizar funciones bloqueantes, que interfieran en el correcto funcionamiento del sistema de control
Al igual que en el ejercicio anterior, cuando se modifique el códigocontrol-comunicacionescontrol-comunicaciones
se sugiere que el código de lectura de las ordenes remotas genere los mismos eventos que se han utilizado al detectar la activación de los pulsadores. De esta forma se minimiza considerable-mente el esfuerzo de implementación y se facilita la escalabilidad del sistema.
Al añadir el soporte para las nuevas órdenes remotas también se deberá actualizar el sistema de monitorización con los mensajes correspondientes a dichas órdenes.
Finalmente comprobaremos que el comportamiento del sistema se corresponde con el resultado esperado. Denominaremoscontrol-remotocontrol-remotoal código de control
desarrollado en este apartado.
5.3.7 Control inteligente
En este último ejercicio se propone añadir alcontrol-remotocontrol-remotoun sistema de control
inteligen-te que genere los eventos de abrir y cerrar la persiana en función de un conjunto de condiciones ambientales.
Para este ejercicio se puede utilizar cualquiera de los sensores de interacción con el exterior: luz, presencia, etc.
Un ejemplo de condiciones complejas podrían ser:
• Si es de noche (no hay luz) y se ha detectado movimiento, encender las luces. Una vez en-cendidas, si no se detecta movimiento en una determinada cantidad de tiempo, las luces se apagarán. ¡Ojo! Apagar las luces altera el estado del sensor de presencia dando falsos po-sitivos. Tras apagar las luces se deberá ignorar el sensor de presencia durante algunos se-gundos.
• Que la intensidad de la luz se adapte a la iluminación ambiente: cuanto mayor ilumina-ción ambiente menor intensidad en el sistema de iluminailumina-ción.
Se sugiere modelar el sistema inteligente como una máquina de estados independiente que le envía eventos al sistema del control del motor.