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

Whac-A-Mole (Button Edition)

Componenten en benodigdheden

Arduino Mega 2560
× 1
Adafruit 1.4" 4-cijferig 7-segments display met I2C-rugzak
Kies de gewenste kleur
× 2
Adafruit Grote arcade-knop met led (60 mm)
Kies 5 verschillende kleuren
× 5
Adafruit Audio fx-bord 16 MB
× 1
Adafruit 2,5w versterker
× 2
Luidspreker:3W, 4 ohm
× 2
Adafruit aan/uit-knop met led
× 1
Adafruit potentiometer 10 k
× 2
Adafruit potentiometerknop
× 2
draad
× 1
Verzonken schroeven M3 + moeren
× 1
Verzonken schroeven M4 + moeren
× 1
Alle 3D-geprinte onderdelen
× 1
Alle lasercut MDF-onderdelen
× 1
Aangepast Arduino mega-schild
× 1
Arduino mega stapelbare headers (voor spatiëring)
× 1
Adafruit DC step-down converter 5v 3A
× 1
12v PSU
× 1
Vrouwelijke psu-bus
× 1
USB-B paneelmontage
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)
schroevendraaier
Soldeerbout (algemeen)

Apps en online services

Arduino IDE
MDF-lasercutservice

Over dit project

Dit is een op maat gemaakte whac-a-mole-game. Voorlopig is het geprogrammeerd met een basisspel, maar het is mogelijk om updates in de functie te maken.

Belangrijkste kenmerken:

  • 5 knoppen voor het spel zelf. Elke knop heeft zijn eigen heldere led. Led's zijn PWM-gestuurd (gebruikt voor de game-over-sequentie).
  • 10 selecteerbare niveaus. Niveau 1 (gemakkelijk) tot 10 (krankzinnig). Tijdens het spelen moet je binnen een bepaalde tijd op de juiste knop drukken. Deze duur is variabel binnen elk niveau (dus soms moet je drukken is sneller dan andere stappen).
  • (pseudo) willekeurige knopselectie tijdens het spelen. De volgende stap (knop die moet worden ingedrukt) is altijd een andere knop.
  • 2 LED-cijferdisplays. Een voor de huidige score/aftellen/niveauselectie en een voor het weergeven van de hoogste score.
  • digitale volumeregeling
  • Opslaan met hoge score
  • Geluidseffecten. Tijdens verschillende fasen van het spel worden geluidsloops afgespeeld via de ingebouwde luidsprekers.
  • Lasergesneden behuizing
  • Veel 3D-geprinte onderdelen
  • Aangepast Arduino Mega-schild

Behuizing

Begin eerst met het monteren van de behuizing.

Monteer de 3D-geprinte montagebeugels op de bovenklep.

Verf de behuizing als je wilt.

Monteer vervolgens de LED-displaysteunen. Vergeet niet de bouten onder de steunen te plaatsen, anders kunnen de verticale staven niet worden vastgezet.

Monteer het Arduino-schild. Ik heb een extra set stapelbare headers gebruikt, zodat er meer ruimte is tussen het schild en de Arduino.

Monteer het achterste bedieningspaneel.

Monteer de bovenklep (knoppen en LED-panelen).

Het achterste bedieningspaneel bevat twee potentiometerbedieningen; één voor de volumeregeling, één voor niveauselectie.

Conclusies

Klaar!

op het linker led-cijferpaneel ziet u het geselecteerde niveau. U kunt niveau 1 (eenvoudig) tot 10 (krankzinnig) selecteren. Op het rechter led-cijferpaneel ziet u de hoogste score voor het bijbehorende niveau. Tijdens een actief spel geeft het linker cijferpaneel de huidige score weer. Druk nu op de groene knop om het spel te starten. Na het aftellen begint het spel.

Code

  • Wac_A_Mole_v1.0.0
