Western

Gabriel Santini Quibao 0040961413013 Gabriel Felipe de Paula 0040961523042 Willian Cruz Arana 0040961523013 Narciso Junior 0040961313030
 * Grupo: **

**Dispositivo:** Arduino Uno


 * Projeto Western **

Um jogo que simula um duelo de Faroeste. Uma música de suspense toca, criando um momento de tensão entre os jogadores, ao fim da música, ambos os jogadores devem apertar um botão. O primeiro a apertar, vence a partida. Duas bases com 3 desenhos cada (personagem esperando, personagem atirando e personagem morto) são presas a um servo motor que, ao apertar, o botão gira a base para mostrar a arte que indica a situação do jogador.
 * Resumo: **


 * Software/materiais utilizados: **


 * IDE do arduino
 * Bibliotecas disponíveis em Bibliotecas para arduino
 * Classes desenvolvidas para este projeto
 * 2 Servos
 * 3 Botões (Player 1, Player 2 e Reset)
 * LEDs
 * Peso Elétrico

**Metodologia** O jogo utiliza dois motores Servos e cada um apresenta a arte de um personagem. Dois botões (controles do jogo). Quando o Arduino é ligado, inicia-se a música do filme "The Good, The Bad and The Ugly", que pode tocar uma vez só, ou repetir uma vez. Ao fim da música, os botões devem ser pressionados, isso faz com que os servos se movam. O jogador que pressionou mais rápido, faz com que o servo com seu personagem vire para a imagem dele atirando, o mais lento, vira para a imagem do personagem morto.

**Desenvolvimento** A maior dificuldade no desenvolvimento deste projeto foi com relação a música. Devido ao fato de nenhum membro do grupo ter muito conhecimento musical, tivemos que estudar partituras e frequencias para fazer a música da forma mais fiel possível. Para solucionar o problema, criamos uma pequena biblioteca de notas e suas variações a partir desses estudos. Demoramos também para conseguir chegar no conceito do projeto final, passamos por várias idéias porém encontrando diversos empecilhos, este projeto foi uma solução criativa para utilizar as ferramentas que estavam disponíveis para nós para desenvolver um pequeno jogo.


 * Código Fonte **

code format="c"
 * 1) include 


 * 1) define ledPin 13      //led for visualization (use 13 for built-in led)


 * 1) define speakerPin 9  //speaker connected to one of the PWM ports


 * 1) define servoPin1 5 // Servo -- fio vermelho 5v -- marron GND -- laranja pino de controle
 * 2) define servoPin2 6

//Button
 * 1) define btnPin1 7
 * 2) define btnPin2 8
 * 3) define btnPin3 3

// Figuras musicais
 * 1) define rp 480 // timeInMilliseconds
 * 2) define breve       (rp * 8)
 * 3) define semibreve   (rp * 4)
 * 4) define minima      (rp * 2)
 * 5) define seminima     rp
 * 6) define colcheia    (rp * ((float) 1/2))
 * 7) define semicolcheia (rp * ((float) 1/4))
 * 8) define fusa        (rp * ((float) 1/8))
 * 9) define semifusa    (rp * ((float) 1/16))

// Notas
 * 1) define b4 494 // SI  4
 * 2) define e5 659 // MI  5
 * 3) define g4 392 // SOL 4
 * 4) define a4 440 // LA  4
 * 5) define e4 330 // MI  4
 * 6) define d5 587 // RE  5
 * 7) define fSH4 370 // FA# 4
 * 8) define d4 294 // RE 4

Servo s1, s2;

void beep ( int frequencyInHertz, long timeInMilliseconds) {   digitalWrite(ledPin, HIGH); //use led to visualize the notes being played long delayAmount = (long)(1000000/frequencyInHertz); long loopTime = (long)((timeInMilliseconds*1000)/(delayAmount*2));

for (int i = 0; i < loopTime; i++) {       digitalWrite(speakerPin,HIGH); delayMicroseconds(delayAmount); digitalWrite(speakerPin,LOW); delayMicroseconds(delayAmount); }

digitalWrite(ledPin, LOW); //set led back to low delay(20); //a little delay to make all notes sound separate }

bool musica(bool IsMusica) {   int RandNumber = random ( 1, 3);

for(int i = 1; i <= RandNumber; i++) {     delay(colcheia); //1     beep( b4 * i, semicolcheia); beep( e5 * i, semicolcheia); beep( b4 * i, semicolcheia); beep( e5 * i, semicolcheia); beep( b4 * i, minima); // 2     beep( g4 * i, seminima); beep( a4 * i, seminima); beep( e4 * i, seminima * 3);

delay(colcheia);

// 3     beep( b4 * i, semicolcheia); beep( e5 * i, semicolcheia); beep( b4 * i, semicolcheia); beep( e5 * i, semicolcheia); beep( b4 * i, minima); // 4     beep( g4 * i, seminima); beep( a4 * i, seminima); beep( d5 * i, seminima * 3 );

if(RandNumber == 3 && i == 3) break;

delay(fusa); // 5     beep( b4 * i, semicolcheia); beep( e5 * i, semicolcheia); beep( b4 * i, semicolcheia); beep( e5 * i, semicolcheia); beep( b4 * i, minima); // 6     beep( g4 * i, seminima); beep( fSH4 * i, semicolcheia); beep( e4 * i, semicolcheia ); beep( d4 * i, seminima * 3);

delay(colcheia); //7     beep( b4 * i, semicolcheia); beep( e5 * i, semicolcheia); beep( b4 * i, semicolcheia); beep( e5 * i, semicolcheia); beep( b4 * i, minima + semifusa); //8     beep( a4 * i, colcheia); beep( e4 * i, minima); //FIM

}  return false; }

char ButtonPressed {

delay(20);

if(!digitalRead(btnPin1)) {  return '1'; }

delay(20);

if(!digitalRead(btnPin2)) {  return '2'; }

return '0'; }

void setup { // OUTPUTS pinMode(ledPin, OUTPUT); pinMode(speakerPin, OUTPUT);

// INPUTS pinMode(btnPin1, INPUT_PULLUP); pinMode(btnPin2, INPUT_PULLUP); pinMode(btnPin3, INPUT_PULLUP); // start

//Servo s1.attach(servoPin1); s1.write(90);

s2.attach(servoPin2); s2.write(90);

Serial.begin(57600); // Monitor serial }

bool IsMusica = true; bool button  = false; char winner  = '0';

void loop {

if(IsMusica) {     IsMusica = musica(IsMusica);

IsMusica = false; }  else if(winner == '0') {    winner = ButtonPressed; }

if( winner == '1') {      beep( 880, colcheia); // LA 5

s1.write(180); delay(500);

s2.write(-180); delay(500);

Serial.print("Winner: Player "); Serial.println(winner);

winner = '3'; }

if(winner == '2') {      beep( 988, colcheia); // SI 5

s2.write(180); delay(500);

s1.write(-180); delay(500);

Serial.print("Winner: Player "); Serial.println(winner);

winner = '3'; }

if(!digitalRead(btnPin3)) {

s1.write(90); delay(500); s2.write(90); delay(500);

IsMusica = true; winner = '0'; }

}

code

O jogo saiu exatamente como o esperado, conseguimos implementar todas as funções que pensamos desde o início do projeto e não houveram problemas com imprevistos. No vídeo abaixo podemos ver uma demonstração do gameplay.
 * Resultados **

media type="vimeo" key="222844172" width="560" height="315"

Exemplo: **@Carritos**