Functiodomo-Sistema de automatización del hogar (domótica) sin cables

Esquema de la placa de potencia. Parte 2.

En esta entrada aparece explicado el esquema final de la placa de control functiodomo. El esquema es el siguiente:

Resumiendo la entrada publicada, podemos ver en el esquema:

  • conector J4 para entrada y salida de conexiones AC, donde se encuentran la alimentación AC, la salida AC al equipo, la señal del interruptor manual y la salida AC al transformador;
  • conectores J1, J2, J4 relacionados con el retorno de la alimentación tras su paso por el transformador, y su salida para la alimentación de las placas de control y comunicaciones;
  • conectores J6, J7, J8 y J9, colocados para permitir una mayor facilidad a la hora de acoplar sensores al conjunto;
  • conector J5 que contiene todas las entradas y salidas relacionadas con el control del estado de los relés y la detección del estado del interruptor.

Las zonas de la placa se puede clasificar en:

  • relé LS1 (NC) que controla si el equipo se controla en modo manual o remoto;
  • relé LS2 (NA) que determina el estado (conectado o no) del modo remoto;
  • U1 componentes relacionados con la detección del estado del interruptor.

En la entrada del blog está todo más extensamente explicado y se puede ver también el esquema del diseño de pistas y el BOM correspondiente a los componentes de la placa.

Por cierto, ¿alguien podría decirme si se puede reducir el tamaño de la imagen que se publica en el foro? Como se puede ver, yo no lo sé, pero creo que escalándola un poco sería mucho más agradable de ver...

Hola,

En primer lugar felicitarte por tu trabajo, me parece muy interesante. Tengo algunas dudillas con respecto al apartado de la placa en la cual segun explicas detecta el estado del interruptor. No entiendo esa parte. Podrias explicarla un poco mas?

Gracias por anticipado.

Un saludo a todos

cacharreante:
Hola,

En primer lugar felicitarte por tu trabajo, me parece muy interesante. Tengo algunas dudillas con respecto al apartado de la placa en la cual segun explicas detecta el estado del interruptor. No entiendo esa parte. Podrias explicarla un poco mas?

Gracias por anticipado.

Un saludo a todos

Hola cacharreante. Lo primero gracias por estar interesado en el proyecto. Eso cuanto menos es gratificante.

En cuanto a lo que preguntas, el concepto sobre cómo detectar el estado del interruptor manual (el interruptor que controla directamente el equipo sobre el que se instala en conmutador remoto) es básicamente un relé por cuya "bobina" pasaría corriente (AC) cuando el interruptor manual estuviese conectado, cambiando el estado del otro lado del "relé", lado en el que pasa la corriente suministrada desde uno de los pines digitales de arduino. Básicamente, su comportamiento es el siguiente:

a) interruptor manual en modo apagado -> no pasa corriente por la "bobina del relé"->"relé" Normalmente Abierto->la corriente suministrada por el pin digital de arduino no llega a ninguna parte.

b) interruptor manual en modo encendido-> pasa corriente por la "bobina"->"relé" cierra el circuito DC->la corriente suministrada por el pin digital de arduino llega a un pin de arduino en modo lectura.

Leyendo el valor de ese pin de entrada de arduino, puedo determinar, mediante la programación del chip, si el interruptor manual esta conectado o no, independientemente del estado en el que esté funcionando el conjunto. Además, al detectar un cambio en el estado del interruptor, por software igualmente, cambio el estado de todo el conjunto y lo paso a modo manual, motivo por el cual, el modo manual tiene preferencia sobre el remoto.

Bueno, éste era el concepto, pero a la hora de diseñar la placa final no se podía utilizar un relé para esto, por lo que se sustituyó por el circuito que forman los componentes D2, U1, R2 del esquema.

Lamento no poder ser más preciso con la terminología, pues con los componentes electro-electrónicos me defiendo para saber para lo que sirven, pero no tanto con su denominación. Es el problema de tener formación mecánica y no eléctrica . :~

