Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Slim basketbalscorebord

Componenten en benodigdheden

Arduino Nano R3
× 1
HC-05 Bluetooth-module
× 1
E18-D80NK Infrarood-nabijheidssensor
× 1
Seeed Grove - Trillingssensor (SW-420)
× 1
DHT22-temperatuursensor
× 1
8 mm RGB-led
× 1
Weerstand 10k ohm
× 3
Weerstand 100 ohm
× 3
Through Hole Resistor, 47 ohm
× 1
Weerstand 1k ohm
× 1
Weerstand 2.21k ohm
× 1
9V-batterij (algemeen)
× 1

Apps en online services

Arduino IDE
MIT App Inventor Android IDE

Over dit project

Ik doe regelmatig basketbaltrainingen en ik houd altijd de sectiestatistieken bij (aantal schoten, scores, missers, enz.). Het bijhouden van deze nummers is nogal saai en moeilijk te bereiken. De slimme ballen kunnen hiervoor gebruikt worden, maar ze hebben enkele nadelen:

  • Als je met meerdere ballen wilt trainen, moet je meerdere (dure) slimme ballen kopen.
  • De nauwkeurigheid is niet zo goed.
  • De duurzaamheid van de bal.

In mijn vorige prototype van een slim basketbalscorebord, gebruikte ik het Avnet SmartEdge-apparaat om een ​​methode te testen om mijn basketbaltrainingen bij te houden. Ik heb de versnellingssensor gebruikt om de schoten te detecteren en de nabijheidssensor om de scores te detecteren. Het idee van dit project is nu om een ​​definitieve oplossing te implementeren voor de basketbalscorebordtaak.

Versies

Aan het begin van het project gebruikte ik de hardwarecomponenten die ik thuis had en ontwikkelde ik de benodigde software (Arduino en Android). Deze eerste versie (1.1.0) bleek redelijk goed te werken, dus besloot ik enkele wijzigingen aan te brengen om goedkopere componenten te gebruiken en ook enkele softwareverbeteringen door te voeren. De tweede versie (2.0.0) is nog beter, geniet ervan.

Stap 1:Arduino

Hardware

U kunt de lijst met hardwarecomponenten voor versie 2.0.0 bekijken in het gedeelte Dingen.

Dit zijn de belangrijkste wijzigingen die zijn aangebracht van versie 1.1.0 naar versie 2.0.0:

  • Arduino Mega 2560 => Gewijzigd in Arduino Nano R3
  • Bluetooth Shield => Gewijzigd in HC-05 Bluetooth-module
  • Oplaadbare Li-ionvoeding => Gewijzigd in 9V-batterij
  • DHT22 temperatuur- en vochtigheidssensor => toegevoegd.

Enkele overwegingen over andere componenten die in dit project worden gebruikt:

  • E18-D80NK Infrarood-nabijheidssensor:andere nabijheidssensoren kunnen in dit project worden gebruikt, maar houd er rekening mee dat het beter is om er een te gebruiken die geen last heeft van zonlichtinterferentie, zoals deze.
  • SW420-trillingssensor:andere trillingssensoren kunnen in dit project worden gebruikt, deze werkt echt goed.

De Arduino-schema's voor de twee versies zijn beschikbaar in de sectie Schema's.

Software

Ik heb de Arduino IDE gebruikt om de Arduino-code te ontwikkelen, geprogrammeerd met de volgende strategie:

  • Na de initialisatie (variabelen, LED, Bluetooth, etc) blijft het continu de status van de sensoren bewaken.
  • Als de nabijheidssensor de aanwezigheid van de bal detecteert, betekent dit dat er zojuist is geschoten en dat het een score is.
  • Als de trillingssensor enige beweging detecteert, betekent dit dat er net is geschoten, maar dat deze 2 seconden (maximaal) wacht om een ​​beslissing te nemen.
  • In deze tijd, als de nabijheidssensor de aanwezigheid van de bal detecteert, weet hij (onmiddellijk) dat het een score is.
  • Als de nabijheidssensor aan het einde van de tijd van 2 seconden de aanwezigheid van de bal niet heeft gedetecteerd, weet hij dat het een misser is.
  • De Arduino informeert de Android via Bluetooth dat er zojuist een schot (score of misser) is gemaakt.
  • Het proces wordt opnieuw gestart.

