Custom SVDX controller

Proyectos realizados por los Retronianos, también links a proyectos externos y sitios relacionados con Modding y DIY... A crear si ha dicho...
Responder
RigoHoward
Mensajes: 1137
Registrado: Lun Ene 28, 2013 9:52 am

Custom SVDX controller

Mensaje por RigoHoward » Jue Sep 25, 2014 6:04 pm

Ya pasó tiempo de sobra, así que hay infor para actualizar este olvidado hilo :P

Sound Voltex (o SDVX) es un juego rítmico / musical lanzado para arcades por allá en el año 2012; fue desarrollado por KONAMI y pertenece a la franquicia de juegos BEMANI (Beatmania, DDR, Guitar Freaks, etc). SDVX al ser un juego relativamente nuevo y moderno, utiliza servicios en la nube para efectos prácticos por lo que es defícil verlo fuera de Japón / Asia.

La banda sonar del juego fue compuesta a partir de algunos temas populares de otras series de juegos pertenecientes a la franquicia BEMANI, además de temas originales de artistas asiáticos y también cuenta con un reportorio de canciones que vienen desde la franquicia de juegos Touhou (shmups ultra populares) a través de una alianza que realizó Konami.

Actualmente SDVX cuenta con 3 versiones lanzadas y vigentes en el mundo arcade:
  • Sound Voltex Booth (SDVX Booth)
    Sound Voltex Infinite Infection (SDVX II)
    Sound Voltex Gravity Wars (SDVX III)
Si bien el juego no es tan popular como Beatmania, respeta una lógica de juego similar:
Una serie de "objetos" decienden bajo un esquema consistente en 6 columnas. Es requerido que el jugador interactúe en presionar los comandos (botones o dispositivo análogo) cuando los objetos alcanzan una zona en la parte inferior de la pantalla denominada "Critical Line". La secuencia de los objetos, con normalidad irán alineados en r3elación al ritmo de la canción escogida y los comandos a presionar dependen del tipo de objeto.

Para evitar entrar en detalles más profundos acá un video de muestra:


Para suerte (del que le interese) el sistema bajo el cual corre Sound Voltex corresponde a una arquitectura de PC clásica la cual hace un par de años atrás fue crackeada permitiendo poder ejecutar este juego en un PC con sistema operativo Windows XP o superior. Es decir el juego no es emulado ni portado, sino que adaptado para correr en cualquier PC que cumpla con requisitos de hardware no muy modestos (Procesador Dual Core, 2gb de RAM, 20 gb de espacio en HDD y una tarjeta de video Nvidia 9300GT o superior)

En mi caso habiendome encantado con el juego y luego de mucho vagaje por internet habiendo dado con los archivos necesarios para ejecutarlo en mi PC, el primer pero que se presenta es el control del juego:

Imagen
En particular, el panel de control que ven en la imagen de arriba está conformado de dos encoders rotatorios de tipo industrial (en el mundo sdvx son los "analog devices") y un conjunto de botones de distinto tamaño (4 botones de 60x60mm, 1 botón de 33x33mm y 1 botones de 42*30mm)

Como una alternativa de entrada para jugar SDVX pueden tomar dos mouse y un teclado para construirse los comandos necesarios de juego, la herramienta bemanitools que es requerida para configurar los comandos del juego, permite setear que los controles análogos puedan simularse a partir de los ejes de un mouse y cada botón puede vincularse a una tecla en su actual teclado. Para muestra una imagen:
Imagen

Obviamente esto no dará el look & feel del arcade, es por ello que al poco tiempo de utilizar esta alternativa me puse en campaña elevar la experienca a un nivel superior.

Teniendo conocimiento del tipo de componentes utilizados para el panel de control original del juego a muchas personas causa depresión dado que adquirir estas piezas conlleva un costo elevado (un encoder rotatorio de 1000 ppr de buena calidad cuesta individualmente sobre 15 mil pesos chilenos, y este bicho utiliza dos!) y todos los botones que utiliza son de la prestigiosa marca japonesa Sanwa Denshi (cada botón cuesta alrededor de 6mil pesos chilenos)

Dejando de lado la depresión inicial que genera esta parte, me di a la tarea de buscar alternativas para construir un control que no implicara gastar más dinero del que uno esperaría (para quienes son más cómodos existen controles comerciales de marca Dj Dao o Virgoo que cuestan sobre 200 dolares más envío y aduanazo, así que piensenlo bien).
Esto me llevó a cuestionarme si los chinos de casualidad tendrían este tipo de piezas de tipo imitacional pero a precios risibles; para mi suerte encontré lo que buscaba y a precios razonables, sin más preámbulo les dejo la lista de partes y piezas que en mi caso adquirí para hacerme mi propio control para SDVX:

Ingredientes para armarse un ASC de sound voltex (valido para kshoot mania también):

Botones de 60mm (son los que más valor poseen como compra)
http://m.aliexpress.com/item/2025045232.html

Botones "FX"
http://www.aliexpress.com/item/Rectangl ... 42903.html (pidan de color blanco, después se puede poner papel lustre o similar de color grafito)

http://m.ebay.com/itm/271815059802?nav=SEARCH

Encoders rotatorios de 600 ppr (los oficiales son de 1000 ppr, pero estos cumplen perfectamente)
http://m.aliexpress.com/item/885959515.html (estos son de 400ppr segun dicen en sows la versión arcade de sdvx usa de 600ppr o mas)

Perillas de aluminio de 30mm
http://m.aliexpress.com/item/1361212531.html
http://m.ebay.com/itm/321634440545?nav=SEARCH

Resortes y microswitch calidad arcade (japoneses marca OMROM, para mejorar la precisión y comodidad de juego son necesarios, aunque los encuentro algo caros)
https://www.akishop.jp/button-parts/273 ... 1-1c3.html
https://www.akishop.jp/button-parts/274-obsa-sp.html

Contando ya con una total claridad de cuales eran los costos vinculados a las piezas, vino la interrogante de sobre que circuito permitiría reunir todos estos componentes y permitir un funcionamiento e interacción como la que brinda el panel de control oficial de SDVX... fue ahí cuando el nombre micro controlador salta al escenario... para no aburrir descrubrí que Arduino Leonardo permite exactamente lo que se necesita para poner a funcionar encoders rotarios y botones para manejarlos como si de un teclado y mouse se tratara!

En Aliexpress encuentras Arduinos Leonardo clones por menos de 6 dólares con free shipping, el resto de elementos necesarios para realizar el control serían:

Cables (y todas las herramientas necesarias para hacer la instalación electrónica, cautín, soldadura, crimpeadoras, terminales de conexión, etc)
Madera, pegamento, clavos, tornillos (para la construcción del cajón en el que montarán todas las piezas)
Pintura, acrílico, leds, arte (si es que quieren darle un toque personalizado a su control)
Y un poco de conocimiento de programación para escribir los algoritmos que serán necesarios para que su Arduino Leonardo se convierta en un control SDVX!

Entre suma y resta esto me resultó:

Prototipo
Imagen

Versión Casi final (si me aweoné con el arte jaja, ya lo corregiré)
Imagen
Imagen
Imagen
Última edición por RigoHoward el Vie Abr 17, 2015 4:04 pm, editado 8 veces en total.

RigoHoward
Mensajes: 1137
Registrado: Lun Ene 28, 2013 9:52 am

Re: Custom SVDX controller

Mensaje por RigoHoward » Lun Dic 15, 2014 10:24 am

Les dejo el código que compilé para arduino:
Spoiler: MOSTRAR

Código: Seleccionar todo

/* Sound Voltex controller para Arduino Leonardo
(2 encoders rotatorios (600ppr) + 7 botones) */

// Tiempo de retraso en ms para resp. de botones
#define DELAY 5

