Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Intelligente Basketball-Anzeigetafel

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1
HC-05 Bluetooth-Modul
× 1
E18-D80NK Infrarot-Näherungssensor
× 1
Seeed Grove - Vibrationssensor (SW-420)
× 1
DHT22-Temperatursensor
× 1
8 mm RGB-LED
× 1
Widerstand 10k Ohm
× 3
Widerstand 100 Ohm
× 3
Durchgangslochwiderstand, 47 Ohm
× 1
Widerstand 1k Ohm
× 1
Widerstand 2,21 kOhm
× 1
9-V-Batterie (generisch)
× 1

Apps und Onlinedienste

Arduino-IDE
MIT App Inventor Android IDE

Über dieses Projekt

Ich mache regelmäßig Basketball-Trainingseinheiten und verfolge immer die Statistiken der Abschnitte (Anzahl der Schüsse, Ergebnisse, Fehlschüsse usw.). Diese Zahlen zu verfolgen ist irgendwie langweilig und schwer zu bewerkstelligen. Die Smart Balls können dafür verwendet werden, haben jedoch einige Nachteile:

  • Wenn Sie mit mehreren Bällen trainieren möchten, müssen Sie mehrere (teure) intelligente Bälle kaufen.
  • Die Genauigkeit ist nicht so gut.
  • Die Haltbarkeit des Balls.

In meinem vorherigen Projekt-Prototyp für eine intelligente Basketball-Anzeigetafel habe ich das Avnet SmartEdge-Gerät verwendet, um eine Methode zum Verfolgen meiner Basketball-Workouts zu testen. Ich habe den Beschleunigungssensor verwendet, um die Schüsse zu erkennen, und den Näherungssensor, um die Scores zu erkennen. Die Idee dieses Projekts besteht nun darin, eine definitive Lösung für die Basketball-Anzeigetafel-Aufgabe zu implementieren.

Versionen

Zu Beginn des Projekts habe ich die Hardwarekomponenten verwendet, die ich zu Hause zur Verfügung hatte, und die benötigte Software (Arduino und Android) entwickelt. Diese erste Version (1.1.0) erwies sich als ziemlich gut, also beschloss ich, einige Änderungen vorzunehmen, um billigere Komponenten zu verwenden und auch einige Softwareverbesserungen zu implementieren. Die zweite Version (2.0.0) ist noch besser, viel Spaß.

Schritt 1:Arduino

Hardware

Sie können die Hardwarekomponentenliste für die Version 2.0.0 im Abschnitt Dinge einsehen.

Dies sind die wichtigsten Änderungen von Version 1.1.0 zu Version 2.0.0:

  • Arduino Mega 2560 => Auf Arduino Nano R3 geändert
  • Bluetooth Shield => Auf HC-05 Bluetooth-Modul geändert
  • Wiederaufladbarer Lithium-Ionen-Akku => Auf 9-V-Batterie umgestellt
  • DHT22 Temperatur- und Feuchtigkeitssensor => Hinzugefügt.

Einige Überlegungen zu anderen in diesem Projekt verwendeten Komponenten:

  • E18-D80NK Infrarot-Näherungssensor:In diesem Projekt könnten andere Näherungssensoren verwendet werden, aber denken Sie daran, dass es besser ist, einen zu verwenden, der nicht unter Sonnenlichtstörungen leidet, wie dieser.
  • Schwingungssensor SW420:In diesem Projekt könnten andere Schwingungssensoren verwendet werden, dieser funktioniert wirklich gut.

Die Arduino-Schaltpläne für die beiden Versionen sind im Abschnitt Schaltpläne verfügbar.

Software

Ich habe die Arduino-IDE verwendet, um den Arduino-Code zu entwickeln, der mit der folgenden Strategie programmiert wurde:

  • Nach der Initialisierung (Variablen, LED, Bluetooth usw.) überwacht es kontinuierlich den Status der Sensoren.
  • Wenn der Näherungssensor die Anwesenheit des Balls erkennt, bedeutet dies, dass gerade ein Schuss passiert ist und es ein Spielstand ist.
  • Wenn der Vibrationssensor eine Bewegung erkennt, bedeutet dies, dass gerade ein Schuss passiert ist, aber er wartet 2 Sekunden (maximal), um eine Entscheidung zu treffen.
  • Wenn der Näherungssensor in dieser Zeit die Anwesenheit des Balls erkennt, weiß er (sofort) dass es ein Spielstand ist.
  • Wenn der Näherungssensor nach Ablauf der 2 Sekunden den Ball nicht erkannt hat, weiß er, dass er verfehlt wurde.
  • Der Arduino informiert das Android über Bluetooth, dass gerade ein Schuss (Treffer oder Fehlschuss) stattgefunden hat.
  • Der Prozess wird neu gestartet.