Dit zijn de belangrijkste wijzigingen die zijn aangebracht van versie 1.1.0 naar versie 2.0.0:

  • Ondersteuning wijzigen van Bluetooth-schild naar HC-05 Bluetooth-module
  • Ondersteuning toevoegen aan DHT22 temperatuur- en vochtigheidssensor
  • Verbeter de logica om schoten, scores en missers te detecteren en voor een betere signalering dacht de LED.

De Arduino-codes voor de twee versies zijn beschikbaar in het gedeelte Code.

Stap 2:Android

Ik heb de MIT App Inventor gebruikt om de Android-code te ontwikkelen, geprogrammeerd met de volgende strategie:

  • Na de initialisatie (schoten, scores, missers, Bluetooth, enz.) wacht het totdat de "Start"-knop wordt ingedrukt.
  • Als de "Start"-knop wordt ingedrukt, blijft de Bluetooth-verbinding continu in de gaten worden gehouden.
  • Elke keer dat het gegevens ontvangt, wordt het bord bijgewerkt en wordt het juiste meldingsgeluid afgespeeld.
  • Het proces wordt herhaald totdat de "Pauze"-knop wordt ingedrukt.
  • Er zijn knoppen om het Bluetooth-apparaat te selecteren, de telling te resetten en enkele extra knoppen om het bord indien nodig aan te passen.

Dit zijn de belangrijkste wijzigingen die zijn aangebracht van versie 1.1.0 naar versie 2.0.0:

  • Verander de lay-out van staand naar liggend.
  • Voeg licht, vochtigheid, temperatuur en warmte-index toe.
  • Verbeter de aanpassingsknoppen.
  • Voeg een functie toe om het scherm altijd aan te houden.
  • Voeg drukgeluiden toe aan alle knoppen.
  • Voegt functionaliteit toe om te waarschuwen telkens wanneer de 50-schotsmarkering (50, 100, 150, enz.) wordt bereikt.

De Android-codes voor de twee versies zijn beschikbaar in het gedeelte Code.

Stap 3:Basketbalbord instellen

Dit is het originele basketbalbord dat ik regelmatig gebruik om basketbaltrainingen te doen.

Eerst heb ik de plastic afdekking onder de ring verwijderd en een gat gemaakt naar de nabijheidssensor.

Daarna maakte ik een klein gaatje om de trillingssensor te bevestigen.

Ik kon de sensor niet rechtstreeks op de plastic kap bevestigen vanwege de kromming, dus bouwde ik een steun voor de sensor met behulp van MDF.

Ik heb de nabijheids- en trillingssensoren vastgezet met een paar bouten en een moer.

Daarna heb ik de andere componenten aangesloten.

Het is tijd voor een rooktest.

Ten slotte heb ik alles op het basketbalbord geïnstalleerd.

Stap 4:Basketbaltrainingstest

Nu is het tijd om alles te testen.

En de grote finale... het is showtime!

Stap 5:Laatste overwegingen

  • Het systeem bleek zeer nauwkeurig te zijn, met zeer weinig valse positieven en zeldzame valse negatieven.
  • Het is fantastisch om met het systeem te spelen om de trainingsstatistieken in realtime en na de training te kennen.