// Asignación de pines

// Para encoders
enum encoderPins {
encoderLPinA = 2,
encoderLPinB = 3,
encoderRPinA = 0,
encoderRPinB = 1,
};

// Para botones
enum buttonPins {
buttonStartPin = 4,
buttonAPin = 5,
buttonBPin = 6,
buttonCPin = 7,
buttonDPin = 8,
buttonFXLPin = 9,
buttonFXRPin = 10,
};

// Para valores de pos. y mov. de encoder
int long encoderLPos, encoderRPos = 0;
int encoderLPinALast, encoderRPinALast, n1, n2 = LOW;

// Asigna tecla "Enter/Return" para boton start
char returnKey = KEY_RETURN;

void setup() {
// Inicia funcionalidad de mouse
Mouse.begin();

// Encoder izquierdo
pinMode (encoderLPinA,INPUT_PULLUP);
pinMode (encoderLPinB,INPUT_PULLUP);

// Encoder derecho
pinMode (encoderRPinA,INPUT_PULLUP);
pinMode (encoderRPinB,INPUT_PULLUP);

// Inicia funcionalidad de teclado
Keyboard.begin();

// Prepara pines para botones
pinMode(buttonStartPin, INPUT_PULLUP);
pinMode(buttonAPin, INPUT_PULLUP);
pinMode(buttonBPin, INPUT_PULLUP);
pinMode(buttonCPin, INPUT_PULLUP);
pinMode(buttonDPin, INPUT_PULLUP);
pinMode(buttonFXLPin, INPUT_PULLUP);
pinMode(buttonFXRPin, INPUT_PULLUP);

// Inicia monitoreo puerto de serie
Serial.begin (9600);
}

