miércoles, 25 de mayo de 2011

Mando NES con arduino

Rebuscando entre las bolsas de trastos en busca de algo que usar para mis proyectos con mi arduino apareció en una bolsa varios cositas de mi vieja NASA que falleció hace... ni lo recuerdo.


La gracia es que aparecieron unos cuantos mandos y una pistola (que aun no se si me servirá para algo o no, ya veré) y para ir tirando me vale; la idea es en un futuro usar algún mando por bluetooth, wifi, radiofrecuencia... pero para ir enredando y mientras me voy haciendo con mas componentes me vale.

Para el mando de la NES (y similares como el de la NASA) hay una librería para arduino, la NESpad, que con dos sencillas ordenes podemos controlar el funcionamiento del mando.

Lo primero es diferenciar claramente cual es cada unos de los pines, para eso, nada mejor que la imagen con la posición de los pines que tienen en la web de la librería.

Y conectar cada cable según la siguiente tabla que también esta en la web, los pines digitales no tienen por que ser el 2,3,4; se puede conectar a los tres que se necesiten y a la hora de inicializarlo solo hay que pasarle los numero de pines que se van a usar:


Pin del Mando Color del cable Pin de Arduino
STROBE Verde Digital 2
CLOCK Azul Digital 3
DATA Marrón Digital 4
+5V Naranja +5V
GND Negro GND

En mi caso y después de varios intentos de errores y de volverse loco el arduino, opte por cortar el cable del mando y todos los errores se solucionaron.


Una vez conectado ya podemos comprobar el funcionamiento con el siguiente código:

#include <NESpad.h>

//Pines Digitales (strobe/clock/data)
NESpad mando = NESpad(2,3,4);

byte state = 0;

void setup() {
    Serial.begin(9600);
}

void loop() {
  state = mando.buttons();
  if (state & NES_A ){ Serial.println("LETRA A"); }
  else if (state & NES_B ) { Serial.println("LETRA B"); }
  else if (state & NES_SELECT ) { Serial.println("SELECT"); }
  else if (state & NES_START ) { Serial.println("START"); }
  else if (state & NES_UP ) { Serial.println("UP"); }
  else if (state & NES_DOWN ) { Serial.println("DOWN"); }
  else if (state & NES_LEFT ) { Serial.println("LEFT"); }
  else if (state & NES_RIGHT ) { Serial.println("RIGHT"); };  
  delay(10);
} 

En cuanto tenga un ratito libre pongo un ejemplo de uso del mando con unos servos que tengo por aquí.

No hay comentarios:

Publicar un comentario