Bueno, después de unas semanas un poco complejas, esta vez sí que voy a tratar de sacar tiempo para publicar las entradas restantes para completar el proyecto de documentación.

En los próximos días publicaré los artículos correspondientes a la conexión entre placas, la programación de arduino y la programación del sistema de control en el ordenador para su comunicación con los componentes del sistema.

Nos leemos.

Conectividad eléctrica entre placas del sistema functiodomo.
http://functionars.com/functiodomo_wp/?p=93

En esta entrada explico la conexión entre el sistema a controlar y el conjunto del conmutador remoto, así como su "autoalimentación" de los cables propios del sistema.

También detallo la ruta que sigue la alimentación por las diferentes placas que componen el conmutador remoto

Su esquema de conexión es el siguiente:

Para tener la información completa de la conectividad entre placas falta únicamente la comunicación de datos entre la placa de potencia y la placa de control, detalles que explicaré en la próxima entrada del blog.

hola castillo14, he estado mirando tu trabajo y muy buena presentacion, asi mirandolo por encima me preguntaba el porque poner la diferenciación de estados, ya que sabiendo el estado del interruptor, pongamos que esta a ON y nos conectamos remotamente y ponemos OFF, no seria mas facil que el arduino compare el estado del pulsador y cambie el solo a estado remoto y si en remoto le pones otra vez a ON se cambie el solo a Manual, y no tengas tu que andar que si ahora manual que si ahora remoto. Tal vez me haya columpiado pero en el caso de montarlo yo me gustaria hacer los menos pasos posibles, seria posible hacerlo??, o lo has intentado y tiene que ser como dices???
Un saludo y felicidades por tu aportación al foro.

riscking:
hola castillo14, he estado mirando tu trabajo y muy buena presentacion, asi mirandolo por encima me preguntaba el porque poner la diferenciación de estados, ya que sabiendo el estado del interruptor, pongamos que esta a ON y nos conectamos remotamente y ponemos OFF, no seria mas facil que el arduino compare el estado del pulsador y cambie el solo a estado remoto y si en remoto le pones otra vez a ON se cambie el solo a Manual, y no tengas tu que andar que si ahora manual que si ahora remoto. Tal vez me haya columpiado pero en el caso de montarlo yo me gustaria hacer los menos pasos posibles, seria posible hacerlo??, o lo has intentado y tiene que ser como dices???
Un saludo y felicidades por tu aportación al foro.

Hola risking:

A nivel de interface no hay problema en mostrar sólo el estado encendido o apagado. Como es una aplicación web se puede adaptar. De hecho tengo tengo algún otro modelo más de interface adaptado a pocos elementos y otro en el que no aparezca la ventana de encendido/apagado, sino que simplemente cambie de estado al pulsar el botón.

A nivel de hardware sí que se ha de mantener la diferenciación de encendido/apagado manual y encendido/apagado remoto, pues en el estado manual utilizo directamente la señal proveniente del interruptor, para minimizar el consumo del conmutador remoto.

Hola castillo14 a ver si me compro una ethernet shiel para probar, a mi me gustaria probar a programar la web en ajax,jquery o similar para q no haga falta refrescar la pagina cada vez que hay un cambio de estado, has probado tu algo de esto? Alguna ethernet shiel q recomiendes? O son todas parecidas?

riscking:
Hola castillo14 a ver si me compro una ethernet shiel para probar, a mi me gustaria probar a programar la web en ajax,jquery o similar para q no haga falta refrescar la pagina cada vez que hay un cambio de estado, has probado tu algo de esto? Alguna ethernet shiel q recomiendes? O son todas parecidas?

Yo no utilizo ninguna ethernet shield en mi sistema ya que la comunicación la realizo por XBee. Si te sirve la información, yo la placa que uso es la siguiente:
http://www.cooking-hacks.com/index.php/shop/arduino/wireless/communication-shield-xb-bt-rfid.html

