45
TALLER DE DOMÓTICA CON ARDUINO SISTEMAS REACTIVOS Y ESCENARIOS DE CONTROL JOSÉ LUIS POZA Y SERGIO SÁEZ Julio 2015

Taller de Domótica con Arduino - cursoarduino.disca.upv.escursoarduino.disca.upv.es/archive/actividades/curso-arduino-e... · TALLER DE DOMÓTICA CON ARDUINO SISTEMAS REACTIVOS Y

  • Upload
    lytuyen

  • View
    227

  • Download
    1

Embed Size (px)

Citation preview

TALLER DEDOMÓTICA CONARDUINOSISTEMAS REACTIVOS Y ESCENARIOS DECONTROL

JOSÉ LUIS POZA Y SERGIO SÁEZJulio 2015

www.princexml.com
Prince - Non-commercial License
This document was created with Prince, a great way of getting web content onto paper.

Esta página se ha dejado vacía a propósito

Taller de Domóticacon Arduino

José Luis Poza y Sergio SáezJulio 2015

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

Reconocimiento – NoComercial – SinObraDerivada (by-nc-nd).No se permite un uso comercial de la obra original ni la generación de obras derivadas.

Índice de contenidos

Parte I Diseño de sistemas reactivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Capítulo 1 Un sistema reactivo sencillo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

1.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.2 Lista de Material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.3 Etapas del desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

1.3.1 Ejercicio básico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.3.2 Control de led con sistema de apagado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.3.3 Control de led con acumulación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Capítulo 2 Diseño de un sistema reactivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.1.1 Diseño del sistema reactivo de control de ráfagas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.2 Lista de Material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.3 Etapas del desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3.3.1 Control manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223.3.2 Sensorización de la posición de la persiana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243.3.3 Sistema de comunicaciones de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253.3.4 Control remoto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263.3.5 Control inteligente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

Capítulo 4 Control de un sistema de motorización de puertas. . . . . . . . . . . . . 29

4.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294.2 Lista de Material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294.3 Etapas del desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

4.3.1 Control manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304.3.2 Sensorización de la posición de la puerta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324.3.3 Sistema de comunicaciones de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.3.4 Control remoto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344.3.5 Control inteligente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

Capítulo 5 Control de un sistema de iluminación . . . . . . . . . . . . . . . . . . . . . . . 37

5.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375.2 Lista de Material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375.3 Etapas del desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

5.3.1 Control manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385.3.2 Control conmutado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405.3.3 Sensorización del estado del sistema de iluminación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405.3.4 Sistema de iluminación regulada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415.3.5 Sistema de comunicaciones de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425.3.6 Control remoto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435.3.7 Control inteligente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Parte I

Diseño de sistemasreactivos

Esta página se ha dejado vacía a propósito

8

Capítulo 1

Un sistema reactivosencilloEste capítulo describe un sistema reactivo sencillo, para implementar con un Arduino, pero losuficientemente complejo como para valorar las bondades del diseño e implementación de sis-temas reactivos utilizando patrones.

1.1 ObjetivosLos 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 MaterialEl material que se va a utilizar durante la realización de este ejercicio es el siguiente:

• Placa Arduino.• 2 pulsadores.• Resitencias del pull-down.

9

1.3 Etapas del desarrolloEl 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ásicoEl montaje que se pretende realizar es un sistema de control de un led. El sistema, trás la llegadade 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 segundoencendido, un segundo apagado, etc. Para generar el evento de activación de la ráfaga se utilzia-rá un pulsador.

Resultado esperadoAl finalizar este ejercicio el sistema deberá emitir, trás la recepción de la señal deactivació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-nominaremos ENCENDIDOENCENDIDO al pulsador conectado en la entrada digital y ACTIVARACTIVAR a la entradaa la que se encuentra conectado dicho pulsador. Dicha entrada deberá ofrecer un valor HIGHHIGH

cuando el pulsador ENCENDIDOENCENDIDO esté pulsado. Para que el valor de la entrada sea LOWLOW cuando elpulsador esté libre se deberá utilizar una resistencia de pull-down.

Figura 1.2 Resistencia de pull-down

Capítulo 1 Un sistema reactivo sencillo Taller de Domótica con Arduino

10

El evento que debe activar el comienzo de la ráfaga será un flanco de subida en la entrada ACTI-ACTI-

