ARCADE FOREVER

[TUTORIAL] Automatizar el encendido/apagado de LEDs con un relé USB y RocketLauncher

« Older   Newer »
  Share  
view post Posted on 7/6/2021, 19:08     +1   -1
Avatar

V.I.P.

Group:
Usuarios AFFA
Posts:
5,357
Reputation:
+502
Location:
Lorca (Murcia)

Status:


[TUTORIAL] Automatizar el encendido/apagado de LEDs con un relé USB y RocketLauncher



ÍNDICE
1.- INTRODUCCIÓN
2.- CÓMO CONECTAR EL RELÉ USB EN EL CIRCUITO Y AL PC
3.- FUNCIONAMIENTO Y SOFTWARE
4.- SCRIPT PARA AUTOMATIZAR EL ENCENDIDO/APAGADO CON ROCKETLAUNCHER Y SU HERRAMIENTA "USER FUNCTIONS"

1.- INTRODUCCIÓN

A la hora de utilizar una pistola GUN4IR en nuestro mueble arcade o PC deberemos instalar unos LEDs IR en los marcos de la pantalla que sirvan de referencia a la cámara de la pistola para saber en todo momento hacia dónde estamos apuntando. Y a menos que incluyamos un interruptor o desenchufemos la fuente de alimentación cuando no los estemos utilizando estos LEDs IR van a estar encendidos todo el tiempo. Esto no es que sea un problema en sí mismo, pero si tenemos más dispositivos de juego que dependan de LEDs IR en una distribución diferente (por ejemplo, Wiimotes que hacen uso de una barra de leds sobre el marco del televisor) la luz de unos LEDs y de los otros se interferirá, dificultando el buen funcionamiento de los dispositivos que dependen de ellos para posicionarse.

2021-06-05-12-22-58



Así que lo ideal es tener apagados los LEDs IR hasta el mismo momento de necesitarlos. Esto lo podemos hacer manualmente, con un interruptor o enchufando la fuente de alimentación, pero en mi caso concreto y por comodidad he decidido automatizar el proceso haciendo uso de un relé USB. De esta forma el propio frontend gestionará el ecendido y apagado de los LEDs al lanzar un juego que necesite de pistola GUN4IR o de Wiimote.
En el mercado existen muchos modelos de placas de relés USB, desde las que tienen un único relé hasta las que tienen 8 relés. Los de 1 y 2 se alimentan directamente del puerto USB del ordenador al que se conectan, mientras que los de más relés precisan de una fuente de alimentación externa para funcionar correctamente. Pero lo que es muy importante que conozcáis es que todas las placas de relés USB del mercado, ya se vendan en Amazon o AliExpress, funcionan igual y utilizan los mismos drivers y software. Os dejo un enlace al vendedor de AliExpress al que le he comprado yo la mía:

Enlace de compra relé USB en AliExpress: https://es.aliexpress.com/item/1005001763829926.html

Ahí podréis comprar placas con cualquier número de relés, aunque yo la he adquirido de tan sólo dos relés porque realmente no necesito más: sólo quiero controlar el encendido y apagado de dos circuitos de LEDs, uno para los 4 LEDs que utilizan las GUN4IR y otro para los 2 LEDs que utilizan los Wiimotes.

2.- CÓMO CONECTAR EL RELÉ USB EN EL CIRCUITO Y AL PC

Aquí os dejo un detalle de la placa de dos relés que me llegó a mí:

USB-Relay-01



USB-Relay-02



Como podéis comprobar cada relé tiene tres conexiones. La explicación de la leyenda para identificar cada una es la siguiente:

COM1: Entrada Común 1
NO1: Normalmente Abierto 1
NC1: Normalmente Cerrado 1

COM2: Entrada Común 2
NO2: Normalmente Abierto 2
NC2: Normalmente Cerrado 2

Como nosotros queremos que los LEDs estén siempre apagados, menos cuando juguemos a algún juego de pistola con la GUN4IR, utilizaremos la entrada "NO1" junto a la C´omún 1 "COM1". Os muestro el esquema de nuestra conexión:

USB-Relay-03



Como podeis ver el relé va a funcionar como un interruptor programable intercalado en uno de los dos cables de alimentación desde la fuente. Este relé funciona con voltajes de alimentación de hasta 30V 12A, así que podremos utilizarlo sea cual sea el circuito de LEDs que tengamos en nuestro mueble arcade. Yo lo estoy utilizando con la toma de 5V de la fuente del PC para alimentar un circuito de cuatro LEDs donde tengo dos parejas de leds en serie cada una, y luego cada serie de dos en paralelo a la fuente:

