Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Tableau d'affichage intelligent de basket-ball

Composants et fournitures

Arduino Nano R3
× 1
Module Bluetooth HC-05
× 1
Capteur de proximité infrarouge E18-D80NK
× 1
Seed Grove - Capteur de vibrations (SW-420)
× 1
Capteur de température DHT22
× 1
LED RVB 8 mm
× 1
Résistance 10k ohm
× 3
Résistance 100 ohm
× 3
Résistance à trou traversant, 47 ohms
× 1
Résistance 1k ohm
× 1
Résistance 2.21k ohm
× 1
Batterie 9V (générique)
× 1

Applications et services en ligne

Arduino IDE
MIT App Inventor Android IDE

À propos de ce projet

J'ai l'habitude de faire régulièrement des entraînements de basket-ball et je fais toujours le suivi des statistiques des sections (nombre de tirs, scores, ratés, etc.). Suivre ces chiffres est un peu ennuyeux et difficile à accomplir. Les smart balls peuvent s'y habituer mais elles présentent quelques inconvénients :

  • Si vous souhaitez vous entraîner avec plusieurs balles, vous devrez acheter plusieurs balles intelligentes (coûteuses).
  • La précision n'est pas si bonne.
  • La durabilité du ballon.

Dans mon précédent projet de prototype de tableau de bord de basket-ball intelligent, j'ai utilisé l'appareil Avnet SmartEdge pour tester une méthode de suivi de mes entraînements de basket-ball. J'ai utilisé le capteur d'accélération pour détecter les coups et le capteur de proximité pour détecter les scores. Maintenant, l'idée de ce projet est de mettre en œuvre une solution définitive pour la tâche de tableau de bord de basket-ball.

Versions

Au début du projet, j'ai utilisé les composants matériels dont je disposais chez moi et développé les logiciels (Arduino et Android) nécessaires. Cette première version (1.1.0) s'est avérée plutôt efficace, j'ai donc décidé d'apporter quelques modifications pour utiliser des composants moins chers et d'implémenter également quelques améliorations logicielles. La deuxième version (2.0.0) est encore meilleure, profitez-en.

Étape 1 :Arduino

Matériel

Vous pouvez voir la liste des composants matériels pour la version 2.0.0 dans la section Objets.

Voici les principaux changements apportés de la version 1.1.0 à la version 2.0.0 :

  • Arduino Mega 2560 => Passé à Arduino Nano R3
  • Bluetooth Shield => Modifié en module Bluetooth HC-05
  • Alimentation Li-ion rechargeable => Changée en batterie 9V
  • Capteur de température et d'humidité DHT22 => ajouté.

Quelques considérations sur les autres composants utilisés dans ce projet :

  • Capteur de proximité infrarouge E18-D80NK :d'autres capteurs de proximité pourraient être utilisés dans ce projet, mais gardez à l'esprit qu'il est préférable d'en utiliser un qui ne souffre pas des interférences du soleil, comme celui-ci.
  • Capteur de vibrations SW420 :d'autres capteurs de vibrations pourraient être utilisés dans ce projet, celui-ci fonctionne très bien.

Les schémas Arduino pour les deux versions sont disponibles dans la section Schémas.

Logiciel

J'ai utilisé l'IDE Arduino pour développer le code Arduino, programmé avec la stratégie suivante :

  • Après l'initialisation (variables, LED, Bluetooth, etc.), il surveille en permanence l'état des capteurs.
  • Si le capteur de proximité détecte la présence du ballon, cela signifie qu'un tir vient de se produire et c'est un score.
  • Si le capteur de vibration détecte un mouvement, cela signifie qu'un tir vient de se produire mais qu'il attend 2 secondes (maximum) pour prendre une décision.
  • En ce moment, si le capteur de proximité détecte la présence du ballon, il sait (immédiatement) qu'il s'agit d'un score.
  • A la fin du temps de 2 secondes, si le capteur de proximité n'a pas détecté la présence de la balle, il sait que c'est raté.
  • L'Arduino informe l'Android via Bluetooth qu'un tir (score ou raté) vient de se produire.
  • Le processus redémarre.