VARVAR, es decir, cuando la entrada ACTIVARACTIVARpase de LOWLOW a HIGHHIGH. Sólo ese caso se deberá comenzar lará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 entrada ACTIVARACTIVAR pase de LOWLOW aHIGHHIGH. Para comprobar el correcto funcionamiento se deberá mantener presionadoel pulsador ENCENDIDOENCENDIDO durante 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 pulsador ENCENDIDOENCENDIDO durante la ejecución de una ráfaga el sistemano altera su comportamiento.

Comprobaremos que el comportamiento del sistema se corresponde con el resulta-do esperado.

1.3.2 Control de led con sistema de apagadoAhora pretendemos añadir un segundo evento que permita interrumpir la ráfaga. Para generarel evento de interrupción de la ráfaga se utilizará un segundo pulsador.

Resultado esperadoAl finalizar este ejercicio el sistema deberá permitir, trás la recepción de la señal deinterrupció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. Denominaremos APAGADOAPAGADO al pulsador conectado en la entrada digital e INTERRUMPIRINTERRUMPIR ala entrada a la que se encuentra conectado dicho pulsador. Dicha entrada deberá ofrecer un va-lor HIGHHIGH cuando el pulsador APAGADOAPAGADO esté pulsado. Para que el valor de la entrada sea LOWLOW cuan-do el pulsador esté libre se deberá utilizar una resistencia de pull-down.

El evento que debe activar la interrupción de la ráfaga podrá ser tanto un flanco de subida en laseñal APAGADOAPAGADO, 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 encuentraencendido. En ese caso, el led deberá apagarse inmediatamente.

Probad que si activamos el pulsadorAPAGADOAPAGADOmientras el led está encendido, la ráfaga se detieneinmediatamente. Comprad que esto sucede así incluso aunque la pulsación sea corta.

Taller de Domótica con Arduino Capítulo 1 Un sistema reactivo sencillo

11

Comprobaremos que el comportamiento del sistema se corresponde con el resulta-do esperado.

1.3.3 Control de led con acumulaciónPretendemos añadir en esta ocasión un sistema de acumulación, de forma que cada vez que sepresione el pulsador ENCENDIDOENCENDIDO durante la ejecución de una ráfaga, el sistema hará un ciclo detres encendidos adicionales. Se deberá acumular una secuencia de tres encendidos adicionalescada 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 secuencia 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 de APAGADOAPAGADO, se interrumpirá la secuencia en curso y el ledde quedará inactivo hasta que se vuelva a presionar el pulsador de ENCENDIDOENCENDIDO.

Capítulo 1 Un sistema reactivo sencillo Taller de Domótica con Arduino

12

Capítulo 2

Diseño de un sistemareactivoEste capítulo describe como se puede diseñar e implementar un sistema reactivo sencillo, sobrela plataforma Arduino, utilizando patrones.

2.1 ObjetivosLos 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áfagasEl 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 cadadestello, cada vez que se presione el pulsador ENCENDIDO.

• Si se presiona el pulsador ENCENDIDO durante una ráfaga activa, el sistema emitira tresdestellos adicionales al final de la misma. El número de destellos adicionales esacumulativo.

• Si durante una ráfaga se presiona el pulsador APAGADO la ráfaga se detendráinmediatamente.

13

Para resolver el problema vamos a plantear su implementación como un sistema reactivo y, porlo tanto, modelarlo con una máquina de estados finitos de UML.

El sistema tendrá dos estados principales:

EnEsperaEnEspera

Representa al sistema cuando está a la espera de un evento y con el led apagado.

RafagaRafaga

El sistema está con una ráfaga activa.

El estado RafagaRafaga tiene a su vez dos subestados que indican si el led está EncendidoEncendido o ApagadoApagado.Estos estados se pueden observar en la siguiente figura. Como era de esperar, al entrar en el esta-do EncendidoEncendido se ejecuta la orden encenderLed()encenderLed() y al entrar en el estado ApagadoApagado se ejecuta laorden apagarLed()apagarLed(). Las transiciones entre ambos estados están temporizadas con11 segseg con loque se construye la ráfaga sobre el led. La ráfaga termina cuando la cuentacuenta llega a 0 o se activael evento pararparar. En ambos casos se cambia al estado EnEsperaEnEspera. La cuentacuenta se pone a 0 cuandoentramos en el estado EnEsperaEnEspera y se incrementa en 3 al entrar en el estado RafagaRafaga o cuandodentro del estado RafagaRafaga se genera un nuevo evento activaractivar.

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 delsistema reactivo, vamos a proceder a su implementación.