Circuito-5-V



El otro relé lo voy a utilizar en un circuito de dos LEDs para los Wiimotes. Os dejo un par de fotografías para que veáis cómo he conectado los relés:

USB-Relay-04



USB-Relay-05



3.- FUNCIONAMIENTO Y SOFTWARE

Como ya hemos comentado todas estas placas USB genéricas utilizan el mismo software para funcionar, pero como los vendedores no suelen proporcionarlo os dejo el enlace la página de Github desde la que se provee este software, así como un enlace directo para que podáis descargarlo desde este mismo tutorial:

Página original del proyecto de Pavel A. USB Relay HID con el código fuente y las descargas oficiales


Descarga directa alternativa con la versión del software que yo he utilizado "USB Relay HID bin 20150330a"



Lo primero que deberéis hacer es descomprimir el contenido del archivo. Yo lo he hecho dentro de una carpeta destinada a utilidades que tengo dentro de mi frontend:

USB-Relay-07a



Es muy importante que la ruta donde descomprimáis el software no contenga espacios en blanco. La razón de ello es que si existen espacios en blanco las sentencias que tendremos que escribir más adelante en el script de AutoHotKey se pueden complicar un poco. Dentro de la carpeta donde descomprimamos el software nos escontraremos con varias subcarpetas. En una estarán los ejecutables para sistemas Windows de 32bits y en otra de 64bit:

USB-Relay-08a



Dentro de cada una de estas carpetas encontraremos dos ejecutables, en mi caso voy a utilizar los de 64bits. El llamado "hidusb-relay-cmd.ese" es el ejecutable para línea de comandos (el que realmente nos va a interesar para realizar la integración automática):

USB-Relay-08b



El otro ejecutable es el archivo "GUIapp.exe" y nos permitirá activar/desactivar los LEDs cuando estemos fuera del frontend:

USB-Relay-08c



Al lanzar este ejecutable aparecerá una ventana desde la que podremos controlar nuestras placas de relés USB (recordad, podremos poner tantas placas como puertos USB tengamos disponibles para conectarlas):

USB-Relay-06a



Por ello el primer paso será siempre reconocerlas por su ID y seleccionarlas, aunque tengamos una solamente. Esto lo haremos pinchando en el botón "Find device":

USB-Relay-06b



Y después seleccionando la placa que deseemos controlar desde el desplegable:

USB-Relay-06h



Si ahora pinchamos en el botón "Open device" lo que haremos es activar la placa seleccionada para poder trabajar con ella:

USB-Relay-06c



Ahora es cuando todo se puede hacer un poco lioso. Al haber utilizado la entrada "NO" (Normalmente Abierto) del relé, el circuito estará siempre abierto (LEDs apagados) hasta que "abramos" (Open) el relé del circuito de LEDs que nos interese encender:

USB-Relay-06d



4.- SCRIPT PARA AUTOMATIZAR EL ENCENDIDO/APAGADO CON ROCKETLAUNCHER Y SU HERRAMIENTA "USER FUNCTIONS"

Como YA hemos indicado, para realizar el encendido/apagado automático de los LEDs al lanzar los juegos desde el frontend vamos a utilizar el ejecutable para l´ínea de comando "hidusb-relay-cmd.ese" y la función "User Functions" de RocketLauncher. Este ejecutable acepta las siguientes instrucciones:

hidusb-relay-cmd [ID=XXXXX] ON|OFF <num> -- cambia la posición del relé

donde <num> es el número de identificación del relé: puede ser 1-2 o "ALL"

hidusb-relay-cmd STATUS -- muestra en pantalla el estado de una placa de relés con su "ID" identificativo.
hidusb-relay-cmd ENUM -- muestra en pantalla el estado de todas las placas de relés conectadas con sus "IDs" identificativos

El parámetro ID=XXXXX especifica ona placa de relés si hay varias conectadas.
Si no especificamos el parámeto ID=XXXXX , y tenemos varias placas conectadas, el programa utilizará una de ellas.
El parámetro ID distingue entre mayúsculas y minúsculas.

Ejemplos de uso:

