Placar Smart Basketball
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 3 | ||||
| × | 3 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicativos e serviços online
| ||||
|
Sobre este projeto
Costumo fazer treinos de basquete regularmente e sempre acompanho as estatísticas das seções (número de arremessos, pontuações, falhas, etc). Acompanhar esses números é meio chato e difícil de realizar. As bolas inteligentes podem ser usadas para isso, mas têm algumas desvantagens:
- Se quiser treinar com várias bolas, você precisará comprar várias bolas inteligentes (caras).
- A precisão não é tão boa.
- A durabilidade da bola.
Em meu projeto anterior de protótipo de placar de basquete inteligente, usei o dispositivo Avnet SmartEdge para testar um método para monitorar meus treinos de basquete. Usei o sensor de aceleração para detectar os tiros e o sensor de proximidade para detectar as pontuações. Agora, a ideia desse projeto é implementar uma solução definitiva para a tarefa de placar do basquete.
Versões
No início do projeto, usei os componentes de hardware que tinha à disposição em casa e desenvolvi o software (Arduino e Android) necessário. Esta primeira versão (1.1.0) provou funcionar muito bem, então decidi fazer algumas mudanças para usar componentes mais baratos e implementar algumas melhorias de software também. A segunda versão (2.0.0) é ainda melhor, aproveite.
Etapa 1:Arduino
Hardware
Você pode ver a lista de componentes de hardware para a versão 2.0.0 na seção Coisas.
Estas são as principais alterações feitas da versão 1.1.0 para a versão 2.0.0:
- Arduino Mega 2560 => Alterado para Arduino Nano R3
- Bluetooth Shield => Alterado para módulo Bluetooth HC-05
- Alimentação de íon de lítio recarregável => Alterada para bateria de 9 V
- Sensor DHT22 de temperatura e umidade => Adicionado.
Algumas considerações sobre outros componentes usados neste projeto:
- Sensor de proximidade infravermelho E18-D80NK:outros sensores de proximidade poderiam ser usados neste projeto, mas tenha em mente que é melhor usar um que não sofra de interferência da luz solar, como este.
- SW420 Sensor de vibração:outros sensores de vibração podem ser usados neste projeto, este funciona muito bem.
Os esquemas do Arduino para as duas versões estão disponíveis na seção Esquemas.
Software
Usei o IDE do Arduino para desenvolver o código do Arduino, programado com a seguinte estratégia:
- Após a inicialização (variáveis, LED, Bluetooth, etc) permanece monitorando continuamente o status dos sensores.
- Se o sensor de proximidade detecta a presença da bola, isso significa que um chute acabou de acontecer e é um placar.
- Se o sensor de vibração detectar algum movimento, significa que um tiro acabou de acontecer, mas ele aguarda 2 segundos (no máximo) para tomar uma decisão.
- Nesse momento, se o sensor de proximidade detecta a presença da bola, ele (imediatamente) sabe que é uma pontuação.
- Ao final do tempo de 2 segundos, se o sensor de proximidade não detectou a presença da bola, ele sabe que foi um erro.
- O Arduino informa ao Android por Bluetooth que um tiro (pontuação ou falha) acabou de acontecer.
- O processo é reiniciado.
Estas são as principais alterações feitas da versão 1.1.0 para a versão 2.0.0:
- Mude o suporte de escudo Bluetooth para módulo Bluetooth HC-05
- Adicionar suporte para sensor de temperatura e umidade DHT22
- Melhore a lógica para detectar tiros, pontuações e erros e para melhor sinalizar através do LED.
Os códigos do Arduino para as duas versões estão disponíveis na seção Código.
Etapa 2:Android
Usei o MIT App Inventor para desenvolver o código Android, programado com a seguinte estratégia:
- Após a inicialização (tiros, pontuações, erros, Bluetooth, etc) espera que o botão "Iniciar" seja pressionado.
- Quando o botão "Iniciar" é pressionado, ele monitora continuamente a conexão Bluetooth.
- Sempre que recebe algum dado, ele atualiza o tabuleiro e reproduz o som de notificação correto.
- O processo se repete até que o botão "Pausar" seja pressionado.
- Existem botões para selecionar o dispositivo Bluetooth, zerar a contagem e alguns botões extras para ajustar a placa, se necessário.
Estas são as principais alterações feitas da versão 1.1.0 para a versão 2.0.0:
- Mude o layout de retrato para paisagem.
- Adicione luz, umidade, temperatura e índice de calor.
- Melhore os botões de ajuste.
- Adicione um recurso para manter a tela sempre ligada.
- Adicione sons de pressionar em todos os botões.
- Adiciona funcionalidade para avisar cada vez que a marca de 50 tiros (50, 100, 150, etc.) é atingida.
Os códigos Android para as duas versões estão disponíveis na seção Código.
Etapa 3:configuração do tabuleiro de basquete
Esta é a prancha de basquete original que eu uso regularmente para fazer exercícios de treinamento de basquete.
Primeiro, retirei a tampa de plástico sob o aro e fiz um orifício para o sensor de proximidade.
Então fiz um pequeno orifício para consertar o sensor de vibração.
Não consegui prender o sensor diretamente na tampa de plástico devido à sua curvatura, então construí um suporte para o sensor usando MDF.
Consertei os sensores de proximidade e vibração usando alguns parafusos e uma porca.
Então eu conectei os outros componentes.
É hora de um teste de fumaça.
Finalmente, instalei tudo na placa de basquete.
Etapa 4:teste de treino de basquete
Agora é hora de testar tudo.
E o grand finale ... é hora do show!
Etapa 5:Considerações finais
- O sistema provou ser muito preciso, com muito poucos falsos positivos e raros falsos negativos.
- É fantástico jogar com o sistema para saber as estatísticas do treino em tempo real e após o treino.
Divirta-se...
Código
- código Arduino (1.1.0)
- código Android (1.1.0)
- código Arduino (2.0.0)
- código Android (2.0.0)
Código Arduino (1.1.0) Arduino
// --------------------------------------------- ------------------------------- //// Nome do arquivo:Scoreboard.ino //// Descrição:Smart Basketball Scoreboard / /// Versão:1.1.0 //// Autor:Marcelo Avila de Oliveira//// --------------------- -------------------------------------------------- ----- //// ----------------------------------------- ----------------------------------- //// DEFINIÇÕES //// ------ -------------------------------------------------- -------------------- //// ATIVAR MODO DE DEBUG // #define DEBUG // #define DEBUG_PROX // #define DEBUG_VIBR // ----- -------------------------------------------------- --------------------- //// CONSTANTS //// -------------------- -------------------------------------------------- ------ //// 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); // ----------------------------------------- ----------------------------------- //// VARIABLES //// ------ -------------------------------------------------- -------------------- //// TIMEunsigned long wait_time; // STATUSboolean prox =false; boolean vibr =false; boolean wait =false; // --- -------------------------------------------------- ----------------------- //// FUNÇÕES (AJUSTES) //// --------------- -------------------------------------------------- ----------- // void setup () {// INICIAR PINS 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); // INICIAR A COMUNICAÇÃO SERIAL Serial.begin (9600); // INICIAR A COMUNICAÇÃO BLUETOOTH setup_bluetooth (); set_led (4, 100); #ifdef DEBUG Serial.println ("A placa está viva"); Serial.println (); #endif} void setup_bluetooth () {#ifdef DEBUG Serial.println ("Configurando Bluetooth"); Serial.println (); #endif Serial1.begin (38400); // Definir taxa de transmissão Serial1.print ("\ r \ n + STWMOD =0 \ r \ n"); // Definido para trabalhar no modo escravo Serial1.print ("\ r \ n + STNA =Arduino \ r \ n"); // Definir nome Serial1.print ("\ r \ n + STOAUT =1 \ r \ n"); // Permitir que o dispositivo emparelhado me conecte Serial1.print ("\ r \ n + STAUTO =0 \ r \ n"); // A conexão automática deve ser proibida aqui delay (2000); // Este atraso é necessário. Serial1.print ("\ r \ n + INQ =1 \ r \ n"); // Tornar o escravo questionável delay (2000); // Este atraso é necessário. while (Serial1.available ()) {// Deletar dados de atraso (50); Serial1.read (); }} // ---------------------------------------------- ------------------------------ //// FUNÇÕES (LUZ) //// -------- -------------------------------------------------- ------------------ // 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) {// COR:// 0 =VERDE // 1 =AMARELO // 2 =VERMELHO // 3 =CIANO // 4 =AZUL / / 5 =MAGENTA // 6 =BRANCO // // BRILHO:// 0 =DESLIGADO // .. // 100 =MÁX. #Ifdef DEBUG Serial.println ("LED de configuração"); 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 brilhante_aux =percent_to_bright (brilhante); switch (cor) {case 0:// GREEN led_g_bright =bright_aux; pausa; caso 1:// AMARELO led_r_bright =bright_aux; led_g_bright =bright_aux; pausa; caso 2:// RED led_r_bright =bright_aux; pausa; caso 3:// CYAN led_g_bright =bright_aux; led_b_bright =bright_aux; pausa; caso 4:// BLUE led_b_bright =bright_aux; pausa; caso 5:// MAGENTA led_r_bright =bright_aux; led_b_bright =bright_aux; pausa; caso 6:// WHITE led_r_bright =bright_aux; led_g_bright =bright_aux; led_b_bright =bright_aux; pausa; } analogWrite (led_r_pin, led_r_bright); analogWrite (led_g_pin, led_g_bright); analogWrite (led_b_pin, led_b_bright); Retorna;}//--------------------------------------------- ------------------------------- //// FUNÇÕES (VERIFICAR) //// ------- -------------------------------------------------- ------------------- // void check_prox () {if (! prox) {if (digitalRead (prox_pin) ==LOW) {#ifdef DEBUG_PROX Serial.println ( "Proximidade detectada"); Serial.println (); #endif prox =true; if (! vibrar) {esperar =verdadeiro; wait_time =millis () + wait_interval; } set_shot (1); }}} void check_vibr () {if (! prox &&! vibr) {if (digitalRead (vibr_pin) ==HIGH) {#ifdef DEBUG_PROX Serial.println ("Vibração detectada"); Serial.println (); #endif vibr =true; esperar =verdadeiro; wait_time =millis () + wait_interval; set_led (1, 100); }}} void check_wait () {if (wait &&millis ()> wait_time) {if (! prox) {set_shot (0); } Redefinir(); }} // ---------------------------------------------- ------------------------------ //// FUNÇÕES (MIS) //// -------- -------------------------------------------------- ------------------ // void set_shot (modo int) {// MODE:// 0 =TOMADA ERRADA (MISS) // 1 =TOMADA DIREITA (PONTUAÇÃO) se (modo ==0) {set_led (2, 100); } else {set_led (0, 100); } Serial1.print (modo); atraso (1000);} void reset () {vibr =false; prox =false; esperar =falso; set_led (4, 100);} // ---------------------------------------- ------------------------------------//// A PRINCIPAL ////----- -------------------------------------------------- --------------------- // void loop () {check_prox (); check_vibr (); check_wait ();}
Código Android (1.1.0) Java
Android MIT App Inventor (http://ai2.appinventor.mit.edu/)Sem visualização (somente download).
Código Arduino (2.0.0) Arduino
// --------------------------------------------- ------------------------------- //// Nome do arquivo:Scoreboard.ino //// Descrição:Smart Basketball Scoreboard / /// Versão:2.0.0 //// Autor:Marcelo Avila de Oliveira//// --------------------- -------------------------------------------------- ----- //// ----------------------------------------- ----------------------------------- //// BIBLIOTECAS //// ------ -------------------------------------------------- -------------------- //// BIBLIOTECA DE TEMPERATURA E HUMIDADE # include "DHT.h" // BIBLIOTECA MULTI SERIAL # include "SoftwareSerial.h" // - -------------------------------------------------- ------------------------- //// DEFINITIONS //// ---------------- -------------------------------------------------- ---------- //// ATIVAR MODO DE DEBUG // #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) SoftwareSerial Bluetooth (10, 11); // ---------------------------------- ------------------------------------------ //// CONSTANTS /// / ------------------------------------------------- --------------------------- //// 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); // --- -------------------------------------------------- ----------------------- //// VARIABLES //// ------------------ -------------------------------------------------- -------- //// TIMEunsigned long wait_time; unsigned long dht_time; // UMIDADE &TEMPERATURAfloat humi, temp, heat; // STATUSboolean prox =false; boolean vibr =false; boolean wait =false; // -------------------------------------------------- -------------------------- //// FUNÇÕES (DEFINIÇÕES) //// ------------ ------------------------ ---------------------------------------- // void setup () {// INICIAR PINS 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 MAGENTA set_led (5, 100); // INICIAR A COMUNICAÇÃO SERIAL Serial.begin (9600); // INICIAR A COMUNICAÇÃO BLUETOOTH setup_bluetooth (); // INICIAR SENSOR DHT dht.begin (); // SET LED AZUL set_led (4, 100); #ifdef DEBUG Serial.println ("A placa está viva"); Serial.println (); #endif} void setup_bluetooth () {#ifdef DEBUG_BLUE Serial.println ("Configurando Bluetooth"); Serial.println (); #endif // DEFINIR TAXA DE BAUD Bluetooth.begin (9600); // LIMPAR TODOS OS DADOS DISPONÍVEIS enquanto (Bluetooth.available ()) {delay (50); Bluetooth.read (); }} // ---------------------------------------------- ------------------------------ //// FUNÇÕES (LUZ) //// -------- -------------------------------------------------- ------------------ // 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) {// COR:// 0 =VERDE // 1 =AMARELO // 2 =VERMELHO // 3 =CIANO // 4 =AZUL / / 5 =MAGENTA // 6 =BRANCO // // BRILHO:// 0 =DESLIGADO // .. // 100 =MÁX. #Ifdef DEBUG Serial.println ("LED de configuração"); 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 brilhante_aux =percent_to_bright (brilhante); switch (cor) {case 0:// GREEN led_g_bright =bright_aux; pausa; caso 1:// AMARELO led_r_bright =bright_aux; led_g_bright =bright_aux; pausa; caso 2:// RED led_r_bright =bright_aux; pausa; caso 3:// CYAN led_g_bright =bright_aux; led_b_bright =bright_aux; pausa; caso 4:// BLUE led_b_bright =bright_aux; pausa; caso 5:// MAGENTA led_r_bright =bright_aux; led_b_bright =bright_aux; pausa; caso 6:// WHITE led_r_bright =bright_aux; led_g_bright =bright_aux; led_b_bright =bright_aux; pausa; } analogWrite (led_r_pin, led_r_bright); analogWrite (led_g_pin, led_g_bright); analogWrite (led_b_pin, led_b_bright); Retorna;}//--------------------------------------------- ------------------------------- //// FUNÇÕES (VERIFICAR) //// ------- -------------------------------------------------- ------------------- // void check_prox () {if (! prox) {// VERIFIQUE A PROXIMIDADE SOMENTE SE A PROXIMIDADE NÃO FOI DETECTADA if (digitalRead (prox_pin) ==BAIXO) {#ifdef DEBUG_PROX Serial.println ("Proximidade detectada"); Serial.println (); #endif // SET LED GREEN set_led (0, 100); send_data (2); prox =verdadeiro; if (! vibrar) {esperar =verdadeiro; wait_time =millis () + wait_interval; }}}} void check_vibr () {if (! prox &&! vibr) {// VERIFIQUE A VIBRAÇÃO SOMENTE SE A PROXIMIDADE E A VIBRAÇÃO NÃO FOR DETECTADA if (digitalRead (vibr_pin) ==HIGH) {#ifdef DEBUG_VIBR Serial.println (" Vibração detectada "); Serial.println (); #endif // DEFINIR LED AMARELO set_led (1, 100); vibr =verdadeiro; esperar =verdadeiro; 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); } Redefinir(); }} void check_dht () {if (! prox &&! vibr) {// VERIFICAR DHT SOMENTE SE A VIBRAÇÃO NÃO FOI DETECTADA if (millis ()> dht_time) {humi =dht.readHumidity (); temp =dht.readTemperature (); calor =dht.computeHeatIndex (temp, humi, false); #ifdef DEBUG_DHT Serial.print ("Umidade:"); Serial.print (humi); Serial.println ("%"); Serial.print ("Temperatura:"); Serial.print (temp); Serial.println ("C"); Serial.print ("Índice principal:"); Serial.print (calor); Serial.println ("C"); Serial.println (""); #endif send_data (0); dht_time =millis () + dht_interval; }}} // --------------------------------------------- ------------------------------- //// FUNÇÕES (MIS) //// ------- -------------------------------------------------- ------------------- // void send_data (int shot) {// SHOT:// 0 =NO DATA // 1 =SHOT ERRADO (MISS) // 2 =TOMADA DIREITA (PONTUAÇÃO) Bluetooth.print (humi); Bluetooth.print (temp); Bluetooth.print (calor); Bluetooth.print (foto); #ifdef DEBUG_BLUE Serial.println ("Bluetooth enviado"); Serial.println (); #endif} void reset () {vibr =false; prox =false; esperar =falso; atraso (1000); // SET LED BLUE set_led (4, 100);} // ----------------------------------- -----------------------------------------//// A PRINCIPAL //// -------------------------------------------------- -------------------------- // void loop () {check_prox (); check_vibr (); check_wait (); check_dht ();}
Código Android (2.0.0) Java
Android MIT App Inventor (http://ai2.appinventor.mit.edu/)Sem visualização (somente download).
Esquemas
Processo de manufatura
- Basquete
- Projetando sistemas de agricultura inteligente de código aberto
- A placa do sensor inteligente acelera o desenvolvimento de IA de borda
- Sensor de temperatura Raspberry Pi
- IoT celular:Lixeira inteligente
- Bartender inteligente
- Sensor de emoção / EEG
- Sensor ultra-sensível e resiliente para têxteis inteligentes
- Sensor ultrafino para lentes de contato inteligentes
- Mecatrônica inteligente auxilia na produção de sensores na Sensata Technologies