Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Whac-A-Mole (Button Edition)

Komponenten und Verbrauchsmaterialien

Arduino Mega 2560
× 1
Adafruit 1,4" 4-stellige 7-Segment-Anzeige mit I2C-Rucksack
Wählen Sie die gewünschte Farbe
× 2
Adafruit Big Arcade Button mit LED (60mm)
Wählen Sie 5 verschiedene Farben
× 5
Adafruit Audio FX-Board 16 MB
× 1
Adafruit 2,5 W Ampere
× 2
Lautsprecher:3 W, 4 Ohm
× 2
Adafruit-Ein-/Ausschalter mit LED
× 1
Adafruit-Potentiometer 10 k
× 2
Adafruit-Potentiometerknopf
× 2
wire
× 1
Senkkopfschrauben M3 + Muttern
× 1
Senkkopfschrauben M4 + Muttern
× 1
Alle 3D-gedruckten Teile
× 1
Alle lasergeschnittenen MDF-Teile
× 1
Benutzerdefiniertes Arduino-Mega-Schild
× 1
Arduino Mega Stackable Header (für Abstände)
× 1
Adafruit DC Abwärtswandler 5V 3A
× 1
12-V-Netzteil
× 1
Weiblicher Netzteilbus
× 1
USB-B-Panelmontage
× 1

Notwendige Werkzeuge und Maschinen

3D-Drucker (generisch)
Schraubendreher
Lötkolben (generisch)

Apps und Onlinedienste

Arduino-IDE
MDF-Lasercut-Service

Über dieses Projekt

Dies ist ein benutzerdefiniertes Whack-A-Maulwurf-Spiel. Im Moment ist es mit einem Basisspiel programmiert, aber es ist möglich, Updates in der Funktion zu erstellen.

Hauptmerkmale:

  • 5 Tasten für das Spiel selbst. Jede Taste hat ihre eigene helle LED. LEDs sind PWM-gesteuert (wird für die Game-Over-Sequenz verwendet).
  • 10 wählbare Stufen. Level 1 (leicht) bis 10 (wahnsinnig). Während des Spiels müssen Sie innerhalb einer bestimmten Zeit die richtige Taste drücken. Diese Dauer ist in jedem Level variabel (manchmal muss man also drücken, ist schneller als andere Schritte).
  • (Pseudo) zufällige Tastenauswahl während des Spiels. Der nächste Schritt (eine Schaltfläche, die gedrückt werden muss) ist immer eine andere Schaltfläche.
  • 2 LED-Ziffernanzeigen. Eine für die aktuelle Punktzahl/Countdown/Level-Auswahl und eine für die Anzeige des Highscores.
  • digitale Lautstärkeregelung
  • Speichern von Highscores
  • Soundeffekte. Während verschiedener Spielzustände werden Soundloops über die eingebauten Lautsprecher abgespielt.
  • Lasergeschnittenes Gehäuse
  • Viele 3D-gedruckte Teile
  • Benutzerdefiniertes Arduino Mega-Schild

Gehäuse

Beginnen Sie zunächst mit der Montage des Gehäuses.

Montieren Sie die 3D-gedruckten Montagehalterungen an der oberen Abdeckung.

Wenn Sie möchten, lackieren Sie das Gehäuse.

Als nächstes montieren Sie die LED-Anzeigehalterungen. Vergessen Sie nicht, die Schrauben unter den Halterungen zu platzieren, da sonst die vertikalen Stangen nicht befestigt werden können.

Bauen Sie das Arduino-Schild zusammen. Ich habe einen zusätzlichen Satz stapelbarer Header verwendet, damit zwischen dem Schild und dem Arduino mehr Platz ist.

Bauen Sie das hintere Bedienfeld zusammen.

Montieren Sie die obere Abdeckung (Tasten &LED-Panels).

Das rückseitige Bedienfeld enthält zwei Potentiometer-Steuerungen; einer für die Lautstärkeregelung, einer für die Pegelauswahl.

Schlussfolgerungen

Fertig!

Auf der linken LED-Zifferntafel können Sie die ausgewählte Stufe sehen. Sie können Level 1 (einfach) bis 10 (wahnsinnig) auswählen. Auf der rechten LED-Zifferntafel können Sie den Highscore für das entsprechende Level sehen. Während eines aktiven Spiels zeigt das linke Ziffernfeld den aktuellen Spielstand an. Drücken Sie nun die grüne Taste, um das Spiel zu starten. Nach einem Countdown beginnt das Spiel.

Code

  • Whac_A_Mole_v1.0.0