hidusb-relay-cmd ID=ABCDE ON 1
hidusb-relay-cmd ID=ABCDE OFF ALL
hidusb-relay-cmd ID=ABCDE STATUS

hidusb-relay-cmd ON ALL -- utiliza la primera placa que encuentra
hidusb-relay-cmd STATUS -- utiliza la primera placa que encuentra


ANOTACIONES:

El comando Enum enumera los ID de todas las placas de relés disponibles.
El parámetro ID distingue entre mayúsculas y minúsculas. y debe coincidir exactamente con la salida del comando "enum".

Cada relé tiene dos pares de contactos: normalmente abierto (NO) y normalmente cerrado (NC).
El estado APAGADO es el estado "normal", cuando el LED rojo está apagado y los contactos normalmente abiertos están desconectados.
El estado ENCENDIDO es cuando el LED rojo está encendido y los contactos normalmente abiertos están conectados.


Como vemos lo primero que necesitamos es obtener el ID de nuestra placa de relés. Esto lo podemos hacer de dos formas: bien desde el ejecutable de la GUI o bien desde el ejecutable de línea de comandos. Con el ejecutable de la GUI ya hemos visto cómo hacerlo anteriormente, paso a mostraros ahora cómo hacerlo también con el ejecutable "hidusb-relay-cmd.ese". Para ello lanzaremos una ventana de comandos localizada en la misma carpeta de la aplicación escribiendo "cmd" en la barra de dirección de la carpeta abierta:

USB-Relay-08c



y presionaremos la tecla "Enter" de nuestro teclado. Esto nos abrirá una ventana de secuencia de comandos ya ubicada en nuestro directorio destino:

USB-Relay-10



Como ya hemos visto en las instrucciones de uso de la aplicación para hacer que ésta nos liste el ID de las placas que tenemos conectadas escribiremos la siguiente secuencia de comandos:

CODE
hidusb-relay-cmd.exe ENUM


USB-Relay-11a



Y presionaremos "Enter" en nuestro teclado. Inmediatamente la aplicación identificará y numerará las placas de relés USB que tengamos conectadas y su estado:

USB-Relay-12a



Ya os adelanto que si sólo tenéis una placa esta normalmente se llamará "HURTM". Una vez que ya conozcamos el ID de nuestra placa estaremos en disposición de crear los script que encenderán y apagarán nuestros LEDs:

hidusb-relay-cmd.exe id=HURTM ON 1 -- Cierra el relé 1
hidusb-relay-cmd.exe id=HURTM OFF 1 -- Abre el relé 1
hidusb-relay-cmd.exe id=HURTM ON 2 -- Cierra el relé 2
hidusb-relay-cmd.exe id=HURTM OFF 2 -- Abre el relé 2

Os recuerdo que yo estoy usando el relé 1 para encender/apagar los cuatro LEDs IR que utilizan lan GUN4IR para posicionarse y el relé 2 para encender/apagar los dos LEDs IR que utilizan los Wiimotes.

Ahora es cuando haremos uso de la herramienta "User Functions" con RocketLauncher. Para ello nos dirigiremos a la carpeta "..\RocketLauncher\Lib\User Functions":

USB-Relay-09b



Aquí es donde deberemos guardar los scripts que generemos para la herramienta. Esta funciona y se gestiona igual que los perfiles de "Keymappers", es decir, como un árbol jerárquico de prioridades. En la parte más alta se encuentra el script "Global.ahk", que se aplicará siempre que lancemos cualquier juego, si la herramienta no encuentra otro más específico. Si deseáis conocer más sobre las funcionalidades de la herramienta "User Functions" os dejo el enlace directo al wiki de RocketLauncher donde se explica con más detalle. Para nuestro propósito lo primero que deberemos hacer es crear con el Bloc de notas de Windows un archivo con extensión .ahk que se llame exactamente igual que nuestro sistema Gun Games. Una vez más os recuerdo la importancia supina que tiene la concordancia de nombres en RocketLauncher:

USB-Relay-09d



Lo editaremos para añadir el siguiente código:

CODE
class SystemUserFunction extends UserFunction {

