亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

智能篮球记分牌

组件和用品

Arduino Nano R3
× 1
HC-05 蓝牙模块
× 1
E18-D80NK 红外接近传感器
× 1
Seeed Grove - 振动传感器 (SW-420)
× 1
DHT22 温度传感器
× 1
8mm RGB LED
× 1
电阻 10k ohm
× 3
电阻 100 ohm
× 3
通孔电阻,47 ohm
× 1
电阻 1k ohm
× 1
电阻 2.21k ohm
× 1
9V 电池(通用)
× 1

应用和在线服务

Arduino IDE
MIT App Inventor Android IDE

关于这个项目

我过去经常进行篮球训练,我总是跟踪各部分的统计数据(投篮次数、得分、失误等)。跟踪这些数字有点无聊且难以完成。智能球可以用于此,但它们有一些缺点:

  • 如果您想使用多个球进行训练,则需要购买多个(昂贵的)智能球。
  • 准确性不太好。
  • 球的耐用性。

在我之前的项目智能篮球记分牌原型中,我使用 Avnet SmartEdge 设备来测试跟踪我的篮球锻炼的方法。我使用加速度传感器来检测击球和接近传感器来检测分数。现在,这个项目的想法是为篮球记分牌任务实现一个明确的解决方案。

版本

在项目开始时,我使用了我在家里可用的硬件组件并开发了所需的软件(Arduino 和 Android)。第一个版本 (1.1.0) 被证明运行良好,因此我决定进行一些更改以使用更便宜的组件并实施一些软件改进。第二个版本(2.0.0)更好,享受。

第 1 步:Arduino

硬件

您可以在 Things 部分看到 2.0.0 版本的硬件组件列表。

这些是从 1.1.0 版到 2.0.0 版的主要变化:

  • Arduino Mega 2560 => 改为 Arduino Nano R3
  • Bluetooth Shield => 改为 HC-05 蓝牙模块
  • 可充电锂离子电源 => 改为 9V 电池
  • DHT22 温度和湿度传感器 => 已添加。

关于本项目中使用的其他组件的一些注意事项:

  • E18-D80NK 红外接近传感器:本项目中可以使用其他接近传感器,但请记住,最好使用不受阳光干扰的传感器,例如这个。
  • SW420 振动传感器:本项目中可以使用其他振动传感器,这个非常好用。

两个版本的 Arduino 原理图可在原理图部分找到。

软件

我使用 Arduino IDE 开发 Arduino 代码,使用以下策略进行编程:

  • 初始化(变量、LED、蓝牙等)后,它会持续监控传感器的状态。
  • 如果接近传感器检测到球的存在,则意味着射门刚刚发生并且得分。
  • 如果振动传感器检测到一些运动,则意味着刚刚发生了一次射击,但它会等待 2 秒(最长)来做出决定。
  • 此时,如果接近传感器检测到球的存在,它(立即)知道这是一个得分。
  • 在 2 秒的时间结束时,如果接近传感器没有检测到球的存在,它就知道这是一个失误。
  • Arduino 通过蓝牙通知 Android 刚刚发生了一次击球(得分或未命中)。
  • 进程重新启动。

这些是从 1.1.0 版到 2.0.0 版的主要变化:

  • 将支持从蓝牙屏蔽更改为 HC-05 蓝牙模块
  • 添加对 DHT22 温湿度传感器的支持
  • 改进逻辑以检测投篮、得分和失误,并更好地发出 LED 信号。

两个版本的 Arduino 代码可在代码部分找到。

第 2 步:安卓

我使用 MIT App Inventor 开发 Android 代码,使用以下策略进行编程:

  • 初始化(投篮、得分、失误、蓝牙等)后,它会等待按下“开始”按钮。
  • 当按下“开始”按钮时,它会持续监控蓝牙连接。
  • 每次收到任何数据时,它都会更新板并播放正确的通知声音。
  • 重复该过程,直到按下“暂停”按钮。
  • 有一些按钮可以选择蓝牙设备、重置计数,还有一些额外的按钮可以在必要时调整电路板。

