domingo, enero 20, 2013

Capcom SNES jostick

Hace rato que tengo un botón hecho con arduino, este botón hace que vim cambie de modo comando a modo inserción. Un amigo  vio como lo ocupaba y se le ocurrió la idea de transformar un control capcom power stick para el snes y pasarlo a usb para poder utilizarlo como un controlador para Traktor.


He aquí como se transformó:



Después de un tiempo de observación noté que una vez que le pasas tierra o corriente a la placa toda esta queda con electricidad, lo que nos facilita la tarea de cablear y ver como funciona, el integrado que hace que funcione con el snes no lo ocupamos para nada, y creo que sería mejor desoldarlo en algún momento. Para estar seguros ayuda mucho tener un multimetro.


Así que fue cosa de soldar un pequeño dispositivo para poder conectarla a la corriente del arduino y empezar a jugar un poco con las conexiones, después fue ir soldando las terminales de los botones y conectarlas directo a una terminal del arduino.



El primer intento lo hice con el arduino pro ethernet de sparkfun, pero para que funcionará necesitaría de otro programa que emulará los tecladazos debido a que este arduino no es reconocido como una interfaz usb hid, así que decidí comprar un arduino leonardo para este caso.




El código puede obtenerse de aqui, esta es la parte que lee los botones, utilicé la variable arrayLettersBits para pasarle la tecla que quería que se presionara:

  //Letras a pulsar en el teclado
  const String arrayLettersBits = "arbxyl512346";

  for (int i = 2; i <= maxButtonPin; i++) {
    buttonState = digitalRead(i);
    if (buttonState != HIGH) {
      Keyboard.press(arrayLettersBits[i-2]);
    } else {
        Keyboard.release(arrayLettersBits[i-2]);
    }
    
  }

Esta parte es la que lee la palanca, aqui utilicé un pequeño hack, puesto que los switches del Jostick me regresaban aveces 0.1v o algo así y el arduino lo estaba detectando como HIGH, es por esto que utilicé analogRead en vez de digitalRead.

for (int i = jostikInitPin; i <= jostikEndPin; i++) {
    buttonState = analogRead(i);
    if (buttonState == 1023.00) {
      switch(i) {
        case 0:
          delay(5);
          buttonState = analogRead(i);
          if (buttonState == 1023.00) {
            Keyboard.press(KEY_RIGHT_ARROW);
            jostickBits[i-jostikInitPin]='0';
          }
          break;
        case 1:
// Más código similar aqui
      }
    } else {
      switch(i) {
        case 0:
          Keyboard.release(KEY_RIGHT_ARROW);
          
          break;
        case 1:     
// Más código similar aqui
      }      
    }

Al final lo terminé probando con un emulador de SNES y un juego de street fighter.

Pero el verdadero uso será así:

No hay comentarios.: