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

Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates

Onderdelen en benodigdheden

OnderdeelAantal
Arduino Nano R31
HC-05 Bluetooth-module1
E18-D80NK Infrarood nabijheidssensor1
Seeed Grove - Trillingssensor (SW-420)1
DHT22 Temperatuursensor1
8mm RGB LED1
Weerstand 10k ohm3
Weerstand 100 ohm3
Weerstand 47 ohm1
Weerstand 1k ohm1
Weerstand 2.21k ohm1
9V batterij1

Apps en online diensten

  • Arduino IDE
  • MIT App Inventor Android IDE

Over dit project

Ik doe regelmatig basketbaltrainingsoefeningen en houd altijd de statistieken bij (aantal worpen, scores, missers, etc.). Het bijhouden van deze cijfers is saai en lastig. Slimme ballen kunnen hiervoor gebruikt worden, maar hebben nadelen:

  • Als je met meerdere ballen wilt trainen, heb je meerdere (duur) slimme ballen nodig.
  • De nauwkeurigheid is niet zo goed.
  • De levensduur van de bal.

In mijn vorige project (slimme basketbalscorebord-prototype) gebruikte ik het Avnet SmartEdge-apparaat om een methode te testen voor het bijhouden van mijn basketbalworkouts. Ik gebruikte de versnellingssensor om worpen te detecteren en de nabijheidssensor om scores te detecteren. Nu is het idee om een definitieve oplossing te implementeren voor de basketbalscorebord-taak.

Versies

Aan het begin van het project gebruikte ik de hardwarecomponenten die ik thuis had en ontwikkelde de benodigde software (Arduino en Android). Deze eerste versie (1.1.0) werkte prima, dus besloot ik wijzigingen door te voeren voor goedkopere componenten en softwareverbeteringen. De tweede versie (2.0.0) is nog beter.

Stap 1: Arduino

Hardware

De hardwarecomponentenlijst voor versie 2.0.0 vind je in de sectie 'Onderdelen'.

De belangrijkste wijzigingen van versie 1.1.0 naar 2.0.0:

  • Arduino Mega 2560 → Arduino Nano R3
  • Bluetooth Shield → HC-05 Bluetooth-module
  • Herlaadbare Li-ion voeding → 9V batterij
  • DHT22 Temperatuur- en vochtigheidssensor → Toegevoegd.

Overwegingen over andere componenten:

  • E18-D80NK Infrarood nabijheidssensor: Andere nabijheidssensoren kunnen gebruikt worden, maar houd rekening met dat het beter is om er een te gebruiken die niet gevoelig is voor zonlicht, zoals deze.
  • SW420 Trillingssensor: Andere trillingssensoren kunnen gebruikt worden, deze werkt heel goed.

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

Software

Ik gebruikte de Arduino IDE voor de Arduino-code, geprogrammeerd met de volgende strategie:

  • Na initialisatie (variabelen, LED, Bluetooth, etc.) blijft het continu de status van de sensoren monitoren.
  • Als de nabijheidssensor de bal detecteert, betekent dit dat er zojuist een worp is geweest en het is een score.
  • Als de trillingssensor beweging detecteert, betekent dit dat er zojuist een worp is geweest, maar het wacht 2 seconden (maximum) om een beslissing te nemen.
  • In deze tijd, als de nabijheidssensor de bal detecteert, weet het direct dat het een score is.
  • Aan het einde van de 2 seconden, als de nabijheidssensor de bal niet detecteerde, weet het dat het een mis is.
  • De Arduino informeert de Android-app via Bluetooth dat er een worp (score of mis) is geweest.
  • Het proces herstart.

Belangrijkste softwarewijzigingen van 1.1.0 naar 2.0.0:

  • Ondersteuning gewijzigd van Bluetooth shield naar HC-05 module
  • Ondersteuning toegevoegd voor DHT22 temperatuur- en vochtigheidssensor
  • Logica verbeterd voor detectie van worpen, scores, missers en betere signalering via de LED.

De Arduino-codes voor beide versies staan in de sectie Code.

Stap 2: Android