这些是从 1.1.0 版到 2.0.0 版的主要变化:

  • 将布局从纵向更改为横向。
  • 添加光、湿度、温度和热指数。
  • 改进调整按钮。
  • 添加使屏幕始终开启的功能。
  • 在所有按钮中添加按下声音。
  • 添加了每次达到 50 次射击标记(50、100、150 等)时发出警告的功能。

代码部分提供了两个版本的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 浮点百分比_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,输入); pinMode(led_r_pin,输出); pinMode(led_g_pin,输出); pinMode(led_b_pin,输出); set_led(5, 100); // 启动串行通信 Serial.begin(9600); // 启动蓝牙通信 setup_bluetooth(); set_led(4, 100); #ifdef DEBUG Serial.println("板子还活着"); Serial.println(); #endif}void setup_bluetooth() { #ifdef DEBUG Serial.println("设置蓝牙"); 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"); // 使从机可查询延迟(2000); // 这个延迟是必需的。 while (Serial1.available()) { // 清除数据延迟(50); Serial1.read(); }}//---------------------------------------------- ------------------------------//// 功能(灯光)////-------- -------------------------------------------------- ------------------//int percent_to_bright(int percent) { // 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 =白色 // // BRIGHT:// 0 =OFF // .. // 100 =MAX #ifdef DEBUG Serial.println("设置 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;休息; case 1:// 黄色 led_r_bright =Bright_aux; led_g_bright =Bright_aux;休息; case 2:// RED led_r_bright =Bright_aux;休息; case 3:// 青色 led_g_bright =Bright_aux; led_b_bright =Bright_aux;休息; case 4:// BLUE led_b_bright =Bright_aux;休息;案例 5:// MAGENTA led_r_bright =Bright_aux; led_b_bright =Bright_aux;休息;案例 6:// 白色 led_r_bright =Bright_aux; led_g_bright =Bright_aux; led_b_bright =Bright_aux;休息;模拟写入(led_r_pin,led_r_bright);模拟写入(led_g_pin,led_g_bright);模拟写入(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;如果 (!vibr) { 等待 =真;等待时间 =毫秒()+ 等待间隔; } set_shot(1); } }}void check_vibr() { if (!prox &&!vibr) { if(digitalRead(vibr_pin) ==HIGH) { #ifdef DEBUG_PROX Serial.println("检测到振动"); Serial.println(); #endif vibr =true;等待=真;等待时间 =毫秒()+ 等待间隔; set_led(1, 100); } }}void check_wait() { if (wait &&millis()> wait_time) { if (!prox) { set_shot(0); } 重启(); }}//---------------------------------------------- ------------------------------//// 函数 (MIS) ////-------- -------------------------------------------------- ------------------//void set_shot(int mode) { // MODE:// 0 =错误射击(未命中)// 1 =正确射击(得分)如果(模式 ==0) { set_led(2, 100); } else { set_led(0, 100); Serial1.print(模式);延迟(1000);}无效重置(){振动=假;代理 =假;等待=假; 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  ////-------------------- -------------------------------------------------- -----////----------------------------------------- -----------------------------------//// 图书馆 ////------ -------------------------------------------------- --------------------//// 温度和湿度库#include "DHT.h"// 多串行库#include "SoftwareSerial.h"//- -------------------------------------------------- -------------------------//// 定义 ////---------------- -------------------------------------------------- ----------//// 打开调试模式// #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);//蓝牙模块LE (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 float percent_to_bright_factor =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() { // 初始化PINS pinMode(prox_pin, INPUT); pinMode(vibr_pin,输入); pinMode(led_r_pin,输出); pinMode(led_g_pin,输出); pinMode(led_b_pin,输出); // 设置 LED 洋红色 set_led(5, 100); // 启动串行通信 Serial.begin(9600); // 启动蓝牙通信 setup_bluetooth(); // 启动 DHT 传感器 dht.begin(); // 设置 LED 蓝色 set_led(4, 100); #ifdef DEBUG Serial.println("板子还活着"); Serial.println(); #endif}void setup_bluetooth() { #ifdef DEBUG_BLUE Serial.println("设置蓝牙"); Serial.println(); #endif // 设置波特率 Bluetooth.begin(9600); // 清除任何可用数据 while (Bluetooth.available()) { delay(50);蓝牙.read(); }}//---------------------------------------------- ------------------------------//// 功能(灯光)////-------- -------------------------------------------------- ------------------//int percent_to_bright(int percent) { // 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 =白色 // // BRIGHT:// 0 =OFF // .. // 100 =MAX #ifdef DEBUG Serial.println("设置 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;休息; case 1:// 黄色 led_r_bright =Bright_aux; led_g_bright =Bright_aux;休息; case 2:// RED led_r_bright =Bright_aux;休息; case 3:// 青色 led_g_bright =Bright_aux; led_b_bright =Bright_aux;休息; case 4:// BLUE led_b_bright =Bright_aux;休息;案例 5:// MAGENTA led_r_bright =Bright_aux; led_b_bright =Bright_aux;休息;案例 6:// 白色 led_r_bright =Bright_aux; led_g_bright =Bright_aux; led_b_bright =Bright_aux;休息;模拟写入(led_r_pin,led_r_bright);模拟写入(led_g_pin,led_g_bright);模拟写入(led_b_pin,led_b_bright);返回;}// - - - - - - - - - - - - - - - - - - - - - - - -------------------------------//// 功能(检查)////------- -------------------------------------------------- -------------------//void check_prox() { if (!prox) { // 仅当未检测到接近时才检查接近度 if(digitalRead(prox_pin) ==LOW) { #ifdef DEBUG_PROX Serial.println("检测到接近"); Serial.println(); #endif // 设置 LED 绿色 set_led(0, 100);发送数据(2);代理 =真;如果 (!vibr) { 等待 =真;等待时间 =毫秒()+ 等待间隔; } } }}void check_vibr() { if (!prox &&!vibr) { // 仅当未检测到接近和振动时才检查振动 if(digitalRead(vibr_pin) ==HIGH) { #ifdef DEBUG_VIBR Serial.println("检测到振动"); Serial.println(); #endif // 设置 LED 黄色 set_led(1, 100);振动 =真;等待=真;等待时间 =毫秒()+ 等待间隔; } }}void check_wait() { if (wait &&millis()> wait_time) { if (!prox) { // SET LED RED set_led(2, 100);发送数据(1); } 重启(); }}void check_dht() { if (!prox &&!vibr) { // 只有在没有检测到振动时才检查 DHT if (millis()> dht_time) { humi =dht.readHumidity(); temp =dht.readTemperature();热 =dht.computeHeatIndex(temp, humi, false); #ifdef DEBUG_DHT Serial.print("湿度:"); Serial.print(humi); Serial.println("%"); Serial.print("温度:");串行打印(温度); Serial.println("C"); Serial.print("标题索引:");串行打印(热); Serial.println("C"); Serial.println(""); #endif send_data(0); dht_time =毫秒()+ dht_interval; } }}//-------------------------------------------- -------------------------------//// 函数(MIS)////------- -------------------------------------------------- -------------------//void send_data(int shot) { // SHOT:// 0 =无数据 // 1 =错误的射击(未命中)// 2 =右击(得分)Bluetooth.print(humi);蓝牙打印(温度);蓝牙.打印(加热);蓝牙.打印(拍摄); #ifdef DEBUG_BLUE Serial.println("蓝牙发送"); Serial.println(); #endif}void reset() { vibr =false;代理 =假;等待=假;延迟(1000); // 设置 LED 蓝色 set_led(4, 100);}//----------------------------------- - - - - - - - - - - - - - - - - - - - - -//// 主要的 //// -------------------------------------------------- --------------------------//void loop() { check_prox(); check_vibr();检查等待(); check_dht();}
Android 代码 (2.0.0)Java
Android MIT App Inventor (http://ai2.appinventor.mit.edu/)
无预览(仅限下载)。

示意图


制造工艺

  1. 篮球
  2. 智能振动传感器集成 LoRaWAN 无线电
  3. 设计开源智能农业系统
  4. 智能传感器板加速边缘 AI 开发
  5. Raspberry Pi 温度传感器
  6. 蜂窝物联网:智能垃圾桶
  7. Smart Bartender
  8. 情绪传感器/脑电图
  9. ABB 推出智能传感器来检查轴承状况
  10. 用于智能纺织品的超灵敏、弹性传感器
  11. 用于智能隐形眼镜的超薄传感器
  12. 智能机电一体化有助于 Sensata Technologies 的传感器生产