3 sept 2015

Domótica: Cómo activar un relé por USB en Windows para control de aparatos (persianas, luces, etc)



Aunque lo más económico y versátil actualmente es utilizar Arduino como placa programable, con lo que nos evitamos la conocida falta de fiabilidad de Windows, cuando queremos activar aparatos de forma programada en ocasiones es más sencillo utilizar un relé por USB, bien porque ya tenemos un equipo que ha de estar siempre encendido, o por otros motivos, lo que nos permite en teoría controlar hasta 8 interruptores por cada conector USB en un mismo equipo.

Tenía que sustituir un viejo sistema que utilizaba el puerto LPT1 para el control de una alarma horaria, así que tras investigar adquirí 2 ud. de este Relé controlado por USB en Aliexpress.

Y si queremos controlar varios dispositivos, los hay de hasta 8 canales (relés) en una misma unidad, con 10A de capacidad cada relé, por lo que las posibilidades se amplían bastante.
Lo complicado fue ponerlo en marcha; mi equipo a veces no lo detectaba (mala calidad del cable que elegí  Hay que proteger la placa de interferencias o bien con una caja metálica o bien cubriéndolo con cinta de aluminio adhesiva), y el vendedor no terminaba de conseguir mandarme las librerías para su programación.
Por suerte Google me las encontró por "USBRelayExtLib", pero mi gozo en un pozo; el programa de comandos "CommandApp_USBRelay" no funcionaba ni como administrador ni en XP ni posteriores, así que tuve que recurrir a la librería incluída y al Autoit, gracias a que unos amigos habían dejado todos los detalles para su automatización en los foros del programa, ¡Así da gusto!

No entregan cable con el mismo, pero os servirá uno de esos que entregan con Arduino Uno (USB macho a hembra), que son de calidad con malla anti-interferencias:
El programa que utilizo yo es el siguiente; simplemente activo la alarma 4 segundos con este script, que gracias a Autoit incluso lo podemos convertir a .exe en un abrir y cerrar de ojos:

Este sería el script (pega en el Scite de Autoit):


#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=relay.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include <Array.au3>

#cs
1. call usb_relay_init() to init the lib.
2. call usb_relay_device_enumerate() to get all the device pluged into pc
3. call usb_relay_device_open() open the device you need
4. other operation funcation:
call usb_relay_device_open_one_relay_channel() to open one way relay
call usb_relay_device_open_all_relay_channel() to open all relays
call usb_relay_device_close_one_relay_channel()to close one way relay
call usb_relay_device_close_all_relay_channel()to close all relays
#ce
$Serial = "abcde"
Global $hDllRelay = DllOpen("usb_relay_device.dll")

$aRet = DllCall( $hDllRelay, "ptr:cdecl", "usb_relay_device_enumerate" )
If @error Then
  MsgBox(16, "error", "usb_relay_device_enumerate", 3)
  Exit
EndIf
;_ArrayDisplay($aRet, "$aRet")
$ptr = $aRet[0]

$tag_usb_relay_device_info = "ptr serial_number;ptr device_path;uint relay_type;int relay_next"
;$tag_usb_relay_device_info = "ptr serial_number;ptr device_path;uint relay_type;ptr relay_next"

$t_usb_relay_device_info = DllStructCreate( $tag_usb_relay_device_info, $ptr )
If @error Then
    MsgBox(0, "", "Error in DllStructCreate " & @error);
    Exit
EndIf
$ptr_serial_number = DllStructGetData( $t_usb_relay_device_info, "serial_number" )
ConsoleWrite( "$ptr_serial_number = " & $ptr_serial_number & @CRLF )
$ptr_device_path = DllStructGetData( $t_usb_relay_device_info, "device_path" )
ConsoleWrite( "$ptr_device_path = " & $ptr_device_path & @CRLF )
$relay_type = DllStructGetData( $t_usb_relay_device_info, "relay_type" )
ConsoleWrite( "$relay_type = " & $relay_type & @CRLF )
$relay_next = DllStructGetData( $t_usb_relay_device_info, "relay_next" )
ConsoleWrite( "$relay_next = " & $relay_next & @CRLF )

; Buffer for serial number for max. 32 characters
$tag_serial_number = "char[32]"

; Fill buffer with data from the memory location given by the pointer
$t_serial_number = DllStructCreate( $tag_serial_number, $ptr_serial_number )

; Get serial number as a string
$s_serial_number = DllStructGetData( $t_serial_number, 1 )

; Print serial number
ConsoleWrite( "$s_serial_number = " & $s_serial_number & @CRLF )

$aRet1 = DllCall( $hdllrelay, "int", "usb_relay_init" )
ConsoleWrite($aRet1[0] & @LF)

;Hemos cogido en $s_serial_number el número de serie del primero que tenemos conectado
$aRet = DllCall( $hdllrelay, "int:cdecl", "usb_relay_device_open_with_serial_number", "str", $s_serial_number, "uint", 5 )
If @error Then
  ConsoleWrite( "Errorcode: " & @error & @CRLF )
Else
  ConsoleWrite( "Handle: " & $aRet[0] & @CRLF )
EndIf
$para1 = "int"
$para2 = $aRet[0]
$para3 = "int"
$para4 = 1

$aRet2 = DllCall($hdllrelay, "int:cdecl", "usb_relay_device_open_one_relay_channel", $para1, $para2, $para3, $para4)
ConsoleWrite($aRet2[0] & @LF)

Sleep(4000) ;Paramos 4 segundos antes de cerrar de nuevo el relé

$aRet2 = DllCall($hdllrelay, "int:cdecl", "usb_relay_device_close_one_relay_channel", $para1, $para2, $para3, $para4)
ConsoleWrite($aRet2[0] & @LF)

DllClose($hdllrelay)

Si examináis el programa, y tenéis algo de experiencia programando, veréis que es bastante sencillo de interpretar; acabo de descubrir Autoit y creo que lo usaré para más cosas en el futuro.

Si queremos controlar más relés, deberemos tener en cuenta que este programa simplemente coge el primer relé conectado y lo activa, así que tendremos que identificarlos, bien con el "GuiApp_English.exe" incluído con la librería, o bien con el propio script.

Parte trasera:



 Y así quedó el relé para activar la alarma, conectado al equipo, protegido con cinta transparente para evitar cortos:

No os olvidéis de protegerlo contra interferencias; yo le puse cinta adhesiva de aluminio por encima
¡Disfrutad creando y experimentando!

Fuentes:
Librerías control USBRelay (Windows)
Librerías control USBRelay (Linux)
Código para control con Pithon
Foro Autoit sobre el uso de su librería con Autoit
Descarga de Autoit3 en Autoit.com