Ik gebruikte MIT App Inventor voor de Android-code, met deze strategie:

  • Na initialisatie (worpen, scores, missers, Bluetooth, etc.) wacht het op de 'Start'-knop.
  • Bij indrukken van 'Start' monitoren het continu de Bluetooth-verbinding.
  • Elke keer dat data wordt ontvangen, wordt het bord bijgewerkt en het juiste notificatiegeluid afgespeeld.
  • Het proces herhaalt zich tot de 'Pauze'-knop wordt ingedrukt.
  • Er zijn knoppen voor Bluetooth-apparaatselectie, teller resetten en extra knoppen om het bord indien nodig aan te passen.

Belangrijkste wijzigingen van 1.1.0 naar 2.0.0:

  • Layout gewijzigd van portret naar landschap
  • Licht, vochtigheid, temperatuur en hitte-index toegevoegd
  • Verbeterde aanpassingsknoppen
  • Functie om het scherm altijd aan te houden toegevoegd
  • Drukgeluiden aan alle knoppen toegevoegd
  • Functionaliteit om te waarschuwen telkens de 50-worpen-milestone (50, 100, 150, etc.) wordt bereikt
Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates
Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates

De Android-codes voor beide versies staan in de sectie Code.

Stap 3: Basketbalbord opstelling

Dit is het originele basketbalbord dat ik regelmatig gebruik voor trainingen.

Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates

Eerst verwijderde ik de plastic afdekpling onder de mand en boorde een gat voor de nabijheidssensor.

Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates

Vervolgens maakte ik een klein gat om de trillingssensor te bevestigen.

Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates

Ik kon de sensor niet direct aan de plastic afdekpling bevestigen vanwege de kromming, dus bouwde een steun uit MDF.

Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates
Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates
Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates

Ik bevestigde de nabijheids- en trillingssensoren met bouten en moeren.

Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates
Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates
Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates

Vervolgens sluitte ik de overige componenten aan.

Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates
Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates
Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates

Tijd voor een rooktest.

Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates

Ten slotte installeerde ik alles op het basketbalbord.

Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates
Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates

Stap 4: Basketbaltraining test

Nu is het tijd om alles te testen. En de grote finale... het is showtime!

Stap 5: Conclusie

  • Het systeem bleek zeer nauwkeurig, met zeer weinig false positives en zeldzame false negatives.
  • Het is fantastisch om met het systeem te spelen en de workout-statistieken in realtime en na de training te weten.

Veel plezier...

Code

Arduino code (1.1.0)

//----------------------------------------------------------------------------//
// Filename : Scoreboard.ino
// Description : Smart Basketball Scoreboard
// Version : 1.1.0
// Author : Marcelo Avila de Oliveira 
//----------------------------------------------------------------------------//
// DEFINITIES
// #define DEBUG
// #define DEBUG_PROX
// #define DEBUG_VIBR
//----------------------------------------------------------------------------//
// CONSTANTEN
// PINS
const 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;
// TIJD
const unsigned long wait_interval = 3000;
// WISKUNDE
const float percent_to_bright_factor = 100 * log10(2) / log10(255);
//----------------------------------------------------------------------------//
// VARIABELEN
// TIJD
unsigned long wait_time;
// STATUS
boolean prox = false;
boolean vibr = false;
boolean wait = false;
//----------------------------------------------------------------------------//
// FUNCTIES (INSTELLINGEN)
void setup() {
  pinMode(prox_pin, INPUT);
  pinMode(vibr_pin, INPUT);
  pinMode(led_r_pin, OUTPUT);
  pinMode(led_g_pin, OUTPUT);
  pinMode(led_b_pin, OUTPUT);
  set_led(5, 100);
  Serial.begin(9600);
  setup_bluetooth();
  set_led(4, 100);
  #ifdef DEBUG
  Serial.println("Board is alive");
  Serial.println();
  #endif
}

void setup_bluetooth() {
  #ifdef DEBUG
  Serial.println("Setting Bluetooth");
  Serial.println();
  #endif
  Serial1.begin(38400);
  Serial1.print("\r\n+STWMOD=0\r\n"); // Slave mode
  Serial1.print("\r\n+STNA=Arduino\r\n"); // Naam
  Serial1.print("\r\n+STOAUT=1\r\n"); // Paar toestaan
  Serial1.print("\r\n+STAUTO=0\r\n"); // Auto-connect verboden
  delay(2000);
  Serial1.print("\r\n+INQ=1\r\n"); // Inquireerbaar maken
  delay(2000);
  while (Serial1.available()) {
    delay(50);
    Serial1.read();
  }
}
//----------------------------------------------------------------------------//
// FUNCTIES (LICHT)
int percent_to_bright(int percent) {
  return 256 - pow(2, percent / percent_to_bright_factor);
}