Cuando yo me comunico con las placas, no lo hago con una dirección IP, sino que utilizo una codificación tal que cuando una placa detecta que hace referencia a ella, se pone en modo "escucha" y ejecuta la acción que contiene la orden. Peferí utilizar una codificación específica porque así hacía independiente el equipo a controlar del chip de comunicación, el equipo está vinculado a la programación del chip arduino.

De todas formas, en los próximos días publicaré el código que he programado también.

En cuanto a la programación de la aplicación web con Ajax, esa es la forma que he seleccionado yo también para hacerlo (mejor o peor según los gustos). El núcleo del sistema es PHP+MySQL (aunque tengo que ver si no me conviene más usar SQLite) y el interface pues HTML+CSS.
Ventajas de esta arquitectura: funciona hasta en una bicicleta si tiene navegador de internet. Desventajas: Con entornos concretos (lease android, ios...) la transmisión de datos es menor pues no tendrás que transmitir las imágenes, pero por contra tienes que desarrollar una aplicación específica para cada plataforma.

Ventajas de esta arquitectura: funciona hasta en una bicicleta si tiene navegador de internet. Desventajas: Con entornos concretos (lease android, ios...) la transmisión de datos es menor pues no tendrás que transmitir las imágenes, pero por contra tienes que desarrollar una aplicación específica para cada plataforma.

No entendí la parte de la desventaja, se supone que si tenemos un interfaz web la cual contiene los módulos que se comunican con los actuadores.. esta puede ser accesada vía web desde cualquier plataforma no?

Enritux:

Ventajas de esta arquitectura: funciona hasta en una bicicleta si tiene navegador de internet. Desventajas: Con entornos concretos (lease android, ios...) la transmisión de datos es menor pues no tendrás que transmitir las imágenes, pero por contra tienes que desarrollar una aplicación específica para cada plataforma.

No entendí la parte de la desventaja, se supone que si tenemos un interfaz web la cual contiene los módulos que se comunican con los actuadores.. esta puede ser accesada vía web desde cualquier plataforma no?

La desventaja está en la rapidez del interface.
Con una aplicación web, el código tanto de las órdenes como del interfaz se envían desde el servidor, incluidas las imágenes que dan forma al aspecto de la aplicación

Con la aplicación específica de la plataforma móvil (lease androis o ios) todo el código e imágenes de la interfaz están almacenadas en el dispositivo móvil, con lo que sólo se transmiten los datos correspondientes a las órdenes que se envían desde/hacia el teléfono hasta/desde el servidor. El flujo de datos es menor y la velocidad del interfaz en mayor. Se eliminan los tiempos de carga del interfaz.

Para mí el núcleo del sistema siempre se trata de una aplicación web, en mi caso en PHP por cuestiones de portabilidad y documentación existente, pero para el interfaz se puede valorar qué es mejor, si rapidez y exclusividad, o por el otro lado, universalidad y un interfaz menos rápido.

Antes que nada dejame felicitarte, se ve increible Fuctiodomo, y te queria hacer una pregunta, como logras hacer el live streaming (tan fluido), to estoy intentando hacer un control de una webcam, pero me he estado dando de topes con el streaming, no consigo hacerlo fluido, me podrias hechar una mano con eso?..

de antemano gracias y denuevo esta increible...

eyoZ07:
Antes que nada dejame felicitarte, se ve increible Fuctiodomo, y te queria hacer una pregunta, como logras hacer el live streaming (tan fluido), to estoy intentando hacer un control de una webcam, pero me he estado dando de topes con el streaming, no consigo hacerlo fluido, me podrias hechar una mano con eso?..

de antemano gracias y denuevo esta increible...

El vídeo lo grabé haciendo un screencast de la pantalla del portátil desde donde interactuaba con el sistema. El portátil cliente y el servidor LAMP que contiene el sistema domótico estaban en la misma red wifi. En cuanto al programa de grabación, no recuerdo si usé Record My Destop o Istambul, pero seguro que fue uno de los dos, el que me fuera más sencillo de usar.

Hola que tal Castillo14, tengo el Arduino Uno R3 conectado con una USB a una maquina con Ubuntu y Xampp...

Al hacer las pruebas por el monitor serial del arduino todo funciona correctamente sin embargo
al quererle enviar los valores al arduino con la libreria php_serial.class.php no lo hace...

Podrías decirme si le hiciste alguna configuracion en el apache?.. ya que tampoco en windows logro hacerlo andar.

<?php

require ("php_serial.class.php");

$serial = new phpSerial();

$serial->deviceSet("/dev/ttyACM0");

$serial->confBaudRate(9600);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->confFlowControl("none");

$serial->deviceOpen();

$serial->sendMessage('A');

$serial->deviceClose();
?>

Enritux:
Hola que tal Castillo14, tengo el Arduino Uno R3 conectado con una USB a una maquina con Ubuntu y Xampp...

Al hacer las pruebas por el monitor serial del arduino todo funciona correctamente sin embargo
al quererle enviar los valores al arduino con la libreria php_serial.class.php no lo hace...

Esta noche o mañana voy a publicar una entrada con el método que uso para comunicarme con arduino a través de PHP.

eyoZ07 también está teniendo problemas y creo que la solución que encontré es mucho más sencilla de lo que estáis intentando.

En un rato me pongo a ello.

Esta noche o mañana voy a publicar una entrada con el método que uso para comunicarme con arduino a través de PHP.

eyoZ07 también está teniendo problemas y creo que la solución que encontré es mucho más sencilla de lo que estáis intentando.

En un rato me pongo a ello.

Gracias..! una manera que me funcionó para conectarme al Arduino fue haciendo librerias en python las cuales son llamadas desde PHP...

Tambien intente con el comando exec pero auditando la velocidad de comunicacion me di cuenta que es mas rapido con python...

Estaré al tanto de tu entrada! :smiley:

Comunicación con Arduino a través de un servidor PHP.

En este artículo explico como nos comunicamos entre el ordenador principal y cada uno de los nodos Arduino mediante instrucciones escritas en PHP.

Como aparece más detallado en el artículo, un punto importante de nuestro método es que la selección de nodo activo no se hace mediante direcciones IP, sino que aprovechando que en las redes Zigbee, todas las órdenes pasan por todos los nodos, debido a su configuración tipo malla, la selección de a qué nodo se dirige una orden la hacemos mediante programación en la propia placa Arduino.

Esta técnica tiene como ventajas:

  • La programación es muy sencilla, tanto en PHP como en Arduino.
  • Los nodos son independientes de los chips Xbee que les comunican con el sistema central. Aunque lo recomendable es saber qué chip XBee acompaña a cada nodo Arduino, los chips Xbee son perfectamente intercambiables entre ellos, ya que la selección del nodo no la hace su dirección de red, sino la propia placa Arduino

También tiene sus desventajas, siendo la principal que esta técnica obliga a tener la placa Arduino siempre conectada, no permitiendo técnicas de ahorro de energía (manteniéndola apagada mientras no llegue una orden), aunque como en nuestro caso los nodos no van a estar alimentados por baterías, este factor no es tan crítico.

Como ejemplos de comunicación PHP-Arduino sobre red Xbee, nuestra programación es la siguiente:

  • para el servidor PHP:

enviar_instrucción_M_al_nodo_a.php

<HTML> 
<BODY> 
<?php 
// apertura del fichero de escritura a través del puerto serie ttyUSB0
$fp =fopen("/dev/ttyUSB0", "w"); 
// escritura de la instrucción aM
fwrite($fp, aM); 
// cierre del fichero
fclose($fp); 
?> 
<p>Envío de la instrucción M a la placa a</p> 

 

 
<a href="../control_por_zonas/index_plata_zonas.html" title="Orden enviada">vuelta a control por zonas</a> 
</BODY> 
</HTML>

En cuanto a la programación de la placa Arduino, el código necesario es el siguiente:

ectura_ordenes_PHP.pde