Dies sind die wichtigsten Änderungen von Version 1.1.0 zu Version 2.0.0:

  • Ändern Sie die Unterstützung von Bluetooth-Schild zum HC-05-Bluetooth-Modul
  • Unterstützung für DHT22 Temperatur- und Feuchtigkeitssensor hinzufügen
  • Verbessern Sie die Logik, um Schüsse, Treffer und Fehlschüsse zu erkennen und die LED besser zu signalisieren.

Die Arduino-Codes für die beiden Versionen sind im Abschnitt Code verfügbar.

Schritt 2:Android

Ich habe den MIT App Inventor verwendet, um den Android-Code zu entwickeln, der mit der folgenden Strategie programmiert wurde:

  • Nach der Initialisierung (Schüsse, Scores, Fehlschüsse, Bluetooth usw.) wartet es darauf, dass die "Start"-Taste gedrückt wird.
  • Wenn die "Start"-Taste gedrückt wird, überwacht sie ständig die Bluetooth-Verbindung.
  • Jedes Mal, wenn es Daten empfängt, aktualisiert es das Board und spielt den richtigen Benachrichtigungston ab.
  • Der Vorgang wiederholt sich, bis die Schaltfläche "Pause" gedrückt wird.
  • Es gibt Tasten zum Auswählen des Bluetooth-Geräts, zum Zurücksetzen des Zählers und einige zusätzliche Tasten zum Anpassen des Boards, falls erforderlich.

Dies sind die wichtigsten Änderungen von Version 1.1.0 zu Version 2.0.0:

  • Ändere das Layout von Hochformat in Querformat.
  • Fügen Sie Licht, Feuchtigkeit, Temperatur und Wärmeindex hinzu.
  • Verbessere die Einstellknöpfe.
  • Funktion hinzufügen, damit der Bildschirm immer eingeschaltet bleibt.
  • Füge Druckgeräusche zu allen Tasten hinzu.
  • Fügt eine Funktion hinzu, die jedes Mal warnt, wenn die 50-Schuss-Marke (50, 100, 150 usw.) erreicht wird.

Die Android-Codes für die beiden Versionen sind im Abschnitt Code verfügbar.

Schritt 3:Einrichtung des Basketballbretts

Dies ist das Original-Basketballbrett, das ich regelmäßig für Basketballtraining verwende.

Zuerst habe ich die Plastikabdeckung unter dem Reifen entfernt und ein Loch in den Näherungssensor gebohrt.

Dann habe ich ein kleines Loch gemacht, um den Vibrationssensor zu befestigen.

Ich konnte den Sensor aufgrund seiner Krümmung nicht direkt an der Kunststoffabdeckung befestigen, daher habe ich den Sensor mit MDF unterstützt.

Ich habe die Näherungs- und Vibrationssensoren mit einigen Schrauben und einer Mutter befestigt.

Dann habe ich die anderen Komponenten angeschlossen.

Es ist Zeit für einen Rauchtest.

Schließlich habe ich alles auf dem Basketballbrett installiert.

Schritt 4:Basketball-Trainingstest

Jetzt ist es Zeit, alles zu testen.

Und das große Finale... es ist Showtime!

Schritt 5:Abschließende Überlegungen

  • Das System erwies sich als sehr genau, mit sehr wenigen falsch positiven und selten falsch negativen Ergebnissen.
  • Es ist fantastisch, mit dem System zu spielen, um die Trainingsstatistiken in Echtzeit und nach dem Training zu kennen.

Viel Spaß...

Code

  • Arduino-Code (1.1.0)
  • Android-Code (1.1.0)
  • Arduino-Code (2.0.0)
  • Android-Code (2.0.0)
