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

Marcador inteligente de baloncesto

Componentes y suministros

Arduino Nano R3
× 1
Módulo Bluetooth HC-05
× 1
Sensor de proximidad infrarrojo E18-D80NK
× 1
Seeed Grove - Sensor de vibración (SW-420)
× 1
Sensor de temperatura DHT22
× 1
LED RGB de 8 mm
× 1
Resistencia de 10k ohmios
× 3
Resistencia 100 ohm
× 3
Resistencia de orificio pasante, 47 ohm
× 1
Resistencia 1k ohm
× 1
Resistencia de 2,21 k ohmios
× 1
batería de 9V (genérica)
× 1

Aplicaciones y servicios en línea

Arduino IDE
IDE de Android de Inventor de la aplicación MIT

Acerca de este proyecto

Suelo hacer entrenamientos de baloncesto con regularidad y siempre hago un seguimiento de las estadísticas de las secciones (número de tiros, puntuaciones, fallos, etc.). Hacer un seguimiento de estos números es algo aburrido y difícil de lograr. Las bolas inteligentes se pueden usar para esto, pero tienen algunos inconvenientes:

  • Si quieres entrenar con múltiples balones, necesitarás comprar varios balones inteligentes (costosos).
  • La precisión no es tan buena.
  • La durabilidad del balón.

En mi proyecto anterior, el prototipo de marcador de baloncesto inteligente, utilicé el dispositivo Avnet SmartEdge para probar un método para realizar un seguimiento de mis entrenamientos de baloncesto. Usé el sensor de aceleración para detectar los disparos y el sensor de proximidad para detectar las puntuaciones. Ahora, la idea de este proyecto es implementar una solución definitiva para la tarea del marcador de baloncesto.

Versiones

Al comienzo del proyecto, usé los componentes de hardware que tenía disponibles en casa y desarrollé el software (Arduino y Android) que necesitaba. Esta primera versión (1.1.0) demostró funcionar bastante bien, así que decidí hacer algunos cambios para usar componentes más baratos e implementar algunas mejoras de software también. La segunda versión (2.0.0) es aún mejor, disfrútala.

Paso 1:Arduino

Hardware

Puede ver la lista de componentes de hardware para la versión 2.0.0 en la sección Cosas.

Estos son los principales cambios realizados desde la versión 1.1.0 a la versión 2.0.0:

  • Arduino Mega 2560 => Cambiado a Arduino Nano R3
  • Escudo Bluetooth => Cambiado a Módulo Bluetooth HC-05
  • Energía de iones de litio recargable => Cambiada a batería de 9V
  • Sensor de temperatura y humedad DHT22 => Añadido.

Algunas consideraciones sobre otros componentes utilizados en este proyecto:

  • Sensor de proximidad por infrarrojos E18-D80NK:en este proyecto se podrían utilizar otros sensores de proximidad, pero tenga en cuenta que es mejor utilizar uno que no sufra la interferencia de la luz solar, como este.
  • Sensor de vibración SW420:Se podrían usar otros sensores de vibración en este proyecto, este funciona muy bien.

Los esquemas de Arduino para las dos versiones están disponibles en la sección Esquemas.

Software

Usé el IDE de Arduino para desarrollar el código de Arduino, programado con la siguiente estrategia:

  • Después de la inicialización (variables, LED, Bluetooth, etc.) permanece monitoreando continuamente el estado de los sensores.
  • Si el sensor de proximidad detecta la presencia de la pelota, significa que acaba de ocurrir un tiro y es un marcador.
  • Si el sensor de vibración detecta algún movimiento, significa que acaba de ocurrir un disparo pero espera 2 segundos (máximo) para tomar una decisión.
  • En este tiempo, si el sensor de proximidad detecta la presencia de la pelota, (inmediatamente) sabe que es una puntuación.
  • Al final del tiempo de 2 segundos, si el sensor de proximidad no detectó la presencia de la pelota, sabe que falló.
  • El Arduino informa al Android a través de Bluetooth que acaba de ocurrir un disparo (anotar o fallar).
  • El proceso se reinicia.

Estos son los principales cambios realizados desde la versión 1.1.0 a la versión 2.0.0:

  • Cambie la compatibilidad con el protector de Bluetooth al módulo Bluetooth HC-05
  • Agregue soporte al sensor de temperatura y humedad DHT22
  • Mejore la lógica para detectar tiros, anotaciones y fallas y para una mejor señalización a través del LED.