Voici les principaux changements apportés de la version 1.1.0 à la version 2.0.0 :

  • Modifier la prise en charge du bouclier Bluetooth par le module Bluetooth HC-05
  • Ajout de la prise en charge du capteur de température et d'humidité DHT22
  • Améliorez la logique pour détecter les tirs, les scores et les ratés et pour une meilleure signalisation grâce à la LED.

Les codes Arduino pour les deux versions sont disponibles dans la section Code.

Étape 2 : Android

J'ai utilisé le MIT App Inventor pour développer le code Android, programmé avec la stratégie suivante :

  • Après l'initialisation (tirs, scores, ratés, Bluetooth, etc.) il attend que le bouton "Démarrer" soit enfoncé.
  • Lorsque le bouton "Démarrer" est enfoncé, il surveille en permanence la connexion Bluetooth.
  • Chaque fois qu'il reçoit des données, il met à jour le tableau et émet le bon son de notification.
  • Le processus se répète jusqu'à ce que le bouton « Pause » soit enfoncé.
  • Il y a des boutons pour sélectionner l'appareil Bluetooth, réinitialiser le compteur et quelques boutons supplémentaires pour ajuster la carte si nécessaire.

Voici les principaux changements apportés de la version 1.1.0 à la version 2.0.0 :

  • Modifiez la mise en page de portrait à paysage.
  • Ajoutez la lumière, l'humidité, la température et l'indice de chaleur.
  • Améliorez les boutons de réglage.
  • Ajouter une fonctionnalité pour que l'écran reste toujours allumé.
  • Ajoutez des sons de presse dans tous les boutons.
  • Ajout d'une fonctionnalité pour avertir chaque fois que la barre des 50 coups (50, 100, 150, etc.) est atteinte.

Les codes Android des deux versions sont disponibles dans la section Code.

Étape 3 :Configuration du plateau de basket

C'est la planche de basket originale que j'utilise régulièrement pour faire des entraînements de basket-ball.

J'ai d'abord retiré le couvercle en plastique sous le cerceau et fait un trou dans le capteur de proximité.

Ensuite, j'ai fait un petit trou pour fixer le capteur de vibration.

Je n'ai pas pu fixer le capteur directement sur le couvercle en plastique en raison de sa courbure, j'ai donc construit un support pour le capteur en utilisant du MDF.

J'ai réparé les capteurs de proximité et de vibration à l'aide de boulons et d'un écrou.

Ensuite, j'ai connecté les autres composants.

C'est l'heure du test de fumée.

Enfin, j'ai tout installé sur le plateau de basket.

Étape 4 : test d'entraînement de basket-ball

Il est maintenant temps de tout tester.

Et le grand final... c'est l'heure du spectacle !

Étape 5 :Considérations finales

  • Le système s'est avéré très précis, avec très peu de faux positifs et de rares faux négatifs.
  • C'est fantastique de jouer avec le système pour connaître les statistiques d'entraînement en temps réel et après l'entraînement.

Amusez-vous bien...

Code

  • Code Arduino (1.1.0)
  • Code Android (1.1.0)
  • Code Arduino (2.0.0)
  • Code Android (2.0.0)