13 comentarios:

  1. Buff, que mal rollo conmutar cargas desde el puerto USB de tu PC. Por mucho que sea un relé, hablamos de una placa made-in-china: deberías perder unos minutos mirando el trazado de las pistas de la PCB.

    ResponderEliminar
    Respuestas
    1. Buenas tardes, el relé es totalmente seguro, ya lo examiné en su día y no puede haber ningún acoplamiento ni derivación (incluso tiene un corte en el PCB en COM por seguridad); de hecho sólo maneja hasta 10A (si nos pasamos entonces ya sería culpa nuestra). He añadido la foto de la parte trasera de todas formas (venía en la web de venta).

      Eliminar
  2. Hola David. Muy buena esta entrada. Soy nuevo en esto pero me gusta aprender. Has logrado activar el relé por USB en Linux?

    Si tienes algunas recomendaciones o un cómo hacerlo lo apreciaría mucho.

    Tengo un electroventilador de 12vcc 80w (de esos que tienen los autos unidos al radiador para enfriar el agua que pasa por el motor.) Lo uso en una ventana como extractor de aire de una habitación.

    Con un adaptador de 220vac a 12vcc 2A lo estoy alimentando con la corriente comercial, y con una bateria de 12v 7ah cuando no.

    Necesito que se encienda 32 veces al dia con una duracion de encendido de 2minutos a intervalos de 15 minutos entre las 21hs y 5hs. Es decir que a partir de las 21hs se encienda 2 min y se apague, luego 15 min después encienda por otros 2 minutos y así hasta las 5 hs de la mañana. No he encontrado ningún temporizador programable que permita 32 programas en un día, solo este tiene 20 programas https://www.youtube.com/watch?v=1EKQEl0k-QE

    Buscando en la red al respecto encontré tu blog (que de paso con info muy buena) y me interesó.

    Estaba pensando que con un raspberry Pi (he leido que funciona como un computador con SO linux) y un Relé por USB como este de la nota podría evitar tener prendido un pc para controlar y activar el relé.

    Vi que has hecho experimentos con Arduino, sabes si con Arduino se puede controlar este Relé por USB y programarlo para 32 encendidos de 2min como mencioné arriba?.

    Muchas gracias y cualquier opinión tuya será apreciada.

    Tony Pater.

    ResponderEliminar
    Respuestas
    1. Buenas Tony, si echas un vistazo a la última entrada sobre Arduino:
      http://miqueridopinwino.blogspot.com.es/2015/11/monta-tu-propio-monitor-de-energia-por-30-eurillos.html (en la que le añado un reloj con pila), y a otras como esta (en mi colaboración con CómoHacer): http://comohacer.eu/como-eliminar-la-humedad-de-tu-casa/ verás que lo mejor en tareas sencillas como ésta es usar Arduino, te permitirá todas las programaciones que quieras. Yo mismo te puedo echar una mano con el programa; con un UNO y el chip RTC acoplado para el control de horas, ya te funciona.

      Eliminar
    2. Hola David, muchas gracias por tu interés y responder tan pronto. Lamento haber tardado tanto pero ando con exámenes finales y hasta ahora saqué tiempo para responderte. Vi las publicaciones que mencionaste, excelente!

      En resumen que necesitaría comprar? Arduino UNO R3, RTC y Relé optoacoplado? Te pongo links con fotos y apreciaría muchisimo si me das una ayuda confirmando si estos son los materiales necesarios:

      -Arduino Uno r3
      http://articulo.mercadolibre.com.ar/MLA-594556305-arduino-uno-r3-cable-usb-compatible-open-_JM

      -RTC DS1307
      http://articulo.mercadolibre.com.ar/MLA-593827119-arduino-i2c-rtc-ds1307-at24c32-real-time-clock-avr-arm-pic-_JM


      -Relé optoacoplado? supongo que el relé usb no sería necesario, por eso pregunto.
      http://articulo.mercadolibre.com.ar/MLA-595558191-modulo-2-reles-optoacoplados-5v-con-bornera-arduino-250v-10a-_JM

      Si falta algo (me podrías indicar? uso la pagina mercadolibre.com.ar pues está en Argentina donde vivo y probablemente compre allí). Muchas gracias adelantadas por tu ayuda!


      Tony Pater

      Eliminar
    3. El relé optoacoplado que indicas no es tal; el de la foto es un relé mecánico por bobina de toda la vida (con 2 ud. en la placa). Te serviría pero yo no se lo cogería a alguien que no sabe qué vende.
      El resto efectívamente sería eso, pero si no tienes experiencia con Arduino, yo no me complicaría y buscaría un programador electrónico Wifi que te pueda hacer la misma función:
      http://www.banggood.com/search/wifi-timing-plug.html
      Este en concreto admite 26 grupos de temorizaciones (supongo que quiere decir 26 rangos de tiempo en los que activar la carga):
      http://www.banggood.com/BroadLink-SP-Mini-WiFi-Smart-Home-Socket-Switch-Plug-Timer-Wireless-Remote-Control-p-1003007.html
      Y por sólo 12$.
      No te desanimo a lo de Arduino, de hecho te encantará por todas las posibilidades que tiene, pero sin saber el nivel que tengas programando, igual es un proyecto complicado para empezar.
      Saludos y a divertirse inventando!

      Eliminar
    4. Tienes más información sobre estos programadores wifi aquí; están muy bien porque los puedes configurar desde tu ordenador, y aunque luego no tengan alcance wifi, siguen funcionando bien por su reloj interno:
      http://nergiza.com/orvibo-s20-el-enchufe-wifi-con-programador-revision/

      Eliminar
    5. Gracias David!. Estaba por comprar el ORVIBO, hasta que vi que para funcionar requiere que tanto mi wifi como los servidores de ORVIBO también estén en internet; y según veo el control y programación es via smartphone (android, ios) no pc. Los fallos de los servidores orvibo han sucedido, segun usuarios de la app WiWo

      https://play.google.com/store/apps/details?id=com.orvibo.irhost

      Prefiero algo que funcione localmente.
      Tony Pater

      Eliminar
    6. Hola David! Finalmente logré mi proyecto!. Solo usé Un Arduino Nano v3.0 y un Relay 5v optoacoplado y unos cuantos cables.

      Los materiales completos
      -1 Arduino Nano v3.0
      -1 Relay 5V optoacoplado
      -1 ElectroVentilador de auto 12Vcc 80Watts
      -1 Power Bank 5v 3000mAh para alimentar el Arduino Nano v.3
      -1 Bateria de 12vcc 7Ah para encender ElectroVentilador
      -2 Cables para conectar el ElectroVentilador a Bateria y a Relay
      3 Cables macho-macho conectar

      Opcional:
      -2 Leds (Rojo y Azul)
      -1 cable macho macho

      Instalé con sudo apt-get install arduino el sistema de programación Arduino en linux (uso linux Mint)
      utilicé el programa (sketch) de ejemplo Blink que se usa para encender un led, y lo modifiqué para que funcione con los tiempos que necesito. Seguí las indicaciones del Profe García https://www.youtube.com/watch?v=Gif-vw9FtII y ya felizmente está andando mi sistema.

      Gracias a tu post, encontré que era posible y buscando mas logré comprar los materiales que necesitaba. Un abrazo.

      Tony Pater.

      Eliminar
    7. Me alegro mucho Tony! Eso es valor, bienvenido al "Hazlo Tú Mismo".
      Efectívamente si no necesitas controlar el tiempo según las horas del día, sino simplemente activarlo cada x tiempo, X veces al día, no te hace falta ni reloj externo, como bien indicas.
      Me alegro mucho de haberte servido de ayuda, ¡Arduino lo hace todo más fácil! :)
      Un abrazote Tony.

      Eliminar
  3. Estimado, muchas gracias por tu post, me fue de gran ayuda para guiarme, pero tengo un problema, conecta mi rele a windows, y no me lo reconoce, osea sale siempre la luz roja, y el progroma no funciona obviamente, tienes tu algún driver para el rele?.
    Saludos

    ResponderEliminar
    Respuestas
    1. Hola, yo no necesité controlador; usa la tecnología HID por lo que en teoría no es necesario. Yo usé Windows 7 para programarlo. Saludos

      Eliminar
  4. Estimado buenas, donde consigo este circuito o Plaqueta? necesitaria uno que comande 2 relay y el codido o SDK para programar mi aplicacion
    Gracias

    ResponderEliminar

Puede dejar su comentario, que tratará de ser moderado en los días siguientes. En caso de ser algo importante/urgente, por favor utilicen el formulario de arriba a la derecha para contactar.