Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth

Componentes y materiales

Arduino Nano R3 ×2
SparkFun 9DoF Sensor Stick ×1
Cables jumper (genéricos) ×1
Tira NeoPixel ×1
Módulo Bluetooth HC-05 ×1
Batería 9V (genérica) ×1

Herramientas necesarias

Aplicaciones y servicios en línea

Sobre este proyecto

Este proyecto tiene 3 partes: la pantalla/tablero de juego, el controlador y el router maestro (script Python).

Parte 1 - La Pantalla

La pantalla es una matriz NeoPixel de 15x10 que funciona con un Arduino Nano. Maneja la lógica del juego y la entrada del script Python que se ejecuta en un ordenador host. Muestra una pelota que crece y se mueve hacia abajo en la matriz, dando una ilusión de profundidad y de la pelota viniendo hacia ti. Si detecta que la pelota es golpeada, esta se redibuja yendo "lejos" de ti.

Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth

Puntuación

La dirección de la pelota (izquierda o derecha) cambia con cada golpe. Si fallas la pelota, la COM obtiene un punto, pero si la COM falla (25% de probabilidad), tú obtienes el punto. Este diseño es similar a la versión de tenis de Wii Sports. Los puntos se muestran cada vez que la COM anota contra el jugador.

Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth

Puntuación máxima

Hay una puntuación máxima almacenada en una EEPROM I2C, en la dirección 0x04. Guarda un byte con la puntuación máxima. Si superas la anterior, sobrescribe la dirección. Si la COM llega a 10 puntos, es game over... Si es confuso, hice una tabla lógica:

Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth

Construir la matriz

Construir la matriz lleva tiempo, así que sigue la guía que hice aquí.

Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth
Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth

Parte 2 - El Controlador

El controlador es otro Arduino Nano con un 9DoF stick (solo 3.3V!) y un módulo HC-05 BLE. Si la aceleración en el eje X o Y supera un umbral, envía un '1' por serie al PC host, donde se reenvía a la pantalla. El Nano toma lecturas del acelerómetro X e Y a intervalos fijos y comprueba si los valores superan ±1.5g. Para acceder al 9DoF I2C, debes instalar la librería SparkFun (disponible aquí). También hay un tutorial para conectar el sensor y ejecutar programas básicos aquí.

Para construir la raqueta usé una caja y recorté forma de raqueta en cartón. Luego puse papel blanco sobre el recorte y dibujé un diseño. Usé una batería de 9V para alimentar el conjunto, ¡asegúrate de pasar la batería por el pin Vin del Nano, o tendrás 9V sin regular! Aquí una foto de los componentes dentro de la raqueta:

Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth

Comunicación por Bluetooth

¿Qué controla esta operación compleja? ¿Cómo habla la raqueta con la pantalla? Secreto: ¡no se hablan directamente! Hay un script Python simple que usa el puerto COM Bluetooth entrante y el puerto COM de la matriz para retransmitir información entre ellos. También ayuda a sincronizar los dos sistemas, ya que ambos se reinician al inicializar los puertos serie. La raqueta envía un '1' al script Python por Bluetooth, y el script envía un '1' a la matriz. Hay un debounce de 1 segundo para que los buffers serie no se desborden (solo tienen buffers de 32 bits).

La Raqueta

Haz clic en las imágenes para ver cómo construí la raqueta:

Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth
Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth
Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth
Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth
Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth
Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth

¡Diviértete con tu nuevo juego de tenis!

Un vídeo del tenis en acción:

Código

Código de la Matriz (C/C++)

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <EEPROM.h>

#define PIN 6
#define EEPROM_ADR 0x50
#define HS_ADR 0x02
#define NOTE_C1 33
#define SPKR_PIN 3

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(15, 10, PIN,
  NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);

int ball_x = 7;
int ball_y = 2;
int radius = 1;
int r_incr = 1;
bool isSwung = false;
int ball_x_dir = 1;
int ball_y_dir = 1;
bool isDirRight = true;
int score = 0;
int COM_score = 0;
int highscore = 0;
int framerate = 50;
int serial_data;
String score_string = "";
uint16_t colors[] = {matrix.Color(255,0,0), matrix.Color(0,255,0), matrix.Color(150,200,0)};
int melody[] = {0};
int tempo[] = {0};
static unsigned long lastFrame = 0;

void setup(){
  Serial.begin(9600);
  matrix.begin();
  matrix.fillScreen(0);
  matrix.setTextColor(colors[1]);
  randomSeed(analogRead(A2));
  display_scores();
  highscore = read_HS();
  Serial.println(highscore, DEC);
  matrix.setCursor(0,1);
  matrix.print("HS: ");
  matrix.show();
  delay(1000);
  matrix.fillScreen(0);
  matrix.setCursor(0,1);
  matrix.print(highscore, DEC);
  matrix.show();
  delay(1000);
  score_string = "";
}

void loop(){
  if((lastFrame + framerate) < millis()){
    update_frame();
    lastFrame = millis();
  }
}

