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
Linha 49: Linha 49:


[[Arquivo:PlacarTenisMesa.png]]
[[Arquivo:PlacarTenisMesa.png]]
==Software para Arduíno===
<source lang="c">
String message; //string that stores the incoming message
void setup()
{
  Serial1.begin(9600); //set baud rate
}
void geraBinario(char caractere, int portaBase)
{
  switch (caractere) {
    case '0':
      Serial1.println("(0000)");
      digitalWrite(portaBase, LOW);
      digitalWrite(portaBase + 1, LOW);
      digitalWrite(portaBase + 2, LOW);
      digitalWrite(portaBase + 3, LOW);
      break;
    case '1':
      Serial1.println("(0001)");
      digitalWrite(portaBase, LOW);
      digitalWrite(portaBase + 1, LOW);
      digitalWrite(portaBase + 2, LOW);
      digitalWrite(portaBase + 3, HIGH);
      break;
    case '2':
      Serial1.println("(0010)");
      digitalWrite(portaBase+0, LOW);
      digitalWrite(portaBase+1, LOW);
      digitalWrite(portaBase+2, HIGH);
      digitalWrite(portaBase+3, LOW);
      break;
    case '3':
      Serial1.println("(0011)");
      digitalWrite(portaBase+0, LOW);
      digitalWrite(portaBase+1, LOW);
      digitalWrite(portaBase+2, HIGH);
      digitalWrite(portaBase+3, HIGH);
      break;
    case '4':
      Serial1.println("(0100)");
      digitalWrite(portaBase+0, LOW);
      digitalWrite(portaBase+1, HIGH);
      digitalWrite(portaBase+2, LOW);
      digitalWrite(portaBase+3, LOW);
      break;     
    case '5':
      Serial1.println("(0101)");
      digitalWrite(portaBase+0, LOW);
      digitalWrite(portaBase+1, HIGH);
      digitalWrite(portaBase+2, LOW);
      digitalWrite(portaBase+3, HIGH);
      break;
    case '6':
      Serial1.println("(0110)");
      digitalWrite(portaBase+0, LOW);
      digitalWrite(portaBase+1, HIGH);
      digitalWrite(portaBase+2, HIGH);
      digitalWrite(portaBase+3, LOW);
      break;
    case '7':
      Serial1.println("(0111)");
      digitalWrite(portaBase+0, LOW);
      digitalWrite(portaBase+1, HIGH);
      digitalWrite(portaBase+2, HIGH);
      digitalWrite(portaBase+3, HIGH);
      break;
    case '8':
      Serial1.println("(1000)");
      digitalWrite(portaBase+0, HIGH);
      digitalWrite(portaBase+1, LOW);
      digitalWrite(portaBase+2, LOW);
      digitalWrite(portaBase+3, LOW);
      break;
    case '9':
      Serial1.println("(1001)");
      digitalWrite(portaBase+0, HIGH);
      digitalWrite(portaBase+1, LOW);
      digitalWrite(portaBase+2, LOW);
      digitalWrite(portaBase+3, HIGH);
      break;
    default:
      //Mantem Placar
      break;     
  }
}
void loop()
{
  while(Serial1.available())
  {//while there is data available on the serial monitor
    message+=char(Serial1.read());//store string from serial command
  }
  if(!Serial1.available())
  {
    if(message.length() - 2 == 11)
    {//ponto computado
      Serial1.print(message); //show the data
      Serial1.print("Comprimento: ");
      Serial1.println(message.length() - 2);
      //PontosDezena  Jogador1 = message[1];
      //PontosUnidade Jogador1 = message[2];
      //Sets          Jogador1 = message[4];
      //PontosDezena  Jogador2 = message[6];
      //PontosUnidade Jogador2 = message[8];
      //Sets          Jogador2 = message[9];
      geraBinario(message[1],2);  //portas = 2, 3, 4, 5
      geraBinario(message[2],6);  //portas = 6, 7, 8, 9
      geraBinario(message[4],10); //portas = 10, 11, 12, 13
      geraBinario(message[6],14); //portas = 14, 15, 16, 17
      geraBinario(message[8],20); //portas = 20, 21, 22, 23
      geraBinario(message[9],24); //portas = 24, 25, 26, 27
     
      //Saque Jogador1 = message[0];
      //Saque Jogador2 = message[11];
      digitalWrite(29, LOW); //saque Jogador 1 porta 29
      digitalWrite(30, LOW); //saque Jogador 2 porta 30
      if (message[0]=='.') {
        Serial1.println("Saque Jogador 1");
        digitalWrite(29, HIGH);} //saque Jogador 1 porta 29
      else if (message[10]=='.') {
        Serial1.println("Saque Jogador 2");
        digitalWrite(30, HIGH);} //saque Jogador 2 porta 30     
      message=""; //clear the data
    }
  }
  delay(1000); //delay
}
</source>


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

Edição das 14h54min de 7 de setembro de 2017

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)
  • Vitor Matheus de Souza Baldacin (CST Análise e Desenvolvimento de Sistemas)

Especificação prévia do sistema

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.

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 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.

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

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.

Hardware do placar eletrônico

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

Exemplo de projeto com 4511: Arduino e display 7 segmentos