Code Arduino (1.1.0)Arduino
//--------------------------------------------- -------------------------------//// Nom du fichier :Scoreboard.ino //// Description :Smart Basketball Scoreboard / /// Version :1.1.0 //// Auteur :Marcelo Avila de Oliveira ////--------------------- -------------------------------------------------- -----////----------------------------------------- -----------------------------------//// DÉFINITIONS ////------ -------------------------------------------------- --------------------//// ACTIVER LE MODE 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;//--- -------------------------------------------------- -----------------------//// FONCTIONS (RÉGLAGES) ////--------------- -------------------------------------------------- -----------//void setup() { // INITIATE BROCHES pinMode(prox_pin, INPUT); pinMode(vibr_pin, INPUT); pinMode(led_r_pin, SORTIE); pinMode(led_g_pin, SORTIE); pinMode(led_b_pin, SORTIE); set_led(5, 100); // INITIATION DE LA COMMUNICATION SERIE Serial.begin(9600); // INITIATION DE LA COMMUNICATION BLUETOOTH setup_bluetooth(); set_led(4, 100); #ifdef DEBUG Serial.println("La carte est vivante"); Serial.println(); #endif}void setup_bluetooth() { #ifdef DEBUG Serial.println("Configuration Bluetooth"); Serial.println(); #endif Serial1.begin(38400); // Définir le débit en bauds Serial1.print("\r\n+STWMOD=0\r\n"); // Configuré pour fonctionner en mode esclave Serial1.print("\r\n+STNA=Arduino\r\n"); // Définir le nom Serial1.print("\r\n+STOAUT=1\r\n"); // Autoriser l'appareil couplé à me connecter Serial1.print("\r\n+STAUTO=0\r\n"); // L'auto-connexion doit être interdite ici delay(2000); // Ce délai est obligatoire. Serial1.print("\r\n+INQ=1\r\n"); // Rendre l'esclave inquisitable delay(2000); // Ce délai est obligatoire. while (Serial1.available()) { // Effacer le délai de données (50); Serial1.read(); }}//---------------------------------------------- ------------------------------//// FONCTIONS (LUMIÈRE) ////-------- -------------------------------------------------- ------------------//int percent_to_bright(int percent) { // POURCENT:// 0..100 // RETURN BRIGHT // 255..0 return 256 - pow(2, percent / percent_to_bright_factor);}void set_led(int color, int bright) { // COULEUR :// 0 =VERT // 1 =JAUNE // 2 =ROUGE // 3 =CYAN // 4 =BLEU / / 5 =MAGENTA // 6 =WHITE // // BRIGHT:// 0 =OFF // .. // 100 =MAX #ifdef DEBUG Serial.println("Setting LED"); Serial.println(); #endif if (couleur <0 || couleur> 6 || brillant <0 || brillant> 100) { return; } int led_r_bright =255; int led_g_bright =255 ; int led_b_bright =255 ; int bright_aux =percent_to_bright(brillant); switch (couleur) { case 0 :// VERT led_g_bright =bright_aux ; Pause; cas 1 :// JAUNE led_r_bright =bright_aux; led_g_bright =bright_aux; Pause; cas 2 :// RED led_r_bright =bright_aux; Pause; cas 3 :// CYAN led_g_bright =bright_aux; led_b_bright =bright_aux; Pause; cas 4:// BLEU led_b_bright =bright_aux; Pause; cas 5 :// MAGENTA led_r_bright =bright_aux; led_b_bright =bright_aux; Pause; cas 6 :// BLANC led_r_bright =bright_aux; led_g_bright =bright_aux; led_b_bright =bright_aux; Pause; } analogWrite(led_r_pin, led_r_bright); analogWrite(led_g_pin, led_g_bright); analogWrite(led_b_pin, led_b_bright); retourner;}//--------------------------------------------- -------------------------------//// FONCTIONS (VÉRIFIER) ////------- -------------------------------------------------- -------------------//void check_prox() { if (!prox) { if(digitalRead(prox_pin) ==LOW) { #ifdef DEBUG_PROX Serial.println( « Proximité détectée »); Serial.println(); #endif prox =vrai; if (!vibr) { attendre =vrai; wait_time =millis() + wait_interval ; } set_shot(1); } }}void check_vibr() { if (!prox &&!vibr) { if(digitalRead(vibr_pin) ==HIGH) { #ifdef DEBUG_PROX Serial.println("Vibration détectée"); Serial.println(); #endif vibr =vrai; attendre =vrai ; wait_time =millis() + wait_interval ; set_led(1, 100); } }}void check_wait() { if (wait &&millis()> wait_time) { if (!prox) { set_shot(0); } réinitialiser(); }}//---------------------------------------------- ------------------------------//// FONCTIONS (MIS) ////-------- -------------------------------------------------- ------------------//void set_shot(int mode) { // MODE :// 0 =MAUVAISE TIR (MISS) // 1 =TIR DROIT (SCORE) si (mode ==0) { set_led(2, 100); } else { set_led (0, 100); } Serial1.print(mode); delay(1000);}void reset() { vibr =false; prox =faux ; attendre =faux ; set_led(4, 100);}//----------------------------------------- ------------------------------------//// PRINCIPALE ////----- -------------------------------------------------- ---------------------//boucle vide() { check_prox(); check_vibr(); check_wait();}
Code Android (1.1.0)Java
Android MIT App Inventor (http://ai2.appinventor.mit.edu/)
Aucun aperçu (téléchargement uniquement).
Code Arduino (2.0.0)Arduino
//--------------------------------------------- -------------------------------//// Nom du fichier :Scoreboard.ino //// Description :Smart Basketball Scoreboard / /// Version :2.0.0 //// Auteur :Marcelo Avila de Oliveira ////--------------------- -------------------------------------------------- -----////----------------------------------------- -----------------------------------//// BIBLIOTHÈQUES ////------ -------------------------------------------------- --------------------//// BIBLIOTHÈQUE DE TEMPÉRATURE ET D'HUMIDITÉ#include "DHT.h"// BIBLIOTHÈQUE MULTI SÉRIE#include "SoftwareSerial.h"//- -------------------------------------------------- -------------------------//// DÉFINITIONS ////---------------- -------------------------------------------------- ----------//// ACTIVER LE MODE 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 LE (RX, TX)Logiciel Bluetooth série (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;// HUMIDITY &TEMPERATUREfloat humi, temp, heat;// STATUSboolean prox =false;boolean vibr =false;boolean wait =false;// -------------------------------------------------- --------------------------//// FONCTIONS (RÉGLAGES) ////------------ ------------------------ -----------------------------------------------------//configuration void() { // INITIATE PIN PinMode(prox_pin, INPUT); pinMode(vibr_pin, INPUT); pinMode(led_r_pin, SORTIE); pinMode(led_g_pin, SORTIE); pinMode(led_b_pin, SORTIE); // SET LED MAGENTA set_led(5, 100); // INITIATION DE LA COMMUNICATION SERIE Serial.begin(9600); // INITIATION DE LA COMMUNICATION BLUETOOTH setup_bluetooth(); // INITIATION DU CAPTEUR DHT dht.begin(); // SET LED BLEU set_led(4, 100); #ifdef DEBUG Serial.println("La carte est vivante"); Serial.println(); #endif}void setup_bluetooth() { #ifdef DEBUG_BLUE Serial.println("Paramétrage Bluetooth"); Serial.println(); #endif // SET BAUD RATE Bluetooth.begin(9600); // EFFACER TOUTES LES DONNEES DISPONIBLES while (Bluetooth.available()) { delay(50); Bluetooth.read(); }}//---------------------------------------------- ------------------------------//// FONCTIONS (LUMIÈRE) ////-------- -------------------------------------------------- ------------------//int percent_to_bright(int percent) { // POURCENT:// 0..100 // RETURN BRIGHT // 255..0 return 256 - pow(2, percent / percent_to_bright_factor);}void set_led(int color, int bright) { // COULEUR :// 0 =VERT // 1 =JAUNE // 2 =ROUGE // 3 =CYAN // 4 =BLEU / / 5 =MAGENTA // 6 =WHITE // // BRIGHT:// 0 =OFF // .. // 100 =MAX #ifdef DEBUG Serial.println("Setting LED"); Serial.println(); #endif if (couleur <0 || couleur> 6 || brillant <0 || brillant> 100) { return; } int led_r_bright =255; int led_g_bright =255 ; int led_b_bright =255 ; int bright_aux =percent_to_bright(brillant); switch (couleur) { case 0 :// VERT led_g_bright =bright_aux ; Pause; cas 1 :// JAUNE led_r_bright =bright_aux; led_g_bright =bright_aux; Pause; cas 2 :// RED led_r_bright =bright_aux; Pause; cas 3 :// CYAN led_g_bright =bright_aux; led_b_bright =bright_aux; Pause; cas 4:// BLEU led_b_bright =bright_aux; Pause; cas 5 :// MAGENTA led_r_bright =bright_aux; led_b_bright =bright_aux; Pause; cas 6 :// BLANC led_r_bright =bright_aux; led_g_bright =bright_aux; led_b_bright =bright_aux; Pause; } analogWrite(led_r_pin, led_r_bright); analogWrite(led_g_pin, led_g_bright); analogWrite(led_b_pin, led_b_bright); retourner;}//--------------------------------------------- -------------------------------//// FONCTIONS (VÉRIFIER) ////------- -------------------------------------------------- -------------------//void check_prox() { if (!prox) { // VÉRIFIEZ LA PROXIMITÉ UNIQUEMENT SI LA PROXIMITÉ N'A PAS ÉTÉ DÉTECTÉ if(digitalRead(prox_pin) ==FAIBLE) { #ifdef DEBUG_PROX Serial.println("Proximité détectée"); Serial.println(); #endif // SET LED VERT set_led(0, 100); envoyer_données(2) ; proxy =vrai ; if (!vibr) { attendre =vrai; wait_time =millis() + wait_interval ; } } }}void check_vibr() { if (!prox &&!vibr) { // VÉRIFIEZ LA VIBRATION UNIQUEMENT SI LA PROXIMITÉ ET LA VIBRATION N'ONT PAS ÉTÉ DÉTECTÉS if(digitalRead(vibr_pin) ==HIGH) { #ifdef DEBUG_VIBR Serial.println(" Vibration détectée" ); Serial.println(); #endif // SET LED JAUNE set_led(1, 100); vibrer =vrai; attendre =vrai ; wait_time =millis() + wait_interval ; } }}void check_wait() { if (wait &&millis()> wait_time) { if (!prox) { // SET LED RED set_led(2, 100); envoyer_données(1) ; } réinitialiser(); }}void check_dht() { if (!prox &&!vibr) { // VÉRIFIEZ DHT UNIQUEMENT SI LA VIBRATION N'A PAS ÉTÉ DÉTECTÉ if (millis()> dht_time) { humi =dht.readHumidity(); temp =dht.readTemperature(); heat =dht.computeHeatIndex(temp, humi, false); #ifdef DEBUG_DHT Serial.print("Humidité :"); Serial.print(humi); Serial.println("%"); Serial.print("Température :"); Serial.print(temp); Serial.println("C"); Serial.print("Head Index :"); Serial.print (chaleur); Serial.println("C"); Serial.println(""); #endif send_data(0) ; dht_time =millis() + dht_interval ; } }}//---------------------------------------------- --------------------------------//// FONCTIONS (MIS) ////------- -------------------------------------------------- -------------------//void send_data(int shot) { // SHOT:// 0 =NO DATA // 1 =WRONG SHOT (MISS) // 2 =RIGHT SHOT (SCORE) Bluetooth.print(humi); Bluetooth.print(temp); Bluetooth.print (chaleur); Bluetooth.print (coup); #ifdef DEBUG_BLUE Serial.println("Bluetooth envoyé"); Serial.println(); #endif}void reset() { vibr =false; prox =faux ; attendre =faux ; retard(1000); // SET LED BLEU set_led(4, 100);}//----------------------------------- -----------------------------------------//// PRINCIPALE //// -------------------------------------------------- --------------------------//boucle vide() { check_prox(); check_vibr(); check_wait(); check_dht();}
Code Android (2.0.0)Java
Android MIT App Inventor (http://ai2.appinventor.mit.edu/)
Aucun aperçu (téléchargement uniquement).

Schémas


Processus de fabrication

  1. Basket-ball
  2. Concevoir des systèmes d'agriculture intelligents open source
  3. La carte de capteur intelligent accélère le développement de l'IA de pointe
  4. Capteur de température Raspberry Pi
  5. IdO cellulaire :poubelle intelligente
  6. Barman intelligent
  7. Capteur d'émotion/EEG
  8. Capteur ultra-sensible et résilient pour les textiles intelligents
  9. Capteur ultra fin pour lentilles de contact intelligentes