Placar Eletrônico para Tênis de Mesa: mudanças entre as edições
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