       ; Use this function to define any code you want to run in every module on start
       StartUserFeatures() {
               Global dbName
               RLLog.Info(A_ThisFunc . " - Starting")
               ; INSERT CODE HERE
               ; Activando Relé LEDs IR GUN4IR
               Run("hidusb-relay-cmd.exe id=HURTM ON 1", "C:\HyperSpin\Utilities\USBRelayHID\bin-Win64\")        ;HURTM, ID de mi placa de relés.
               RLLog.Info(A_ThisFunc . " - Ending")
       }

       ; Use this function to define any code you may need to stop or clean up in every module on exit
       StopUserFeatures() {
               Global dbName
               RLLog.Info(A_ThisFunc . " - Starting")
               ; Desactivando Relé LEDs IR GUN4IR
               Run("hidusb-relay-cmd.exe id=HURTM OFF 1", "C:\HyperSpin\Utilities\USBRelayHID\bin-Win64\")        ;HURTM, ID de mi placa de relés.
               RLLog.Info(A_ThisFunc . " - Ending")
       }

       ; Use this function to define any code you want to run before Pause starts
       StartPauseUserFeatures() {
               Global dbName
               RLLog.Info(A_ThisFunc . " - Starting")
               ; Desactivando Relé LEDs IR GUN4IR
               Run("hidusb-relay-cmd.exe id=HURTM OFF 1", "C:\HyperSpin\Utilities\USB_Relay_HID_bin_20150330a\bin-Win64\")        ;HURTM, ID de mi placa de relés.
               RLLog.Info(A_ThisFunc . " - Ending")
       }

       ; Use this function to define any code you may need to stop or clean up after Pause ends
       StopPauseUserFeatures() {
               Global dbName
               RLLog.Info(A_ThisFunc . " - Starting")
               ; Activando Relé LEDs IR GUN4IR
               Run("hidusb-relay-cmd.exe id=HURTM ON 1", "C:\HyperSpin\Utilities\USB_Relay_HID_bin_20150330a\bin-Win64\")        ;HURTM, ID de mi placa de relés.
               RLLog.Info(A_ThisFunc . " - Ending")
       }

}


Si estudiáis un poco el código veréis que le estamos indicando a RocketLauncher que cierre el circuito del relé 1 cada vez que lancemos un juego del sistema "Gun Games" y que lo abra cuando salgamos. También le estamos diciendo que haga los mismo, pero al revés, cuando entremos al menú de "Pause" y cuando salgamos de él.

Ahora vamos a hacer lo mismo con el relé 2 para utilizar los Wiimotes con los juegos del sistema Nintendo Wii. Para automatizar su encendido apagado crearemos otro archivo de sistema en la carpeta "..\RocketLauncher\Lib\User Functions", en este caso llamado "Nintendo Wii.ahk". Para hacerlo más rápido podemos copiar el que ya tenemos creado "Gun Games.ahk" y renombrarlo, porque el código interno que necesitamos es el mismo, con la diferencia de que ahora debemos hacer referncia al canal "2" en lugar de al "1":

USB-Relay-09e



CODE
class SystemUserFunction extends UserFunction {

       ; Use this function to define any code you want to run in every module on start
       StartUserFeatures() {
               Global dbName
               RLLog.Info(A_ThisFunc . " - Starting")
               ; INSERT CODE HERE
               ; Activando Relé LEDs IR GUN4IR
               Run("hidusb-relay-cmd.exe id=HURTM ON 2", "C:\HyperSpin\Utilities\USBRelayHID\bin-Win64\")        ;HURTM, ID de mi placa de relés.
               RLLog.Info(A_ThisFunc . " - Ending")
       }

       ; Use this function to define any code you may need to stop or clean up in every module on exit
       StopUserFeatures() {
               Global dbName
               RLLog.Info(A_ThisFunc . " - Starting")
               ; Desactivando Relé LEDs IR GUN4IR
               Run("hidusb-relay-cmd.exe id=HURTM OFF 2", "C:\HyperSpin\Utilities\USBRelayHID\bin-Win64\")        ;HURTM, ID de mi placa de relés.
               RLLog.Info(A_ThisFunc . " - Ending")
       }

       ; Use this function to define any code you want to run before Pause starts
       StartPauseUserFeatures() {
               Global dbName
               RLLog.Info(A_ThisFunc . " - Starting")
               ; Desactivando Relé LEDs IR GUN4IR
               Run("hidusb-relay-cmd.exe id=HURTM OFF 2", "C:\HyperSpin\Utilities\USB_Relay_HID_bin_20150330a\bin-Win64\")        ;HURTM, ID de mi placa de relés.
               RLLog.Info(A_ThisFunc . " - Ending")
       }

       ; Use this function to define any code you may need to stop or clean up after Pause ends
       StopPauseUserFeatures() {
               Global dbName
               RLLog.Info(A_ThisFunc . " - Starting")
               ; Activando Relé LEDs IR GUN4IR
               Run("hidusb-relay-cmd.exe id=HURTM ON 2", "C:\HyperSpin\Utilities\USB_Relay_HID_bin_20150330a\bin-Win64\")        ;HURTM, ID de mi placa de relés.
               RLLog.Info(A_ThisFunc . " - Ending")
       }

}


Y eso es todo. Os dejo un vídeo de andar por casa, donde os muestro cómo se encienden los LEDs para usar mis pistolas GUN4IR cuando lanzo cualquier juego del sistema Gun Games y cómo se apagan al volver a la ruleta del frontend. El "click" que se escucha es el sonido del relé al cambiar su conmutación:



Edited by Pegafun - 16/6/2021, 11:03
 
Web  Top
view post Posted on 7/6/2021, 19:12     +1   -1
Avatar

V.I.P.

Group:
Usuarios AFFA
Posts:
4,465
Reputation:
+299
Location:
Barcelona

Status:


Estas hecho un artista....
 
Top
view post Posted on 8/6/2021, 07:58     +1   -1
Avatar

V.I.P.

Group:
Member
Posts:
1,275
Reputation:
+152
Location:
Vigo

Status:


Gran tutorial, enhorabuena.
 
Top
view post Posted on 9/6/2021, 17:57     +1   -1
Avatar

V.I.P.

Group:
Member
Posts:
753
Reputation:
+102

Status:


Una cosilla por si os pasa lo que me ha ocurrido, se me quedaban ventanas CMD abiertas al salir de los juegos y tras haber ejecutado el exe de los relés, fallando luego, es simplemente cerrar las ventanas CMD, pero curiosamente tampoco me las cerraba el comando taskkill, he tenido que usar el programa nircmd.exe que ya tenia en la carpeta tools o utils del hyperspin, curioso programamita que no pesa nada y tiene funciones interesantes, como llevar el puntero del ratón fuera de la pantalla antes de lanzar el hyperspin con un simple comando por ejemplo, etc... Quizá el problema es del Win7, al final me estoy pasando al 10, renovarse o morir.

Instalamos el nircmd.exe copiandolo a la carpeta del windows sin más y simplemente al salir del juego y tras haber desactivado el relé, matamos los CMD que queden abiertos con la última orden:

CODE
; Use this function to define any code you may need to stop or clean up in every module on exit
      StopUserFeatures() {
              Global dbName
              RLLog.Info(A_ThisFunc . " - Starting")
              ; Desactivando Relé LEDs IR GUN4IR
              Run("hidusb-relay-cmd.exe id=HURTM OFF 2", "C:\HyperSpin\Utilities\USBRelayHID\bin-Win64\")        ;HURTM, ID de mi placa de relés.
              RLLog.Info(A_ThisFunc . " - Ending")

              Run nircmd KILLPROCESS cmd.exe             ;Cerrar ventanas CMD, cierra todas las que haya.
}
 
Top
view post Posted on 10/6/2021, 10:23     +1   +1   -1
Avatar

V.I.P.

Group:
Usuarios AFFA
Posts:
5,357
Reputation:
+502
Location:
Lorca (Murcia)

Status:


QUOTE (Morera @ 9/6/2021, 18:57) 
Quizá el problema es del Win7, al final me estoy pasando al 10, renovarse o morir.

Te recomiendo mucho muchísimo el Windows 10 LTSC (Long Term Servicing Channel). Esta distribución incorpora todas las novedades del sistema hasta la versión 1809, es decir, la actualización de octubre 2018 de Wnidows 10, con lo cual es la versión más moderna en la que siguen funcionado las unidades virtuales SCSI. Y además no integra ni Edge, ni Cortana, ni modern-apps. Es un Win-Win.

Eso sí, para que no se te "joda" todo lo bueno que tiene dicha versión y se mantenga en la 1809, desactiva completamente las actualizaciones de Windows Update nada más instalarlo.

QUOTE (Usuario8 @ 7/6/2021, 20:12) 
Estas hecho un artista....

QUOTE (justez @ 8/6/2021, 08:58) 
Gran tutorial, enhorabuena.

Muchas gracias a vosotros por leerme.
 
Web  Top
4 replies since 7/6/2021, 19:08   1122 views
  Share