Software para Arduíno=

String message; //string that stores the incoming message

void setup()
{
  Serial1.begin(9600); //set baud rate
}

void geraBinario(char caractere, int portaBase)
{
   switch (caractere) {
    case '0':
      Serial1.println("(0000)");
      digitalWrite(portaBase, LOW);
      digitalWrite(portaBase + 1, LOW);
      digitalWrite(portaBase + 2, LOW);
      digitalWrite(portaBase + 3, LOW);
      break;
     case '1':
      Serial1.println("(0001)");
      digitalWrite(portaBase, LOW);
      digitalWrite(portaBase + 1, LOW);
      digitalWrite(portaBase + 2, LOW);
      digitalWrite(portaBase + 3, HIGH);
      break;
    case '2':
      Serial1.println("(0010)");
      digitalWrite(portaBase+0, LOW);
      digitalWrite(portaBase+1, LOW);
      digitalWrite(portaBase+2, HIGH);
      digitalWrite(portaBase+3, LOW);
      break;
    case '3':
      Serial1.println("(0011)");
      digitalWrite(portaBase+0, LOW);
      digitalWrite(portaBase+1, LOW);
      digitalWrite(portaBase+2, HIGH);
      digitalWrite(portaBase+3, HIGH);
      break;
    case '4':
      Serial1.println("(0100)");
      digitalWrite(portaBase+0, LOW);
      digitalWrite(portaBase+1, HIGH);
      digitalWrite(portaBase+2, LOW);
      digitalWrite(portaBase+3, LOW);
      break;      
    case '5':
      Serial1.println("(0101)");
      digitalWrite(portaBase+0, LOW);
      digitalWrite(portaBase+1, HIGH);
      digitalWrite(portaBase+2, LOW);
      digitalWrite(portaBase+3, HIGH);
      break;
    case '6':
      Serial1.println("(0110)");
      digitalWrite(portaBase+0, LOW);
      digitalWrite(portaBase+1, HIGH);
      digitalWrite(portaBase+2, HIGH);
      digitalWrite(portaBase+3, LOW);
      break;
    case '7':
      Serial1.println("(0111)");
      digitalWrite(portaBase+0, LOW);
      digitalWrite(portaBase+1, HIGH);
      digitalWrite(portaBase+2, HIGH);
      digitalWrite(portaBase+3, HIGH);
      break;
    case '8':
      Serial1.println("(1000)");
      digitalWrite(portaBase+0, HIGH);
      digitalWrite(portaBase+1, LOW);
      digitalWrite(portaBase+2, LOW);
      digitalWrite(portaBase+3, LOW);
      break;
    case '9':
      Serial1.println("(1001)");
      digitalWrite(portaBase+0, HIGH);
      digitalWrite(portaBase+1, LOW);
      digitalWrite(portaBase+2, LOW);
      digitalWrite(portaBase+3, HIGH);
      break;
    default:
      //Mantem Placar
      break;      
  }
}

void loop()
{ 
  while(Serial1.available())
  {//while there is data available on the serial monitor
    message+=char(Serial1.read());//store string from serial command
  }
  if(!Serial1.available())
  {
    if(message.length() - 2 == 11)
    {//ponto computado
      Serial1.print(message); //show the data
      Serial1.print("Comprimento: "); 
      Serial1.println(message.length() - 2);
      //PontosDezena  Jogador1 = message[1];
      //PontosUnidade Jogador1 = message[2];
      //Sets          Jogador1 = message[4];
      //PontosDezena  Jogador2 = message[6];
      //PontosUnidade Jogador2 = message[8];
      //Sets          Jogador2 = message[9];
      geraBinario(message[1],2);  //portas = 2, 3, 4, 5
      geraBinario(message[2],6);  //portas = 6, 7, 8, 9
      geraBinario(message[4],10); //portas = 10, 11, 12, 13
      geraBinario(message[6],14); //portas = 14, 15, 16, 17
      geraBinario(message[8],20); //portas = 20, 21, 22, 23
      geraBinario(message[9],24); //portas = 24, 25, 26, 27
      
      //Saque Jogador1 = message[0];
      //Saque Jogador2 = message[11];
      digitalWrite(29, LOW); //saque Jogador 1 porta 29
      digitalWrite(30, LOW); //saque Jogador 2 porta 30
      if (message[0]=='.') {
         Serial1.println("Saque Jogador 1");
         digitalWrite(29, HIGH);} //saque Jogador 1 porta 29
      else if (message[10]=='.') {
         Serial1.println("Saque Jogador 2");
         digitalWrite(30, HIGH);} //saque Jogador 2 porta 30       

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

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 ca 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.

Comunicação Serial via Bluetooth

Pinagem e conexão com o Arduíno

Este módulo apresenta 6 pinos, mas com apenas 4 pinos é possível colocar o mesmo para funcionar e fazer o Arduíno interagir dispositivos Bluetooth.

            _________
           |         |
           |         |
           |         |
           |Bleutooth|
           |         |
           |   HC06  |
           |         |
           |         |
           |_________|
             | | | |
     Vcc ----+ | | +---- Txd
     Gnd ------+ +------ Rxd

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) deve-se utilizar a Serial1, Serial2 ou Serial3.

Referências