• No se han encontrado resultados

TALLER DE DOMÓTICA CON ARDUINO

N/A
N/A
Protected

Academic year: 2021

Share "TALLER DE DOMÓTICA CON ARDUINO"

Copied!
45
0
0

Texto completo

(1)

TALLER DE

DOMÓTICA CON

ARDUINO

SISTEMAS REACTIVOS Y ESCENARIOS DE

CONTROL

JOSÉ LUIS POZA Y SERGIO SÁEZ

(2)
(3)

Taller de Domótica

con Arduino

José Luis Poza y Sergio Sáez

Julio 2015

(4)

Licencia

© Copyright 2015, José Luis Poza y Sergio Sáez

Reconocimiento – NoComercial – SinObraDerivada (by-nc-nd).

(5)

Í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

(6)

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

(7)

Parte I

Diseño de sistemas

reactivos

(8)
(9)

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.

(10)

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

(11)

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.

(12)

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.

(13)

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á

(14)

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.

(15)

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;

(16)

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) {

(17)

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 */

(18)

break break; }

}

(19)

Parte II

Escenarios de control

domótico

(20)
(21)

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.

(22)

• 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.

(23)

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.

(24)

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.

(25)

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.

(26)

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

(27)

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.

(28)
(29)

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.

(30)

• 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-

(31)

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

(32)

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.

(33)

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.

(34)

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.

(35)

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.

(36)

Se sugiere modelar el sistema inteligente como una máquina de estados independiente que le envía eventos al sistema del control del motor.

(37)

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.

(38)

• 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.

(39)

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.

(40)

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.

(41)

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

(42)

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:

(43)

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:

(44)

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.

(45)

• 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.

Referencias

Documento similar

Volviendo a la jurisprudencia del Tribunal de Justicia, conviene recor- dar que, con el tiempo, este órgano se vio en la necesidad de determinar si los actos de los Estados

El contar con el financiamiento institucional a través de las cátedras ha significado para los grupos de profesores, el poder centrarse en estudios sobre áreas de interés

Hemos sido capaces de crear un sistema que realiza varias funciones con un mismo módulo de control, una placa de arduino UNO, con la que hemos conseguido crear un

"No porque las dos, que vinieron de Valencia, no merecieran ese favor, pues eran entrambas de tan grande espíritu […] La razón porque no vió Coronas para ellas, sería

Para realizar el hardware del proyecto utilizando la placa de desarrollo Arduino Leonardo, únicamente será necesario el uso de 5 conexiones entre la placa

Arduino [Arduino] (ver Ilustración 2.3) es una plataforma de hardware libre, basada en una placa con un microcontrolador y un entorno de desarrollo, diseñada para facilitar el uso

En los Mac, el puerto serie será probablemente algo como/dev/tty.usbserial-1B1 (para una placa USB), o /dev/tty.USA19QW1b1P1.1 (para una placa serie conectada con un

 Mediante una batería de 9 a 12 voltios removible, con posibilidad de ser desconectada por medio de un interruptor general alojado en la parte frontal de la carcasa.