Arduino-Code (1.1.0)Arduino
//--------------------------------------------------------- -------------------------------------------//// Dateiname :Scoreboard.ino //// Beschreibung :Smart Basketball Scoreboard / /// Version :1.1.0 //// Autor :Marcelo Avila de Oliveira ////-------------------- -------------------------------------------------- -----////-------------------------------------------------- -----------------------------------//// DEFINITIONEN ////------ -------------------------------------------------- ----------------- ///// DEBUG-MODUS EINSCHALTEN // #define DEBUG// #define DEBUG_PROX// #define DEBUG_VIBR//----- -------------------------------------------------- ----------//// KONSTANTEN ////-------------------- -------------------------------------------------- ------//// 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 Prozent_to_bright_factor =100 * log10(2 ) / log10(255); //----------------------------------------- -----------------------------------//// VARIABLEN ////------ -------------------------------------------------- ----------------- ///// TIMEunsigned long wait_time;// STATUSboolean prox =false;boolean vibr =false;boolean wait =false;//--- -------------------------------------------------- -----------//// FUNKTIONEN (EINSTELLUNGEN) ////-------------- -------------------------------------------------- -----------//void setup () {// INITIATE PINS pinMode (prox_pin, INPUT); pinMode (vibr_pin, INPUT); pinMode (led_r_pin, AUSGANG); pinMode (led_g_pin, AUSGANG); pinMode (led_b_pin, AUSGANG); set_led(5, 100); // SERIELLE KOMMUNIKATION INITIIEREN Serial.begin (9600); // BLUETOOTH-KOMMUNIKATION INITIIEREN setup_bluetooth(); set_led (4, 100); #ifdef DEBUG Serial.println ("Board lebt"); Serial.println(); #endif}void setup_bluetooth () { #ifdef DEBUG Serial.println ("Setting Bluetooth"); Serial.println(); #endif Serial1.begin(38400); // Baudrate einstellen Serial1.print("\r\n+STWMOD=0\r\n"); // Im Slave-Modus arbeiten Serial1.print ("\r\n+STNA=Arduino\r\n"); // Setze den Namen Serial1.print("\r\n+STOAUT=1\r\n"); // Erlaube dem gekoppelten Gerät, mich zu verbinden Serial1.print("\r\n+STAUTO=0\r\n"); // Auto-Verbindung sollte hier verboten werden delay(2000); // Diese Verzögerung ist erforderlich. Serial1.print("\r\n+INQ=1\r\n"); // Den Slave abfragbar machen delay(2000); // Diese Verzögerung ist erforderlich. while (Serial1.available ()) {// Datenverzögerung löschen (50); Serial1.read(); }}//---------------------------------------------------------- ------------------------------------------ ///// FUNKTIONEN (LICHT) ////-------- -------------------------------------------------- ------------------//int Prozent_to_bright(int Prozent) { // PERCENT:// 0..100 // RETURN BRIGHT // 255..0 return 256 - pow(2, Percent / Percent_to_bright_factor);}void set_led(int color, int bright) { // FARBE:// 0 =GRÜN // 1 =GELB // 2 =ROT // 3 =CYAN // 4 =BLAU / / 5 =MAGENTA // 6 =WEISS // // HELL:// 0 =AUS // .. // 100 =MAX #ifdef DEBUG Serial.println("Setting LED"); Serial.println(); #endif if (color <0 || color> 6 || bright <0 || bright> 100) { return; } int led_r_bright =255; int led_g_bright =255; int led_b_bright =255; int bright_aux =Prozent_to_bright(hell); Schalter (Farbe) { Fall 0:// GRÜN led_g_bright =bright_aux; brechen; Fall 1:// GELB led_r_bright =bright_aux; led_g_bright =hell_aux; brechen; Fall 2:// ROT led_r_bright =bright_aux; brechen; Fall 3:// CYAN led_g_bright =bright_aux; led_b_bright =hell_aux; brechen; Fall 4:// BLAU led_b_bright =bright_aux; brechen; Fall 5:// MAGENTA led_r_bright =bright_aux; led_b_bright =hell_aux; brechen; Fall 6:// WEISS led_r_bright =bright_aux; led_g_bright =hell_aux; led_b_bright =hell_aux; brechen; } analogWrite (led_r_pin, led_r_bright); analogWrite (led_g_pin, led_g_bright); analogWrite (led_b_pin, led_b_bright); Rückkehr;}//--------------------------------------------- -------------------------------------------//// FUNKTIONEN (PRÜFEN) ////------ -------------------------------------------------- -------------------//void check_prox () { if (! prox) { if (digitalRead (prox_pin) ==LOW) { # ifdef DEBUG_PROX Serial.println ( "Nähe erkannt"); Serial.println(); #endif prox =wahr; if (!vibr) { warten =wahr; 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 erkannt"); Serial.println(); #endif vibr =wahr; warten =wahr; wait_time =millis() + wait_interval; set_led(1, 100); } }}void check_wait() { if (wait &&millis()> wait_time) { if (!prox) { set_shot(0); } zurücksetzen(); }}//---------------------------------------------------------- ------------------------------------------//// FUNKTIONEN (MIS) ////-------- -------------------------------------------------- ------------------//void set_shot(int mode) {// MODE:// 0 =WRONG SHOT (MISS) // 1 =RECHTER SHOT (SCORE) if (Modus ==0) {set_led (2, 100); aufrechtzuerhalten. Sonst { set_led (0, 100); } Serial1.print (Modus); delay(1000);}void reset() { vibr =false; prox =falsch; warten =falsch; set_led(4, 100);}//---------------------------------------------------- ------------------------------------//// HAUPTSÄCHLICH ////----- -------------------------------------------------- ---------------------- //void loop () { check_prox (); check_vibr(); check_wait();}
Android-Code (1.1.0)Java
Android MIT App Inventor (http://ai2.appinventor.mit.edu/)
Keine Vorschau (nur Download).
Arduino-Code (2.0.0)Arduino
//--------------------------------------------------------- -------------------------------------------//// Dateiname :Scoreboard.ino //// Beschreibung :Smart Basketball Scoreboard / /// Version :2.0.0 //// Autor :Marcelo Avila de Oliveira ////-------------------- -------------------------------------------------- -----////-------------------------------------------------- -----------------------------------//// BIBLIOTHEKEN ////------ -------------------------------------------------- ------------------//// TEMPERATUR- &FEUCHTIGKEITSBIBLIOTHEK#include "DHT.h"// MULTI SERIAL LIBRARY#include "SoftwareSerial.h"//- -------------------------------------------------- -------------------------- ///// DEFINITIONEN ////---------------- -------------------------------------------------- ----------//// DEBUG-MODUS EINSCHALTEN// #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); // BLUETOOTH MODU LE (RX, TX)SoftwareSerielles Bluetooth (10, 11); //--------------------------------- ------------------------------------------------------ //// KONSTANTEN /// /------------------------------------------------ ---------------------------//// 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 Prozent_to_bright_factor =100 * log10(2) / log10(255);//--- -------------------------------------------------- -----------------------//// VARIABLEN ////----------------- -------------------------------------------------- --------//// TIMEunsigned long wait_time;unsigned long dht_time;// HUMIDITY &TEMPERATUREfloat humi, temp, heat;// STATUSboolean prox =false;boolean vibr =false;boolean wait =false;// -------------------------------------------------- -------------------------- ///// FUNKTIONEN (EINSTELLUNGEN) ////------------ ------------------------ ---------------------------------------- // Setup stornieren () { // INITIATE PINS pinMode (prox_pin, INPUT); pinMode (vibr_pin, INPUT); pinMode (led_r_pin, AUSGANG); pinMode (led_g_pin, AUSGANG); pinMode (led_b_pin, AUSGANG); // SET LED MAGENTA set_led (5, 100); // SERIELLE KOMMUNIKATION INITIIEREN Serial.begin (9600); // BLUETOOTH-KOMMUNIKATION INITIIEREN setup_bluetooth(); // DHT-SENSOR INITIEREN dht.begin(); // SET LED BLAU set_led (4, 100); #ifdef DEBUG Serial.println ("Board lebt"); Serial.println(); #endif}void setup_bluetooth () { #ifdef DEBUG_BLUE Serial.println ( "Bluetooth einstellen"); Serial.println(); #endif // BAUDRATE EINSTELLEN Bluetooth.begin(9600); // ALLE VERFÜGBAREN DATEN LÖSCHEN while (Bluetooth.available ()) { delay (50); Bluetooth.read(); }}//---------------------------------------------------------- ------------------------------------------ ///// FUNKTIONEN (LICHT) ////-------- -------------------------------------------------- ------------------//int Prozent_to_bright(int Prozent) { // PERCENT:// 0..100 // RETURN BRIGHT // 255..0 return 256 - pow(2, Percent / Percent_to_bright_factor);}void set_led(int color, int bright) { // FARBE:// 0 =GRÜN // 1 =GELB // 2 =ROT // 3 =CYAN // 4 =BLAU / / 5 =MAGENTA // 6 =WEISS // // HELL:// 0 =AUS // .. // 100 =MAX #ifdef DEBUG Serial.println("Setting LED"); Serial.println(); #endif if (color <0 || color> 6 || bright <0 || bright> 100) { return; } int led_r_bright =255; int led_g_bright =255; int led_b_bright =255; int bright_aux =Prozent_to_bright(hell); Schalter (Farbe) { Fall 0:// GRÜN led_g_bright =bright_aux; brechen; Fall 1:// GELB led_r_bright =bright_aux; led_g_bright =hell_aux; brechen; Fall 2:// ROT led_r_bright =bright_aux; brechen; Fall 3:// CYAN led_g_bright =bright_aux; led_b_bright =hell_aux; brechen; Fall 4:// BLAU led_b_bright =bright_aux; brechen; Fall 5:// MAGENTA led_r_bright =bright_aux; led_b_bright =hell_aux; brechen; Fall 6:// WEISS led_r_bright =bright_aux; led_g_bright =hell_aux; led_b_bright =hell_aux; brechen; } analogWrite (led_r_pin, led_r_bright); analogWrite (led_g_pin, led_g_bright); analogWrite (led_b_pin, led_b_bright); Rückkehr;}//--------------------------------------------- -------------------------------------------//// FUNKTIONEN (PRÜFEN) ////------ -------------------------------------------------- -------------------//void check_prox() { if (!prox) { // NÄHE PRÜFEN, WENN NÄHE NICHT ERFASST WURDE if(digitalRead(prox_pin) ==NIEDRIG) { #ifdef DEBUG_PROX Serial.println ( "Nähe erkannt"); Serial.println(); #endif // SET LED GRÜN set_led (0, 100); send_data(2); prox =wahr; if (!vibr) { warten =wahr; wait_time =millis() + wait_interval; } } }}void check_vibr() { if (!prox &&!vibr) {// VIBRATION PRÜFEN NUR, WENN NÄHE UND VIBRATION NICHT ERFASST WURDEN if(digitalRead(vibr_pin) ==HIGH) { #ifdef DEBUG_VIBR Serial.println(" Vibration erkannt"); Serial.println(); #endif // SET LED GELB set_led(1, 100); vibr =wahr; warten =wahr; wait_time =millis() + wait_interval; }}}void check_wait() { if (wait &&millis()> wait_time) { if (!prox) {// SET LED RED set_led (2, 100); send_data(1); } zurücksetzen(); }}void check_dht() { if (!prox &&!vibr) { // DHT NUR ÜBERPRÜFEN, WENN SCHWINGUNGEN NICHT ERFASST WURDEN if (millis()> dht_time) { humi =dht.readHumidity(); temp =dht.readTemperature(); heat =dht.computeHeatIndex(temp, humi, false); #ifdef DEBUG_DHT Serial.print ( "Feuchtigkeit:"); Serial.print (humi); Serial.println("%"); Serial.print ( "Temperatur:"); Serial.print (temp); Serial.println("C"); Serial.print ( "Kopfindex:"); Serial.print (Wärme); Serial.println("C"); Serial.println(""); #endif send_data(0); dht_time =millis() + dht_interval; } }} //--------------------------------------------------------- -------------------------------------------//// FUNKTIONEN (MIS) ////--------- -------------------------------------------------- -------------------//void send_data(int shot) { // SHOT:// 0 =KEINE DATEN // 1 =FALSCHE SHOT (MISS) // 2 =RECHTER SCHUSS (SCORE) Bluetooth.print (humi); Bluetooth.print (temp); Bluetooth.print (Wärme); Bluetooth.print (Schuss); #ifdef DEBUG_BLUE Serial.println("Bluetooth gesendet"); Serial.println(); #endif}void reset() { vibr =false; prox =falsch; warten =falsch; Verzögerung (1000); // SET LED BLAU set_led(4, 100);}//---------------------------------- -----------------------------------------//// HAUPTSÄCHLICH //// -------------------------------------------------- -------------------------- //void loop () { check_prox (); check_vibr(); check_wait(); check_dht();}
Android-Code (2.0.0)Java
Android MIT App Inventor (http://ai2.appinventor.mit.edu/)
Keine Vorschau (nur Download).

Schaltpläne


Herstellungsprozess

  1. Basketball
  2. Entwerfen von Open-Source-Smart-Farming-Systemen
  3. Smart Sensor Board beschleunigt die Entwicklung von Edge-KI
  4. Raspberry Pi-Temperatursensor
  5. Mobiles IoT:Intelligenter Mülleimer
  6. Smart Barkeeper
  7. Emotionssensor / EEG
  8. Ultraempfindlicher, widerstandsfähiger Sensor für intelligente Textilien
  9. Ultradünner Sensor für intelligente Kontaktlinsen
  10. Intelligente Mechatronik unterstützt die Sensorproduktion bei Sensata Technologies