Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Умное табло баскетбола

Компоненты и расходные материалы

Arduino Nano R3
× 1
Модуль Bluetooth HC-05
× 1
Инфракрасный датчик приближения E18-D80NK
× 1
Seeed Grove - датчик вибрации (SW-420)
× 1
Датчик температуры DHT22
× 1
8-миллиметровый светодиод RGB
× 1
Резистор 10 кОм
× 3
Резистор 100 Ом
× 3
Резистор в сквозное отверстие, 47 Ом
× 1
Резистор 1 кОм
× 1
Резистор 2,21 кОм
× 1
Батарея 9 В (стандартная)
× 1

Приложения и онлайн-сервисы

IDE Arduino
IDE для Android Inventor для приложений MIT

Об этом проекте

Я регулярно тренируюсь по баскетболу и всегда отслеживаю статистику секций (количество бросков, очков, промахов и т. Д.). Отслеживать эти числа довольно скучно и сложно. Для этого можно использовать умные шары, но у них есть некоторые недостатки:

  • Если вы хотите тренироваться с несколькими мячами, вам нужно купить несколько (дорогих) умных мячей.
  • Точность невысока.
  • Прочность мяча.

В моем предыдущем проекте прототипа интеллектуального баскетбольного табло я использовал устройство Avnet SmartEdge для тестирования метода отслеживания моих тренировок в баскетболе. Я использовал датчик ускорения для определения выстрелов и датчик приближения для определения очков. Теперь идея этого проекта состоит в том, чтобы реализовать окончательное решение задачи баскетбольного табло.

Версии

В начале проекта я использовал аппаратные компоненты, которые были у меня дома, и разработал необходимое программное обеспечение (Arduino и Android). Эта первая версия (1.1.0) зарекомендовала себя довольно хорошо, поэтому я решил внести некоторые изменения, чтобы использовать более дешевые компоненты, а также внести некоторые улучшения в программное обеспечение. Вторая версия (2.0.0) еще лучше, наслаждайтесь.

Шаг 1. Arduino

Оборудование

Вы можете увидеть список аппаратных компонентов для версии 2.0.0 в разделе «Вещи».

Основные изменения, внесенные с версии 1.1.0 на версию 2.0.0:

  • Arduino Mega 2560 => заменен на Arduino Nano R3
  • Bluetooth Shield => Изменен на модуль Bluetooth HC-05
  • Литий-ионная аккумуляторная батарея => Батарея заменена на 9 В
  • Датчик температуры и влажности DHT22 => Добавлено.

Некоторые соображения по поводу других компонентов, используемых в этом проекте:

  • Инфракрасный датчик приближения E18-D80NK:в этом проекте можно использовать и другие датчики приближения, но имейте в виду, что лучше использовать тот, который не подвержен влиянию солнечного света, как этот.
  • Датчик вибрации SW420:в этом проекте можно использовать другие датчики вибрации, этот работает очень хорошо.

Схемы Arduino для двух версий доступны в разделе «Схемы».

Программное обеспечение

Я использовал IDE Arduino для разработки кода Arduino, запрограммированного со следующей стратегией:

  • После инициализации (переменные, светодиод, Bluetooth и т. д.) он продолжает непрерывно отслеживать состояние датчиков.
  • Если датчик приближения обнаруживает присутствие мяча, это означает, что выстрел только что произошел, и это счет.
  • Если датчик вибрации обнаруживает какое-то движение, это означает, что выстрел только что произошел, но он ждет 2 секунды (максимум), чтобы принять решение.
  • В этот раз, если датчик приближения обнаруживает присутствие мяча, он (сразу) узнает, что это счет.
  • По истечении 2 секунд, если датчик приближения не обнаружил присутствие мяча, он знает, что это промах.
  • Arduino сообщает Android через Bluetooth, что только что произошел выстрел (результат или промах).
  • Процесс перезапускается.

Основные изменения, внесенные с версии 1.1.0 на версию 2.0.0:

  • Измените поддержку Bluetooth Shield на модуль Bluetooth HC-05
  • Добавить поддержку датчика температуры и влажности DHT22
  • Улучшить логику обнаружения выстрелов, очков и промахов, а также улучшить сигнализацию с помощью светодиода.

Коды Arduino для двух версий доступны в разделе «Код».

Шаг 2. Android

Я использовал MIT App Inventor для разработки кода Android, запрограммированного со следующей стратегией:

  • После инициализации (выстрелы, очки, промахи, Bluetooth и т. д.) он ожидает нажатия кнопки «Старт».
  • При нажатии кнопки «Пуск» продолжается постоянный мониторинг соединения Bluetooth.
  • Каждый раз, когда он получает какие-либо данные, он обновляет доску и воспроизводит правильный звук уведомления.
  • Процесс повторяется, пока не будет нажата кнопка «Пауза».
  • Есть кнопки для выбора устройства Bluetooth, сброса счетчика и некоторые дополнительные кнопки для настройки платы при необходимости.