Los códigos de Arduino para las dos versiones están disponibles en la sección de Código.

Paso 2:Android

Usé MIT App Inventor para desarrollar el código de Android, programado con la siguiente estrategia:

  • Después de la inicialización (tiros, puntuaciones, fallas, Bluetooth, etc.) espera a que se presione el botón "Inicio".
  • Cuando se presiona el botón "Inicio", permanece monitoreando continuamente la conexión Bluetooth.
  • Cada vez que recibe datos, actualiza el tablero y reproduce el sonido de notificación correcto.
  • El proceso se repite hasta que se presiona el botón "Pausa".
  • Hay botones para seleccionar el dispositivo Bluetooth, restablecer el conteo y algunos botones adicionales para ajustar el tablero si es necesario.

Estos son los principales cambios realizados desde la versión 1.1.0 a la versión 2.0.0:

  • Cambie el diseño de vertical a horizontal.
  • Agregue índice de luz, humedad, temperatura y calor.
  • Mejore los botones de ajuste.
  • Agregue una función para mantener la pantalla siempre encendida.
  • Agregue sonidos de presión en todos los botones.
  • Agrega funcionalidad para advertir cada vez que se alcanza la marca de 50 disparos (50, 100, 150, etc.).

Los códigos de Android para las dos versiones están disponibles en la sección Código.

Paso 3:configuración de la tabla de baloncesto

Esta es la tabla de baloncesto original que utilizo habitualmente para hacer entrenamientos de baloncesto.

Primero quité la cubierta de plástico debajo del aro e hice un agujero en el sensor de proximidad.

Luego hice un pequeño agujero para arreglar el sensor de vibración.

No pude sujetar el sensor directamente a la cubierta de plástico debido a su curvatura, así que construí un soporte para el sensor usando MDF.

Arreglé los sensores de proximidad y vibración usando algunos pernos y una tuerca.

Luego conecté los otros componentes.

Es hora de una prueba de humo.

Finalmente, instalé todo en la tabla de baloncesto.

Paso 4:prueba de entrenamiento de baloncesto

Ahora es el momento de probar todo.

Y el gran final ... ¡es la hora del espectáculo!

Paso 5:consideraciones finales

  • El sistema demostró ser muy preciso, con muy pocos falsos positivos y pocos falsos negativos.
  • Es fantástico jugar con el sistema para conocer las estadísticas del entrenamiento en tiempo real y después del entrenamiento.

Diviértete ...

Código

  • Código Arduino (1.1.0)
  • código de Android (1.1.0)
  • Código Arduino (2.0.0)
  • Código de Android (2.0.0)
Código Arduino (1.1.0) Arduino
 // --------------------------------------------- ------------------------------- //// Nombre de archivo:Scoreboard.ino //// Descripción:Smart Basketball Scoreboard / /// Versión:1.1.0 //// Autor:Marcelo Avila de Oliveira  //// --------------------- -------------------------------------------------- ----- //// ----------------------------------------- ----------------------------------- //// DEFINICIONES //// ------ -------------------------------------------------- -------------------- //// ACTIVAR EL MODO DEBUG // #define DEBUG // #define DEBUG_PROX // #define DEBUG_VIBR // ----- -------------------------------------------------- --------------------- //// CONSTANTES //// -------------------- -------------------------------------------------- ------ //// PINSconst int prox_pin =2; const int vibr_pin =3; const int led_r_pin =4; const int led_g_pin =5; const int led_b_pin =6; // TIMEconst unsigned long wait_interval =3000; / / MATHconst float percent_to_bright_factor =100 * log10 (2 ) / log10 (255); // ----------------------------------------- ----------------------------------- //// VARIABLES //// ------ -------------------------------------------------- -------------------- //// TIMEunsigned long wait_time; // STATUSboolean prox =false; boolean vibr =false; boolean wait =false; // --- -------------------------------------------------- ----------------------- //// FUNCIONES (AJUSTES) //// --------------- -------------------------------------------------- ----------- // configuración vacía () {// INICIAR PINS pinMode (prox_pin, INPUT); pinMode (vibr_pin, ENTRADA); pinMode (led_r_pin, SALIDA); pinMode (led_g_pin, SALIDA); pinMode (led_b_pin, SALIDA); set_led (5, 100); // INICIAR COMUNICACIÓN SERIAL Serial.begin (9600); // INICIAR LA COMUNICACIÓN BLUETOOTH setup_bluetooth (); set_led (4, 100); #ifdef DEBUG Serial.println ("La placa está viva"); Serial.println (); #endif} void setup_bluetooth () {#ifdef DEBUG Serial.println ("Configuración de Bluetooth"); Serial.println (); #endif Serial1.begin (38400); // Establecer la velocidad en baudios Serial1.print ("\ r \ n + STWMOD =0 \ r \ n"); // Establecer para trabajar en modo esclavo Serial1.print ("\ r \ n + STNA =Arduino \ r \ n"); // Establecer nombre Serial1.print ("\ r \ n + STOAUT =1 \ r \ n"); // Permitir que el dispositivo emparejado se conecte Serial1.print ("\ r \ n + STAUTO =0 \ r \ n"); // La conexión automática debería estar prohibida aquí delay (2000); // Este retraso es necesario. Serial1.print ("\ r \ n + INQ =1 \ r \ n"); // Hacer que el esclavo sea consultable delay (2000); // Este retraso es necesario. while (Serial1.available ()) {// Borrar retraso de datos (50); Serial1.read (); }} // ---------------------------------------------- ------------------------------ //// FUNCIONES (LUZ) //// -------- -------------------------------------------------- ------------------ // int percent_to_bright (int percent) {// PERCENT:// 0..100 // RETURN BRIGHT // 255..0 return 256 - pow (2, percent / percent_to_bright_factor);} void set_led (int color, int bright) {// COLOR:// 0 =VERDE // 1 =AMARILLO // 2 =ROJO // 3 =CIAN // 4 =AZUL / / 5 =MAGENTA // 6 =BLANCO // // BRILLO:// 0 =APAGADO // .. // 100 =MAX #ifdef DEBUG Serial.println ("LED de ajuste"); Serial.println (); #endif if (color <0 || color> 6 || brillante <0 || brillante> 100) {return; } int led_r_bright =255; int led_g_bright =255; int led_b_bright =255; int bright_aux =percent_to_bright (brillante); cambiar (color) {caso 0:// VERDE led_g_bright =bright_aux; descanso; caso 1:// AMARILLO led_r_bright =bright_aux; led_g_bright =bright_aux; descanso; caso 2:// ROJO led_r_bright =bright_aux; descanso; caso 3:// CYAN led_g_bright =bright_aux; led_b_bright =bright_aux; descanso; caso 4:// AZUL led_b_bright =bright_aux; descanso; caso 5:// MAGENTA led_r_bright =bright_aux; led_b_bright =bright_aux; descanso; caso 6:// BLANCO led_r_bright =bright_aux; led_g_bright =bright_aux; led_b_bright =bright_aux; descanso; } analogWrite (led_r_pin, led_r_bright); analogWrite (led_g_pin, led_g_bright); analogWrite (led_b_pin, led_b_bright); regreso;}//--------------------------------------------- ------------------------------- //// FUNCIONES (COMPROBAR) //// ------- -------------------------------------------------- ------------------- // void check_prox () {if (! prox) {if (digitalRead (prox_pin) ==LOW) {#ifdef DEBUG_PROX Serial.println ( "Proximidad detectada"); Serial.println (); #endif prox =true; si (! vibr) {espera =verdadero; tiempo_espera =millis () + intervalo_espera; } set_shot (1); }}} void check_vibr () {if (! prox &&! vibr) {if (digitalRead (vibr_pin) ==HIGH) {#ifdef DEBUG_PROX Serial.println ("Vibración detectada"); Serial.println (); #endif vibr =true; esperar =verdadero; tiempo_espera =millis () + intervalo_espera; set_led (1, 100); }}} void check_wait () {if (espera &&millis ()> espera_tiempo) {if (! prox) {set_shot (0); } Reiniciar(); }} // ---------------------------------------------- ------------------------------ //// FUNCIONES (MIS) //// -------- -------------------------------------------------- ------------------ // void set_shot (int mode) {// MODE:// 0 =WRONG SHOT (MISS) // 1 =RIGHT SHOT (SCORE) si (modo ==0) {set_led (2, 100); } else {set_led (0, 100); } Serial1.print (modo); delay (1000);} void reset () {vibr =false; prox =falso; esperar =falso; set_led (4, 100);} // ---------------------------------------- ------------------------------------//// PRINCIPAL ////----- -------------------------------------------------- --------------------- // bucle vacío () {check_prox (); check_vibr (); check_wait ();} 
