jueves, 8 de noviembre de 2012

Respuestas visuales, auditivas y táctiles

En esta entrada la idea era mostrar una especie de interacción entre el usuario y la maquina (donde se ejecuta una aplicación/juego). Como el curso esta orientado a la creación de un juego, estas interacciones se pueden obtener como respuestas por parte de la aplicación a acciones que realice el usuario, que pueden ser visuales, sonoras o hasta táctiles.

En el mundo de los videojuegos estas respuestas son imprescindibles:
  • Las visuales, son las más presentes en todos los videojuegos, ya que cualquier situación, acción o cambio que el usuario realice, se vera reflejada en una respuesta visual, como por ejemplo al disparar una arma, una respuesta visual puede ser el humo o la pequeña explosión que se emite. 

  • Las sonoras, son tambien muy presentes, ya casi en cualquier acciones que se realice y en la que se trate de imitar la realidad, lo mas natural es que se escuche algo, como ejemplo podemos retomar el disparo de una pistola, que al suceder esto se debe de emitir un sonido que emule la explosión de ésta o al quebrar un cristal, o incluso se puede tomar como respuesta sonora, la música de ambientación ya que se encuentra en constante cambio y depende de la situación en la que se encuentre el personaje o cierta acción que se realice.

  • Las táctiles son un poco más recientes (según yo, su primera aparición fué en los controles del nintendo 64, añadiendo un aditamento), y su mayor uso es en las consolas de juegos, ya que se encuentran en los controles como pequeños motores que los hacen vibrar en diversas situaciones, como al disparar, golpear, recibir daño, etc.
Para tratar de explicar un poco mejor esto, realice una pequeña implementación usando un arduino, botones, leds, un piezo/speaker/buzzer y muchos cables :P.

La idea que se me ocurrió fue la de hacer juego de reacción (tratando de imitar un juego de unos topos que se golpean con un mazo) donde tengo 3 leds y 3 botones, los led prenden aleatoriamente y la meta es presionar el boton del led que esta encendido.
El jugador tiene 1/2 segundo para reaccionar, si el jugador atina se enciende un led de aprobación (verde) y se emite un sonido agudo, de lo contrario o si no se presiona nada se enciene un led de error (rojo) y se emite un sonido grave.

Aquí las respuestas a las acciones del jugador son visuales y auditivas, donde las visuales son en las que encienden los leds (aprobación y error)  y las sonoras son en las que se emiten los sonidos (agudos y graves).

Sin más, aquí dejo la imágen del diagrama hecho con Fritzing para las conexiones:




Aquí unas fotos del circuito real:




El código para el arduino esta muy simple, se hace uso de conexión serial, encendido y apagado de pines digitales, lecturas de pines digitales y de random para encender los leds aleatoriamente:

int led1 = 2;
int led2 = 3;
int led3 = 4;
int boton1 = 5;
int boton2 = 6;
int boton3 = 7;
int ok = 8;
int error = 9;
int bocina = 10;


void setup(){
Serial.begin(115200);

pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(ok, OUTPUT);
pinMode(bocina, OUTPUT);
pinMode(error, OUTPUT);
pinMode(boton1, INPUT);
pinMode(boton2, INPUT);
pinMode(boton3, INPUT);

}

void loop(){
   
    int led = random(2, 5);
  
    digitalWrite(led, HIGH);
    Serial.print(led-1);
    delay(500);
    
    int boton = led + 3;
    
    int estado = digitalRead(boton);
    delay(500);
    if (estado == HIGH){
      digitalWrite(ok, HIGH);
      tone(bocina, 900, 250);
      delay(500);
      Serial.print(boton-4);
      Serial.print(1);
    }
    else{
      digitalWrite(error, HIGH);
      tone(bocina, 400, 250);
      delay(500);
      Serial.print(0);
      Serial.print(0); 
    }     
  
  digitalWrite(led, LOW);
  digitalWrite(ok, LOW);
  digitalWrite(error, LOW);  
  delay(250);
}



  • Al principio se establecen que pines se usaran y como se usarán, entradas o salidas.
  • Ya en la parte de ejecución del programa, primero se usa random, para obtener un entero y usar este para encender cierto led.
  • Ya encendido el led, se usa un delay(500) para tener oportunidad de ver al led encendido.
  • Se busca que se presione el botón correspondiente, esto sumando 3 al entero que se uso para encender led y ya con este número de pin se hace la lectura con digitalRead().
  • Se usa un delay(500), que equivale a 1/2 segundo para esperar a que reaccione el jugador.
  • Con la lectura obtenida, se entra al if, si se presiona se enciende el led ok(verde) y la bocina emite un sonido agudo, usando la función tone, que tiene como parametros (pin, frecuencia(MHz), duración(milisegundos)), entre más alta la frecuencia mas agudo el sonido. si no se presiona sucede todo lo contrario, se enciende el led error (rojo) y se emite un sonido grave.
  • Al final se apagan todos los leds encendidos, la bocina se apaga sola al terminar la duración de su sonido, se puso un pequeño delay(250) para darle un tiempo al arduino antes de que se vuelva a repetir todo el proceso.

También, como el código de arduino usa conexión serial, elabore un pequeño programa en python que usa esta comunicación serial y usa los datos recibidos para mostrar una forma de puntuación en pantalla, además de indicar cuando se acierta o falla en el juego.

import serial

s=serial.Serial(2,115200)

def main():

 marcador, total = 0, 0

 while (True):
  l = int(s.read())
  b = int(s.read())
  r = int(s.read())
  print "Led #", l, " Boton #", b

  total +=1 

  if(r == 1): 
   marcador += 1
   print "Acertaste!!"

  else:
   print "Fallaste!!"

 
  print "Tu puntuacion -->> ", marcador, "/", total

main()  



  • Se usa la librería pyserial, se importa como import serial.
  • Se crea un objeto tipo serial con los parametros (puerto, baudrate), se pueden usar más, pero con estos son suficientes para este propósito. el puerto es asignado por windows para el arduino es COM3 o 3, pero debido a que la librería pyserial los enumera desde 0, por eso se estableció 2, (en Ubuntu el manejo de los puertos es de manera diferente).
  •  Con el objeto serial, se hacen las lecturas de la información enviada por el arduino, mediante la función read().
  • Se usa un while infinito para que siempre que el arduino envíe datos este leyendo.
  • Las variables, l se usa para el valor de led encendido, b para el boton presionado y r para el resultado de si se presiono o no el correcto, y se convierten todos a enteros.
  • Si r arroja un 1, quiere decir que se acertó y se suma uno al puntaje.
  • Al final se muestra el puntaje,en el formato de, cuantas veces que se acertó de cuantas posibles y se repite todo el proceso.


Una captura del programa de python:



Aquí dejo un video de como funciona el juego:




____________________________________________________________________________________
Enlace Útiles:




1 comentario:

  1. No hay mención de aportaciones al proyecto grupal. Van 5 pts por la tarea y 6 pts extra por el hardware.

    ResponderEliminar