/* Modificación del programa SwitchCase2 de la librería de ejemplos de Arduino 
Programa original creado por Tom Igoe el 1 de julio de 2009 
Programa mofificado por José Antonio Castillo Rodríguez el 15 de abril de 2010 
A continuación el texto informativo original de Tom Igoe: 
-- Switch statement with serial input 
-- 
-- Demonstrates the use of a switch statement. The switch 
-- statement allows you to choose from among a set of discrete values 
-- of a variable. It's like a series of if statements. 
-- 
-- To see this sketch in action, open the Serial monitor and send any character. 
-- The characters a, b, c, d, and e, will turn on LEDs. Any other character will turn 
-- the LEDs off. 
-- 
-- The circuit: 
-- * 5 LEDs attached to digital pins 2 through 6 through 220-ohm resistors 
-- 
-- created 1 Jul 2009 
-- by Tom Igoe 
-- 
-- http://www.arduino.cc/en/Tutorial/SwitchCase2 
-- 
Modificaciones realizadas por José Antonio Castillo Rodríguez: 
+ pin actuable para control de estado manual modificables por variable (asignaPinAlimentacion) 
+ pin actuable para alimentación sensor modificables por variable (alimenSensor) 
+ 
+ cambio en los caracteres de control; nomenclatura de acciones: 
+ M -> activa el pin que alimenta el detector de estado manual; N -> desactiva el pin que alimenta el detector de estado manual 
+ OTRO VALOR -> envía una señal de error a través del puerto serie 
+ 
+ "a","b","c"... selecciona la placa como activa para poder recibir la siguiente orden; valor de activación definido por variable (selecPlaca) 
+ 
+ el pin de lectura del cambio de estado manual esta definido por variable (remotoPin) 
+ 
*/ 
// VARIABLE DE SELECCIÓN DE PLACA 
int inByte = 0; // almacena la lectura del puerto serie 
int selecPlaca = 'a'; // CTE-valor ante el CUAL se activa la placa en modo escucha 
boolean placaActiva = false; // indica si la placa está en modo escucha o no 
// VARIABLES RELATIVAS AL PIN 13 DE ARDUINO-UTILIZADO PARA LA COMPROBACIÓN DEL ESTADO MANUAL 
int asignaPinAlimentacion = 13; // CTE-indica el pin de la placa que alimenta el comprobador de estado manual 
boolean estadoPinAlimentacion = true; // encendido/apagado del pin que alimenta el comprobador de estado manual 
int remotoPin = 12; // CTE-selecciona el pin de entrada para comprobar cambios en el modo manual 
int remotoCambio = 0; // inicialización de la variable para leer en pin del cambio de estado manual 
boolean estadoManual = false; // indica el estado del control manual (false-> apagado manual; true-> encendido manual) 
boolean estadoManualPrevio = false; // almacena el estado del control manual en el ciclo anterior (false-> apagado manual; true-> encendido manual) 

void setup() { 
// initialize serial communication: 
Serial.begin(9600); 
// inicialización de los pines 
pinMode(asignaPinAlimentacion, OUTPUT); 
pinMode(remotoPin, INPUT); 
} 