void loop() {
// Lee Pin A de encoder izquierdo
n1 = digitalRead(encoderLPinA);
// Si Pin A (encoder izq.) detecta pulso
if ((encoderLPinALast == LOW) && (n1 == HIGH)) {
// Si no hay pulso en Pin B
if (digitalRead(encoderLPinB) == LOW) {
encoderLPos--;
// Mueve mouse en eje X
Mouse.move(1,0,0);
// Si se cumple una rotación completa, resetea posición
if (encoderLPos == -600){
(encoderLPos = 0);
}
} else {
encoderLPos++;
// Mueve mouse en eje -X
Mouse.move(-1,0,0);
// Si se cumple una rotación completa, resetea posición
if (encoderLPos == 600){
(encoderLPos = 0);
}
}
}
// Guarda posición de encoder izquierdo
encoderLPinALast = n1;

// Lee Pin A de encoder derecho
n2 = digitalRead(encoderRPinA);
// Si Pin A (encoder der.) detecta pulso
if ((encoderRPinALast == LOW) && (n2 == HIGH)) {
// Si no hay pulso en Pin B
if (digitalRead(encoderRPinB) == LOW) {
encoderRPos--;
// Mueve mouse en eje Y
Mouse.move(0,1,0);
// Si se cumple una rotación completa, resetea posición
if (encoderRPos == -600){
(encoderRPos = 0);
}
} else {
encoderRPos++;
// Mueve mouse en eje -Y
Mouse.move(0,-1,0);
// Si se cumple una rotación completa, resetea posición
if (encoderRPos == 600){
(encoderRPos = 0);
}
}
}
// Guarda posición de encoder derecho
encoderRPinALast = n2;

// Manejo de pulsación de botones
// BT Start
static char old_START = LOW;
char this_START = digitalRead(buttonStartPin);
if(this_START == LOW && old_START == HIGH)
{
Keyboard.press(returnKey);
delay(DELAY);
}
if (this_START == HIGH && old_START == LOW)
{
Keyboard.release(returnKey);
delay(DELAY);
}
old_START = this_START;


// BT A
static char old_BTA = LOW;
char this_BTA = digitalRead(buttonAPin);
if (this_BTA == LOW && old_BTA == HIGH)
{
Keyboard.press('s');
delay(DELAY);
}

if (this_BTA == HIGH && old_BTA == LOW)
{
Keyboard.release('s');
delay(DELAY);
}
old_BTA = this_BTA;

// BT B
static char old_BTB = LOW;
char this_BTB = digitalRead(buttonBPin);
if (this_BTB == LOW && old_BTB == HIGH)
{
Keyboard.press('d');
delay(DELAY);
}

if (this_BTB == HIGH && old_BTB == LOW)
{
Keyboard.release('d');
delay(DELAY);
}
old_BTB = this_BTB;

// BT C
static char old_BTC = LOW;
char this_BTC = digitalRead(buttonCPin);
if (this_BTC == LOW && old_BTC == HIGH)
{
Keyboard.press('j');
delay(DELAY);
}

if (this_BTC == HIGH && old_BTC == LOW)
{
Keyboard.release('j');
delay(DELAY);
}
old_BTC = this_BTC;

// BT D
static char old_BTD = LOW;
char this_BTD = digitalRead(buttonDPin);
if (this_BTD == LOW && old_BTD == HIGH)
{
Keyboard.press('k');
delay(DELAY);
}

if (this_BTD == HIGH && old_BTD == LOW)
{
Keyboard.release('k');
delay(DELAY);
}
old_BTD = this_BTD;

// BT FXL
static char old_FXL = LOW;
char this_FXL = digitalRead(buttonFXLPin);
if (this_FXL == LOW && old_FXL == HIGH)
{
Keyboard.press('c');
delay(DELAY);
}

if (this_FXL == HIGH && old_FXL == LOW)
{
Keyboard.release('c');
delay(DELAY);
}
old_FXL = this_FXL;

// BT FXR
static char old_FXR = LOW;
char this_FXR = digitalRead(buttonFXRPin);
if (this_FXR == LOW && old_FXR == HIGH)
{
Keyboard.press('n');
delay(DELAY);
}

if (this_FXR == HIGH && old_FXR == LOW)
{
Keyboard.release('n');
delay(DELAY);
}
old_FXR = this_FXR;

}
Si tienen encoders de menos ppr, ca.birn el valor "600" por el numero que corresponda.
Última edición por RigoHoward el Dom Abr 19, 2015 3:44 am, editado 2 veces en total.

RigoHoward
Mensajes: 1137
Registrado: Lun Ene 28, 2013 9:52 am

Re: Custom SVDX controller

Mensaje por RigoHoward » Vie Abr 17, 2015 4:06 pm

Soplenme la vela!

Avatar de Usuario
Walky
Mensajes: 597
Registrado: Mar Ene 22, 2013 5:48 pm
Contactar:

Re: Custom SVDX controller

Mensaje por Walky » Sab Abr 18, 2015 12:57 pm

¡Está genial! No tenía idea de la existencia de ese juego, habrá que echarle un vistazo.

Por cierto, ¿tendrás por ahí una invitación para Bemaniso.ws? :mrgreen:

RigoHoward
Mensajes: 1137
Registrado: Lun Ene 28, 2013 9:52 am

Re: Custom SVDX controller

Mensaje por RigoHoward » Dom Abr 19, 2015 3:42 am

Walky escribió:¡Está genial! No tenía idea de la existencia de ese juego, habrá que echarle un vistazo.

Por cierto, ¿tendrás por ahí una invitación para Bemaniso.ws? :mrgreen:
Mandame tu mail por privado ;)

Avatar de Usuario
Lander
Mensajes: 318
Registrado: Mar Oct 28, 2014 11:44 pm
Ubicación: Quilpué, Valparaiso

Re: Custom SVDX controller

Mensaje por Lander » Mar Abr 21, 2015 10:08 am

Cuando leí Touhou (el juego predilecto de mi polola), EXIJO QUE NOS DIGAS COMO CONSEGUIRSE LA ISO PARA INSTALAR EL JUEGO :D

Responder