Placar Eletrônico para Tênis de Mesa: mudanças entre as edições

De Wiki Cursos IFPR Foz
Ir para navegaçãoIr para pesquisar
 
(36 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 10: Linha 10:
*Tiago Marins de Queiroz (CST Análise e Desenvolvimento de Sistemas)
*Tiago Marins de Queiroz (CST Análise e Desenvolvimento de Sistemas)
*Joabe Domingos de Oliveira (CST Análise e Desenvolvimento de Sistemas)
*Joabe Domingos de Oliveira (CST Análise e Desenvolvimento de Sistemas)
*Vitor Matheus de Souza Baldacin (CST Análise e Desenvolvimento de Sistemas)
*Micheli Trindade Moura (Licenciatura em Física)


==Especificação prévia do sistema==
===Produções===


O '''Placar Eletrônico para Tênis de Mesa''' será controlado por microcontrolador '''Arduíno''' e receberá informações reotamente, via tecnologia '''''bluetooth''''', eviadas por aplicativo em celular '''Android'''.
CANTÚ, E.; MOURA, M. T.; OLIVEIRA, J. D. ; MARINS, T. Medição da energia elétrica produzida por um gerador eólico utilizando o Arduíno Yun. Mostra IFTech 2017, Foz do Iguaçu, 2017. ([[Mídia:Placar2016.pdf|Poster IFTech2017]]).
 
==Especificação do sistema==
 
O '''Placar Eletrônico para Tênis de Mesa''' será controlado por microcontrolador '''Arduíno''' e receberá informações reotamente, via '''''bluetooth''''', eviadas por aplicativo em celular '''Android'''.


===Formato do placar eletrônico===
===Formato do placar eletrônico===


A configuração inicial do placar eletrônico e as informações a serem apresentadas serão similares as disponibilizadas pelo aplicativo
A configuração do placar eletrônico e as informações a serem apresentadas serão similares as disponibilizadas pelo aplicativo '''Placar Tênis de Mesa''' <ref>https://play.google.com/store/apps/details?id=br.com.leonferrer.tabletennis&hl=pt_BR</ref>, utilizado para arbitrar jogos de tênis de mesa para tablets e smarthphones.
'''[https://play.google.com/store/apps/details?id=br.com.leonferrer.tabletennis&hl=pt_BR Placar Tênis de Mesa]''', utilizado para arbitrar jogos de tênis de mesa para tablets e smarthphones.
 
;Configuração inicial do placar: O placar registrará a partida entre dois jogadores: '''Jogador 1 x Jogador 2'''.
;Configuração do placar: O placar registrará a partida entre dois jogadores: '''Jogador 1 x Jogador 2'''.


Para iniciar uma partida deve-se definir:
Para iniciar uma partida deve-se definir:
Linha 30: Linha 34:
*Botões para voltar ponto (em caso de erro na contagem), um para cada jogador.
*Botões para voltar ponto (em caso de erro na contagem), um para cada jogador.


====Envio de informações via ''bluetooth'' do smarthphone ao placar====
===Envio de informações via ''bluetooth'' do smarthphone ao placar===
 
Para o envio das informações via ''bluetooth'' será gerado uma '''string de caracteres''' com as informações correntes do painel,incluindo:
#Ordem do saque (0, 1 ou 2)
#Sets jogador 1 (0 a 9)
#Sets jogador 2 (0 a 9)
#Pontos jogador 1 (0 a 99)
#<code>:</code> (caractere separador)
#Pontos jogador 2 (0 a 99)
#: (caractere separador)


Uma opção para o envio das informações via ''bluetooth'' é gerar uma '''string de caracteres''' com as informações correntes do painel. Por exemplo:
_00_0x0_00_ (string inicial)
.00_0x0_00_ (definição do sacador, no exemplo jogador 1)
.01_0x0_00_ (ponto para jogador 1)
_01_0x0_01. (ponto para jogador 2 e inversão da ordem de saque)
_01_0x0_02. (ponto para jogador)
...


Desta forma, caso haja uma perda momentânea de comunicação entre o ''smarthphone'' e o placar, quando a comunicação for reestabelecida o painel será automaticamente atualizado com a informação atualizada.
Desta forma, caso haja uma perda momentânea de comunicação entre o ''smarthphone'' e o placar, quando a comunicação for reestabelecida o painel será automaticamente atualizado com a informação atualizada.


====Hardware do placar eletrônico====
===Hardware do placar eletrônico===
 
O hardware para o painel eletrônico vai utilizar o '''CI 4511''' <ref>https://www.filipeflop.com/produto/ci-decodificador-cd4511/</ref> que é um '''decodificador de BCD para 7 segmentos'''.
 
[[Arquivo:PlacarTenisMesa.png]]


O hardware para o painel eletrônico vai utilizar o '''CI 4511''' que é um '''decodificador de BCD para 7 segmentos'''.
===Comunicação Serial via Bluetooth===


Exemplo de projeto com 4511: [http://www.arduinoecia.com.br/2016/08/cd4511-arduino-display-7-segmentos.html Arduino e display 7 segmentos]
;Pinagem e conexão com o Arduíno: Será utilizado o módulo '''Bluetooth HC06''' <ref>https://www.filipeflop.com/blog/tutorial-modulo-bluetooth-com-arduino/</ref>, que possui 4 pinos para conexão com o Arduíno, como mostrado na figura:
            _________
            |        |
            |        |
            |        |
            |Bleutooth|
            |        |
            |  HC06  |
            |        |
            |        |
            |_________|
              | | | |
      Vcc ----+ | | +---- Rxd
      Gnd ------+ +------ Txd
:Cuidados com a conexão do módulo Bluetooth HC06 com o Arduíno:
:*O HC06 funciona com alimentação '''Vcc=3,3V''', a qual também é fornecida pelo Arduino ao lado da alimentação de 5V;
:*Na comunicação serial, como o Arduíno fornece 5V, é necessário utilizar um '''[http://200.17.101.9/wiki/index.php/Resistores#Divisor_de_Tens.C3.A3o divisor de tensão]''' na entrada Rxd do HC06, conforme exemplo abaixo:
[[Arquivo:DivisorTensao-Bleutooth.png]]
V<sub>Rxd</sub> = R2/(R1 + R2).5
::Exemplo:
R1=470 &Omega;, R2=1 K&Omega; -> V<sub>Rxd</sub> = 3,4 V


[[Arquivo:PlacarTenisMesa.png]]
====Arduíno Mega Multi Serial====
O '''Arduíno MEGA''' usa a '''Serial''' exclusivamente para comunicação com a '''porta USB'''. Para comunicação serial TTL (5V) nos pinos 0 (RX) and 1 (TX), como a que será utilizada com o módulo Bluetooth, deve-se utilizar a '''Serial1''', '''Serial2''' ou '''Serial3''' <ref>https://www.arduino.cc/en/Reference/Serial</ref>.
 
==Software para Arduíno==


====Processamento a ser realizado pelo Arduíno====
===Processamento a ser realizado pelo Arduíno===


O '''Arduíno''' que controla o placar eletrônico recebe a '''''string'' de caracteres''' via bluetooth e gera a '''contagem em binário''' a ser mostrada em cada ''display''.
O '''Arduíno''' que controla o placar eletrônico recebe a '''''string'' de caracteres''' via bluetooth e gera a '''contagem em binário''' a ser mostrada em cada ''display''.
Linha 56: Linha 89:
;Indicação do sacador:A indicação do '''sacador''' será mostrada através dos '''pontos''' nos dois displays maiores que mostram a pontuação de cada jogador.
;Indicação do sacador:A indicação do '''sacador''' será mostrada através dos '''pontos''' nos dois displays maiores que mostram a pontuação de cada jogador.


;Sinalização sonora:Um buzzer acionado pelo Arduíno indicará algumas situações ca partida. por exemplo:
;Sinalização sonora:Um buzzer acionado pelo Arduíno indicará algumas situações da partida, por exemplo:
:*'''Um bip''' -> Indicação de '''um ponto'''
:*'''Um bip''' -> Indicação de '''um ponto'''
:*'''Dois bips''' -> Indicação de ponto e '''inversão na ordem de saque''';
:*'''Dois bips''' -> Indicação de ponto e '''inversão na ordem de saque''';
:*'''Sonorização prolongada''' -> Indicação de '''final de set''' ou '''inversão de lado''' no caso de set decisivo.
:*'''Sonorização prolongada''' -> Indicação de '''final de set''' ou '''inversão de lado''' no caso de set decisivo.


===Comunicação Serial via Bluetooth===
===Programa fonte===
 
<source lang="c">
//Software para Controle de Painel Eletrônico via Bluetooth
//2017 - IFPR
//Desenvolvedor: Evandro Cantú
 
String mensagem; //string que armazena mensagem recebida via Bluetooth
int porta;
 
void setup()
{
  //Utiliza Serial1 do Arduino Mega
  Serial1.begin(9600); //set baud rate
  for (porta=2;porta<18;porta++)
    pinMode(porta, OUTPUT);
  for (porta=20;porta<30;porta++)
    pinMode(porta, OUTPUT);
  //Zera portas
  for (porta=2;porta<18;porta++)
    digitalWrite(porta, LOW);
  for (porta=20;porta<30;porta++)
    digitalWrite(porta, LOW);
}


;Interface Multi Serial do Arduíno Mega: [https://www.arduino.cc/en/Tutorial/MultiSerialMega MultiSerialMega]
//Função geraBinario:
//Recebe como parâmetro um caractere (0, 1, 2, 3, 4, 5, 6. 7. 8 ou 9)
//e converte para binário nas portas correspondentes do Arduíno
//para mostrar no Painel Eletrônico.
void geraBinario(char caractere, int porta)
{
  switch (caractere) {
    case '0':
      Serial1.println("(0000)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, LOW);
      digitalWrite(porta+2, LOW);
      digitalWrite(porta+3, LOW);
      break;
    case '1':
      Serial1.println("(0001)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, LOW);
      digitalWrite(porta+2, LOW);
      digitalWrite(porta+3, HIGH);
      break;
    case '2':
      Serial1.println("(0010)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, LOW);
      digitalWrite(porta+2, HIGH);
      digitalWrite(porta+3, LOW);
      break;
    case '3':
      Serial1.println("(0011)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, LOW);
      digitalWrite(porta+2, HIGH);
      digitalWrite(porta+3, HIGH);
      break;
    case '4':
      Serial1.println("(0100)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, HIGH);
      digitalWrite(porta+2, LOW);
      digitalWrite(porta+3, LOW);
      break;     
    case '5':
      Serial1.println("(0101)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, HIGH);
      digitalWrite(porta+2, LOW);
      digitalWrite(porta+3, HIGH);
      break;
    case '6':
      Serial1.println("(0110)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, HIGH);
      digitalWrite(porta+2, HIGH);
      digitalWrite(porta+3, LOW);
      break;
    case '7':
      Serial1.println("(0111)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, HIGH);
      digitalWrite(porta+2, HIGH);
      digitalWrite(porta+3, HIGH);
      break;
    case '8':
      Serial1.println("(1000)");
      digitalWrite(porta+0, HIGH);
      digitalWrite(porta+1, LOW);
      digitalWrite(porta+2, LOW);
      digitalWrite(porta+3, LOW);
      break;
    case '9':
      Serial1.println("(1001)");
      digitalWrite(porta+0, HIGH);
      digitalWrite(porta+1, LOW);
      digitalWrite(porta+2, LOW);
      digitalWrite(porta+3, HIGH);
      break;
    default:
      //Mantem Placar
      break;     
  }
}


;Módulo Bluetooth: [https://www.filipeflop.com/blog/tutorial-modulo-bluetooth-com-arduino/ Tutotial Bluetooth]
void loop()
{
  while(Serial1.available())
  {//Enquanto tiver dados na Serial1 conectada ao Bluetooth
    mensagem+=char(Serial1.read());//Armazena dados na string mensagem
  }
  if(!Serial1.available())
  {
    if(mensagem.length() - 2 == 11)//Verifica se mensagem está correta
    {//ponto computado
      Serial1.print(mensagem); //Mostra mensagem
      Serial1.print("Comprimento: ");  
      Serial1.println(mensagem.length() - 2);
      //Organização da mensagem:
      //PontosDezena  Jogador1 = mensagem[1];
      //PontosUnidade Jogador1 = mensagem[2];
      //Sets          Jogador1 = mensagem[4];
      //PontosDezena  Jogador2 = mensagem[6];
      //PontosUnidade Jogador2 = mensagem[8];
      //Sets          Jogador2 = mensagem[9];
      geraBinario(mensagem[1],2);  //portas = 2, 3, 4, 5
      geraBinario(mensagem[2],6);  //portas = 6, 7, 8, 9
      geraBinario(mensagem[4],10); //portas = 10, 11, 12, 13
      geraBinario(mensagem[6],14); //portas = 14, 15, 16, 17
      geraBinario(mensagem[8],20); //portas = 20, 21, 22, 23
      geraBinario(mensagem[9],24); //portas = 24, 25, 26, 27
      //Saque Jogador1 = mensagem[0];
      //Saque Jogador2 = mensagem[11];
      digitalWrite(28, LOW); //saque Jogador 1 porta 28
      digitalWrite(29, LOW); //saque Jogador 2 porta 29
      if (mensagem[0]=='.') {
        Serial1.println("Saque Jogador 1");
        digitalWrite(28, HIGH);} //saque Jogador 1 porta 28
      else if (mensagem[10]=='.') {
        Serial1.println("Saque Jogador 2");
        digitalWrite(29, HIGH);} //saque Jogador 2 porta 29     


;Comunicação Bleutooth com Android: [http://roboino.com.br/arduino-bluetooth-android/ Bleutooth Android]
      mensagem=""; //clear the data
    }
  }
  delay(1000); //delay
}
</source>


==Referências==
==Referências==
<references />
<references />


----
--[[Usuário:Evandro.cantu|Evandro.cantu]] ([[Usuário Discussão:Evandro.cantu|discussão]]) 18h37min de 8 de setembro de 2017 (BRT)
----
----


[[Categoria:Arduíno]]
[[Categoria:Arduíno]] [[Categoria:LabMaker]]

Edição atual tal como às 20h32min de 15 de outubro de 2018

Placar Eletrônico para Tênis de Mesa

Objetivo

O objetivo deste projeto é construir um placar eletrônico para tênis de mesa, automatizado por microcontrolador Arduíno e comandado remotamente por um aplicativo Android via bluetooth.

Equipe

Professor orientador
Alunos voluntários
  • Tiago Marins de Queiroz (CST Análise e Desenvolvimento de Sistemas)
  • Joabe Domingos de Oliveira (CST Análise e Desenvolvimento de Sistemas)
  • Micheli Trindade Moura (Licenciatura em Física)

Produções

CANTÚ, E.; MOURA, M. T.; OLIVEIRA, J. D. ; MARINS, T. Medição da energia elétrica produzida por um gerador eólico utilizando o Arduíno Yun. Mostra IFTech 2017, Foz do Iguaçu, 2017. (Poster IFTech2017).

Especificação do sistema

O Placar Eletrônico para Tênis de Mesa será controlado por microcontrolador Arduíno e receberá informações reotamente, via bluetooth, eviadas por aplicativo em celular Android.

Formato do placar eletrônico

A configuração do placar eletrônico e as informações a serem apresentadas serão similares as disponibilizadas pelo aplicativo Placar Tênis de Mesa [1], utilizado para arbitrar jogos de tênis de mesa para tablets e smarthphones.

Configuração do placar
O placar registrará a partida entre dois jogadores: Jogador 1 x Jogador 2.

Para iniciar uma partida deve-se definir:

  • O número de set (1, 3, 5 ou 7);
  • O primeiro jogador a sacar (Jogador 1 ou 2).
Contagem de pontos pelo smarthphone
  • Botões para contagem de ponto, um para cada jogador;
  • Botões para voltar ponto (em caso de erro na contagem), um para cada jogador.

Envio de informações via bluetooth do smarthphone ao placar

Para o envio das informações via bluetooth será gerado uma string de caracteres com as informações correntes do painel,incluindo:

  1. Ordem do saque (0, 1 ou 2)
  2. Sets jogador 1 (0 a 9)
  3. Sets jogador 2 (0 a 9)
  4. Pontos jogador 1 (0 a 99)
  5. : (caractere separador)
  6. Pontos jogador 2 (0 a 99)
    (caractere separador)


Desta forma, caso haja uma perda momentânea de comunicação entre o smarthphone e o placar, quando a comunicação for reestabelecida o painel será automaticamente atualizado com a informação atualizada.

Hardware do placar eletrônico

O hardware para o painel eletrônico vai utilizar o CI 4511 [2] que é um decodificador de BCD para 7 segmentos.

Comunicação Serial via Bluetooth

Pinagem e conexão com o Arduíno
Será utilizado o módulo Bluetooth HC06 [3], que possui 4 pinos para conexão com o Arduíno, como mostrado na figura:
            _________
           |         |
           |         |
           |         |
           |Bleutooth|
           |         |
           |   HC06  |
           |         |
           |         |
           |_________|
             | | | |
     Vcc ----+ | | +---- Rxd
     Gnd ------+ +------ Txd
Cuidados com a conexão do módulo Bluetooth HC06 com o Arduíno:
  • O HC06 funciona com alimentação Vcc=3,3V, a qual também é fornecida pelo Arduino ao lado da alimentação de 5V;
  • Na comunicação serial, como o Arduíno fornece 5V, é necessário utilizar um divisor de tensão na entrada Rxd do HC06, conforme exemplo abaixo:

VRxd = R2/(R1 + R2).5
Exemplo:
R1=470 Ω, R2=1 KΩ -> VRxd = 3,4 V

Arduíno Mega Multi Serial

O Arduíno MEGA usa a Serial exclusivamente para comunicação com a porta USB. Para comunicação serial TTL (5V) nos pinos 0 (RX) and 1 (TX), como a que será utilizada com o módulo Bluetooth, deve-se utilizar a Serial1, Serial2 ou Serial3 [4].

Software para Arduíno

Processamento a ser realizado pelo Arduíno

O Arduíno que controla o placar eletrônico recebe a string de caracteres via bluetooth e gera a contagem em binário a ser mostrada em cada display.

Indicação do sacador
A indicação do sacador será mostrada através dos pontos nos dois displays maiores que mostram a pontuação de cada jogador.
Sinalização sonora
Um buzzer acionado pelo Arduíno indicará algumas situações da partida, por exemplo:
  • Um bip -> Indicação de um ponto
  • Dois bips -> Indicação de ponto e inversão na ordem de saque;
  • Sonorização prolongada -> Indicação de final de set ou inversão de lado no caso de set decisivo.

Programa fonte

//Software para Controle de Painel Eletrônico via Bluetooth
//2017 - IFPR
//Desenvolvedor: Evandro Cantú

String mensagem; //string que armazena mensagem recebida via Bluetooth
int porta;

void setup()
{ 
  //Utiliza Serial1 do Arduino Mega
  Serial1.begin(9600); //set baud rate
  for (porta=2;porta<18;porta++)
    pinMode(porta, OUTPUT);
  for (porta=20;porta<30;porta++)
    pinMode(porta, OUTPUT);
  //Zera portas
  for (porta=2;porta<18;porta++)
    digitalWrite(porta, LOW);
  for (porta=20;porta<30;porta++)
    digitalWrite(porta, LOW);
}

//Função geraBinario:
//Recebe como parâmetro um caractere (0, 1, 2, 3, 4, 5, 6. 7. 8 ou 9)
//e converte para binário nas portas correspondentes do Arduíno
//para mostrar no Painel Eletrônico.
void geraBinario(char caractere, int porta)
{
   switch (caractere) {
    case '0':
      Serial1.println("(0000)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, LOW);
      digitalWrite(porta+2, LOW);
      digitalWrite(porta+3, LOW);
      break;
     case '1':
      Serial1.println("(0001)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, LOW);
      digitalWrite(porta+2, LOW);
      digitalWrite(porta+3, HIGH);
      break;
    case '2':
      Serial1.println("(0010)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, LOW);
      digitalWrite(porta+2, HIGH);
      digitalWrite(porta+3, LOW);
      break;
    case '3':
      Serial1.println("(0011)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, LOW);
      digitalWrite(porta+2, HIGH);
      digitalWrite(porta+3, HIGH);
      break;
    case '4':
      Serial1.println("(0100)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, HIGH);
      digitalWrite(porta+2, LOW);
      digitalWrite(porta+3, LOW);
      break;      
    case '5':
      Serial1.println("(0101)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, HIGH);
      digitalWrite(porta+2, LOW);
      digitalWrite(porta+3, HIGH);
      break;
    case '6':
      Serial1.println("(0110)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, HIGH);
      digitalWrite(porta+2, HIGH);
      digitalWrite(porta+3, LOW);
      break;
    case '7':
      Serial1.println("(0111)");
      digitalWrite(porta+0, LOW);
      digitalWrite(porta+1, HIGH);
      digitalWrite(porta+2, HIGH);
      digitalWrite(porta+3, HIGH);
      break;
    case '8':
      Serial1.println("(1000)");
      digitalWrite(porta+0, HIGH);
      digitalWrite(porta+1, LOW);
      digitalWrite(porta+2, LOW);
      digitalWrite(porta+3, LOW);
      break;
    case '9':
      Serial1.println("(1001)");
      digitalWrite(porta+0, HIGH);
      digitalWrite(porta+1, LOW);
      digitalWrite(porta+2, LOW);
      digitalWrite(porta+3, HIGH);
      break;
    default:
      //Mantem Placar
      break;      
  }
}

void loop()
{ 
  while(Serial1.available())
  {//Enquanto tiver dados na Serial1 conectada ao Bluetooth
    mensagem+=char(Serial1.read());//Armazena dados na string mensagem
  }
  if(!Serial1.available())
  {
    if(mensagem.length() - 2 == 11)//Verifica se mensagem está correta
    {//ponto computado
      Serial1.print(mensagem); //Mostra mensagem
      Serial1.print("Comprimento: "); 
      Serial1.println(mensagem.length() - 2);
      //Organização da mensagem:
      //PontosDezena  Jogador1 = mensagem[1];
      //PontosUnidade Jogador1 = mensagem[2];
      //Sets          Jogador1 = mensagem[4];
      //PontosDezena  Jogador2 = mensagem[6];
      //PontosUnidade Jogador2 = mensagem[8];
      //Sets          Jogador2 = mensagem[9];
      geraBinario(mensagem[1],2);  //portas = 2, 3, 4, 5
      geraBinario(mensagem[2],6);  //portas = 6, 7, 8, 9
      geraBinario(mensagem[4],10); //portas = 10, 11, 12, 13
      geraBinario(mensagem[6],14); //portas = 14, 15, 16, 17
      geraBinario(mensagem[8],20); //portas = 20, 21, 22, 23
      geraBinario(mensagem[9],24); //portas = 24, 25, 26, 27
      //Saque Jogador1 = mensagem[0];
      //Saque Jogador2 = mensagem[11];
      digitalWrite(28, LOW); //saque Jogador 1 porta 28
      digitalWrite(29, LOW); //saque Jogador 2 porta 29
      if (mensagem[0]=='.') {
         Serial1.println("Saque Jogador 1");
         digitalWrite(28, HIGH);} //saque Jogador 1 porta 28
      else if (mensagem[10]=='.') {
         Serial1.println("Saque Jogador 2");
         digitalWrite(29, HIGH);} //saque Jogador 2 porta 29       

      mensagem=""; //clear the data
    } 
  }
  delay(1000); //delay
}

Referências


--Evandro.cantu (discussão) 18h37min de 8 de setembro de 2017 (BRT)