Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Placar Smart Basketball

Componentes e suprimentos

Arduino Nano R3
× 1
Módulo Bluetooth HC-05
× 1
Sensor de proximidade infravermelho E18-D80NK
× 1
Seeed Grove - Sensor de vibração (SW-420)
× 1
Sensor de temperatura DHT22
× 1
LED RGB de 8 mm
× 1
Resistor 10k ohm
× 3
Resistor 100 ohm
× 3
Through Hole Resistor, 47 ohm
× 1
Resistor 1k ohm
× 1
Resistor 2,21 k ohm
× 1
Bateria de 9 V (genérica)
× 1

Aplicativos e serviços online

Arduino IDE
MIT App Inventor Android IDE

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

  1. Basquete
  2. Projetando sistemas de agricultura inteligente de código aberto
  3. A placa do sensor inteligente acelera o desenvolvimento de IA de borda
  4. Sensor de temperatura Raspberry Pi
  5. IoT celular:Lixeira inteligente
  6. Bartender inteligente
  7. Sensor de emoção / EEG
  8. Sensor ultra-sensível e resiliente para têxteis inteligentes
  9. Sensor ultrafino para lentes de contato inteligentes
  10. Mecatrônica inteligente auxilia na produção de sensores na Sensata Technologies