Veel plezier...

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
//--------------------------------------------- ------------------------------//// Bestandsnaam :Scoreboard.ino //// Beschrijving :Smart Basketball Scoreboard / /// Versie:1.1.0 //// Auteur:Marcelo Avila de Oliveira  ////--------------------- -------------------------------------------------- -----////----------------------------------------- -----------------------------------//// DEFINITIES ////------ -------------------------------------------------- --------------------//// DEBUG-MODUS INSCHAKELEN// #define DEBUG// #define DEBUG_PROX// #define DEBUG_VIBR//----- -------------------------------------------------- ---------------------//// CONSTANTEN ////-------------------- -------------------------------------------------- ------//// 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);//----------------------------------------- -----------------------------------//// VARIABELEN ////------ -------------------------------------------------- --------------------//// TIMEunsigned long wait_time;// STATUSboolean prox =false;boolean vibr =false;boolean wait =false;//--- -------------------------------------------------- -----------------------//// FUNCTIES (INSTELLINGEN) ////--------------- -------------------------------------------------- -----------//void setup () {// INITIATE PINS pinMode (prox_pin, INPUT); pinMode (vibr_pin, INPUT); pinMode (led_r_pin, UITGANG); pinMode (led_g_pin, UITGANG); pinMode (led_b_pin, UITGANG); set_led (5, 100); // START SERILE COMMUNICATIE Serial.begin (9600); // START BLUETOOTH-COMMUNICATIE setup_bluetooth(); set_led(4, 100); #ifdef DEBUG Serial.println("Board leeft"); Serieel.println(); #endif}void setup_bluetooth() { #ifdef DEBUG Serial.println ("Bluetooth instellen"); Serieel.println(); #endif Serial1.begin(38400); // Stel de baudrate in Serial1.print ("\r\n+STWMOD=0\r\n"); // Aan het werk in slave-modus Serial1.print("\r\n+STNA=Arduino\r\n"); // Naam instellen Serial1.print ("\r\n+STOAUT=1\r\n"); // Sta het gekoppelde apparaat toe om verbinding met mij te maken Serial1.print ("\r\n+STAAUTO=0\r\n"); // Auto-verbinding zou hier verboden moeten zijn vertraging (2000); // Deze vertraging is vereist. Serial1.print("\r\n+INQ=1\r\n"); // Maak de slaaf nieuwsgierige vertraging (2000); // Deze vertraging is vereist. while (Serial1.available()) {// Gegevensvertraging wissen (50); Serie1.lezen(); }}//---------------------------------------------- ------------------------------//// FUNCTIES (LICHT) ////-------- -------------------------------------------------- ------------------//int percent_to_bright(int percent) { // PERCENT:// 0..100 // RETURN HELDER // 255..0 return 256 - pow(2, procent / procent_to_bright_factor);}void set_led (int kleur, int helder) { // KLEUR:// 0 =GROEN // 1 =GEEL // 2 =ROOD // 3 =CYAAN // 4 =BLAUW / / 5 =MAGENTA // 6 =WIT // // HELDER:// 0 =UIT // .. // 100 =MAX #ifdef DEBUG Serial.println ("Setting LED"); Serieel.println(); #endif if (kleur <0 || kleur> 6 || helder <0 || helder> 100) { return; } int led_r_bright =255; int led_g_bright =255; int led_b_bright =255; int bright_aux =percent_to_bright(helder); schakelaar (kleur) {geval 0:// GROENE led_g_bright =bright_aux; pauze; geval 1:// GELE led_r_bright =bright_aux; led_g_bright =heldere_aux; pauze; geval 2:// RODE led_r_bright =bright_aux; pauze; geval 3:// CYAAN led_g_bright =bright_aux; led_b_bright =heldere_aux; pauze; geval 4:// BLAUWE led_b_bright =bright_aux; pauze; geval 5:// MAGENTA led_r_bright =bright_aux; led_b_bright =heldere_aux; pauze; geval 6:// WIT led_r_bright =bright_aux; led_g_bright =heldere_aux; led_b_bright =heldere_aux; pauze; } analogWrite (led_r_pin, led_r_bright); analogWrite (led_g_pin, led_g_bright); analogWrite (led_b_pin, led_b_bright); opbrengst;}//--------------------------------------------- -------------------------------//// FUNCTIES (CHECK) ////------- -------------------------------------------------- -------------------//void check_prox() {if (!prox) {if(digitalRead(prox_pin) ==LAAG) { #ifdef DEBUG_PROX Serial.println( "Nabijheid gedetecteerd"); Serieel.println(); #endif prox =waar; if (!vibr) { wacht =waar; wait_time =millis() + wait_interval; } set_shot(1); } }} ongeldig check_vibr() { if (!prox &&!vibr) { if(digitalRead(vibr_pin) ==HOOG) { #ifdef DEBUG_PROX Serial.println("Trilling gedetecteerd"); Serieel.println(); #endif vibreren =waar; wacht =waar; wait_time =millis() + wait_interval; set_led(1, 100); } }} ongeldig check_wait() { if (wait &&millis()> wait_time) { if (!prox) { set_shot(0); } reset(); }}//---------------------------------------------- ------------------------------//// FUNCTIES (MIS) ////-------- -------------------------------------------------- ------------------//void set_shot (int-modus) { // MODUS:// 0 =VERKEERDE SCHOT (MISS) // 1 =JUISTE SCHOT (SCORE) als (modus ==0) { set_led (2, 100); } else { set_led(0, 100); } Serie1.print(modus); delay(1000);}void reset() { vibr =false; prox =onwaar; wacht =onwaar; set_led(4, 100);}//---------------------------------------- ------------------------------------//// VOORNAAMST ////----- -------------------------------------------------- ---------------------//void loop() { check_prox(); check_vibr(); check_wait();}
Android-code (1.1.0)Java
Android MIT App Inventor (http://ai2.appinventor.mit.edu/)
Geen voorbeeld (alleen downloaden).
Arduino-code (2.0.0)Arduino
//--------------------------------------------- ------------------------------//// Bestandsnaam :Scoreboard.ino //// Beschrijving :Smart Basketball Scoreboard / /// Versie:2.0.0 //// Auteur:Marcelo Avila de Oliveira  ////--------------------- -------------------------------------------------- -----////----------------------------------------- -----------------------------------//// BIBLIOTHEKEN ////------ -------------------------------------------------- --------------------//// TEMPERATUUR &VOCHTIGHEID BIBLIOTHEEK#include "DHT.h"// MULTI SERIAL LIBRARY#include "SoftwareSerial.h"//- -------------------------------------------------- -------------------------//// DEFINITIES ////---------------- -------------------------------------------------- ----------//// DEBUG-MODUS INSCHAKELEN// #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)SoftwareSeriële Bluetooth (10, 11);//---------------------------------- ------------------------------------------//// CONSTANTEN /// /------------------------------------------------- ---------------------------//// 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);//--- -------------------------------------------------- -----------------------//// VARIABELEN ////------------------ -------------------------------------------------- --------//// TIMEunsigned long wait_time;unsigned long dht_time;// VOCHTIGHEID &TEMPERATUURfloat humi, temp, heat;// STATUSboolean prox =false;boolean vibr =false;boolean wait =false;// -------------------------------------------------- --------------------------//// FUNCTIES (INSTELLINGEN) ////------------ ------------------------ ----------------------------------------//void setup() { // INITIATE PINS pinMode (prox_pin, INPUT); pinMode (vibr_pin, INPUT); pinMode (led_r_pin, UITGANG); pinMode (led_g_pin, UITGANG); pinMode (led_b_pin, UITGANG); // SET LED MAGENTA set_led (5, 100); // START SERILE COMMUNICATIE Serial.begin (9600); // START BLUETOOTH-COMMUNICATIE setup_bluetooth(); // START DHT-SENSOR dht.begin(); // SET LED BLAUW set_led (4, 100); #ifdef DEBUG Serial.println("Board leeft"); Serieel.println(); #endif}void setup_bluetooth() { #ifdef DEBUG_BLUE Serial.println("Bluetooth instellen"); Serieel.println(); #endif // BAUDRATE INSTELLEN Bluetooth.begin (9600); // WIS ALLE BESCHIKBARE GEGEVENS while (Bluetooth.available()) { delay(50); Bluetooth.lezen(); }}//---------------------------------------------- ------------------------------//// FUNCTIES (LICHT) ////-------- -------------------------------------------------- ------------------//int percent_to_bright(int percent) { // PERCENT:// 0..100 // RETURN HELDER // 255..0 return 256 - pow(2, procent / procent_to_bright_factor);}void set_led (int kleur, int helder) { // KLEUR:// 0 =GROEN // 1 =GEEL // 2 =ROOD // 3 =CYAAN // 4 =BLAUW / / 5 =MAGENTA // 6 =WIT // // HELDER:// 0 =UIT // .. // 100 =MAX #ifdef DEBUG Serial.println ("Setting LED"); Serieel.println(); #endif if (kleur <0 || kleur> 6 || helder <0 || helder> 100) { return; } int led_r_bright =255; int led_g_bright =255; int led_b_bright =255; int bright_aux =percent_to_bright(helder); schakelaar (kleur) {geval 0:// GROENE led_g_bright =bright_aux; pauze; geval 1:// GELE led_r_bright =bright_aux; led_g_bright =heldere_aux; pauze; geval 2:// RODE led_r_bright =bright_aux; pauze; geval 3:// CYAAN led_g_bright =bright_aux; led_b_bright =heldere_aux; pauze; geval 4:// BLAUWE led_b_bright =bright_aux; pauze; geval 5:// MAGENTA led_r_bright =bright_aux; led_b_bright =heldere_aux; pauze; geval 6:// WIT led_r_bright =bright_aux; led_g_bright =heldere_aux; led_b_bright =heldere_aux; pauze; } analogWrite (led_r_pin, led_r_bright); analogWrite (led_g_pin, led_g_bright); analogWrite (led_b_pin, led_b_bright); opbrengst;}//--------------------------------------------- -------------------------------//// FUNCTIES (CHECK) ////------- -------------------------------------------------- -------------------//void check_prox() {if (!prox) {// CONTROLEER DE NABIJHEID ALLEEN ALS DE NABIJHEID NIET IS GEDETECTEERD if(digitalRead(prox_pin) ==LAAG) { #ifdef DEBUG_PROX Serial.println ("Nabijheid gedetecteerd"); Serieel.println(); #endif // SET LED GROEN set_led(0, 100); verzendgegevens(2); prox =waar; if (!vibr) { wacht =waar; wait_time =millis() + wait_interval; } } }}void check_vibr() { if (!prox &&!vibr) { // CONTROLEER DE TRILLING ALLEEN ALS DE NABIJHEID EN TRILLING NIET GEDETECTEERD werden if(digitalRead(vibr_pin) ==HOOG) { #ifdef DEBUG_VIBR Serial.println(" Trilling gedetecteerd"); Serieel.println(); #endif // SET LED GEEL set_led(1, 100); trillen =waar; wacht =waar; wait_time =millis() + wait_interval; } }} ongeldig check_wait() { if (wait &&millis()> wait_time) { if (!prox) { // SET LED RED set_led (2, 100); verzendgegevens(1); } reset(); }}void check_dht() { if (!prox &&!vibr) { // CONTROLEER DHT ALLEEN ALS TRILLING NIET WERD GEDETECTEERD if (millis()> dht_time) { humi =dht.readHumidity(); temp =dht.readTemperature(); warmte =dht.computeHeatIndex(temp, humi, false); #ifdef DEBUG_DHT Serial.print("Vochtigheid:"); Serial.print(humi); Serieel.println("%"); Serial.print("Temperatuur:"); Serial.print(temp); Serieel.println("C"); Serial.print("Hoofdindex:"); Serial.print(warmte); Serieel.println("C"); Serieel.println(""); #endif send_data(0); dht_time =millis() + dht_interval; } }}//--------------------------------------------- -------------------------------//// FUNCTIES (MIS) ////------- -------------------------------------------------- -------------------//void send_data (int shot) { // SHOT:// 0 =GEEN GEGEVENS // 1 =VERKEERDE SHOT (MISS) // 2 =RECHTS SCHOT (SCORE) Bluetooth.print (humi); Bluetooth.print(temp); Bluetooth.print(warmte); Bluetooth.print (opname); #ifdef DEBUG_BLUE Serial.println ("Bluetooth verzonden"); Serieel.println(); #endif}void reset() { vibr =false; prox =onwaar; wacht =onwaar; vertraging (1000); // SET LED BLAUW set_led (4, 100);}//----------------------------------- -----------------------------------------//// VOORNAAMST //// -------------------------------------------------- --------------------------//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/)
Geen voorbeeld (alleen downloaden).

Schema's


Productieproces

  1. Basketbal
  2. Slimme trillingssensor integreert LoRaWAN-radio
  3. Open-source slimme landbouwsystemen ontwerpen
  4. Slim sensorbord versnelt edge AI-ontwikkeling
  5. Raspberry Pi-temperatuursensor
  6. Cellular IoT:Smart Garbage Can
  7. Slimme barman
  8. Emotiesensor / EEG
  9. Ultragevoelige, veerkrachtige sensor voor slim textiel
  10. Ultradunne sensor voor slimme contactlenzen
  11. Slimme mechatronica helpt sensorproductie bij Sensata Technologies