void set_led(int color, int bright) {
  #ifdef DEBUG
  Serial.println("Setting LED");
  Serial.println();
  #endif
  if (color < 0 || color > 6 || bright < 0 || bright > 100) return;
  int led_r_bright = 255, led_g_bright = 255, led_b_bright = 255;
  int bright_aux = percent_to_bright(bright);
  switch (color) {
    case 0: led_g_bright = bright_aux; break; // GROEN
    case 1: led_r_bright = bright_aux; led_g_bright = bright_aux; break; // GEEL
    case 2: led_r_bright = bright_aux; break; // ROOD
    case 3: led_g_bright = bright_aux; led_b_bright = bright_aux; break; // CYAN
    case 4: led_b_bright = bright_aux; break; // BLAUW
    case 5: led_r_bright = bright_aux; led_b_bright = bright_aux; break; // MAGENTA
    case 6: led_r_bright = bright_aux; led_g_bright = bright_aux; led_b_bright = bright_aux; break; // WIT
  }
  analogWrite(led_r_pin, led_r_bright);
  analogWrite(led_g_pin, led_g_bright);
  analogWrite(led_b_pin, led_b_bright);
}
//----------------------------------------------------------------------------//
// FUNCTIES (CONTROLE)
void check_prox() {
  if (!prox && digitalRead(prox_pin) == LOW) {
    #ifdef DEBUG_PROX
    Serial.println("Proximity detected");
    Serial.println();
    #endif
    prox = true;
    if (!vibr) { wait = true; wait_time = millis() + wait_interval; }
    set_shot(1);
  }
}

void check_vibr() {
  if (!prox && !vibr && digitalRead(vibr_pin) == HIGH) {
    #ifdef DEBUG_VIBR
    Serial.println("Vibration detected");
    Serial.println();
    #endif
    vibr = true;
    wait = true;
    wait_time = millis() + wait_interval;
    set_led(1, 100);
  }
}

void check_wait() {
  if (wait && millis() > wait_time) {
    if (!prox) set_shot(0);
    reset();
  }
}
//----------------------------------------------------------------------------//
// FUNCTIES (DIVERSEN)
void set_shot(int mode) {
  if (mode == 0) set_led(2, 100); // ROOD = MIS
  else set_led(0, 100); // GROEN = SCORE
  Serial1.print(mode);
  delay(1000);
}

void reset() {
  vibr = false; prox = false; wait = false;
  set_led(4, 100);
}
//----------------------------------------------------------------------------//
// MAIN
void loop() {
  check_prox();
  check_vibr();
  check_wait();
}

Android code (1.1.0)

