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

Tenis Arduino virtual

Componentes y suministros

Arduino Nano R3
× 2
Barra de sensor SparkFun 9DoF
× 1
Cables de puente (genéricos)
× 1
Tira de NeoPixel
× 1
Módulo Bluetooth HC-05
× 1
batería de 9V (genérica)
× 1

Herramientas y máquinas necesarias

Soldador (genérico)

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

Este proyecto tiene 3 partes:el tablero / pantalla del juego, el controlador y el enrutador maestro (secuencia de comandos de Python).

Parte 1 - La pantalla

La pantalla es una matriz de neopíxeles de 15x10 que se ejecuta en un Arduino Nano. Maneja la lógica del juego y la entrada de Python Script que se ejecuta desde una computadora host. Muestra una bola que crece y se mueve más abajo en la matriz, dando una ilusión de profundidad y la bola viene hacia ti. Si detecta que la pelota ha sido golpeada, la pelota se volverá a dibujar y se alejará de usted.

Puntos

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

Puntaje alto

Hay una puntuación alta en ejecución que se almacena en una EEPROM I2C, en la dirección 0x04. Mantiene un byte que tiene la puntuación más alta. Si obtiene una puntuación más alta que la anterior, sobrescribe la dirección. Si el COM obtiene una puntuación de 10, se acabó el juego ... Si eso es confuso, hice una tabla lógica:

Haz la matriz

Hacer la matriz llevará algún tiempo, así que sigue la guía que hice aquí.

Parte 2 - El controlador

El controlador es otro Arduino Nano que tiene un stick 9DoF (¡solo 3v3!) Y un módulo HC-05 BLE adjunto. Si la aceleración de cualquiera de los ejes xo y es mayor que un umbral especificado, envía un '1' a través de serie a la PC host, donde se transmite a la pantalla. El Nano toma una lectura del acelerómetro xey en un intervalo establecido donde luego verifica si los valores caen por encima o por debajo de 1,5 gramos. Para acceder al dispositivo I2C 9 DoF, debe instalar la biblioteca Sparkfun que se puede descargar aquí. También hay un tutorial sobre cómo conectar el sensor y ejecutar programas básicos con él aquí.

Para construir la raqueta utilicé una caja y luego recorté la forma de una raqueta en un trozo de cartón. A partir de ahí fue fácil:simplemente coloque un trozo de papel blanco sobre el recorte de cartón y dibuje un diseño sobre el papel. Usé una batería de 9v para alimentar la configuración, solo asegúrese de pasar la batería a través del pin Vin en el Nano, ¡o de lo contrario será un 9v no regulado! Aquí hay una imagen de las partes internas dentro de la raqueta:

Comunicarse a través de Bluetooth

Así que ahora se estará preguntando, ¿qué controla esta compleja operación? ¿Cómo se comunica la raqueta con la pantalla? Aquí hay un secreto:¡no se hablan entre ellos! Hay una secuencia de comandos de Python simple que usa el puerto COM de Bluetooth entrante y el puerto COM de la matriz para transmitir información entre ellos. También ayuda a sincronizar los dos sistemas, ya que ambos se restablecen cuando se inicializan los puertos serie. La raqueta envía un "1" a la secuencia de comandos de Python a través de Bluetooth, y luego la secuencia de comandos de Python envía un "1" a la matriz. Hay un rebote de 1 segundo para que los puertos serie no desborden sus búferes (solo tienen búferes de 32 bits).

La raqueta

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

¡Diviértete con tu nuevo juego de tenis!

Un video de tenis que se juega:

Código

  • Código de matriz
  • Código de raqueta
  • Código Python