Wac_A_Mole_v1.0.0Arduino
Arduino-code, geschreven in Visual Studio
/*Whac_A_Mole_v1.0.0By WT040*/#include "Wire.h"#include "Adafruit_LEDBackpack.h"#include "Adafruit_GFX.h"Adafruit_7segment matrix1 =Adafruit_7segment();Adafruit_7segment matrix2 =Adafruit_7segment();#define debounceTime 10 //declare potmeter controls#define potmeterVolume 0#define potmeterGameLevel 1//declare amp power pin#define ampPower 32//declare buttons#define btn1Pin 22#define btn2Pin 24#define btn3Pin4Pdein 28#define btn5Pin 30byte btnArray[] ={ btn1Pin, btn2Pin, btn3Pin, btn4Pin, btn5Pin};#define btn1 0 // voor gebruik van de btn array#define btn2 1 // voor gebruik van de btn3 2 // btt gebruik van de btn-array#define btn4 3 // voor gebruik van de btn-array#define btn5 4 // voor gebruik van de btn-array//declare-knop leds#define btnLed1Pin 9#define btnLed2Pin 10#define btnLed3Pin 11#define btnLed5BinnLed5 13 byte btnLedArray[] ={ btnLed1Pin, btnLed2Pin, btnLed3Pin, btnLed4Pin, btnLed5Pin};#define btnLed1 0 // f of het gebruik van de btn array#define btnLed2 1 // voor het gebruik van de btn array#define btnLed3 2 // voor het gebruik van de btn array#define btnLed4 3 // voor het gebruik van de btn array#define btnLed5 4 // voor het gebruik van de btn array/ /declare audio fx digitals#define fx0TriggerPin 29#define fx1TriggerPin 31#define fx2TriggerPin 33#define fx3TriggerPin 35#define fx4TriggerPin 37#define fx5TriggerPin 39#define fx6TriggerPindex#define fx6TriggerPindex7 41#define fx6TriggerPinde 49 definieert fxVolUpPin 51 # definiëren fxVolDnPin 53byte fxTriggerArray [] ={fx0TriggerPin, fx1TriggerPin, fx2TriggerPin, fx3TriggerPin, fx4TriggerPin, fx5TriggerPin, fx6TriggerPin, fx7TriggerPin, fx8TriggerPin, fx9TriggerPin, fx10TriggerPin}; byte fxVolumeArray [] ={fxVolUpPin, fxVolDnPin}; # definiëren fx0Trigger 0 // voor het gebruik van de btn array#define fx1Trigger 1 // voor het gebruik van de btn array#define fx2Trigger 2 // voor het gebruik van de btn array#define fx3Trigger 3 // voor het gebruik van de btn array#define fx4Trigger 4 // voor het gebruik van de btn array tn array#define fx5Trigger 5 // voor gebruik van de btn array#define fx6Trigger 6 // voor gebruik van de btn array#define fx7Trigger 7 // voor gebruik van de btn array#define fx8Trigger 8 // voor gebruik van de btn array#define fx9Trigger 9 // voor het gebruik van de btn array#define fx10Trigger 10 // voor het gebruik van de btn array#define fxVolUp 0 // voor het gebruik van de btn array#define fxVolDn 1 // voor het gebruik van de btn arraysigned int currentPlayingSound =-1;byte btnPressed[5 ], ledState[5];//blink ledunsigned lange vorigeMillisLedBlink =0; //voor knipperende led#define intervalLedBlink 750 ////game start sequenceunsigned long previousMillisGameStarting =0;#define intervalCountDown 1000byte gameStartCountDown;////game stepsunsigned long previousMillisGameStep =0;int gameStepLength =0; // lengte van een individuele stepint gameStepBtn =0; //de knop die moet worden ingedrukt //int valPotmeterVolume =0;int volume =0;int actualVolume =35; //volume van het adafruit fx boardint valPotmeterGameLevel =0;int gameLevel;int currentScore;int highScore;int highScoreAddr =1;byte activeBtn;bool debug; // schakel debug of notbyte wackAMoleState in; //status van de gamebool SystemInitialized =false;#define stateUnknown 0#define waitForStart 1#define start 2#define running 3#define gameOver 4#define gestopt 5void setup(){ Serial.begin(9600); // init versterker power pin pinMode (ampPower, OUTPUT); digitalWrite (versterkervermogen, LAAG); //init btn-pinnen voor (int Pin =0; Pin <5; Pin ++) {pinMode (btnArray [Pin], INPUT); } //init btn led-pinnen voor (int Pin =0; Pin <5; Pin ++) {pinMode (btnLedArray [Pin], OUTPUT); } //init btn fx pinnen voor (int Pin =0; Pin <11; Pin ++) { pinMode (fxTriggerArray [Pin], OUTPUT); digitalWrite (fxTriggerArray [Pin], HOOG); } //init btn fx volume pinnen voor (int Pin =0; Pin <2; Pin ++) { pinMode (fxVolumeArray [Pin], OUTPUT); digitalWrite(fxVolumeArray[Pin], HOOG); } matrix1.begin(0x70); matrix2.begin(0x71); while (!eeprom_is_ready()); // Wacht tot EEPROM gereed is cli(); highScore =eeprom_read_word((uint16_t*)(gameLevel * 2)); zie(); matrix1.print(0); matrix1.writeDisplay(); matrix2.print(0); matrix2.writeDisplay(); initializeSystem();}void loop(){ checkButtonInputs(); // wanneer we de schakelaars controleren, krijgen we de huidige status readVolumePotmeter(); if (wackAMoleState ==waitForStart) { playSound (fx0Trigger); if (btnPressed[btn4]) { wackAMoleState =starten; } leesGameLevelPotmeter(); ledBlinkStart(); } if (wackAMoleState ==starten) { startGame(); } if (wackAMoleState ==actief) { playSound (fx1Trigger); checkVolgendeGameStep(); }} ongeldig checkNextGameStep() { unsigned long currentMillisGameStep =millis(); int hoeveelheidVanButtonPresses =0; for (int btn =0; btn <5; btn++) {if (btnPressed[btn]) {hoeveelheidKnoppers++; } } if (vorigeMillisGameStep ==0) { previousMillisGameStep =huidigeMillisGameStep; digitalWrite (btnLedArray [btnLed4], LAAG); randomSeed(analogRead (2)); gameStepBtn =willekeurig (0, 5); gameStepLength =willekeurig (3000 / gameLevel, 5000 / gameLevel); digitalWrite (btnLedArray [gameStepBtn], HOOG); // licht nieuw knoplampje op } if ((currentMillisGameStep - previousMillisGameStep>
=gameStepLength) || (amountOfButtonPresses> 1) || (amountOfButtonPresses ==1) &&!btnPressed[gameStepBtn]) {//Game over... playSound( fx2Trigger); wackAMoleState =gameOver; vorigeMillisGameStep =0; for (int teller =0; teller <5; teller++) {analogeWrite(btnLedArray[teller], 255); } for (int helderheid =255; helderheid> 0; helderheid--) { analogWrite(btnLedArray[btnLed1], helderheid); analogWrite(btnLedArray[btnLed2], helderheid); analogWrite(btnLedArray[btnLed3], helderheid); analogWrite(btnLedArray[btnLed4], helderheid); analogWrite(btnLedArray[btnLed5], helderheid); vertraging(10); } analogWrite(btnLedArray[btnLed1], 0); analogWrite(btnLedArray[btnLed2], 0); analogWrite(btnLedArray[btnLed3], 0); analogWrite(btnLedArray[btnLed4], 0); analogWrite(btnLedArray[btnLed5], 0); Serial.println("Game OVER"); if (currentScore> highScore) { while (!eeprom_is_ready()); // Wacht tot EEPROM gereed is cli(); eeprom_write_word((uint16_t*)(gameLevel * 2), currentScore); // Laten we onze waarde initialiseren in EEPROM sei(); } int-teller =0; doe { vertraging(1); checkButtonInputs(); teller++; } while ((teller <1000) &&!btnPressed[btn1] &&!btnPressed[btn2 &&!btnPressed[btn3] &&!btnPressed[btn4] &&!btnPressed[btn5]]);//wacht op de release van de knoppenmatrix1 .print(0); matrix1.writeDisplay(); wackAMoleState =waitForStart; } else if (btnPressed[gameStepBtn] &&(amountOfButtonPresses ==1)) {digitalWrite(btnLedArray[gameStepBtn], LOW); // schakel led vorige knop uit int teller =0; doe { vertraging(1); checkButtonInputs(); teller++; } while ((teller <1000) &&btnPressed[gameStepBtn]);//wacht op het loslaten van de knop previousMillisGameStep =currentMillisGameStep; int tempStepBtn =0; doen { tempStepBtn =willekeurig (0, 5); gameStepLength =willekeurig (3000 / gameLevel, 5000 / gameLevel); } while (gameStepBtn ==tempStepBtn); gameStepBtn =tempStepBtn; digitalWrite (btnLedArray [gameStepBtn], HOOG); // licht op nieuwe knop licht currentScore ++; matrix1.print(huidigeScore); matrix1.writeDisplay(); if (currentScore> highScore) { matrix2.print(currentScore); matrix2.writeDisplay(); } }}void ledBlinkStart() //blink a led zonder vertraging{ unsigned long currentMillisLedBlink =millis(); if (currentMillisLedBlink - previousMillisLedBlink>=intervalLedBlink) { previousMillisLedBlink =currentMillisLedBlink; if (ledState[0] ==LAAG) { ledState[0] =HOOG; } else { ledState[0] =LAAG; } digitalWrite(btnLedArray[btnLed4], ledState[0]); //groene led/knop }}void startGame() //start sequentie van het spel zelf{ unsigned long currentMillisGameStarting =millis(); digitalWrite(btnLedArray[btnLed4], 0); // zet groene led/knop uit currentScore =0; if (gameStartCountDown ==0) { playSound (fx3Trigger); previousMillisGameStarting =millis(); gameStartCountDown =4; vertraging (300); matrix1.print(gameStartCountDown, DEC); matrix1.writeDisplay(); } if (currentMillisGameStarting - previousMillisGameStarting>=intervalCountDown) { previousMillisGameStarting =currentMillisGameStarting; if (gameStartCountDown> 0) { gameStartCountDown--; matrix1.print(gameStartCountDown, DEC); matrix1.writeDisplay(); if (gameStartCountDown ==0) { wackAMoleState =actief; } } }}void initializeSystem(){ //voeg hier de init-code toe... digitalWrite(btnLedArray[btnLed1], HIGH); vertraging (75); digitalWrite(btnLedArray[btnLed2], HOOG); vertraging (75); digitalWrite(btnLedArray[btnLed3], HOOG); vertraging (75); digitalWrite(btnLedArray[btnLed4], HOOG); vertraging (75); digitalWrite(btnLedArray[btnLed5], HOOG); vertraging (1000); digitalWrite(btnLedArray[btnLed5], LAAG); vertraging (75); digitalWrite (btnLedArray [btnLed4], LAAG); vertraging (75); digitalWrite(btnLedArray[btnLed3], LOW); vertraging (75); digitalWrite (btnLedArray [btnLed2], LAAG); vertraging (75); digitalWrite (btnLedArray [btnLed1], LAAG); vertraging (1000); debug =waar; wackAMoleState =waitForStart; initVolume(); if (actualVolume> 0) { enableAmpPower (true); }}void checkButtonInputs() //controleer op knopwijzigingen{ static byte previousstate[5]; statische byte huidige toestand [5]; statisch lang laatste keer; byte-index; // debounce if ((laatste keer + debounceTime)> millis()) { return; } laatste keer =millis(); // for (index =0; index <5; index ++) {currentstate [index] =digitalRead (btnArray [index]); // lees de knop if (currentstate[index]!=btnPressed[index]) { if ((btnPressed[index] ==HIGH) &&(currentstate[index] ==LOW)) { if (debug) { Serial.print ("knop losgelaten:"); Serial.println(index + 1); } btnPressed[index] =0; } if ((btnPressed[index] ==LAAG) &&(currentstate[index] ==HOOG)) { if (debug) { Serial.print ("knop ingedrukt:"); Serial.println(index + 1); } btnPressed[index] =1; } } }}void initVolume(){ valPotmeterVolume =(analogRead(potmeterVolume) / 30); if (actualVolume> valPotmeterVolume) {do {digitalWrite(fxVolumeArray[fxVolDn], LOW); actueel Volume--; vertraging(20); digitalWrite(fxVolumeArray[fxVolDn], HOOG); vertraging(20); } while (actualVolume> valPotmeterVolume); } else if (actualVolume  valPotmeterVolume) {digitalWrite(fxVolumeArray[fxVolDn], LOW); actueel Volume--; vertraging (40); digitalWrite(fxVolumeArray[fxVolDn], HOOG); if (actualVolume ==0) { enableAmpPower (false); } } else if (actualVolume  -1) { matrix2.print (hoge score); } else { matrix2.print(0); } matrix2.writeDisplay();}void playSound(int sound){ if (currentPlayingSound !=sound) { for (int counter =0; counter <11; counter++) {digitalWrite(fxTriggerArray[counter], HIGH); } digitalWrite(fxTriggerArray[geluid], LAAG); currentPlayingSound =geluid; }}void enableAmpPower(bool state){ digitalWrite(ampPower, state);}

Aangepaste onderdelen en behuizingen

Lasergesneden MDF onderdelen 6mm OC9CvHjuTzsYL9POZCJt.dxfLasercut MDF onderdelen 9mm 1irkeqvO4ABzhKqhmyG7.dxfLasercut plexiglas onderdelen 3mm j4Tnmni6dQ0KXJtiHcy1.dxfCustom Arduino Mega Shield 5yiRX1RdQuPX0gNXjYkm.zip3D geprinte versterkerbevestiging, print 2x3D geprinte arduino mega mount3D geprinte achteraansluitpaneel montage3D geprinte achteraansluitpaneel3D geprinte kabelclip, print zoveel als u wilt3D geprinte led display mount, print 2x3D geprinte led display mount slot, print 4x3D geprinte led display bovenframe, print 2x3D geprinte bovenkap montage achterkant3D geprinte bovenkap montage voorzijde, print 2x3D geprinte bovenkap montage kant, print 2x

Schema's


Productieproces

  1. Instrumentknoppen kiezen
  2. Hoe u inbusbouten met knop kiest
  3. Knop
  4. Bewegingsgestuurde AWS IoT-knop
  5. UnifiedWater v1
  6. Mobiele stembus
  7. Moderne jukebox
  8. Hoe een PCB-prototypefabricagebedrijf te kiezen?
  9. Hoe de zaagsnelheid kiezen?
  10. Hoe de beste dompelpomp kiezen?
  11. Waarom kiezen voor verticale draaicentra?