Основные изменения, внесенные с версии 1.1.0 на версию 2.0.0:

  • Измените макет с книжной на альбомную.
  • Добавьте свет, влажность, температуру и индекс тепла.
  • Улучшите кнопки настройки.
  • Добавьте функцию, чтобы экран всегда оставался включенным.
  • Добавить звуки нажатия на все кнопки.
  • Добавляет функцию предупреждения каждый раз, когда достигается отметка в 50 выстрелов (50, 100, 150 и т. д.).

Коды Android для двух версий доступны в разделе «Код».

Шаг 3. Установка баскетбольной доски

Это оригинальная баскетбольная доска, которую я регулярно использую для тренировок по баскетболу.

Сначала снял пластиковую крышку под обручем и проделал отверстие для датчика приближения.

Затем проделал небольшое отверстие для крепления датчика вибрации.

Мне не удалось прикрепить датчик непосредственно к пластиковой крышке из-за ее кривизны, поэтому я построил опору для датчика, используя МДФ.

Я закрепил датчики приближения и вибрации с помощью нескольких болтов и гайки.

Затем я подключил остальные компоненты.

Пришло время дымового теста.

Наконец, я установил все на баскетбольную доску.

Шаг 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 //// Автор:Марсело Авила де Оливейра  //// --------------------- -------------------------------------------------- ----- //// ----------------------------------------- ----------------------------------- //// ОПРЕДЕЛЕНИЯ //// ------ -------------------------------------------------- -------------------- //// ВКЛЮЧИТЬ РЕЖИМ ОТЛАДКИ // #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 float percent_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); // НАЧАЛО СВЯЗИ 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"); // Делаем ведомое устройство запрошенным задержкой (2000); // Эта задержка обязательна. while (Serial1.available ()) {// Очистить задержку данных (50); Serial1.read (); }} // ---------------------------------------------- ------------------------------ //// ФУНКЦИИ (СВЕТ) //// -------- -------------------------------------------------- ------------------ // int percent_to_bright (int percent) {// PERCENT:// 0..100 // ВОЗВРАТ ЯРКОСТЬ // 255..0 return 256 - pow (2, percent / percent_to_bright_factor);} void set_led (int color, int bright) {// ЦВЕТ:// 0 =ЗЕЛЕНЫЙ // 1 =ЖЕЛТЫЙ // 2 =КРАСНЫЙ // 3 =СИНИЙ // 4 =СИНИЙ / / 5 =ПУРПУРНЫЙ // 6 =БЕЛЫЙ // // ЯРКИЙ:// 0 =ВЫКЛ // .. // 100 =МАКС. #Ifdef DEBUG Serial.println ("Настройка светодиода"); Serial.println (); #endif if (цвет <0 || цвет> 6 || яркий <0 || яркий> 100) {return; } int led_r_bright =255; int led_g_bright =255; int led_b_bright =255; int bright_aux =percent_to_bright (яркий); переключатель (цвет) {case 0:// ЗЕЛЕНЫЙ led_g_bright =bright_aux; ломать; case 1:// ЖЕЛТЫЙ led_r_bright =bright_aux; led_g_bright =bright_aux; ломать; case 2:// КРАСНЫЙ led_r_bright =bright_aux; ломать; case 3:// CYAN led_g_bright =bright_aux; led_b_bright =bright_aux; ломать; case 4:// СИНИЙ led_b_bright =bright_aux; ломать; case 5:// MAGENTA led_r_bright =bright_aux; led_b_bright =bright_aux; ломать; case 6:// БЕЛЫЙ 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; если (! вибр) {ждать =истина; время ожидания =миллис () + интервал ожидания; } 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) {если (! prox) {set_shot (0); } перезагрузить(); }} // ---------------------------------------------- ------------------------------ //// ФУНКЦИИ (MIS) //// -------- -------------------------------------------------- ------------------ // void set_shot (int mode) {// MODE:// 0 =WRONG SHOT (MISS) // 1 =RIGHT SHOT (SCORE), если (режим ==0) {set_led (2, 100); } еще {set_led (0, 100); } Serial1.print (режим); delay (1000);} сбросить void () {vibr =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 //// Автор:Марсело Авила де Оливейра  //// --------------------- -------------------------------------------------- ----- //// ----------------------------------------- ----------------------------------- //// БИБЛИОТЕКИ //// ------ -------------------------------------------------- -------------------- //// БИБЛИОТЕКА ТЕМПЕРАТУРЫ И ВЛАЖНОСТИ # 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 # define DHTPIN 7 # определить DHTTYPE DHT22DHT dht (DHTPIN, DHTTYPE); // МОДУЛЬ BLUETOOTH LE (RX, TX) Программное обеспечение Последовательный 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; // ВЛАЖНОСТЬ И ТЕМПЕРАТУРА float humi, temp, heat; // STATUSboolean prox =false; boolean vibr =false; boolean wait =false; // -------------------------------------------------- -------------------------- //// ФУНКЦИИ (НАСТРОЙКИ) //// ------------ ------------------------ ---------------------------------------- // void setup () {// ИНИЦИАЦИЯ PINS pinMode (prox_pin, ВХОД); pinMode (vibr_pin, ВХОД); pinMode (led_r_pin, ВЫХОД); pinMode (led_g_pin, ВЫХОД); pinMode (led_b_pin, ВЫХОД); // УСТАНОВКА ПУРПУРНОГО СВЕТОДИОДА set_led (5, 100); // НАЧАЛО ПОСЛЕДОВАТЕЛЬНОЙ СВЯЗИ Serial.begin (9600); // НАЧАЛО СВЯЗИ BLUETOOTH setup_bluetooth (); // ЗАПУСК ДАТЧИКА DHT dht.begin (); // УСТАНАВЛИВАЕМ СИНИЙ светодиод 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 (); }} // ---------------------------------------------- ------------------------------ //// ФУНКЦИИ (СВЕТ) //// -------- -------------------------------------------------- ------------------ // int percent_to_bright (int percent) {// PERCENT:// 0..100 // ВОЗВРАТ ЯРКОСТЬ // 255..0 return 256 - pow (2, percent / percent_to_bright_factor);} void set_led (int color, int bright) {// ЦВЕТ:// 0 =ЗЕЛЕНЫЙ // 1 =ЖЕЛТЫЙ // 2 =КРАСНЫЙ // 3 =СИНИЙ // 4 =СИНИЙ / / 5 =ПУРПУРНЫЙ // 6 =БЕЛЫЙ // // ЯРКИЙ:// 0 =ВЫКЛ // .. // 100 =МАКС. #Ifdef DEBUG Serial.println ("Настройка светодиода"); Serial.println (); #endif if (цвет <0 || цвет> 6 || яркий <0 || яркий> 100) {return; } int led_r_bright =255; int led_g_bright =255; int led_b_bright =255; int bright_aux =percent_to_bright (яркий); переключатель (цвет) {case 0:// ЗЕЛЕНЫЙ led_g_bright =bright_aux; ломать; case 1:// ЖЕЛТЫЙ led_r_bright =bright_aux; led_g_bright =bright_aux; ломать; case 2:// КРАСНЫЙ led_r_bright =bright_aux; ломать; case 3:// CYAN led_g_bright =bright_aux; led_b_bright =bright_aux; ломать; case 4:// СИНИЙ led_b_bright =bright_aux; ломать; case 5:// MAGENTA led_r_bright =bright_aux; led_b_bright =bright_aux; ломать; case 6:// БЕЛЫЙ 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 (0, 100); send_data (2); prox =true; если (! вибр) {ждать =истина; время ожидания =миллис () + интервал ожидания; }}}} void check_vibr () {if (! prox &&! vibr) {// ПРОВЕРЬТЕ ВИБРАЦИЮ ТОЛЬКО ЕСЛИ БЛИЖНОСТЬ И ВИБРАЦИЯ НЕ ОБНАРУЖЕНА if (digitalRead (vibr_pin) ==HIGH) {#ifdef DEBUG_VIBR Serial.println (" Обнаружена вибрация »); Serial.println (); #endif // УСТАНОВИТЬ ЖЕЛТЫЙ светодиод set_led (1, 100); вибр =правда; ждать =правда; время ожидания =миллис () + интервал ожидания; }}} void check_wait () {if (wait &&millis ()> wait_time) {if (! prox) {// УСТАНОВИТЬ КРАСНЫЙ СВЕТОДИОД set_led (2, 100); send_data (1); } перезагрузить(); }} void check_dht () {if (! prox &&! vibr) {// ПРОВЕРКА DHT ТОЛЬКО ЕСЛИ ВИБРАЦИЯ НЕ ОБНАРУЖЕНА if (millis ()> dht_time) {humi =dht.readHumidity (); temp =dht.readTemperature (); heat =dht.computeHeatIndex (температура, влажность, ложь); #ifdef DEBUG_DHT Serial.print ("Влажность:"); Серийный принт (гуми); Serial.println ("%"); Serial.print ("Температура:"); 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 =NO DATA // 1 =WRONG SHOT (MISS) // 2 =ПРАВЫЙ ВЫСТРЕЛ (ОЦЕНКА) Bluetooth.print (humi); Bluetooth.print (темп); Bluetooth.print (тепло); Bluetooth.print (снимок); #ifdef DEBUG_BLUE Serial.println ("Bluetooth отправлен"); Serial.println (); #endif} void reset () {vibr =false; прокс =ложь; ждать =ложь; задержка (1000); // УСТАНОВИТЬ СИНИЙ светодиод 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/)
 Нет предварительной версии (только загрузка). 

Схема


Производственный процесс

  1. Баскетбол
  2. Разработка систем интеллектуального земледелия с открытым исходным кодом
  3. Интеллектуальная сенсорная плата ускоряет разработку периферийного ИИ
  4. Датчик температуры Raspberry Pi
  5. Сотовый Интернет вещей:умный мусорный бак
  6. Умный бармен
  7. Датчик эмоций / ЭЭГ
  8. Сверхчувствительный и надежный датчик для смарт-текстиля
  9. Ультратонкий сенсор для умных контактных линз
  10. Умная мехатроника помогает в производстве датчиков в Sensata Technologies