スマートバスケットボールスコアボード
コンポーネントと消耗品
> ![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 3 | |||
![]() |
| × | 3 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
アプリとオンラインサービス
> ![]() |
| |||
|
このプロジェクトについて
私はバスケットボールのトレーニングトレーニングを定期的に行っており、常にセクションの統計(ショット数、スコア、ミスなど)を追跡しています。これらの数字を追跡することは、退屈で達成するのが難しいものです。スマートボールはこれに使用できますが、いくつかの欠点があります:
- 複数のボールでトレーニングしたい場合は、いくつかの(高価な)スマートボールを購入する必要があります。
- 精度はそれほど良くありません。
- ボールの耐久性。
以前のプロジェクトのスマートバスケットボールスコアボードのプロトタイプでは、Avnet SmartEdgeデバイスを使用して、バスケットボールのトレーニングを追跡する方法をテストしました。加速度センサーを使用してショットを検出し、近接センサーを使用してスコアを検出しました。現在、このプロジェクトのアイデアは、バスケットボールのスコアボードタスクの決定的なソリューションを実装することです。
バージョン
プロジェクトの開始時に、私は自宅で入手可能なハードウェアコンポーネントを使用し、必要なソフトウェア(ArduinoとAndroid)を開発しました。この最初のバージョン(1.1.0)はかなりうまく機能することがわかったので、より安価なコンポーネントを使用するためにいくつかの変更を加え、いくつかのソフトウェアの改善も実装することにしました。 2番目のバージョン(2.0.0)はさらに優れています、お楽しみください。
ステップ1:Arduino
ハードウェア
バージョン2.0.0のハードウェアコンポーネントリストは、[物事]セクションで確認できます。
これらは、バージョン1.1.0からバージョン2.0.0に加えられた主な変更点です。
- Arduino Mega 2560 => Arduino NanoR3に変更
- Bluetoothシールド=> HC-05Bluetoothモジュールに変更
- 充電式リチウムイオン電源=> 9V電池に変更
- DHT22温度および湿度センサー=>追加。
このプロジェクトで使用される他のコンポーネントに関するいくつかの考慮事項:
- E18-D80NK赤外線近接センサー:このプロジェクトでは他の近接センサーを使用することもできますが、このような太陽光の干渉を受けないセンサーを使用することをお勧めします。
- SW420振動センサー:このプロジェクトでは他の振動センサーを使用できますが、これは非常にうまく機能します。
2つのバージョンのArduino回路図は、回路図セクションで入手できます。
ソフトウェア
Arduino IDEを使用して、次の戦略でプログラムされたArduinoコードを開発しました。
- 初期化(変数、LED、Bluetoothなど)後も、センサーのステータスを継続的に監視し続けます。
- 近接センサーがボールの存在を検出した場合、それはショットがちょうど起こったことを意味し、それはスコアです。
- 振動センサーが何らかの動きを検出した場合、それはショットが発生したばかりであることを意味しますが、決定を下すために2秒(最大)待機します。
- このとき、近接センサーがボールの存在を検出すると、(すぐに)それがスコアであることがわかります。
- 2秒間の終わりに、近接センサーがボールの存在を検出しなかった場合、それはミスであることがわかります。
- Arduinoは、Bluetoothを介してAndroidにショット(スコアまたはミス)が発生したことを通知します。
- プロセスが再開されます。
これらは、バージョン1.1.0からバージョン2.0.0に加えられた主な変更点です。
- サポートをBluetoothシールドからHC-05Bluetoothモジュールに変更します
- DHT22温度および湿度センサーのサポートを追加
- ショット、スコア、ミスを検出し、LEDをより適切に通知するためのロジックを改善します。
2つのバージョンのArduinoコードは、コードセクションで入手できます。
ステップ2:Android
MIT App Inventorを使用して、次の戦略でプログラムされたAndroidコードを開発しました。
- 初期化(ショット、スコア、ミス、Bluetoothなど)の後、[開始]ボタンが押されるのを待ちます。
- [スタート]ボタンを押すと、Bluetooth接続を継続的に監視します。
- データを受信するたびに、ボードが更新され、正しい通知音が鳴ります。
- 「一時停止」ボタンが押されるまで、このプロセスが繰り返されます。
- Bluetoothデバイスを選択したり、カウントをリセットしたりするためのボタンと、必要に応じてボードを調整するための追加のボタンがいくつかあります。
これらは、バージョン1.1.0からバージョン2.0.0に加えられた主な変更点です。
- レイアウトを縦向きから横向きに変更します。
- 光、湿度、温度、熱指数を追加します。
- 調整ボタンを改善します。
- 画面を常にオンに保つ機能を追加します。
- すべてのボタンにプレス音を追加します。
- 50ショットのマーク(50、100、150など)に達するたびに警告する機能を追加します。


2つのバージョンのAndroidコードは、[コード]セクションで入手できます。
ステップ3:バスケットボールボードのセットアップ
これは、私がバスケットボールのトレーニングトレーニングを行うために定期的に使用するオリジナルのバスケットボールボードです。
<図>
まず、フープの下のプラスチックカバーを取り外し、近接センサーに穴を開けました。
<図>
次に、振動センサーを固定するための小さな穴を開けました。
<図>
曲率が原因でセンサーをプラスチックカバーに直接取り付けることができなかったため、MDFを使用してセンサーのサポートを構築しました。
<図>


いくつかのボルトとナットを使用して、近接センサーと振動センサーを修正しました。
<図>


次に、他のコンポーネントを接続しました。
<図>


スモークテストの時間です。
<図>
最後に、すべてをバスケットボールボードに取り付けました。
<図>

ステップ4:バスケットボールのトレーニングテスト
次に、すべてをテストします。
そしてグランドフィナーレ...それはショータイムです!
ステップ5:最終的な考慮事項
- システムは非常に正確であり、誤検知がほとんどなく、誤検知がまれであることが証明されました。
- システムで遊んで、トレーニングの統計をリアルタイムでトレーニング後に知るのは素晴らしいことです。
楽しんでください...
コード
- Arduinoコード(1.1.0)
- Androidコード(1.1.0)
- Arduinoコード(2.0.0)
- Androidコード(2.0.0)
Arduinoコード(1.1.0) Arduino
// ------------------------------------------------- ------------------------------- ////ファイル名:Scoreboard.ino ////説明:スマートバスケットボールスコアボード/ ///バージョン:1.1.0 ////作成者:Marcelo Avila de Oliveira//// ---------------------- -------------------------------------------------- ----- //// --------------------------------------------- ----------------------------------- ////定義//// ------ -------------------------------------------------- -------------------- ////デバッグモードをオンにする//#define DEBUG // #define DEBUG_PROX // #define DEBUG_VIBR // ----- -------------------------------------------------- --------------------- ////定数//// -------------------- -------------- ------------------------------------------ //// 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 floatpercent_to_bright_factor =100 * log10(2)/ log10( 255); // ------------------------------------------------- ------------------------------- ////変数//// ---------- -------------------------------------------------- ---------------- //// TIMEunsigned long wait_time; // STATUSboolean prox =false; boolean vibr =false; boolean wait =false; // ------- -------------------------------------------------- ------------------- ////機能(設定)//// ------------------- -------------------------------------------------- ------- // 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); // BLUETOOTH通信を開始しますsetup_bluetooth(); set_led(4、100); #ifdef DEBUG Serial.println( "ボードは生きています"); Serial.println(); #endif} void setup_bluetooth(){#ifdef DEBUG Serial.println( "Bluetoothの設定"); Serial.println(); #endif Serial1.begin(38400); //ボーレートを設定Serial1.print( "\ r \ n + STWMOD =0 \ r \ n"); //スレーブモードで動作するように設定Serial1.print( "\ r \ n + STNA =Arduino \ r \ n"); //名前をSerial1.print( "\ r \ n + STOAUT =1 \ r \ n");に設定します。 //ペアリングされたデバイスに接続を許可しますSerial1.print( "\ r \ n + STAUTO =0 \ r \ n"); //ここでは自動接続を禁止する必要がありますdelay(2000); //この遅延は必須です。 Serial1.print( "\ r \ n + INQ =1 \ r \ n"); //スレーブを照会可能なdelay(2000);にします。 //この遅延は必須です。 while(Serial1.available()){//データ遅延をクリア(50); Serial1.read(); }} // ---------------------------------------------- ------------------------------ ////機能(ライト)//// -------- -------------------------------------------------- ------------------ // intpercent_to_bright(intpercent){// 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 =GREEN // 1 =YELLOW // 2 =RED // 3 =CYAN // 4 =BLUE / / 5 =マゼンタ// 6 =白////明るい:// 0 =オフ// .. // 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 =percent_to_bright(bright); switch(color){case 0://緑led_g_bright =bright_aux;壊す;ケース1://黄色led_r_bright =bright_aux; led_g_bright =bright_aux;壊す;ケース2://赤led_r_bright =bright_aux;壊す;ケース3://シアンled_g_bright =bright_aux; led_b_bright =bright_aux;壊す;ケース4://青led_b_bright =bright_aux;壊す;ケース5://マゼンタled_r_bright =bright_aux; led_b_bright =bright_aux;壊す;ケース6:// WHITE led_r_bright =bright_aux; led_g_bright =bright_aux; led_b_bright =bright_aux;壊す; } analogWrite(led_r_pin、led_r_bright); analogWrite(led_g_pin、led_g_bright); analogWrite(led_b_pin、led_b_bright);戻る;}// - - - - - - - - - - - - - - - - - - - - - - - ------------------------------- ////機能(チェック)//// ------- -------------------------------------------------- ------------------- // void check_prox(){if(!prox){if(digitalRead(prox_pin)==LOW){#ifdef DEBUG_PROX Serial.println( "近接が検出されました"); Serial.println(); #endif prox =true; if(!vibr){wait =true; wait_time =millis()+ wait_interval; } set_shot(1); }}} void check_vibr(){if(!prox &&!vibr){if(digitalRead(vibr_pin)==HIGH){#ifdef DEBUG_PROX Serial.println( "振動が検出されました"); Serial.println(); #endif vibr =true;待機=true; wait_time =millis()+ wait_interval; set_led(1、100); }}} void check_wait(){if(wait &&millis()> wait_time){if(!prox){set_shot(0); } reset(); }} // ---------------------------------------------- ------------------------------ ////機能(MIS)//// -------- -------------------------------------------------- ------------------ // void set_shot(int mode){//モード:// 0 =間違ったショット(ミス)// 1 =正しいショット(スコア)if (モード==0){set_led(2、100); } else {set_led(0、100); } Serial1.print(mode); delay(1000);} void reset(){vibr =false; prox =false;待機=false; set_led(4、100);} // ---------------------------------------- - - - - - - - - - - - - - - - - - - //// 主要 //// - - - -------------------------------------------------- --------------------- // void loop(){check_prox(); check_vibr(); check_wait();}
Androidコード(1.1.0) Java
Android MIT App Inventor(http://ai2.appinventor.mit.edu/)プレビューなし(ダウンロードのみ)。
Arduinoコード(2.0.0) Arduino
// ------------------------------------------------- ------------------------------- ////ファイル名:Scoreboard.ino ////説明:スマートバスケットボールスコアボード/ ///バージョン:2.0.0 ////作成者:Marcelo Avila de Oliveira//// ---------------------- -------------------------------------------------- ----- //// --------------------------------------------- ----------------------------------- ////ライブラリ//// ------ -------------------------------------------------- -------------------- //// TEMPERATURE&HUMIDITY LIBRARY#include "DHT.h" // MULTI SERIAL LIBRARY#include "SoftwareSerial.h" //- -------------------------------------------------- ------------------------- ////定義//// -------------- -------------------------------------------------- ------------ ////デバグモードをオンにする//#define DEBUG // #define DEBUG_BLUE // #define DEBUG_PROX // #define DEBUG_VIBR // #define DEBUG_DHT // DHT SENSOR#定義DHTPIN7#define DHTTYPE DHT22DHT dht(DHTPIN、DHTTYPE); // BLUETOOTH MODULE(RX、TX)SoftwareSerial Bluetooth(10、11); // ----------------- -------------------------------------------------- --------- ////定数//// -------------------------------- -------------------------------------------- //// 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 floatpercent_to_ 100 * log10(2)/ log10(255); // ------------------------------------ ---------------------------------------- ////変数//// ---------------------------------------------- ------------------------------ //// TIMEunsigned long wait_time; unsigned long dht_time; // HUMIDITY&TEMPERATUREfloat humi、temp 、heat; // STATUSboolean prox =false; boolean vibr =false; boolean wait =false; // ---------------------------- ------------------------------------------------ // //機能(設定)//// ---------------------------------------- ------------------------------------ // void setup(){//ピンを初期化pinMode(prox_pin 、入力); pinMode(vibr_pin、INPUT); pinMode(led_r_pin、OUTPUT); pinMode(led_g_pin、OUTPUT); pinMode(led_b_pin、OUTPUT); // LEDマゼンタを設定しますset_led(5、100); //シリアル通信を開始しますSerial.begin(9600); // BLUETOOTH通信を開始しますsetup_bluetooth(); // DHTセンサーを開始しますdht.begin(); // SET LED BLUE set_led(4、100); #ifdef DEBUG Serial.println( "ボードは生きています"); Serial.println(); #endif} void setup_bluetooth(){#ifdef DEBUG_BLUE Serial.println( "Bluetoothの設定"); Serial.println(); #endif //ボーレートを設定Bluetooth.begin(9600); //利用可能なデータをクリアしますwhile(Bluetooth.available()){delay(50); Bluetooth.read(); }} // ---------------------------------------------- ------------------------------ ////機能(ライト)//// -------- -------------------------------------------------- ------------------ // intpercent_to_bright(intpercent){// 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 =GREEN // 1 =YELLOW // 2 =RED // 3 =CYAN // 4 =BLUE / / 5 =マゼンタ// 6 =白////明るい:// 0 =オフ// .. // 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 =percent_to_bright(bright); switch(color){case 0://緑led_g_bright =bright_aux;壊す;ケース1://黄色led_r_bright =bright_aux; led_g_bright =bright_aux;壊す;ケース2://赤led_r_bright =bright_aux;壊す;ケース3://シアンled_g_bright =bright_aux; led_b_bright =bright_aux;壊す;ケース4://青led_b_bright =bright_aux;壊す;ケース5://マゼンタled_r_bright =bright_aux; led_b_bright =bright_aux;壊す;ケース6:// WHITE led_r_bright =bright_aux; led_g_bright =bright_aux; led_b_bright =bright_aux;壊す; } analogWrite(led_r_pin、led_r_bright); analogWrite(led_g_pin、led_g_bright); analogWrite(led_b_pin、led_b_bright);戻る;}// - - - - - - - - - - - - - - - - - - - - - - - ------------------------------- ////機能(チェック)//// ------- -------------------------------------------------- ------------------- // void check_prox(){if(!prox){//近接が検出されなかった場合にのみ近接をチェックif(digitalRead(prox_pin)==LOW){#ifdef DEBUG_PROX Serial.println( "近接が検出されました"); Serial.println(); #endif // SET LED GREEN set_led(0、100); send_data(2); prox =true; if(!vibr){wait =true; wait_time =millis()+ wait_interval; }}}} void check_vibr(){if(!prox &&!vibr){//近接と振動が検出されなかった場合にのみ振動をチェックif(digitalRead(vibr_pin)==HIGH){#ifdef DEBUG_VIBR Serial.println( "振動が検出されました "); Serial.println(); #endif // SET LED YELLOW set_led(1、100); vibr =true;待機=true; 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); } reset(); }} void check_dht(){if(!prox &&!vibr){//振動が検出されなかった場合にのみDHTをチェックif(millis()> dht_time){humi =dht.readHumidity(); temp =dht.readTemperature(); heat =dht.computeHeatIndex(temp、humi、false); #ifdef DEBUG_DHT Serial.print( "湿度:"); Serial.print(humi); Serial.println( "%"); Serial.print( "温度:"); Serial.print(temp); Serial.println( "C"); Serial.print( "ヘッドインデックス:"); Serial.print(heat); Serial.println( "C"); Serial.println( ""); #endif send_data(0); dht_time =millis()+ dht_interval; }}} // ------------------------------------------------- ------------------------------- ////機能(MIS)//// ------- -------------------------------------------------- ------------------- // void send_data(int shot){//ショット:// 0 =データなし// 1 =間違ったショット(ミス)// 2 =RIGHT SHOT(SCORE)Bluetooth.print(humi); Bluetooth.print(temp); Bluetooth.print(heat); Bluetooth.print(ショット); #ifdef DEBUG_BLUE Serial.println( "Bluetooth送信済み"); Serial.println(); #endif} void reset(){vibr =false; prox =false;待機=false; delay(1000); // SET LED BLUE set_led(4、100);} // ----------------------------------- - - - - - - - - - - - - - - - - - - - - -//// 主要 //// -------------------------------------------------- -------------------------- // void loop(){check_prox(); check_vibr(); check_wait(); check_dht();}
Androidコード(2.0.0) Java
Android MIT App Inventor(http://ai2.appinventor.mit.edu/)プレビューなし(ダウンロードのみ)。
回路図


製造プロセス