void loop() { 
// comenzamos con el pin 13 encendido 
if (estadoPinAlimentacion == true) { 
digitalWrite(asignaPinAlimentacion, HIGH); 
} 
// lectura de la señal serie 
if (Serial.available() > 0) { 
int inByte = Serial.read(); 
if (placaActiva == true) { // si la placa está en modo activo pasa a actuar dependiendo de la lectura del valor de inByte 
switch (inByte) { 
// desconectar el pin 13 que alimenta al analógico 
// "N" desactiva el pin, "M" lo vuelve a activar 
case 'N': 
digitalWrite(asignaPinAlimentacion, LOW); 
estadoPinAlimentacion = false; 
// hay que enviar por serie el código "'placa'13OFF" 
Serial.print(selecPlaca, BYTE); 
Serial.print('1', BYTE); 
Serial.print('3', BYTE); 
Serial.print('O', BYTE); 
Serial.print('F', BYTE); 
Serial.print('F', BYTE); 
Serial.print(","); 
break; 
case 'M': 
digitalWrite(asignaPinAlimentacion, HIGH); 
estadoPinAlimentacion = true; 
// hay que enviar por serie el código "'placa'13ON" 
Serial.print(selecPlaca, BYTE); 
Serial.print('1', BYTE); 
Serial.print('3', BYTE); 
Serial.print('O', BYTE); 
Serial.print('N', BYTE); 
Serial.print(","); 
break; 
default: //cualquier otro valor leido envía señal de error 
// hay que enviar por serie el código "'placa'13err" 
Serial.print(selecPlaca, BYTE); 
Serial.print('1', BYTE); 
Serial.print('3', BYTE); 
Serial.print('e', BYTE); 
Serial.print('r', BYTE); 
Serial.print('r', BYTE); 
Serial.print(","); 
} 
} 
// caso que la placa esté en modo activo, se vuelve a modo escucha tras 
// haber ejecutado la orden correspondiente 
if (placaActiva == true) { 
placaActiva = false; 
} 
//******** SELECCIÓN DE LA PLACA *************************** 
//********************************************************************* 
// si la variable inByte se corresponde con la letra de la placa (la asignada a la variable selecPlaca en este caso) 
// la placa se pone en modo activo 
if (inByte == selecPlaca) { 
placaActiva = true; 
} 
} 
}

Con estos dos códigos, nos permirtirán activar el pin 13 cuando enviemos la orden "aM" (nodo "a"+orden "M") y desactivarlo cuando enviémos la orden "aN".

Todo este proceso de comunicación está basado en la información publicada en los siguientes enlaces:
Control de Arduino utilizando PHP:

http://www.mydarkmaterials.co.uk/2008/11/30/interfacing-php-with-the-arduino/

Configuración de Zigbee:
http://ladyada.net/make/xbee/arduino.html

Software de configuración de los chips Xbee:

Bueno, después de unas semanas en las que mis publicaciones realizadas sobre el sistema "functiodomo" habían decaído exponencialmente, puedo anunciar que a partir de la próxima semana esto cambiará, con lo que haré pública el resto de documentación (interconexiones, programación, evoluciones...) del proyecto.

La razón del parón que sufrieron las publicaciones es que me anunciaron que el proyecto "functiodomo" había sido preseleccionado entre los finalistas del concurso EmprendeGo, cuyo premio consistía en una colaboración con una empresa patrocinadora, en mi caso Nokia. Como me acaban de comunicar que no estoy al final entre los ganadores, no voy a depender del criterio de ninguna empresa externa y voy a poder continuar con el plan previsto de publicaciones.

Objetivo: desarrollar un sistema de automatización del hogar que sea la referencia del sector.

P.D.: Este fin de semana también abriré un hilo en la sección correspondiente de Home Automation del foro en inglés. Incluiré este hilo como enlace en ese otro nuevo hilo, por lo que es posible que empiecen a aparecer algunos comentarios en el idioma de Shakespeare :wink:

Sigo tus avances, a ver si hay alguna idea tuya que pueda meter en mi casa inteligente.

Muy pronto podré publicar la documentación de unas nuevas placas que estamos desarrollando para el sistema functiodomo. las PCB que estamos desarrollando son dos:

  • Una que engloba toda la parte de control (programable compatible con Arduino), transformador 220 VAC/9 VDC y comunicaciones inalámbricas por XBee. Todo en 60x65mm.
  • La otra es la que maneja la parte de potencia, siguiendo el esquema de la que he publicado en este foro. Tamaño 60x55 mm.

Adjunto una imagen del esquema de las placas en modo de conexión para 3 equipos independientes:

¿Cuál es el motivo de desarrollar estas placas? Pues porque necesitaba unas placas que me permitieran minimizar los errores de montaje, que fueran más compactas y que resultasen más económicas que la combinación de placas anteriores.

Conforme me sea posible, iré publicando más información, aquí y a través del blog: http://www.functiodomo.org