Introduction: Simon Say's Light Game
Hallo!
Ik ben Steven Vis, een kunst student op het HKU in Utrecht. Ik studeer hier game art. Voor het vak "If This Than That" wou ik een kort spelletje maken, net als een arcade game; iets verslavends en simpel dus. Op het HKU hebben wij basis lessen gekregen over programeren in phyton. En ook al lijkt arduino hier erg op, was het nog steeds erg moeilijk voor mij. Mijn orginele plan was om het spel quitar hero te maken maar na het op internet op te zoeken bleek dit te moeilijk te coderen voor mij. Verder kwam ik er achter dat veel mensen die het simon say's spel hebben gemaakt. Er waren geen duidelijke toturials dus ben ik begonnen met een duitse tekst die het uitlegde. Ook vertaald bleek dit te moeilijk voor mij dus heb ik eerst alle compnenten appart uitgeprobeert. De codes en de circuits van de servo, lichtjes en de buzzer hebben mij veel geleerd. En zo snapte ik eindelijk de uitleg van andere mensen. Ik heb mijn code daarna geschreven waarbij ik nog tegen veel problemen aanliep met als grootste dat het geluid het niet doet, behalve bij de "gameover" state en het open luik dat een delay pakt uit de "start" state". Ik heb mijn eigen persoonlijke touch gegeven aan dit project en heb het veel geplaytest om de timing van alles perfect te maken.
Wat je nodig hebt voor dit project is:
- Arduino Uno
- Buzzer (Piezo small)
- Potentiometer
- Micro server
- Pushbutton x 4
- LED x 4 (het liefst 4 verschillende kleuren)
- Resistor 220 ohm x 4
- Resistor 1 x 4
- Breadboard wires (het liefst in verschillende kleuren)
Voor de doos heb ik gebruikt:
- 1 dun plankje verwerkt hout
- een lasercutter
- houtlijm
Attachments
Step 1: Testen in 123D Circuits
Als eerste ben ik begonnen met 123D Circuits hierin begon ik met 4 pushbuttons, 4 resistors 1's, 4 Resistor 220 ohm en 4 LEDs, ik koppelde toen de cathode van de LEDs met een resistor. Het andere einde van de resistor is gekoppeld aan een de ground. De anode zit aan een Arduino Digital Pin. Ik deed ongeveer hetzelfde met onze pushbuttons; we koppelen de terminal 21 met een resistor. het andere einde van de resistor is gekoppeld aan een de ground. Verder koppelen we terminal 21 ook met een Arduino Digital Pin. Terminal 12 gaat naar de 5 Volt.
Hierna ben ik aan de code gaan werken.
Step 2: Code
Voor de setup staat 2 arrays, 1 voor de Arduino Digital Pins van de knoppen en 1 van de Arduino Digital Pins van de LEDs. Ronde zijn de lichtjes die je ziet knipperen die je daarna na moet doen met de knoppen en RondeLengte geeft aan hoe veel lichtjes je na moet doen. De start, Play en GameOver state geven aan in welke GameStatus de game op dat moment is. De Nu en Toen Tijd worden gebruikt om te checken of de speler de knoppen op tijd indrukt.
<p>int Knoppen[] = {3, 5, 7, 9};<br>int Lichten[] = {2, 4, 6, 8};</p><p>int Ronde[100];</p><p>int RondeLengte = 0;</p><p>const int START = 0; const int PLAY = 1; const int GAMEOVER = 2;</p><p>int GameStatus;</p><p>long NuTijd = 0; long ToenTijd = 0;</p>
De void Setup Zorgt voor de LED outputs en de Button Inputs. Dit word uitgevoerd wanner de arduino opstart. Daarna zet het de game status op start.
<p>void setup() { </p><p> for(int pin=0; pin<4; pin++) { pinMode(Lichten[pin], OUTPUT); } for(int pin=0; pin<4; pin++) { pinMode(Knoppen[pin], INPUT); }</p><p> GameStatus = START; randomSeed(analogRead(40)); }</p>
De Void Loop roept de functies uit die moeten worden gebruikt voor elke game status
<p>void loop() { </p><p> if(GameStatus == START) { WachtopStart(); } else if(GameStatus == PLAY) { ZieRonde(); LeesRonde(); } else if(GameStatus == GAMEOVER) { AllKnipper(3); GameStatus = START; } }</p>
De WachtopStart laat alle LEDs 1 voor 1 zien tot er op een knop word gedrukt. hij doet een LED aan wacht op een knop die mischien word ingedrukt en doet de LED uit. Wanneer een knop is ingedrukt verandert de game status naar Play.
<p>void WachtopStart()<br>{ int KnopIngedrukt = -1; allOff(); for(int pin = 0; pin < 4; pin++) { if(KnopIngedrukt == -1) { digitalWrite(Lichten[pin], HIGH); KnopIngedrukt = WachtopKnop(80); digitalWrite(Lichten[pin], LOW); } } if(KnopIngedrukt != -1) { delay(800); RondeLengte = 0; GameStatus = PLAY; } }</p>
De WachtopKnop geeft terug welke knop is ingedrukt(0, 1, 2 of 3) of -1 als geen knop is ingedrukt in een bepaalde tijd. Wanneer de knop terug op komt leest hij hem als dit binnen de tijd is(delay)
<p>int WachtopKnop(int delay)<br>{ int KnopIngedrukt = -1; int input; boolean buttonBackUp = false;</p><p> NuTijd = millis(); ToenTijd = NuTijd; while (NuTijd - ToenTijd < delay & buttonBackUp == false) { for(int pin = 0; pin < 4 & buttonBackUp == false; pin++) { if(digitalRead(Knoppen[pin]) == HIGH) { KnopIngedrukt = pin; digitalWrite(Lichten[pin], HIGH); while (NuTijd - ToenTijd < delay & buttonBackUp == false) { input = digitalRead(Knoppen[pin]); if(input == LOW) { buttonBackUp = true; } NuTijd = millis(); } digitalWrite(Lichten[pin], LOW); if(NuTijd - ToenTijd > delay) { KnopIngedrukt = -1; } } } NuTijd = millis(); } return KnopIngedrukt; }</p>
De ZieRonde maakt de RondeLengte langer en laat de de hele ronde zien.
<p>void ZieRonde()<br>{ Ronde[RondeLengte] = random(0,4); RondeLengte++; for(int index=0; index <RondeLengte; index++)</p><p>{</p><p> delay(300); digitalWrite(Lichten[Ronde[index]], HIGH); delay(700); digitalWrite(Lichten[Ronde[index]], LOW); } }</p>
De LeesRonde wacht voor de speler om de Ronde na te doen. als de speler iets fout doet zet deze fucntie de game status naar gameover.
<p>void LeesRonde()<br>{ int WelkeKnop; boolean madeMistake = false; for(int index=0; index< RondeLengte & madeMistake == false; index++)</p><p>{</p><p> WelkeKnop = WachtopKnop(2500); // 0, 1, 2, or 3 if(WelkeKnop == -1 | WelkeKnop != Ronde[index]) { madeMistake = true; // Exit the loop. GameStatus = GAMEOVER; } } }</p>
De AllKnipper Knippert de LEDs, de allOff doet alle LED's uit en de allOn doet alle LED's aan
<p>void AllKnipper(int Keren)<br>{ for(int Tel = 0; Tel < Keren; Tel++) { allOn(); delay(300); allOff(); delay(300); } }</p><p>void allOff() { for(int pin = 0; pin < 4; pin++) { digitalWrite(Lichten[pin], LOW); } }</p><p>void allOn() { for(int pin = 0; pin < 4; pin++) { digitalWrite(Lichten[pin], HIGH); } }</p>
Hierna begon ik met het bouwen van mij Arduino spel
Attachments
Step 3: Testen En Bouwen Van Mijn Arduino Spel
Dit is de fase waarin ik Mijn spel echt ging bouwen en zo duidelijk kon zien of het werkte en wat ik moest later moest solderen. Verder heb ik hier 2 onderdelen aan mijn Arduino project toegevoegd om zo meer gebruik te maken van mij starters pakket. Als eerste een buzzer voor het spel:
Voor de setup bind ik deze vast aan pin 12.
int piezoPin = 12;
Hierna heb ik in de GameOver status bij het knipperen, tonen toegevoegd.
<p>void AllKnipper(int Keren)<br>{ for(int Tel = 0; Tel < Keren; Tel++) { allOn(); tone(piezoPin, 1000, 500); delay(300); allOff(); tone(piezoPin, 300, 500); delay(300); } }</p>
Verder heb ik een servo toegevoeg bestuurbaar door een draaiknop:
Voor de setup heb ik mijn servo toegevoegd en de draaiknop op Analog 0 gezet.
<p>#include <Servo.h><br></p><p>Servo DekselServo;</p><p>int DraaiknopPin = 0; int DraaiknopPos;</p>
Hierna heb ik de deksel servo in de setup gekoppeld aan pin 10.
<p>DekselServo.attach(10);</p>
De loop zorgt er verder voor dat de draaiknop de servo bestuurd
<p>DraaiknopPos = analogRead(DraaiknopPin); <br>DraaiknopPos = map(DraaiknopPos, 0, 1023, 64, 154); DekselServo.write(DraaiknopPos); delay(0);</p>
Hierna ben ik verder gegaan met het bouwen van mij houten doos
Step 4: Het Bouwen Van Mijn Doos
Als eerst heb ik op photoshop een bestand gemaakt met de goeie afmetingen voor het doosje van mijn arduino spel. Later heb ik dit over gezet naar een illustrator bestand en ik heb de lasercutter in de makerspace gebruikt om mijn doos uit te snijden. Verder heb ik in houtbewerking wat gaten geboord en alles aan elkaar gelijmd. Voor het solderen heb ik gaten gemaakt in de bovenkant onder het deksel zodat hier mijn onderdelen uit konden komen. Deze bovenste plank kan ik er uit halen wanneer ik wil zodat ik er makkelijk mee kan solderen.
Hierna ben ik gaan solderen.
Step 5: Solderen
Als eerst heb ik een cursus gehad in het solderen over een klein circuitje. ik had nu de kennis om zelf wat te maken. Alleen niet de tijd, in een paar uurtjes heb ik zo slordig als maar kan alles op zen plek gesoldeerd in de hoop dat alles goed zat. en gellukig alles werkt. Ik kon de arduino makkelijk in de doos doenen vast maken aan de draaiknop die in de doos is geinstaleert. De arduino kon ik door een gat in de achterkant aansluiten aan stroom.
Ik ben erg blij met mijn project en ook al heeft het een paar bugs, heeft het me alsnog veel geleerd.