Hacking Genuis II - Software
Bom, vamos à parte "soft" da coisa, agora... nem foi muito difícil nada.
Adotando a abordagem desenvolvida por Jack, primeiro testei os botões. Para isso, nada como um "pograminha" específico.
De novo, uma aplicação específica foi usada:
Por fim, juntando tudo, eis o programa completo, que chamei de GeniusFighter:
É isso! O programa nem é tão complicado, e eu comentei de maneira que me pareceu didática. Não foi um projeto assim... xuxu beleza??? :) Abracadabraço, até a próxima.
Adotando a abordagem desenvolvida por Jack, primeiro testei os botões. Para isso, nada como um "pograminha" específico.
// Define button pins in Arduino #define bBlue 7 #define bRed 8 #define bGreen 9 #define bYellow 10 void setup() { Serial.begin(9600); // define pins as outputs pinMode(bBlue,OUTPUT); pinMode(bYellow,OUTPUT); pinMode(bGreen,OUTPUT); pinMode(bRed,OUTPUT); } void loop() { // wait for a key pressed while(!Serial.available()); // read key char c=Serial.read(); // empty serial buffer while(Serial.available()) Serial.read(); // Depending on the key sent, the software "press" the corresponding button switch(c) { case 'B': digitalWrite(bBlue,HIGH); delay(500); digitalWrite(bBlue,LOW); break; case 'Y': digitalWrite(bYellow,HIGH); delay(500); digitalWrite(bYellow,LOW); break; case 'G': digitalWrite(bGreen,HIGH); delay(500); digitalWrite(bGreen,LOW); break; case 'R': digitalWrite(bRed,HIGH); delay(500); digitalWrite(bRed,LOW); break; } }Tão logo essa aplicação acima funcionou, parti prá próxima etapa, que era perceber o acendimento das lâmpadas, que eu sabia seria um pouco mais complicado.
De novo, uma aplicação específica foi usada:
// Analogic pins #define lBlue 0 #define lRed 1 #define lGreen 2 #define lYellow 3 int lampSignal = 0; void setup() { Serial.begin(9600); } void loop() { lampSignal=analogRead(lBlue); if(lampSignal<200) Serial.println("Blue"); lampSignal=analogRead(lYellow); if(lampSignal<200) Serial.println("Yellow"); lampSignal=analogRead(lRed); if(lampSignal<200) Serial.println("Red"); lampSignal=analogRead(lGreen); if(lampSignal<200) Serial.println("Green"); delay(200); }Como tinha que perceber a variação do sinal, que começava em +/- 3V (leitura de 600 no Arduino) e quando o botão era pressionado caía, fui ajustando o valor até chegar em 200. No fim acho que usei 250, mas de toda forma o programa acima mostrava na tela exatamente a cor que eu ou o Genius "apertávamos".
Por fim, juntando tudo, eis o programa completo, que chamei de GeniusFighter:
// Program states #define stWait 0 #define stListening 1 #define stPlaying 2 // Arduino Genius // Analog port Connector number - "see" color #define blue 0 // 4 #define red 1 // 7 #define green 2 // 14 #define yellow 3 // 17 // Arduino digital port - "press" button #define pBlue 3 #define pRed 4 #define pGreen 5 #define pYellow 6 // Wait time to accept keypressed #define lThreshold 200 // Max number of rounds in a game #define maxRounds 128 int currentRound = 0; long timeInterval = 350; int status = stWait; String colors[] = {"Blue","Red","Green","Yellow"}; byte sequence[maxRounds]; void clearSequence() { for(int i=0; i<maxRounds;i++) sequence[i]=0; } // Check for a selected color, returning it in that case int selectedColor() { int i; for(i=blue;i<=yellow;i++) if(analogRead(i)<lThreshold) break; if(i<=yellow) { while(analogRead(i)<lThreshold) delay(50); return i; } else { delay(50); return -1; } } // Wait until a color is pressed int waitForColor() { int color=-1; while(color==-1) color=selectedColor(); return color; } // Listen the game, storing the color sequence void listen() { currentRound++; // int timeInterval=millis(); for(int i=0;i<currentRound;i++) { sequence[i]=waitForColor(); Serial.print(colors[sequence[i]]); if(i<(currentRound-1)) Serial.print(','); if(((i+1) % 10) == 0) Serial.println(); } Serial.println(); // timeInterval=(millis()-timeInterval) / currentRound; // Serial.println(timeInterval); } // Press a button corresponding to a color void pressColor(int color) { digitalWrite(color+3,HIGH); // 3 is the color pins offset: pBlue = 7 delay(250); digitalWrite(color+3,LOW); delay(50); } // Play the stores sequence void play() { for(int i=0;i<currentRound;i++) pressColor(sequence[i]); } void setup() { Serial.begin(57600); pinMode(pBlue,OUTPUT); pinMode(pYellow,OUTPUT); pinMode(pGreen,OUTPUT); pinMode(pRed,OUTPUT); } void loop() { // "Just" switch between states, processing each one switch(status) { case stWait: currentRound=0; Serial.println("Waiting game start..."); sequence[currentRound]=waitForColor(); currentRound++; status=stPlaying; break; case stListening: Serial.println("Listening..."); listen(); status=stPlaying; break; case stPlaying: delay(500); Serial.print("Playing "); Serial.print(currentRound); Serial.println(" colors..."); play(); status=stListening; break; } }
É isso! O programa nem é tão complicado, e eu comentei de maneira que me pareceu didática. Não foi um projeto assim... xuxu beleza??? :) Abracadabraço, até a próxima.
Oi Mauro!
ResponderExcluiro Fábio Santos do HackerSpace SJC me passou o link pra essa sua página. Show o projetinho que você montou aqui. Só faltou contar se o genius chega a um fim, ou se ele e o arduino ficam brincando eternamente. :)
Abs !
Atanaí
Rere... obrigado, que bom que vc gostou.
ExcluirAcho que no filminho que eu coloquei no outro post tem o jogo até o final, veja lá. De toda forma, no nível mais difícil, o jogo vai no máximo até 32 tons, o que significa que o Arduino sempre ganha mole...
[],
Mauro