Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Breadboard to PCB Part 1 - Making the Simon Says Game

Componenten en benodigdheden

Arduino UNO
× 1
Soldeerloze breadboard op ware grootte
× 1
LED (generiek)
× 4
SparkFun Drukknopschakelaar 12 mm
× 4
Zoemer
× 1
Jumperdraden (algemeen)
× 12
Weerstand 10k ohm
× 4
Weerstand 330 ohm
× 4
USB-A naar B-kabel
× 1

Apps en online services

Arduino IDE

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; Pin  functie 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.fzz

Productieproces

  1. Arduino-gyroscoopspel met MPU-6050
  2. Arduino digitale dobbelstenen
  3. DIY 37 LED Roulette Game
  4. Arduino-gamecontroller
  5. Joystick-spel
  6. Draagbare afstandsdetector
  7. Pixel Chaser-game
  8. galvaniseren met koper
  9. NeoMatrix Arduino Pong
  10. Productie 101:onderdeel worden van de lucht- en ruimtevaartindustrie
  11. Processen die betrokken zijn bij de productie van 4 gelaagde PCB's - Deel 2