Android MIT App Inventor (https://ai2.appinventor.mit.edu/) - Download benodigd.

Arduino code (2.0.0)

//----------------------------------------------------------------------------//
// Filename : Scoreboard.ino
// Description : Smart Basketball Scoreboard
// Version : 2.0.0
// Author : Marcelo Avila de Oliveira 
//----------------------------------------------------------------------------//
// BIBLIOTHEKEN
#include "DHT.h"
#include "SoftwareSerial.h"
//----------------------------------------------------------------------------//
// DEFINITIES
// #define DEBUG
// #define DEBUG_BLUE
// #define DEBUG_PROX
// #define DEBUG_VIBR
// #define DEBUG_DHT
// DHT SENSOR
#define DHTPIN 7
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// BLUETOOTH MODULE (RX, TX)
SoftwareSerial Bluetooth(10, 11);
//----------------------------------------------------------------------------//
// CONSTANTEN
const 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;
const unsigned long wait_interval = 2000;
const unsigned long dht_interval = 10000;
const float percent_to_bright_factor = 100 * log10(2) / log10(255);
//----------------------------------------------------------------------------//
// VARIABELEN
unsigned long wait_time, dht_time;
float humi, temp, heat;
boolean prox = false, vibr = false, wait = false;
//----------------------------------------------------------------------------//
// FUNCTIES (INSTELLINGEN)
void setup() {
  pinMode(prox_pin, INPUT);
  pinMode(vibr_pin, INPUT);
  pinMode(led_r_pin, OUTPUT);
  pinMode(led_g_pin, OUTPUT);
  pinMode(led_b_pin, OUTPUT);
  set_led(5, 100); // MAGENTA
  Serial.begin(9600);
  setup_bluetooth();
  dht.begin();
  set_led(4, 100); // BLAUW
  #ifdef DEBUG
  Serial.println("Board is alive");
  Serial.println();
  #endif
}

void setup_bluetooth() {
  #ifdef DEBUG_BLUE
  Serial.println("Setting Bluetooth");
  Serial.println();
  #endif
  Bluetooth.begin(9600);
  while (Bluetooth.available()) { delay(50); Bluetooth.read(); }
}
//----------------------------------------------------------------------------//
// FUNCTIES (LICHT) - identiek aan v1.1.0
// ...
//----------------------------------------------------------------------------//
// FUNCTIES (CONTROLE)
void check_prox() {
  if (!prox && digitalRead(prox_pin) == LOW) {
    #ifdef DEBUG_PROX
    Serial.println("Proximity detected");
    Serial.println();
    #endif
    set_led(0, 100); // GROEN
    send_data(2);
    prox = true;
    if (!vibr) { wait = true; wait_time = millis() + wait_interval; }
  }
}

void check_vibr() {
  if (!prox && !vibr && digitalRead(vibr_pin) == HIGH) {
    #ifdef DEBUG_VIBR
    Serial.println("Vibration detected");
    Serial.println();
    #endif
    set_led(1, 100); // GEEL
    vibr = true;
    wait = true;
    wait_time = millis() + wait_interval;
  }
}

void check_wait() {
  if (wait && millis() > wait_time) {
    if (!prox) { set_led(2, 100); send_data(1); } // ROOD = MIS
    reset();
  }
}

void check_dht() {
  if (!prox && !vibr && millis() > dht_time) {
    humi = dht.readHumidity();
    temp = dht.readTemperature();
    heat = dht.computeHeatIndex(temp, humi, false);
    #ifdef DEBUG_DHT
    Serial.print("Humidity: "); Serial.print(humi); Serial.println("%");
    Serial.print("Temperature: "); Serial.print(temp); Serial.println("C");
    Serial.print("Heat Index: "); Serial.print(heat); Serial.println("C");
    Serial.println();
    #endif
    send_data(0);
    dht_time = millis() + dht_interval;
  }
}
//----------------------------------------------------------------------------//
// FUNCTIES (DIVERSEN)
void send_data(int shot) {
  // SHOT: 0=GEEN DATA, 1=MIS, 2=SCORE
  Bluetooth.print(humi);
  Bluetooth.print(temp);
  Bluetooth.print(heat);
  Bluetooth.print(shot);
  #ifdef DEBUG_BLUE
  Serial.println("Bluetooth sent");
  Serial.println();
  #endif
}

void reset() {
  vibr = false; prox = false; wait = false;
  delay(1000);
  set_led(4, 100); // BLAUW
}
//----------------------------------------------------------------------------//
// MAIN
void loop() {
  check_prox();
  check_vibr();
  check_wait();
  check_dht();
}

Android code (2.0.0)

Android MIT App Inventor (https://ai2.appinventor.mit.edu/) - Download benodigd.

Schema's

Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates Geavanceerde slimme basketbalscorebord met Bluetooth, sensoren & realtime updates

Productieproces

  1. Basketbal: Van Naismith's 1891 Uitvinding tot Moderne Productietechnieken
  2. Een Raspberry Pi thuistemperatuurmonitor bouwen met MCP9808, InfluxDB & Grafana
  3. Slimme Vuilnisbak: Een Cellulaire IoT-oplossing voor Geautomatiseerd Afvalbeheer
  4. Slimme Barman: Bouw Je Eigen Raspberry Pi-Cocktailstation
  5. Emotiesensor & EEG: Goedkope Hardware voor Real-time Emotiedetectie
  6. Sensorproductie Revolutie: Sensata Gebruikt Slimme Mechatronica
  7. TE Connectivity 8911: Geïntegreerde LoRaWAN draadloze versnellingsmeter voor geavanceerde trillingsmonitoring
  8. Open-source smart farming systemen bouwen: Boeren versterken met betaalbare, interoperabele IoT
  9. ECM3532: Eta Compute’s eerste geïntegreerde, ultra-laagstroom AI-sensorboard versnelt edge-ontwikkeling
  10. Revolutionaire ultra-gevoelige, duurzame rek-sensor voor slimme textiel
  11. Revolutionaire ultra-dunne sensor verbetert slimme contactlensfunctionaliteit