Código de Android (1.1.0) Java
Inventor de la aplicación Android MIT (http://ai2.appinventor.mit.edu/)
 Sin vista previa (solo descarga). 
Código Arduino (2.0.0) Arduino
 // --------------------------------------------- ------------------------------- //// Nombre de archivo:Scoreboard.ino //// Descripción:Smart Basketball Scoreboard / /// Versión:2.0.0 //// Autor:Marcelo Avila de Oliveira  //// --------------------- -------------------------------------------------- ----- //// ----------------------------------------- ----------------------------------- //// BIBLIOTECAS //// ------ -------------------------------------------------- -------------------- //// BIBLIOTECA DE TEMPERATURA Y HUMEDAD # incluye "DHT.h" // BIBLIOTECA MULTI SERIE # incluye "SoftwareSerial.h" // - -------------------------------------------------- ------------------------- //// DEFINICIONES //// ---------------- -------------------------------------------------- ---------- //// ACTIVAR MODO DEBUG // #define DEBUG // #define DEBUG_BLUE // #define DEBUG_PROX // #define DEBUG_VIBR // #define DEBUG_DHT // DHT SENSOR # define DHTPIN 7 # define DHTTYPE DHT22DHT dht (DHTPIN, DHTTYPE); // MODU BLUETOOTH Software LE (RX, TX) Serie Bluetooth (10, 11); // ---------------------------------- ------------------------------------------ //// CONSTANTES /// / ------------------------------------------------- --------------------------- //// PINSconst int prox_pin =2; const int vibr_pin =3; const int led_r_pin =4; const int led_g_pin =5; const int led_b_pin =6; // TIMEconst unsigned long wait_interval =2000; const unsigned long dht_interval =10000; // MATHconst float percent_to_bright_factor =100 * log10 (2) / log10 (255); // --- -------------------------------------------------- ----------------------- //// VARIABLES //// ------------------ -------------------------------------------------- -------- //// TIMEunsigned long wait_time; unsigned long dht_time; // HUMEDAD &TEMPERATUREfloat humi, temp, heat; // STATUSboolean prox =false; boolean vibr =false; boolean wait =false; // -------------------------------------------------- -------------------------- //// FUNCIONES (AJUSTES) //// ------------ ------------------------ ---------------------------------------- // configuración vacía () {// INICIAR PINS pinMode (pin_prox, ENTRADA); pinMode (vibr_pin, ENTRADA); pinMode (led_r_pin, SALIDA); pinMode (led_g_pin, SALIDA); pinMode (led_b_pin, SALIDA); // SET LED MAGENTA set_led (5, 100); // INICIAR COMUNICACIÓN SERIAL Serial.begin (9600); // INICIAR LA COMUNICACIÓN BLUETOOTH setup_bluetooth (); // INICIAR SENSOR DHT dht.begin (); // ESTABLECER LED AZUL set_led (4, 100); #ifdef DEBUG Serial.println ("La placa está viva"); Serial.println (); #endif} void setup_bluetooth () {#ifdef DEBUG_BLUE Serial.println ("Configuración de Bluetooth"); Serial.println (); #endif // CONFIGURAR LA VELOCIDAD EN BAUDIOS Bluetooth.begin (9600); // BORRAR CUALQUIER DATO DISPONIBLE while (Bluetooth.available ()) {delay (50); Bluetooth.read (); }} // ---------------------------------------------- ------------------------------ //// FUNCIONES (LUZ) //// -------- -------------------------------------------------- ------------------ // int percent_to_bright (int percent) {// PERCENT:// 0..100 // RETURN BRIGHT // 255..0 return 256 - pow (2, percent / percent_to_bright_factor);} void set_led (int color, int bright) {// COLOR:// 0 =VERDE // 1 =AMARILLO // 2 =ROJO // 3 =CIAN // 4 =AZUL / / 5 =MAGENTA // 6 =BLANCO // // BRILLO:// 0 =APAGADO // .. // 100 =MAX #ifdef DEBUG Serial.println ("LED de ajuste"); Serial.println (); #endif if (color <0 || color> 6 || brillante <0 || brillante> 100) {return; } int led_r_bright =255; int led_g_bright =255; int led_b_bright =255; int bright_aux =percent_to_bright (brillante); cambiar (color) {caso 0:// VERDE led_g_bright =bright_aux; descanso; caso 1:// AMARILLO led_r_bright =bright_aux; led_g_bright =bright_aux; descanso; caso 2:// ROJO led_r_bright =bright_aux; descanso; caso 3:// CYAN led_g_bright =bright_aux; led_b_bright =bright_aux; descanso; caso 4:// AZUL led_b_bright =bright_aux; descanso; caso 5:// MAGENTA led_r_bright =bright_aux; led_b_bright =bright_aux; descanso; caso 6:// BLANCO led_r_bright =bright_aux; led_g_bright =bright_aux; led_b_bright =bright_aux; descanso; } analogWrite (led_r_pin, led_r_bright); analogWrite (led_g_pin, led_g_bright); analogWrite (led_b_pin, led_b_bright); regreso;}//--------------------------------------------- ------------------------------- //// FUNCIONES (COMPROBAR) //// ------- -------------------------------------------------- ------------------- // void check_prox () {if (! prox) {// VERIFIQUE LA PROXIMIDAD SOLO SI NO SE DETECTÓ LA PROXIMIDAD if (digitalRead (prox_pin) ==BAJA) {#ifdef DEBUG_PROX Serial.println ("Proximidad detectada"); Serial.println (); #endif // ESTABLECER LED VERDE set_led (0, 100); enviar_datos (2); prox =verdadero; si (! vibr) {espera =verdadero; tiempo_espera =millis () + intervalo_espera; }}}} void check_vibr () {if (! prox &&! vibr) {// COMPROBAR LA VIBRACIÓN SÓLO SI NO SE DETECTARON PROXIMIDAD Y VIBRACIÓN if (digitalRead (vibr_pin) ==HIGH) {#ifdef DEBUG_VIBR Serial.println (" Vibración detectada "); Serial.println (); #endif // ESTABLECER LED AMARILLO set_led (1, 100); vibr =verdadero; esperar =verdadero; tiempo_espera =millis () + intervalo_espera; }}} void check_wait () {if (wait &&millis ()> wait_time) {if (! prox) {// SET LED RED set_led (2, 100); enviar_datos (1); } Reiniciar(); }} void check_dht () {if (! prox &&! vibr) {// VERIFICAR DHT SOLO SI NO SE DETECTARON VIBRACIONES if (millis ()> dht_time) {humi =dht.readHumidity (); temp =dht.readTemperature (); calor =dht.computeHeatIndex (temp, humi, false); #ifdef DEBUG_DHT Serial.print ("Humedad:"); Serial.print (humi); Serial.println ("%"); Serial.print ("Temperatura:"); Serial.print (temp); Serial.println ("C"); Serial.print ("Índice principal:"); Serial.print (calor); Serial.println ("C"); Serial.println (""); #endif send_data (0); dht_time =millis () + dht_interval; }}} // --------------------------------------------- ------------------------------- //// FUNCIONES (MIS) //// ------- -------------------------------------------------- ------------------- // void send_data (int shot) {// SHOT:// 0 =SIN DATOS // 1 =WRONG SHOT (MISS) // 2 =DISPARO DERECHO (PUNTUACIÓN) Bluetooth.print (humi); Bluetooth.print (temperatura); Bluetooth.print (calor); Bluetooth.print (disparo); #ifdef DEBUG_BLUE Serial.println ("Bluetooth enviado"); Serial.println (); #endif} void reset () {vibr =false; prox =falso; esperar =falso; retraso (1000); // ESTABLECER LED AZUL set_led (4, 100);} // ----------------------------------- -----------------------------------------//// PRINCIPAL //// -------------------------------------------------- -------------------------- // bucle vacío () {check_prox (); check_vibr (); check_wait (); check_dht ();} 
Código de Android (2.0.0) Java
Inventor de la aplicación Android MIT (http://ai2.appinventor.mit.edu/)
 Sin vista previa (solo descarga). 

Esquemas


Proceso de manufactura

  1. Baloncesto
  2. El sensor de vibración inteligente integra la radio LoRaWAN
  3. Diseño de sistemas agrícolas inteligentes de código abierto
  4. La placa del sensor inteligente acelera el desarrollo de la IA de borde
  5. Sensor de temperatura Raspberry Pi
  6. IoT celular:cubo de basura inteligente
  7. Smart Bartender
  8. Sensor de emoción / EEG
  9. Sensor ultrasensible y resistente para textiles inteligentes
  10. Sensor ultrafino para lentes de contacto inteligentes
  11. La mecatrónica inteligente ayuda a la producción de sensores en Sensata Technologies