void update_frame(){
  serial_data = Serial.parseInt();
  if(serial_data) isSwung = true;
  else isSwung = false;

  if(ball_y >= 5 && ball_y < 7 && isSwung){
    if(isDirRight){
      ball_x_dir = -1; ball_y_dir = -1;
    } else {
      ball_x_dir = 1; ball_y_dir = -1;
    }
    r_incr = -1;
  } else if(ball_y >= 8){
    COM_score += 1;
    end_round();
  } else if(ball_y <= 2){
    isDirRight = !isDirRight;
    int randNum = random(4);
    Serial.println(randNum);
    if(randNum == 2){
      score += 1;
      if(score > highscore) write_HS();
      end_round();
    } else {
      if(isDirRight){ ball_x_dir = 1; ball_y_dir = 1; }
      else { ball_x_dir = -1; ball_y_dir = 1; }
      r_incr = 1;
    }
  }
  ball_x += ball_x_dir;
  ball_y += ball_y_dir;
  radius += r_incr;
  matrix.fillScreen(0);
  matrix.fillCircle(ball_x, ball_y, radius, colors[2]);
  matrix.show();
}

void end_round(){
  if(COM_score >= 10) end_game();
  isDirRight = true;
  r_incr = 1;
  ball_x_dir = 1; ball_y_dir = 1;
  ball_x = 7; ball_y = 2; radius = 1;
  display_scores();
  matrix.fillScreen(0);
  matrix.fillCircle(ball_x, ball_y, radius, colors[2]);
  matrix.show();
}

void end_game(){
  matrix.fillScreen(0);
  matrix.setCursor(0,1);
  matrix.setTextColor(colors[0]);
  matrix.drawLine(3,0,12,9,colors[0]);
  matrix.drawLine(11,0,2,9,colors[0]);
  matrix.show();
  delay(500);
  while(1){ }
}

void display_scores(){
  matrix.fillScreen(0);
  matrix.setTextColor(colors[1]);
  matrix.setCursor(0,1);
  score_string = String(score) + "-" + String(COM_score);
  scrollText(score_string);
  matrix.fillScreen(0);
  delay(2000);
  matrix.show();
}

void scrollText(String text){
  int pass = 0;
  int x = matrix.width();
  for(int i=0; i<24; i++){
    matrix.fillScreen(0);
    matrix.setCursor(x,2);
    matrix.print(text);
    x -= 1;
    matrix.show();
    delay(150);
  }
}

void write_HS(){
  EEPROM.write(0x04, int(score));
}

int read_HS(){
  byte HS = EEPROM.read(0x04);
  return HS;
}

Código de la Raqueta (C/C++)

#include <Wire.h>
#include <SPI.h>
#include <SparkFunLSM9DS1.h>

LSM9DS1 imu;
#define LSM9DS1_M 0x1E
#define LSM9DS1_AG 0x6B
#define PRINT_SPEED 10

static unsigned long lastPrint = 0;
float accelx = 0;
float accely = 0;

void setup() {
  Serial.begin(9600);
  imu.settings.device.commInterface = IMU_MODE_I2C;
  imu.settings.device.mAddress = LSM9DS1_M;
  imu.settings.device.agAddress = LSM9DS1_AG;
  if (!imu.begin()) {
    while (1);
  }
}

void loop() {
  if ((lastPrint + PRINT_SPEED) < millis()) {
    if (imu.accelAvailable()) {
      imu.readAccel();
    }
    lastPrint = millis();
  }
  accelx = imu.calcAccel(imu.ax);
  accely = imu.calcAccel(imu.ay);
  if(accelx <= -1.5 || accelx >= 1.5){
    Serial.print(1);
    delay(600);
  } else if(accely <= -1.5 || accely >= 1.5){
    Serial.print(1);
    delay(600);
  }
}

Código Python

import serial
import time

matrix_port = "COM3"
raquet_port = "COM9"

matrix = serial.Serial(matrix_port, 9600)
racquet = serial.Serial(raquet_port, 9600)

time.sleep(10)

while 1:
  data = racquet.read()
  print(data)
  if data == "1":
    print("hit")
    matrix.write("1")
    time.sleep(1)
  time.sleep(0.05)

Esquemáticos

Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth
Juego de Tenis con Arduino: Experiencia de Raqueta Virtual con NeoPixel, Sensores y Bluetooth

Proceso de manufactura

  1. Detector de idiomas TinyML con Edge Impulse en Arduino Nano 33 BLE Sense
  2. Construye un Juego Giroscópico en Tiempo Real con Arduino Nano y Sensor MPU-6050
  3. Proyecto Dados Digitales Arduino: Construye tu Propio Generador de Números Aleatorios con LCD
  4. Construye un Iron Man animado con Arduino: componentes, sensores y guía paso a paso
  5. Find Me: Localizador Inteligente de Objetos con Arduino y Bluetooth
  6. Controlador de Humidificador DIY con Arduino y Relé: Configuración Segura de Alto Voltaje
  7. Medición de Distancia en Tiempo Real con Sonar Arduino y Visualización en Processing
  8. MobBob: Robot Arduino Impreso en 3D, Controlado por Smartphone Android
  9. Construir una lámpara de escritorio reactiva al audio con Arduino Nano
  10. Pong Neón en Matriz NeoPixel con Arduino Nano
  11. Construye un volante joystick personalizado con Arduino para gaming