Whac_A_Mole_v1.0.0Arduino
Arduino-Code, geschrieben 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();Ada ._7segment matrix2 =Adafruit_7segment();#define debounceTime 10 // Deklariere Potmeter Controls#Define PotmeterVolume 0#Define PotmeterGameLevel 1 // Deklariere Amp Power Pin#Define ampPower 32 // Declare buttons#define btn1Pin 22#define btn2Pin 24#define btn3Pin 26#define btn4 28#define btn5Pin 30byte btnArray[] ={ btn1Pin, btn2Pin, btn3Pin, btn4Pin, btn5Pin};#define btn1 0 // zur Verwendung des btn-Arrays#define btn2 1 // zur Verwendung des btn-Arrays# // for btn3 2 Verwenden des btn-Arrays#define btn4 3 // für das Verwenden des btn-Arrays#define btn5 4 // für das Verwenden des btn-Arrays //declare button leds#define btnLed1Pin 9#define btnLed2Pin 10#define btnLed3Pin 11#define btnLed4Pin 12#define 13 byte btnLedArray[] ={ btnLed1Pin, btnLed2Pin, btnLed3Pin, btnLed4Pin, btnLed5Pin};#define btnLed1 0 // f oder mit dem btn-Array#define btnLed2 1 // für das btn-Array#define btnLed3 2 // für das btn-Array#define btnLed4 3 // für das btn-Array#define btnLed5 4 // für das 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 fx6TriggerPin 41#define fx7Triggerinxin8 definieren fxVolUpPin 51 # definieren fxVolDnPin 53byte fxTriggerArray [] ={fx0TriggerPin, fx1TriggerPin, fx2TriggerPin, fx3TriggerPin, fx4TriggerPin, fx5TriggerPin, fx6TriggerPin, fx7TriggerPin, fx8TriggerPin, fx9TriggerPin, fx10TriggerPin}; byte fxVolumeArray [] ={fxVolUpPin, fxVolDnPin}; # define fx0Trigger 0 // zur Verwendung des btn-Arrays#define fx1Trigger 1 // zur Verwendung des btn-Arrays#define fx2Trigger 2 // zur Verwendung des btn-Arrays#define fx3Trigger 3 // zur Verwendung des btn-Arrays#define fx4Trigger 4 // zur Verwendung des b tn array#define fx5Trigger 5 // für die Verwendung des btn-Array#define fx6Trigger 6 // für die Verwendung des btn-Array#define fx7Trigger 7 // für die Verwendung des btn-Array#define fx8Trigger 8 // für die Verwendung des btn-Array#define fx9Trigger 9 // zur Verwendung des btn-Arrays#define fx10Trigger 10 // zur Verwendung des btn-Arrays#define fxVolUp 0 // zur Verwendung des btn-Arrays#define fxVolDn 1 // zur Verwendung des btn-Arraysigned int currentPlayingSound =-1;byte btnPressed[5 ], ledState[5]; //blink ledunsigned long previousMillisLedBlink =0; //für blinkende LED#define intervalLedBlink 750 ////game start sequenceunsigned long previousMillisGameStarting =0;#define intervalCountDown 1000byte gameStartCountDown;////game stepsunsigned long previousMillisGameStep =0;int gameStepLength =0; // Länge eines einzelnen Stepint gameStepBtn =0; //die Taste, die gedrückt werden muss //int valPotmeterVolume =0;int volume =0;int currentVolume =35; //Lautstärke des adafruit fx boardint valPotmeterGameLevel =0;int gameLevel;int currentScore;int highScore;int highScoreAddr =1;byte activeBtn;bool debug; // Debug oder Notbyte aktivieren wackAMoleState; //Zustand des Gamebools SystemInitialized =false;#define stateUnknown 0#define waitForStart 1#define Start 2#define running 3#define gameOver 4#define gestoppt 5void setup(){ Serial.begin(9600); // Init Amp Power Pin PinMode (ampPower, OUTPUT); digitalWrite (ampPower, LOW); // Btn-Pins für (int Pin =0; Pin <5; Pin ++) initiieren {pinMode (btnArray [Pin], INPUT); } // Init btn LED-Pins für (int Pin =0; Pin <5; Pin ++) {pinMode (btnLedArray [Pin], OUTPUT); } // Init btn fx Pins für (int Pin =0; Pin <11; Pin++) {pinMode (fxTriggerArray [Pin], OUTPUT); digitalWrite (fxTriggerArray[Pin], HIGH); } // Init btn fx Volume-Pins für (int Pin =0; Pin <2; Pin ++) {pinMode (fxVolumeArray [Pin], OUTPUT); digitalWrite (fxVolumeArray[Pin], HIGH); } Matrix1.begin (0x70); matrix2.begin(0x71); while (!eeprom_is_ready()); // Warten bis EEPROM bereit ist cli(); HighScore =eeprom_read_word((uint16_t*)(gameLevel * 2)); sei(); matrix1.print(0); matrix1.writeDisplay(); matrix2.print(0); matrix2.writeDisplay(); initializeSystem();}void loop(){ checkButtonInputs(); // Wenn wir die Schalter überprüfen, erhalten wir den aktuellen Zustand readVolumePotmeter(); if (wackAMoleState ==waitForStart) { playSound (fx0Trigger); if (btnPressed[btn4]) { wackAMoleState =starten; } readGameLevelPotmeter(); ledBlinkStart(); } if (wackAMoleState ==Start) { startGame(); aufrechtzuerhalten. Wenn (wackAMoleState ==läuft) { playSound (fx1Trigger); checkNextGameStep(); }}void checkNextGameStep() { unsigned long currentMillisGameStep =millis(); int MengeOfButtonPresses =0; for (int btn =0; btn <5; btn++) { if (btnPressed[btn]) { MengeOfButtonPresses++; } } if (vorherigerMillisGameStep ==0) { previousMillisGameStep =currentMillisGameStep; digitalWrite (btnLedArray[btnLed4], LOW); randomSeed(analogRead(2)); gameStepBtn =random(0, 5); gameStepLength =random(3000 / gameLevel, 5000 / gameLevel); digitalWrite(btnLedArray[gameStepBtn], HIGH); //neues Tastenlicht aufleuchten} if ((currentMillisGameStep - previousMillisGameStep>
=gameStepLength) || (amountOfButtonPresses> 1) || (amountOfButtonPresses ==1) &&!btnPressed[gameStepBtn]) { //Game over... playSound( fx2Trigger); wackAMoleState =gameOver; vorherigerMillisGameStep =0; for (int counter =0; counter <5; counter++) { analogWrite (btnLedArray[counter], 255); } for (int Helligkeit =255; Helligkeit> 0; Helligkeit--) { AnalogWrite (btnLedArray[btnLed1], Helligkeit); analogWrite (btnLedArray[btnLed2], Helligkeit); analogWrite(btnLedArray[btnLed3], Helligkeit); analogWrite(btnLedArray[btnLed4], Helligkeit); analogWrite(btnLedArray[btnLed5], Helligkeit); Verzögerung(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()); // Warten bis EEPROM bereit ist cli(); eeprom_write_word((uint16_t*)(gameLevel * 2), currentScore); // Lassen Sie uns unseren Wert in EEPROM initialisieren sei(); } int-Zähler =0; tun { verzögern (1); checkButtonInputs(); Zähler++; } while ((Zähler <1000) &&!btnPressed[btn1] &&!btnPressed[btn2 &&!btnPressed[btn3] &&!btnPressed[btn4] &&!btnPressed[btn5]]);//warte auf das Loslassen der Tastenmatrix1 .print(0); matrix1.writeDisplay(); wackAMoleState =waitForStart; } else if (btnPressed[gameStepBtn] &&(amountOfButtonPresses ==1)) { digitalWrite(btnLedArray[gameStepBtn], LOW); // LED-Vorherige Taste ausschalten Int Counter =0; tun { verzögern (1); checkButtonInputs(); Zähler++; } while ((Zähler <1000) &&btnPressed[gameStepBtn]);//auf die Freigabe des Buttons warten previousMillisGameStep =currentMillisGameStep; int tempStepBtn =0; do { tempStepBtn =random (0, 5); gameStepLength =random(3000 / gameLevel, 5000 / gameLevel); } while (gameStepBtn ==tempStepBtn); gameStepBtn =tempStepBtn; digitalWrite(btnLedArray[gameStepBtn], HIGH); // neue Taste aufleuchten light currentScore++; matrix1.print (aktueller Wert); matrix1.writeDisplay(); if (currentScore> HighScore) { matrix2.print (currentScore); matrix2.writeDisplay(); } }}void ledBlinkStart () // eine LED ohne Verzögerung blinken { unsigned long currentMillisLedBlink =millis (); if (currentMillisLedBlink - previousMillisLedBlink>=intervalLedBlink) { previousMillisLedBlink =currentMillisLedBlink; if (ledState[0] ==LOW) { ledState[0] =HIGH; aufrechtzuerhalten. Sonst { ledState [0] =NIEDRIG; } digitalWrite (btnLedArray[btnLed4], ledState[0]); //grüne LED/Taste}}void startGame() //Startsequenz des Spiels selbst{ unsigned long currentMillisGameStarting =millis(); digitalWrite(btnLedArray[btnLed4], 0); // Grüne LED/Taste ausschalten currentScore =0; if (gameStartCountDown ==0) { playSound (fx3Trigger); vorherigesMillisGameStarting =millis(); SpielStartCountDown =4; Verzögerung (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 =läuft; } } }}void initializeSystem(){ //Init-Code hier hinzufügen... digitalWrite(btnLedArray[btnLed1], HIGH); Verzögerung (75); digitalWrite(btnLedArray[btnLed2], HIGH); Verzögerung (75); digitalWrite(btnLedArray[btnLed3], HIGH); Verzögerung (75); digitalWrite(btnLedArray[btnLed4], HIGH); Verzögerung (75); digitalWrite(btnLedArray[btnLed5], HIGH); Verzögerung (1000); digitalWrite(btnLedArray[btnLed5], LOW); Verzögerung (75); digitalWrite (btnLedArray[btnLed4], LOW); Verzögerung (75); digitalWrite (btnLedArray[btnLed3], LOW); Verzögerung (75); digitalWrite (btnLedArray[btnLed2], LOW); Verzögerung (75); digitalWrite(btnLedArray[btnLed1], LOW); Verzögerung (1000); debuggen =wahr; wackAMoleState =waitForStart; initVolume(); if (actualVolume> 0) { enableAmpPower (true); }}void checkButtonInputs() // Auf Änderungen der Schaltflächen prüfen { statisches Byte vorheriger Zustand[5]; statisches Byte aktueller Zustand[5]; statische lange letzte Zeit; Byte-Index; // entprellen if ((lasttime + debounceTime)> millis ()) { zurück; } letzte Zeit =millis(); // für (index =0; index <5; index++) { currentstate[index] =digitalRead(btnArray[index]); // Schaltfläche lesen if (currentstate[index]!=btnPressed[index]) { if ((btnPressed[index] ==HIGH) &&(currentstate[index] ==LOW)) { if (debug) { Serial.print ("Taste losgelassen:"); Serial.println (Index + 1); } btnPressed[index] =0; } if ((btnPressed[index] ==LOW) &&(currentstate[index] ==HIGH)) { if (debug) { Serial.print ( "Taste gedrückt:"); Serial.println (Index + 1); } btnPressed[index] =1; } } }}void initVolume () { valPotmeterVolume =(analogRead (potmeterVolume) / 30); if (actualVolume> valPotmeterVolume) { do { digitalWrite (fxVolumeArray[fxVolDn], LOW); tatsächliches Volumen--; Verzögerung (20); digitalWrite(fxVolumeArray[fxVolDn], HIGH); Verzögerung (20); } while (actualVolume> valPotmeterVolume); aufrechtzuerhalten. Sonst if (actualVolume  valPotmeterVolume) { digitalWrite (fxVolumeArray[fxVolDn], LOW); tatsächliches Volumen--; Verzögerung (40); digitalWrite(fxVolumeArray[fxVolDn], HIGH); if (actualVolume ==0) { enableAmpPower (false); } } else if (actualVolume  -1) {matrix2.print (highScore); aufrechtzuerhalten. Sonst { 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 [Sound], LOW); currentPlayingSound =Ton; }}void enableAmpPower(bool state){ digitalWrite(ampPower, state);}

Kundenspezifische Teile und Gehäuse

Lasergeschnittene MDF-Teile 6 mm OC9CvHjuTzsYL9POZCJt.dxfLasercut MDF Teile 9mm 1irkeqvO4ABzhKqhmyG7.dxfLasercut Plexiglasteile 3mm j4Tnmni6dQ0KXJtiHcy1.dxfCustom Arduino Mega Shield 5yiRX1RdQuPX0gNXjYkm.zip3D gedruckte Verstärkerhalterung, Druck 2x3D gedruckte Arduino Mega Mount3D gedruckte Rückverbindungsplatte Halterung3D gedruckte Rückverbindungsplatte3D gedruckte Kabelklemme, drucken Sie so viele wie Sie möchten oberer Rahmen, 2x3D gedruckte obere Abdeckungshalterung drucken3D gedruckte obere Abdeckungshalterung vorne, 2x3D gedruckte obere Abdeckungshalterung drucken, 2x drucken

Schaltpläne


Herstellungsprozess

  1. So wählen Sie Instrumentenknöpfe aus
  2. So wählen Sie Innensechskantschrauben aus
  3. Schaltfläche
  4. Bewegungsgesteuerte AWS IoT-Schaltfläche
  5. UnifiedWater v1
  6. Mobile Abstimmungsbox
  7. So wählen Sie ein Unternehmen zur Herstellung von PCB-Prototypen aus
  8. Wie wähle ich die Sägegeschwindigkeit?
  9. Wie wählt man die beste Tauchpumpe aus?
  10. Warum sollten Sie sich für vertikale Drehzentren entscheiden?