Breadboard to PCB Part 1 - Making the Simon Says Game
Componenten en benodigdheden
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 4 | ||||
| × | 1 | ||||
| × | 12 | ||||
| × | 4 | ||||
| × | 4 | ||||
| × | 1 |
Apps en online services
|
Over dit project
Inleiding
We hebben allemaal het oude Simon Says-spel gezien, waarbij je een reeks lichten probeert te kopiëren door op de knop te drukken die overeenkomt met de juiste lichtreeks. Voor Hackster Live toonden we een PCB-ontwerptool genaamd Upverter. Dit is een leuk en eenvoudig project om te maken en om te zetten in een PCB. Hieronder staat het basisproject dat de creatie van het spel laat zien, compleet met hardware en code.
Deze projectreeks bestaat uit drie delen.
- Deel 1: Het Simon Says-spel maken
- Deel 2: Ontwerp een PCB op basis van het Simon Says-spel met Upverter
- Deel 3: Frees je eigen PCB van het ontwerp dat je op Upverter hebt gemaakt
Wat je leert in deze serie
- Een basisproject op een breadboard uitzetten
- Hoe maak je een printplaat in Upverter
- Hoe u uw eigen PCB kunt frezen met een CNC-machine
Software
Als je de Arduino IDE niet hebt voor het schrijven en uploaden van code naar je Arduino, download dan hier de nieuwste versie voor je besturingssysteem.
Hardware-installatie
Ik heb Sparkfun's Inventor's Kit-voorbeeld gebruikt als inspiratie voor mijn hardware-setup en heb het enigszins aangepast. Bekijk het Fritzing-diagram hieronder.
Code
Het leuke van dit spel is dat je zoveel variaties kunt hebben. Zoals ik hierboven al zei, gebruikte ik het voorbeeld van Sparkfun als uitgangspunt voor mijn hardware-installatie en schreef ik de code helemaal opnieuw. Als het schrijven van je eigen code niet iets is waarin je geïnteresseerd bent, kun je de mijne hieronder gebruiken, de code van Sparkfun gebruiken in het bovenstaande voorbeeld met een paar aanpassingen, of zoeken naar andere Simon zegt games/codes die werken met je hardware-installatie .
Ik heb gedetailleerde opmerkingen en de foutopsporing seriële afdrukregels in mijn code opgenomen, zodat je kunt zien wat er op de seriële monitor gebeurt terwijl het spel draait. Bekijk hieronder de video van het spel Simon Says in actie!
Simon Says Game Video
*Opmerking:in deze video heb ik het aantal lichten op een rij dat ik nodig had om te winnen ingesteld op 5. Dit kan worden gewijzigd om het spel moeilijker te maken, maar ik wilde mijn video relatief kort houden :).
Nu ben je klaar om van je breadboard een PCB te maken! Leer hoe in Breadboard to PCB Part 2 - Een PCB ontwerpen met Upverter.
Code
- Simon zegt Arduino-code
Simon Says Arduino CodeArduino
int ledArray[] ={12, 9, 5, 2};// ledArray[0] is groen, ledArray[1] is rood, ledArray[2] is geel en ledArray[3] is blauw. int buttonArray[] ={13, 10, 6, 3};// buttonArray[0] is groen, buttonArray[1] is rood, buttonArray[2] is geel en buttonArray[3] is blauw. int pinCount =4; // zowel ledArray als buttonArray hebben dezelfde pinCount --> gebruik dit voor zowel knoppen als leds int buzzer =8; int ledState =0; int gameState =0; #define NUMBERTOWIN 5 //Aantal lichten dat je moet matchen om te winnen --> Je kunt dit aantal wijzigen om het spel meer of minder uitdagend te maken om te winnen int gameValues[NUMBERTOWIN]; int roundNum =0; unsigned lange vorigeMillis =0; // heb dit nodig voor pre-game status voor knipperende lichten zonder vertraging --> als u vertraging gebruikt, wordt uw druk op de knop om het spel te starten mogelijk niet opgemerkt unsigned long interval1 =500; // heb dit nodig voor de tijd tussen de knipperingen // declare functionsvoid setLed (int ledNum); void displayClue (int roundNum); boolean waitForInput (int buttonNum); void setup () {Serial.begin(9600);Serial.println("setup"); for (int Pin =0; Pinfunctie setLed() stelt dat als ledNum <0 is, led LAAG is setLed(-1); // zet het ronde nummer op nul zodat je begint bij de eerste ronde roundNum =0; vertraging (1000); // zet gameState op 1 gameState =1; } } if (gameState ==1) { gamePlay(); } if (gameState ==2) { //Je wint!! - speel het winnende geluid en blader door leds (winDisplay) 3 keer gevolgd door een keer het display verliezen voor een goede overgang. //vertraging om de speler de tijd te geven om de knop los te laten voordat hij wint. Geluid speelt vertraging (500); winnend_geluid(); winDisplay(); winDisplay(); winDisplay(); losDisplay(); Serial.println("winDisplay"); //vertraging kort voordat pre_game delay (1000) wordt uitgevoerd; // reset gameState naar nul om pre_game gameState =0 te bellen; } if (gameState ==3) { // Je verliest :( - speel geluid en flits-leds (loseDisplay) 3 keer voor een goede overgang. // vertraging om de speler de tijd te geven om de knop los te laten voordat hij het geluid verliest, speelt vertraging (500); losing_sound(); lossDisplay(); lossDisplay(); lossDisplay(); Serial.println("loseDisplay"); //vertraging kort voordat pre_game delay (1000) wordt uitgevoerd; // reset gameState naar nul om pre_game gameState =0 te bellen; } }//pre_gamevoid pre_game(){ //Controleer of er voldoende tijd is verstreken tussen de leds die oplichten zonder teken lang currentMillis =millis(); if (currentMillis - previousMillis> interval1) { //if er is voldoende tijd verstreken update brandt als ( ledState ==0) {Serial.println("pre green"); setLed(0); ledState =1;} else if (ledState ==1) {Serial.println("pre red"); setLed(1); ledState =2; } else if (ledState ==2) { Serial.println("pre yellow"); setLed(2); ledState =3; } else if (ledState ==3) { Serial.println("pre blue "); setLed (3); ledState =0; } // reset tijd previousMillis =currentMillis; }}//function for while game is playingvoid gamePlay(){ Serial.println("gamePlay"); // pre-load array met willekeurige getallen voor spel voor (int i=0; i als er op een knop wordt gedrukt, ga naar de rest van de code if (!button0 || !button1 || !button2 || !button3) { // Stel kort uit om dubbel tellen te voorkomen 250); // licht de corresponderende led op wanneer een knop wordt ingedrukt if (buttonNum ==0) { digitalWrite (ledArray [0], HIGH); vertraging (250); digitalWrite(ledArray[0], LAAG); } else if (buttonNum ==1) { digitalWrite (ledArray [1], HIGH); vertraging (250); digitalWrite(ledArray[1], LAAG); } else if (buttonNum ==2) { digitalWrite(ledArray[2], HIGH); vertraging (250); digitalWrite(ledArray[2], LAAG); } else if (buttonNum ==3) { digitalWrite(ledArray[3], HIGH); vertraging (250); digitalWrite(ledArray[3], LAAG); } // controleer of de juiste knop is ingedrukt if (buttonNum ==0 &&button0 ==0) { Serial.println ("0 Pressed"); retourneer waar; } else if (buttonNum ==1 &&button1 ==0) { Serial.println ("1 Pressed"); retourneer waar; } else if (buttonNum ==2 &&button2 ==0) { Serial.println ("2 Pressed"); retourneer waar; } else if (buttonNum ==3 &&button3 ==0) { Serial.println ("3 Pressed"); retourneer waar; } else { return false; } } }}//after win - laat de lichten snel scrollenvoid winDisplay(){digitalWrite(ledArray[0], HIGH);delay(75);digitalWrite(ledArray[0], LOW);delay(75);digitalWrite(ledArray [1], HOOG);vertraging(75);digitalWrite(ledArray[1], LAAG);vertraging(75);digitalWrite(ledArray[2], HOOG);vertraging(75);digitalWrite(ledArray[2], LAAG );delay(75);digitalWrite(ledArray[3], HIGH);delay(75);digitalWrite(ledArray[3], LOW);delay(75);digitalWrite(ledArray[2], HIGH);vertraging(75 );digitalWrite(ledArray[2], LOW);delay(75);digitalWrite(ledArray[1], HIGH);delay(75);digitalWrite(ledArray[1], LOW);delay(75);digitalWrite(ledArray [0], HIGH);delay(75);digitalWrite(ledArray[0], LOW);delay(75);}void winning_sound(void){ //tone (pinnummer, frequentie - ik heb dit online opgezocht om te vinden de frequentie voor de noten die ik wilde, de duur van de melodie) Serial.println("buzzer1"); toon (zoemer, 294, 250); vertraging (200); toon (zoemer, 294, 250); vertraging (200); toon (zoemer, 294, 250); vertraging (200); toon (zoemer, 392, 500); vertraging (500); Serial.println("tweede 392"); toon (zoemer, 392, 250); vertraging (200); toon (zoemer, 440, 250); vertraging (200); toon (zoemer, 392, 250); vertraging (200); toon (zoemer, 440, 250); vertraging (200); tone(zoemer, 494, 500);}void looseDisplay(){ digitalWrite(ledArray[0], HIGH); digitalWrite(ledArray[1], HOOG); digitalWrite(ledArray[2], HOOG); digitalWrite(ledArray[3], HOOG); vertraging (200); digitalWrite(ledArray[0], LAAG); digitalWrite(ledArray[1], LAAG); digitalWrite(ledArray[2], LAAG); digitalWrite(ledArray[3], LAAG); delay(200);}void losing_sound(void){ Serial.println("losing_sound"); toon (zoemer, 98, 250); vertraging (250); toon (zoemer, 93, 250); vertraging (250); toon (zoemer, 87, 250); vertraging(250);}
Schema's
simon_says_fritzing_Yb8EdKPqD4.fzzProductieproces
- Arduino-gyroscoopspel met MPU-6050
- Arduino digitale dobbelstenen
- DIY 37 LED Roulette Game
- Arduino-gamecontroller
- Joystick-spel
- Draagbare afstandsdetector
- Pixel Chaser-game
- galvaniseren met koper
- NeoMatrix Arduino Pong
- Productie 101:onderdeel worden van de lucht- en ruimtevaartindustrie
- Processen die betrokken zijn bij de productie van 4 gelaagde PCB's - Deel 2