Código de matriz C / C ++
Va en el Arduino adjunto a la matriz.
 #include  #include  #include  #include  #include  #define PIN 6 // Pin de datos para la matriz # define EEPROM_ADR 0x50 // La dirección I2C de la EEPROM # define HS_ADR 0x02 // La dirección del byte de puntuación más alta en la EEPROM # define NOTE_C1 33 # define SPKR_PIN 3Adafruit_NeoMatrix matriz =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; // Coordenada X de la bola ball_y =2; // Radio de la coordenada Y de la bola =1; // Radio de la bolaint r_incr =1; // Cuánto aumentar el radio bybool isSwung =false; // ¿Es el raquet swungint ball_x_dir =1; // Dirección X de la bolaint ball_y_dir =1; // La dirección Y de la bola esDirRight =true; int score =0; // La puntuación del juego actualint COM_score =0; int highscore =0; // La puntuación más alta de todos los juegosint framerate =50; // Cuántos ms entre cada frameint 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 (colores [1]); randomSeed (analogRead (A2)); display_scores (); puntuación más alta =read_HS (); Serial.println (puntuación más alta, DEC); matrix.setCursor (0,1); matrix.print ("HS:"); matrix.show (); retraso (1000); matrix.fillScreen (0); matrix.setCursor (0,1); matrix.print (puntuación más alta, DEC); matrix.show (); retraso (1000); score_string ="";} bucle vacío () {if ((lastFrame + framerate)  =5 &&ball_y <7 &&isSwung) {if (isDirRight) {ball_x_dir =-1; ball_y_dir =-1; } else if (! isDirRight) {ball_x_dir =1; ball_y_dir =-1; } r_incr =-1; } más si (bola_y> =8) {COM_puntuación + =1; end_round (); } else if (ball_y <=2) {isDirRight =! isDirRight; int randNum =aleatorio (4); Serial.println (randNum); if (randNum ==2) {// 25% de probabilidad de que la puntuación de COM falte + =1; if (puntuación> puntuación más alta) {write_HS (); } end_round; } else {if (isDirRight) {ball_x_dir =1; ball_y_dir =1; } else if (! isDirRight) {ball_x_dir =-1; ball_y_dir =1; } r_incr =1; }} bola_x + =bola_x_dir; ball_y + =ball_y_dir; radio + =r_incr; matrix.fillScreen (0); matrix.fillCircle (bola_x, bola_y, radio, colores [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; bola_x =7; ball_y =2; radio =1; display_scores (); matrix.fillScreen (0); matrix.fillCircle (bola_x, bola_y, radio, colores [2]); matrix.show (); } void end_game () {matrix.fillScreen (0); matrix.setCursor (0,1); matrix.setTextColor (colores [0]); matrix.drawLine (3,0,12,9, colores [0]); matrix.drawLine (11,0,2,9, colores [0]); matrix.show (); retraso (500); while (1) {}} void display_scores () {matrix.fillScreen (0); matrix.setTextColor (colores [1]); matrix.setCursor (0,1); score_string =String (score) + "-" + String (COM_score); scrollText (score_string); matrix.fillScreen (0); retraso (2000); matrix.show ();} void scrollText (Texto de cadena) {int pass =0; int x =matriz.ancho (); para (int i =0; i <24; i ++) {matrix.fillScreen (0); matriz.setCursor (x, 2); matrix.print (texto); x - =1; matrix.show (); retraso (150); }} void write_HS () {EEPROM.write (0x04, int (puntuación));} int read_HS () {byte HS =EEPROM.read (0x04); // Leer de la dirección 4 return HS;} 
Código de raqueta C / C ++
 #include  #include  #include  LSM9DS1 imu; #define LSM9DS1_M 0x1E // Sería 0x1C si SDO_M es LOW # define LSM9DS1_AG 0x6B // Sería 0x6A si SDO_AG es LOW # define PRINT_SPEED 10 // 10 ms entre comprobaciones estática unsigned long lastPrint =0; // Mantenga un registro de la impresión timefloat accelx =0; float accely =0; void setup () {// ponga su código de configuración aquí, para que se ejecute una vez: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 ()) {// falló mientras (1); }} void loop () {if ((lastPrint + PRINT_SPEED)  =1.5) {Serial.print (1); retraso (600); } else if (acertadamente <=-1.5 || acertadamente> =1.5) {Serial.print (1); retraso (600);}} 
Código Python Python
 import serialimport timematrix_port ="COM3" raquet_port ="COM9" matrix =serial.Serial (matrix_port, 9600) raquet =serial.Serial (raquet_port, 9600) time.sleep (10) while 1:data =raquet.read ( ) imprimir datos si data =="1":imprimir "hit" matrix.write ("1") time.sleep (1) time.sleep (.05) 

Esquemas


Proceso de manufactura

  1. TinyML-Language Detector basado en Edge Impulse y Arduino
  2. Juego de giroscopio Arduino con MPU-6050
  3. Dados digitales Arduino
  4. Iron Man
  5. Encuéntrame
  6. Control del humidificador Arduino
  7. Sonda usando arduino y visualización en procesamiento IDE
  8. MobBob:Robot Arduino DIY controlado por un teléfono inteligente Android
  9. Luz de escritorio reactiva de audio Arduino
  10. NeoMatrix Arduino Pong
  11. Joystick de Arduino