Realizado por José María Amusquívar Poppe, Fabián Alfonso Beirutti Pérez y Prashant Jeswani Tejwani

Índice del contenido:

  1. Introducción
  2. Diseño y configuración
  3. Código implementado
  4. Descargar código en Processing y Arduino
  5. Referencias

Introducción

Se programa una interfaz que utiliza la información de distancia suministrada por el sensor Sharp GP2D12, leída a través del Arduino, para controlar el movimiento de la pala del Jugador 2 en el juego Pong implementado con Processing. Se ha reutilizado y refactorizado en clases el código del juego multijugador implementado anteriormente. A continuación:

  • Se describe el trabajo realizado argumentando las decisiones adoptadas para la solución propuesta
  • Se incluye las referencias y herramientas utilizadas
  • Se muestra el resultado con un gif animado

Diseño y configuración

El diseño y configuración ha sido el que se puede observar en la siguiente figura. Se adjunta el enlace de la configuración en Tinkercad para visualizar las conexiones del Arduino. El conexionado de cada cable del sensor de distancia a las señales que corresponden en la tarjeta es el siguiente: rojo = 5v, negro = GND y amarillo = A0.

Código implementado

A continuación se describe el trabajo realizado. Respecto al código de Processing, se crean e inicializan las variables necesarias para el correcto funcionamiento y establecimiento de la conexión con Arduino.

Serial arduino;
String value = "0";


En la función setup() se obtiene una lista de todos los puertos serie disponibles y se escoge el puerto adecuado. A continuación, se crea objeto Serial para leer los datos que son enviados desde Arduino a través de la función Serial.println(msg) (véase la función loop() del programa en Arduino).

Nota: Se deberá escoger el mismo puerto que se esté utilizando en Arduino (en nuestro caso es el primero de la lista).

void setup() {
  ...
  // Arduino port
  String portName = Serial.list()[0];
  arduino = new Serial(this, portName, 9600);
  ...
}


En la función draw() se llama la función move() de la clase Paddle para el movimiento de las palas de los jugadores. Como el movimiento de la pala del el jugador 2 se realiza mediante el sensor, se pasa como parámetro la distancia mediante la función getSensorDistance().

void draw() {
  if (start) {
    ...
    paddle.move(getSensorDistance());
    ...
  } else {
    ...
  }
}


La función getSensorDistance() devuelve la distancia en cm obtenida de Arduino, en el caso de que el valor sea nulo se devuelve -1.

float getSensorDistance() {
  if (arduino.available() > 0) {
    value = arduino.readStringUntil('\n');
  }

  return (value != null) ? float(value) : -1;
}


La Clase Paddle representa las palas de ambos jugadores. Para el jugador 2 se inicializan las variables para establecer un rango mínimo y máximo de distancia.

...
private float minDistance;
private float maxDistance;
private float posRemapped;

public Paddle() {
  ...
  this.minDistance = 7.0;
  this.maxDistance = 30.0;
}


La función move(distance) se encarga mover las palas de ambos jugadores. Para el movimiento de pala del jugador 2, la variable posRemapped mapea la distancia obtenida de la mano entre 0 y la parte inferior del tablero de juego.

void move(float distance) {
  ...
  if (distance == -1) return;    
  if (distance > maxDistance) distance = maxDistance;
  if (distance < minDistance) distance = minDistance;

  // Map player 2 position 
  posRemapped = map(distance, minDistance, maxDistance, 0, height-89);
  this.posy2 = posRemapped;
}


Respecto al código de Arduino, se inicializan las variables que almacenarán los resultado obtenidos del sensor de distancia, conectando el sensor en el pin analógico A0. En la función setup() se abre el monitor de serie para visualizar las distancias que se obtienen.

int IR_SENSOR = 0; // Sensor connected to the analog A0
int sensorResult = 0; // Sensor result
float sensorDistance = 0; // Calculated value

void setup() {
  // Setup communication with serial monitor
  Serial.begin(9600);
}


La función loop() se encarga de leer el valor del sensor, convertirlo en centímetros y enviarlo a Processing.

void loop() {
  // Read the value from the ir sensor
  sensorResult = analogRead(IR_SENSOR);
  // Calculate distance in cm
  sensorDistance = (6787.0 / (sensorResult - 3.0)) - 4.0;
  // Send distance to Processing
  Serial.println(sensorDistance);
  delay(200); // Wait
} 


A continuación, se muestra el resultado final mediante un gif animado. La pala de la derecha es del jugador 2, controlado mediante el sensor de distancia:

Descargar código en Processing y Arduino

Para descargar el código en Processing y Arduino, acceda a: Descargar código en Processing y Arduino o acceda a la carpeta del repositorio del proyecto en: Repositorio del proyecto

Repositorio del proyecto de Prashant Jeswani Tejwani

Repositorio del proyecto de Fabián Alfonso Beirutti Pérez


Referencias

Guión de prácticas

Página de Arduino

Creación del enlace de descarga