Capítulo 2 Diseño de un sistema reactivo Taller de Domótica con Arduino

14

2.1.2 Implementación del sistema reactivoA continuación vamos a definir cada unos de los elementos que nos permitirán implementar elsistema reactivo.

2.1.2.1 Eventos del sistemaEl sistema reactivo sólo utiliza dos eventos posibles, ACTIVARACTIVARy PARARPARAR, y los vamos a definir co-mo un enumerado. Se añade el evento especial NINGUNONINGUNO para 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 evento EVENTO_TEMPORALEVENTO_TEMPORAL que se asociará con la expiración de los eventos detipo after Xafter X.

2.1.2.2 Estados del sistemaLos 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 estado EST_RAFAGAEST_RAFAGA no está definido ya que no se puede estar en dicho estado sinestar en el estado ENCENDIDOENCENDIDOo APAGADOAPAGADO. Igualmente, el estado INICIALINICIAL sólo es un estado detransición que nos permitirá inicializar el sistema. Podría implementarse dentro de la funciónsetup()setup().

2.1.2.3 Bucle principal del sistema reactivoEl 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;

Taller de Domótica con Arduino Capítulo 2 Diseño de un sistema reactivo

15

nivel_parar= LOW;

}

voidvoid loop () {

evento_t evento= EV_NINGUNO;

/* Comprobar eventos */

entrada_activar= leer_pulsador_encendido();

entrada_parar= leer_pulsador_apagado();

ifif (nivel_activar == LOW && entrada_activar == HIGH) {

evento= EV_ACTIVAR;

} elseelse ifif (nivel_parar == LOW && entrada_parar == HIGH) {

evento= EV_PARAR;

} elseelse {

ifif (estado == EST_RAFAGA_ENCENDIDO || estado == EST_RAFAGA_APAGADO) {

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

switchswitch (estado) {

casecase EST_INICIAL:

ifif (evento == EV_NINGUNO) {

apagar_led(); /* entry EN_ESPERA */

cuenta= 0; /* entry EN_ESPERA */

} /* endif */

breakbreak;

casecase EST_EN_ESPERA:

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

breakbreak;

casecase EST_RAFAGA_ENCENDIDO:

switchswitch (evento) {

Capítulo 2 Diseño de un sistema reactivo Taller de Domótica con Arduino

16

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

Taller de Domótica con Arduino Capítulo 2 Diseño de un sistema reactivo

17

breakbreak;

}

}

Capítulo 2 Diseño de un sistema reactivo Taller de Domótica con Arduino

18

Parte II

Escenarios de controldomótico

Esta página se ha dejado vacía a propósito

20

Capítulo 3

Control de un sistema demotorización depersianasEste documento describe un escenario en el que se va a utilizar una placa Arduino y diversossensores y actuadores para realizar la motorización y control automático de un sistema de per-sianas.

3.1 ObjetivosLos objetivos que se pretenden conseguir con este escenario de domótica son:

• Aprender a resolver un escenario de control complejo mediante un proceso de desarrolloincremental.

• Conocer y utilizar los sensores sin contacto basados en efecto Hall para la detección definales de carrera.

• Comprender y aplicar la estructura de un sistema reactivo al control automático de unsistema de motorización de persianas.

3.2 Lista de MaterialEl 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.

21

• 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 desarrolloEl 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 decontrol utilizado dentro del Arduino.

3.3.1 Control manualComo 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, dospulsadores y las correspondientes resistencias de pull-down.

Resultado esperadoAl 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. Denominaremos ARRIBAARRIBA y ABAJOABAJO a cada uno de los pulsadores y a las entradas utiliza-das por dichos pulsadores SUBIRSUBIRy BAJARBAJAR, respectivamente. Dichas entradas deberán ofrecer unvalor HIGHHIGH cuando el pulsador correspondiente esté pulsado. Para que el valor de la entrada seaLOWLOW cuando el pulsador esté libre se deberá utilizar una resistencia de pull-down para cada pulsa-dor.

Capítulo 3 Control de un sistema de motorización de persianas Taller de Domótica con Arduino

22

Figura 3.1 Resistencia de pull-down

Una vez realizado este montaje, vamos a realizar un programa que lea las entradas SUBIRSUBIRy BA-BA-

JARJARde los pulsadores y active dos salidas digitales del Arduino, que denominaremos SUBIENDOSUBIENDO

y BAJANDOBAJANDO. Una vez realizado el programa conectaremos las salidas SUBIENDOSUBIENDO y BAJANDOBAJANDO a lasentradas CH1CH1 y CH2CH2 de la placa de relés, respectivamente. Una vez alimentada la placa de relésadecuadamente, comprobaremos el correcto funcionamiento del montaje, es decir, que cuandoactivamos el pulsador ARRIBAARRIBA se active la entrada CH1CH1de la placa de relés (señalizado en la placade relés mediante el correspondiente led) y análogamente para el pulsador ABAJOABAJO y la entradaCH2CH2.

Comprobado el correcto funcionamiento del montaje de control manual, pasaremos a realizarlas conexiones finales. Para ello conectaremos la alimentación de los motores a la placa de relésuniendo el positivo de la fuente de alimentación a las dos entradas NCNCde los relés y el negativo alas dos entradas NONO. Finalmente, conectaremos las entradas del motor a cada una de las entradasCOMCOM de 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 siguientefigura se muestra un esquema de las conexiones de un relé.

Figura 3.2 Conexiones del relé

Finalmente comprobaremos que el comportamiento del sistema se correspondecon el resultado esperado. Denominaremos control-manualcontrol-manual al código de controldesarrollado en este apartado.

Taller de Domótica con Arduino Capítulo 3 Control de un sistema de motorización de persianas

23

3.3.2 Sensorización de la posición de la persianaEn este paso se van a añadir al sistema de motorización de persianas los oportunos sensores parala detección de los finales de carrera. Ello nos permitirá poder enviarle al sistema órdenes paraque suba o baje completamente la persiana.

Resultado esperadoAl 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 finalesde 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 colocadoen la parte baja de la persiana. De esta forma, se podrá detectar el paso de dicho imán mediantesensores 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 campomagné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 denominaremos FIN_ARRIBAFIN_ARRIBA y FIN_ABAJOFIN_ABAJO, yalimentaremos los sensores adecuadamente.

Una vez conectados los sensores, modificaremos el código control-manualcontrol-manual para que el motorde 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 carreray la implementación de estos en el código de control del motor, tan sólo resta por añadir que elmovimiento 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 nuevosestados, v.g. SUBIENDOSUBIENDO y BAJANDOBAJANDO. 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 estado PARADOPARADO.

Capítulo 3 Control de un sistema de motorización de persianas Taller de Domótica con Arduino

24

Finalmente comprobaremos que el comportamiento del sistema se correspondecon el resultado esperado. Denominaremos control-sensorizadocontrol-sensorizado al código decontrol desarrollado en este apartado.

3.3.3 Sistema de comunicaciones de controlSe 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 sistema de control por la consola serie y enviarleórdenes de movimiento a la persiana por la misma consola.

Resultado esperadoAl finalizar este ejercicio el sistema deberá informar a través de la consola serie delestado del mismo, es decir, PARADOPARADO, ABAJOABAJO, SUBIENDOSUBIENDO, ARRIBAARRIBAo BAJANDOBAJANDO. 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 de control-sensorizadocontrol-sensorizado desarrollado en el apartadoanterior el sistema de monitorización mediante mensajes por la consola serie. Para ello, tras ini-cializar la consola serie en setup()setup(), se enviará un mensaje con el nuevo estado del sistema cadavez éste cambie por la recepción de una orden (por consola o mediante los pulsadores) o debidoa 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 deordenes 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 persianaa bajar persianap parar

Se debe tener cuidado durante la lectura de las órdenes provenientes de la consolaserie 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.

Taller de Domótica con Arduino Capítulo 3 Control de un sistema de motorización de persianas

25

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. Deesta forma se minimiza considerablemente el esfuerzo de implementación de esta etapa y de lasampliaciones propuestas en las siguientes secciones.

Al añadir el soporte para las nuevas órdenes remotas también se deberá actualizar el sistema demonitorización con los mensajes correspondientes a dichas órdenes.

Finalmente comprobaremos que el comportamiento del sistema se correspondecon el resultado esperado. Denominaremos control-comunicacionescontrol-comunicacionesal código decontrol desarrollado en este apartado.

3.3.4 Control remotoSe 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 esperadoAl 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 segundaplacas 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 utilizarfunciones bloqueantes, que interfieran en el correcto funcionamiento del sistemade control

Al igual que en el ejercicio anterior, cuando se modifique el código control-comunicacionescontrol-comunicaciones

se sugiere que el código de lectura de las ordenes remotas genere los mismos eventos que se han

Capítulo 3 Control de un sistema de motorización de persianas Taller de Domótica con Arduino

26

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 demonitorización con los mensajes correspondientes a dichas órdenes.

Finalmente comprobaremos que el comportamiento del sistema se correspondecon el resultado esperado. Denominaremos control-remotocontrol-remoto al código de controldesarrollado en este apartado.

3.3.5 Control inteligenteEn este último ejercicio se propone añadir al control-remotocontrol-remotoun sistema de control inteligen-te que genere los eventos de abrir y cerrar la persiana en función de un conjunto de condicionesambientales.

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 bajela temperatura de un cierto umbral

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

Taller de Domótica con Arduino Capítulo 3 Control de un sistema de motorización de persianas

27

Esta página se ha dejado vacía a propósito

28

Capítulo 4

Control de un sistema demotorización de puertasEste documento describe un escenario en el que se va a utilizar una placa Arduino y diversossensores y actuadores para realizar la motorización y control automático de un sistema de aper-tura de puertas.

4.1 ObjetivosLos objetivos que se pretenden conseguir con este escenario de domótica son:

• Aprender a resolver un escenario de control complejo mediante un proceso de desarrolloincremental.

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

29

• 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 desarrolloEl 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 decontrol utilizado dentro del Arduino.

4.3.1 Control manualComo 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á unArduino, dos pulsadores y las correspondientes resistencias de pull-down.

Resultado esperadoAl 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. Denominaremos APERTURAAPERTURA y CIERRECIERRE a cada uno de los pulsadores y a las entradas utili-zadas por dichos pulsadores ABRIRABRIRyCERRARCERRAR, respectivamente. Dichas entradas deberán ofrecerun valor HIGHHIGH cuando el pulsador correspondiente esté pulsado. Para que el valor de la entra-da sea LOWLOW cuando el pulsador esté libre se deberá utilizar una resistencia de pull-down para cadapulsador.

Figura 4.1 Resistencia de pull-down

Una vez realizado este montaje, vamos a realizar un programa que lea las entradas ABRIRABRIRy CE-CE-

RRARRRARde los pulsadores y active dos salidas digitales del Arduino, que denominaremos ABRIEN-ABRIEN-

Capítulo 4 Control de un sistema de motorización de puertas Taller de Domótica con Arduino

30

DODO y CERRANDOCERRANDO. Una vez realizado el programa conectaremos las salidas ABRIENDOABRIENDO y CERRANDOCERRANDO

a una de las entradas de cada uno de los final de carrera por contacto. La función de estos finalesde 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 delconmutador (la izquierda en la figura) y salir por el cable negro (la derecha en la figura) haciauna de las entradas CH1CH1 o CH2CH2de la placa de relés. En el momento en que la puerta llegue al finalde carrera correspondiente y presione el conmutador, la señal de control se redirigirá a la salidacentral del conmutador, quedando el canal de entrada de la placa de relés al aire y parando elmotor (las placas de relés suelen llevar incorporada una resistencia del pull-down en las entradasde 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 control ABRIENDOABRIENDO y CERRANDOCERRANDO a los finales de carrera y la sa-lida a los canales CH1CH1 y CH2CH2 de 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 lospulsadores ABRIRABRIR y CERRARCERRAR y viendo que se activa la entrada CH1CH1 o CH2CH2 de 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, quecon 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 realizarlas conexiones finales. Para ello conectaremos la alimentación de los motores a la placa de relésuniendo el positivo de la fuente de alimentación a las dos entradas NCNCde los relés y el negativo alas dos entradas NONO. Finalmente, conectaremos las entradas del motor a cada una de las entradas

Taller de Domótica con Arduino Capítulo 4 Control de un sistema de motorización de puertas

31

COMCOM de 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 siguientefigura 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 ala placa de relés coincide con las conexiones a través de los finales de carrera, con elobjetivo 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 correspondecon el resultado esperado. Denominaremos control-manualcontrol-manual al código de controldesarrollado en este apartado.

4.3.2 Sensorización de la posición de la puertaEn 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 esperadoAl 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 yactivando 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 decada conmutador a sendas entradas digitales del Arduino que denominaremos FIN_ABIERTOFIN_ABIERTOyFIN_CERRADOFIN_CERRADO. Se deberá utilizar una resistencia de pull-down para poder leer un valor LOWLOW 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 unled, distinto en cada caso, mediante unas nuevas salidas digitales del Arduino que denominare-mos LED_ABIERTOLED_ABIERTOy LED_CERRADOLED_CERRADO.

Capítulo 4 Control de un sistema de motorización de puertas Taller de Domótica con Arduino

32

Cuando se haya comprobado el correcto funcionamiento de la detección de los finales de carreray 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.ABRIENDOABRIENDO y CERRANDOCERRANDO. En dichos estados, la puerta seguirá moviéndose hasta alcanzar el finalde carrera, pasando en ese momento a uno de los nuevos estados ABIERTAABIERTAo CERRADACERRADA. Si duranteel movimiento el usuario pulsa el botón de la dirección contraria el motor se deberá parar y pa-sar al estado PARADAPARADA.

En los estados ABIERTAABIERTA o CERRADACERRADA, la señal de control correspondiente, ABRIENDOABRIENDO o CERRANDOCERRANDO,deberá desactivarse. Ello desactivará a su vez la señal de entrada del final de carrera,FIN_ABIERTOFIN_ABIERTO o FIN_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ónde dichos leds esté asociada al estado ABIERTAABIERTA o CERRADACERRADAy no a las señales de fin de carrera.

Finalmente comprobaremos que el comportamiento del sistema se correspondecon el resultado esperado. Denominaremos control-sensorizadocontrol-sensorizado al código decontrol desarrollado en este apartado.

4.3.3 Sistema de comunicaciones de controlSe 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 sistema de control por la consola serie y enviarleórdenes de movimiento a la puerta por la misma consola.

Resultado esperadoAl finalizar este ejercicio el sistema deberá informar a través de la consola serie delestado 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 pararla puerta. El sistema de control mediante pulsadores deberá seguir funcionan con norma-lidad.

Inicialmente vamos a añadir al código de control-sensorizadocontrol-sensorizado desarrollado en el apartadoanterior el sistema de monitorización mediante mensajes por la consola serie. Para ello, tras ini-cializar la consola serie en setup()setup(), se enviará un mensaje con el nuevo estado del sistema cadavez éste cambie por la recepción de una orden (por consola o mediante los pulsadores) o debidoa 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.

Taller de Domótica con Arduino Capítulo 4 Control de un sistema de motorización de puertas

33

Una vez implementado y probado el sistema de monitorización, vamos a añadir un sistema deordenes 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 puertaw abrir puertap parar

Se debe tener cuidado durante la lectura de las órdenes provenientes de la consolaserie 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. Deesta 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 demonitorización con los mensajes correspondientes a dichas órdenes.

Finalmente comprobaremos que el comportamiento del sistema se correspondecon el resultado esperado. Denominaremos control-comunicacionescontrol-comunicacionesal código decontrol desarrollado en este apartado.

4.3.4 Control remotoSe pretende añadir un sistema de control remoto a nuestro sistema de control de puertas. En estecaso, las órdenes podrán llegar desde uno de los sistemas de comunicaciones elegidos.

Resultado esperadoAl 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 segundaplacas Arduino.

Capítulo 4 Control de un sistema de motorización de puertas Taller de Domótica con Arduino

34

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 utilizarfunciones bloqueantes, que interfieran en el correcto funcionamiento del sistemade control

Al igual que en el ejercicio anterior, cuando se modifique el código control-comunicacionescontrol-comunicaciones

se sugiere que el código de lectura de las ordenes remotas genere los mismos eventos que se hanutilizado 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 demonitorización con los mensajes correspondientes a dichas órdenes.

Finalmente comprobaremos que el comportamiento del sistema se correspondecon el resultado esperado. Denominaremos control-remotocontrol-remoto al código de controldesarrollado en este apartado.

4.3.5 Control inteligenteEn este último ejercicio se propone añadir al control-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, comoson 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 sensorde 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 seestá 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.

Taller de Domótica con Arduino Capítulo 4 Control de un sistema de motorización de puertas

35

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

Capítulo 4 Control de un sistema de motorización de puertas Taller de Domótica con Arduino

36

Capítulo 5

Control de un sistema deiluminaciónEste 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 ObjetivosLos objetivos que se pretenden conseguir con este escenario de domótica son:

• Aprender a resolver un escenario de control complejo mediante un proceso de desarrolloincremental.

• 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 MaterialEl 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.• Sensor de consumo para detectar el estado de las luces.

37

• Sistema de control remoto: infrarrojos, bluetooth o radio frecuencia.

5.3 Etapas del desarrolloEl 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 decontrol utilizado dentro del Arduino.

5.3.1 Control manualComo 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, unpulsador y las correspondientes resistencias de pull-down.

Resultado esperadoAl finalizar este ejercicio el sistema deberá permitir encender las luces mientras elpulsador 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-nominaremos LUZLUZ al pulsador y ACTIVARACTIVAR a la entrada a la que esté conectado. Dicha entrada de-berá ofrecer un valor HIGHHIGH cuando el pulsador esté pulsado. Para que el valor de la entrada seaLOWLOW cuando 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 denominaremosCONMUT_1CONMUT_1y CONMUT_2CONMUT_2. Cuando ACTIVARACTIVAR esté a HIGHHIGH, pondremos CONMUT_1CONMUT_1 a HIGHHIGHy CONMUT_2CONMUT_2

a LOWLOW . Cuando ACTIVARACTIVAR esté a LOWLOW, pondremos CONMUT_1CONMUT_1 a LOWLOW y CONMUT_2CONMUT_2 a HIGHHIGH. Se muestrauna resumen de la correspondencia de los valores en la siguiente tabla.

Capítulo 5 Control de un sistema de iluminación Taller de Domótica con Arduino

38

ACTIVARACTIVAR CONMUT_1CONMUT_1 CONMUT_2CONMUT_2

HIGH HIGH LOW

LOW LOW HIGH

Una vez realizado el programa conectaremos la salida CONMUT_1CONMUT_1 a la entrada IN1IN1 de la placa decontrol de motores y CONMUT_2CONMUT_2 a la entrada IN2IN2. Con ello podremos controlar la polaridad a lassalidas de MOTORAMOTORA. De momento, la entrada ENAENA del motor AA la conectaremos a +5v+5v en la placaArduino.

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+5v y GNDGND (pi-nes amarillos) a la placa Arduino y VMSVMS y GNDGND (terminales de tornillo azules) a la alimentacióndel 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 pulsador LUZLUZ se activen los leds L1L1 o L2L2

(pero no ambos) en la placa de motores, señalizando así la dirección de la polaridad de salida deMOTORAMOTORA.

Comprobado el correcto funcionamiento del montaje de control manual, pasaremos a realizarlas conexiones finales. Para ello conectaremos las entradas de la bombilla con los cables rojo yamarillo a cada una de las salidas de MOTORAMOTORA y el cable negro a la entrada GNDGND de los terminalesde tornillo azules o al negativo de la fuente de alimentación.

Taller de Domótica con Arduino Capítulo 5 Control de un sistema de iluminación

39

Dado que la estructura de la bombilla tiene incorporado un conmutador, puededarse 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 correspondecon el resultado esperado. Denominaremos control-manualcontrol-manual al código de controldesarrollado en este apartado.

5.3.2 Control conmutadoEl siguiente paso será modificar el control de iluminación, para que el estado de luz conmutecon cada pulsación.

Resultado esperadoAl finalizar este ejercicio el sistema de iluminación deberá cambiar de encendido aapagado y viceversa con cada pulsación del botón LUZLUZ.

El primer paso es modificar la lógica de control para que el Arduino detecto los flancos desubida del pulsador (paso de LOWLOW a HIGHHIGH) en vez del valor fijo HIGHHIGH.

En segundo lugar se definirá una variable conmutadorconmutador (con valores 00 o 11) que mantendrá el es-tado del conmutador lógico implementado por el Arduino y que cambiará su valor con cadaflanco de subida detectado en el pulsador LUZLUZ. Los valores de las salidas CONMUT_1CONMUT_1 y CONMUT_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 conmutador externo.

Finalmente comprobaremos que el comportamiento del sistema se correspondecon el resultado esperado. Denominaremos control-conmutadocontrol-conmutado al código de con-trol desarrollado en este apartado.

5.3.3 Sensorización del estado del sistema de iluminaciónEn este paso se va a añadir al sistema de iluminación un sistema de monitorización de su estadoque permita determinar si la luz está encendida o apagada.

Capítulo 5 Control de un sistema de iluminación Taller de Domótica con Arduino

40

Resultado esperadoAl 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 elpulsador LUZLUZ o mediante el conmutador externo.

Para realizar la detección del estado de la iluminación utilizaremos un sensor de consumo paramonitorizar la actividad de la fuente de alimentación. Dado que las bombillas utilizadas hastaeste 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 parapoder calibrar el consumo de corriente alterna del sistema con la luz encendida y apagada. Paraello se utilizará el código de ejemplo suministrado por el fabricante del sensor y se escribirán losvalores obtenidos en la consola serie (o por la pantalla LCD).

Una vez calibrado el sistema, se obtendrá el valor intermedio de ambos consumos como valorde corte y se modificará la lógica de control y el montaje para que encienda un led, que deno-minaremos TESTIGOTESTIGO, 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 decomo se haya cambiado el estado de las luces (pulsador o conmutador externo).

Finalmente comprobaremos que el comportamiento del sistema se correspondecon el resultado esperado. Denominaremos control-sensorizadocontrol-sensorizado al código decontrol desarrollado en este apartado.

5.3.4 Sistema de iluminación reguladaSe va a incorporar al control-sensorizadocontrol-sensorizado un mecanismo que permita controlar la intensi-dad del sistema de iluminación mediante un sensor rotatorio.

Resultado esperadoAl 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 estimar 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 laluz, 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 denominaremos POTENCIAPOTENCIA. El valor obtenido de dicho sensor, una vezmapeado al rango 0-2550-255, se utilizará para generar una onda PWM, mediante la función

Taller de Domótica con Arduino Capítulo 5 Control de un sistema de iluminación

41

analogWrite()analogWrite(), que se aplicará a través de una nueva salida que denominaremos INTENSIDADINTENSIDAD

a la entrada ENAENA (pines amarillos) de la placa de motores, sustituyendo así la conexión a +5v+5vquese 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 intensidadestá 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 elsistema 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 laconsola cada vez que éste cambie.

La iluminación del led TESTIGOTESTIGOpasará a estar activa a partir de un porcentaje de intensidad del10 %. Modifíquese la lógica de control para que se tenga en cuenta este nuevo umbral.

Finalmente comprobaremos que el comportamiento del sistema se correspondecon el resultado esperado. Denominaremoscontrol-reguladocontrol-reguladoal código de controldesarrollado en este apartado.

5.3.5 Sistema de comunicaciones de controlSe 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 esperadoAl finalizar este ejercicio el sistema deberá aceptar órdenes desde la consola seriepara encender, apagar, aumentar intensidad o reducir intensidad de las luces. El

sistema de control mediante el pulsador y el sensor rotatorio deberá seguir funcionan connormalidad.

Inicialmente vamos a añadir al código de control-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 en setup()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 deordenes 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:

Capítulo 5 Control de un sistema de iluminación Taller de Domótica con Arduino

42

Carácter Acción a realizar

0 apagar1 encenderq más intensidad (+ 10%)a menos intensidad (- 10%)

Se debe tener cuidado durante la lectura de las órdenes provenientes de la consolaserie 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 implementación de esta etapa y de lasampliaciones 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 unavez modificada la intensidad mediante las ordenes enviadas por la consola serie, la intensidadalmacenada 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 demonitorización con los mensajes correspondientes a dichas órdenes.

Finalmente comprobaremos que el comportamiento del sistema se correspondecon el resultado esperado. Denominaremos control-comunicacionescontrol-comunicacionesal código decontrol desarrollado en este apartado.

5.3.6 Control remotoSe 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 esperadoAl 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 laconsola 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:

Taller de Domótica con Arduino Capítulo 5 Control de un sistema de iluminación

43

1. Mando a distancia por infrarrojos y receptor. O receptor y emisor desde una segundaplacas 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 utilizarfunciones bloqueantes, que interfieran en el correcto funcionamiento del sistemade control

Al igual que en el ejercicio anterior, cuando se modifique el código control-comunicacionescontrol-comunicaciones

se sugiere que el código de lectura de las ordenes remotas genere los mismos eventos que se hanutilizado 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 demonitorización con los mensajes correspondientes a dichas órdenes.

Finalmente comprobaremos que el comportamiento del sistema se correspondecon el resultado esperado. Denominaremos control-remotocontrol-remoto al código de controldesarrollado en este apartado.

5.3.7 Control inteligenteEn este último ejercicio se propone añadir al control-remotocontrol-remotoun sistema de control inteligen-te que genere los eventos de abrir y cerrar la persiana en función de un conjunto de condicionesambientales.

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

Capítulo 5 Control de un sistema de iluminación Taller de Domótica con Arduino

44

• 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 iluminación.

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

Taller de Domótica con Arduino Capítulo 5 Control de un sistema de iluminación

45