Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Whac-A-Mole (édition bouton)

Composants et fournitures

Arduino Mega 2560
× 1
Afficheur Adafruit 1.4" à 4 chiffres à 7 segments avec sac à dos I2C
Choisissez la couleur que vous voulez
× 2
Adafruit Gros bouton d'arcade avec led (60mm)
Choisissez 5 couleurs différentes
× 5
Adafruit Audio fx board 16mb
× 1
Ampli Adafruit 2.5w
× 2
Haut-parleur :3 W, 4 ohms
× 2
Bouton marche/arrêt Adafruit avec led
× 1
Potentiomètre Adafruit 10 k
× 2
Bouton de potentiomètre Adafruit
× 2
fil
× 1
Vis à tête fraisée M3 + écrous
× 1
Vis à tête fraisée M4 + écrous
× 1
Toutes les pièces imprimées en 3D
× 1
Toutes les pièces MDF découpées au laser
× 1
Mega shield Arduino personnalisé
× 1
En-têtes empilables méga Arduino (pour l'espacement)
× 1
Convertisseur abaisseur CC Adafruit 5v 3A
× 1
PSU 12v
× 1
Bus psu femelle
× 1
Montage panneau USB-B
× 1

Outils et machines nécessaires

Imprimante 3D (générique)
tournevis
Fer à souder (générique)

Applications et services en ligne

Arduino IDE
Service de découpe laser MDF

À propos de ce projet

Il s'agit d'un jeu whac-a-mole personnalisé. Pour l'instant, il est programmé avec un jeu de base, mais il est possible de créer des mises à jour dans la fonctionnalité.

Principales caractéristiques :

  • 5 boutons pour le jeu lui-même. Chaque bouton a sa propre led lumineuse. Les LED sont contrôlées par PWM (utilisées pour la séquence de jeu).
  • 10 niveaux sélectionnables. Niveau 1 (facile) à 10 (fou). Pendant le jeu, vous devez appuyer sur le bon bouton dans un certain temps. Cette durée est variable à l'intérieur de chaque niveau (il faut donc parfois appuyer sur est plus rapide que les autres étapes).
  • (pseudo) sélection de bouton aléatoire pendant le jeu. L'étape suivante (bouton sur lequel vous devez appuyer) est toujours un autre bouton.
  • 2 affichages digitaux LED. Un pour la sélection du score/compte à rebours/niveau actuel et un pour afficher le score le plus élevé.
  • contrôle numérique du volume
  • Stockage des meilleurs scores
  • Effets sonores. Pendant divers états du jeu, des boucles sonores sont jouées via les haut-parleurs intégrés.
  • Boîtier découpé au laser
  • De nombreuses pièces imprimées en 3D
  • Bouclier Arduino Mega personnalisé

Enceinte

Tout d'abord, commencez par assembler le boîtier.

Montez les supports de montage imprimés en 3D sur le capot supérieur.

Si vous le souhaitez, peignez l'enceinte.

Ensuite, montez les supports d'affichage à LED. N'oubliez pas de placer les boulons sous les supports, sinon les barres verticales ne peuvent pas être fixées.

Assemblez le shield Arduino. J'ai utilisé un ensemble supplémentaire d'en-têtes empilables, il y a donc plus d'espace entre le bouclier et l'Arduino.

Assemblez le panneau de commande arrière.

Assemblez le capot supérieur (boutons et panneaux LED).

Le panneau de commande arrière comprend deux commandes de potentiomètre; un pour le contrôle du volume, un pour la sélection du niveau.

Conclusion

Terminé !

sur le panneau de chiffres à led de gauche, vous pouvez voir le niveau sélectionné. Vous pouvez sélectionner le niveau 1 (facile) à 10 (fou). Sur le panneau de chiffres à LED de droite, vous pouvez voir le score le plus élevé pour le niveau correspondant. Pendant un jeu actif, le panneau de chiffres de gauche affichera le score actuel. Appuyez maintenant sur le bouton vert pour démarrer le jeu. Après un compte à rebours, le jeu commencera.

Code

  • Whac_A_Mole_v1.0.0
Whac_A_Mole_v1.0.0Arduino
Code Arduino, écrit dans Visual Studio
/*Whac_A_Mole_v1.0.0By WT040*/#include "Wire.h"#include "Adafruit_LEDBackpack.h"#include "Adafruit_GFX.h"Adafruit_7segment matrice1 =Adafruit_7segment();Adafruit_7seg Adafruit_7segment();#define debounceTime 10 //déclare les commandes du potentiomètre#define potmeterVolume 0#define potmeterGameLevel 1//déclare la broche d'alimentation de l'ampli#define ampPower 32//déclare les boutons#define btn1Pin 22#define btn2Pin 24#define btn3Pin 26#define 28#define btn5Pin 30byte btnArray[] ={ btn1Pin, btn2Pin, btn3Pin, btn4Pin, btn5Pin};#define btn1 0 // pour utiliser le tableau btn#define btn2 1 // pour utiliser le tableau btn#define pour btn3 2 en utilisant le tableau btn#define btn4 3 // pour utiliser le tableau btn#define btn5 4 // pour utiliser le tableau btn//declare button leds#define btnLed1Pin 9#define btnLed2Pin 10#define btnLed3Pin 11#define btnLed4Pin 12#define 13 octets btnLedArray[] ={ btnLed1Pin, btnLed2Pin, btnLed3Pin, btnLed4Pin, btnLed5Pin};#define btnLed1 0 // f ou en utilisant le tableau btn#define btnLed2 1 // pour utiliser le tableau btn#define btnLed3 2 // pour utiliser le tableau btn#define btnLed4 3 // pour utiliser le tableau btn#define btnLed5 4 // pour utiliser le tableau btn/ /declare audio fx digitals#define fx0TriggerPin 29#define fx1TriggerPin 31#define fx2TriggerPin 33#define fx3TriggerPin 35#define fx4TriggerPin 37#define fx5TriggerPin 39#define fx6TriggerPin#45#defineTriggerPin 43#definePin10 définir fxVolUpPin 51 # définissent fxVolDnPin 53byte fxTriggerArray [] ={fx0TriggerPin, fx1TriggerPin, fx2TriggerPin, fx3TriggerPin, fx4TriggerPin, fx5TriggerPin, fx6TriggerPin, fx7TriggerPin, fx8TriggerPin, fx9TriggerPin, fx10TriggerPin}; octet fxVolumeArray [] ={fxVolUpPin, fxVolDnPin}; # define fx0Trigger 0 // pour utiliser le tableau btn#define fx1Trigger 1 // pour utiliser le tableau btn#define fx2Trigger 2 // pour utiliser le tableau btn#define fx3Trigger 3 // pour utiliser le tableau btn#define fx4Trigger 4 // pour utiliser le b tn array#define fx5Trigger 5 // pour utiliser le tableau btn#define fx6Trigger 6 // pour utiliser le tableau btn#define fx7Trigger 7 // pour utiliser le tableau btn#define fx8Trigger 8 // pour utiliser le tableau btn#define fx9Trigger 9 // pour utiliser le tableau btn#define fx10Trigger 10 // pour utiliser le tableau btn#define fxVolUp 0 // pour utiliser le tableau btn#define fxVolDn 1 // pour utiliser le tableau btnsigned int currentPlayingSound =-1;byte btnPressed[5 ], ledState[5];//clignotement ledunsigned long previousMillisLedBlink =0; //pour la led clignotante#define intervalLedBlink 750 ////game start sequenceunsigned long previousMillisGameStarting =0;#define intervalCountDown 1000byte gameStartCountDown;////game stepsunsigned long previousMillisGameStep =0;int gameStepLength =0; //longueur d'un stepint gameStepBtn =0; //le bouton qui doit être enfoncé //int valPotmeterVolume =0;int volume =0;int actualVolume =35; //volume du board adafruit fxint valPotmeterGameLevel =0;int gameLevel;int currentScore;int highScore;int highScoreAddr =1;byte activeBtn;bool debug; //activer le débogage ou notbyte wackAMoleState ; //état du gamebool SystemInitialized =false;#define stateUnknown 0#define waitForStart 1#define start 2#define running 3#define gameOver 4#define stop 5void setup(){ Serial.begin(9600); //init amp power pin pinMode(ampPower, OUTPUT); digitalWrite (ampPower, LOW); //init les broches btn pour (int Pin =0; Pin <5; Pin++) { pinMode(btnArray[Pin], INPUT); } //init btn led pins for (int Pin =0; Pin <5; Pin++) { pinMode(btnLedArray[Pin], OUTPUT); } //init btn fx pins for (int Pin =0; Pin <11; Pin++) { pinMode(fxTriggerArray[Pin], OUTPUT); digitalWrite(fxTriggerArray[Pin], HIGH); } //init btn fx volume pins for (int Pin =0; Pin <2; Pin++) { pinMode(fxVolumeArray[Pin], OUTPUT); digitalWrite(fxVolumeArray[Pin], HIGH); } matrice1.begin (0x70); matrice2.début (0x71); while (!eeprom_is_ready()); // Attend que l'EEPROM soit prête cli(); highScore =eeprom_read_word((uint16_t*)(gameLevel * 2)); sei(); matrice1.impression(0); matrice1.writeAffichage(); matrice2.impression(0); matrice2.writeAffichage(); initializeSystem();}void loop(){ checkButtonInputs(); // lorsque nous vérifions les commutateurs, nous obtenons l'état actuel readVolumePotmeter(); if (wackAMoleState ==waitForStart) { playSound(fx0Trigger); if (btnPressed[btn4]) { wackAMoleState =démarrage ; } readGameLevelPotmeter(); ledBlinkStart(); } if (wackAMoleState ==démarrage) { startGame(); } if (wackAMoleState ==en cours d'exécution) { playSound(fx1Trigger); checkNextGameStep(); }} void checkNextGameStep() { long currentMillisGameStep non signé =millis(); int quantitéOfButtonPresses =0; for (int btn =0; btn <5; btn++) { if (btnPressed[btn]) {mountOfButtonPresses++; } } if (previousMillisGameStep ==0) { previousMillisGameStep =currentMillisGameStep; digitalWrite(btnLedArray[btnLed4], LOW); randomSeed(analogRead(2)); gameStepBtn =aléatoire (0, 5); gameStepLength =random(3000 / gameLevel, 5000 / gameLevel); digitalWrite(btnLedArray[gameStepBtn], HAUT); // allume la nouvelle lumière du bouton } if ((currentMillisGameStep - previousMillisGameStep>
=gameStepLength) || (amountOfButtonPresses> 1) || (amountOfButtonPresses ==1) &&!btnPressed[gameStepBtn]) { //Game over... playSound( fx2Trigger); wackAMoleState =gameOver; previousMillisGameStep =0; for (int counter =0; counter <5; counter++) { analogWrite(btnLedArray[counter], 255); } pour (int luminosité =255 ; luminosité> 0 ; luminosité--) { analogWrite(btnLedArray[btnLed1], luminosité); analogWrite(btnLedArray[btnLed2], luminosité); analogWrite(btnLedArray[btnLed3], luminosité); analogWrite(btnLedArray[btnLed4], luminosité); analogWrite(btnLedArray[btnLed5], luminosité); retard(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()); // Attend que l'EEPROM soit prête cli(); eeprom_write_word((uint16_t*)(gameLevel * 2), currentScore); // Initialisons notre valeur dans l'EEPROM sei(); } compteur entier =0; faire { retard (1); checkButtonInputs(); compteur++; } while ((compteur <1000) &&!btnPressed[btn1] &&!btnPressed[btn2 &&!btnPressed[btn3] &&!btnPressed[btn4] &&!btnPressed[btn5]]);//attendre le relâchement du bouton matrix1 .print(0); matrice1.writeAffichage(); wackAMoleState =waitForStart; } else if (btnPressed[gameStepBtn] &&(amountOfButtonPresses ==1)) { digitalWrite(btnLedArray[gameStepBtn], LOW); // éteint la led du bouton précédent int counter =0; faire { retard (1); checkButtonInputs(); compteur++; } while ((compteur <1000) &&btnPressed[gameStepBtn]);//attendre le relâchement du bouton previousMillisGameStep =currentMillisGameStep; int TempStepBtn =0 ; do { tempStepBtn =random(0, 5); gameStepLength =random(3000 / gameLevel, 5000 / gameLevel); } while (gameStepBtn ==tempStepBtn); gameStepBtn =tempStepBtn; digitalWrite(btnLedArray[gameStepBtn], HAUT); // allume le nouveau bouton light currentScore++; matrice1.print(currentScore); matrice1.writeAffichage(); if (currentScore> highScore) { matrice2.print(currentScore); matrice2.writeAffichage(); } }}void ledBlinkStart() //clignote une led sans délai{ unsigned long currentMillisLedBlink =millis(); if (currentMillisLedBlink - previousMillisLedBlink>=intervalLedBlink) { previousMillisLedBlink =currentMillisLedBlink ; if (ledState[0] ==LOW) { ledState[0] =HIGH; } else { ledState[0] =FAIBLE; } digitalWrite(btnLedArray[btnLed4], ledState[0]); // LED verte/bouton }} void startGame() // séquence de démarrage du jeu lui-même{ non signé long currentMillisGameStarting =millis(); digitalWrite(btnLedArray[btnLed4], 0); //éteindre la led verte/le bouton currentScore =0; if (gameStartCountDown ==0) { playSound(fx3Trigger); previousMillisGameStarting =millis(); gameStartCountDown =4 ; retard (300); matrix1.print(gameStartCountDown, DEC); matrice1.writeAffichage(); } if (currentMillisGameStarting - previousMillisGameStarting>=intervalCountDown) { previousMillisGameStarting =currentMillisGameStarting ; if (gameStartCountDown> 0) { gameStartCountDown--; matrix1.print(gameStartCountDown, DEC); matrice1.writeAffichage(); if (gameStartCountDown ==0) { wackAMoleState =en cours d'exécution ; } } }}void initializeSystem(){ //ajouter le code d'initialisation ici... digitalWrite(btnLedArray[btnLed1], HIGH); retard (75); digitalWrite(btnLedArray[btnLed2], HAUT); retard (75); digitalWrite(btnLedArray[btnLed3], HAUT); retard (75); digitalWrite(btnLedArray[btnLed4], HAUT); retard (75); digitalWrite(btnLedArray[btnLed5], HAUT); retard(1000); digitalWrite(btnLedArray[btnLed5], LOW); retard (75); digitalWrite(btnLedArray[btnLed4], LOW); retard (75); digitalWrite(btnLedArray[btnLed3], LOW); retard (75); digitalWrite(btnLedArray[btnLed2], LOW); retard (75); digitalWrite(btnLedArray[btnLed1], LOW); retard(1000); déboguer =vrai ; wackAMoleState =waitForStart; initVolume(); if (volume réel> 0) { enableAmpPower(true); }}void checkButtonInputs() //vérifier les changements de bouton{ static byte previousstate[5]; octet statique currentstate[5] ; statique depuis longtemps ; index d'octets ; //debounce if ((lasttime + debounceTime)> millis()) { return; } lasttime =millis(); // pour (index =0; index <5; index++) { currentstate[index] =digitalRead(btnArray[index]); // lire le bouton if (currentstate[index] !=btnPressed[index]) { if ((btnPressed[index] ==HIGH) &&(currentstate[index] ==LOW)) { if (debug) { Serial.print ("bouton relâché :"); Serial.println(index + 1); } btnPressed[index] =0; } if ((btnPressed[index] ==LOW) &&(currentstate[index] ==HIGH)) { if (debug) { Serial.print("bouton enfoncé :"); Serial.println(index + 1); } btnPressed[index] =1; } } }}void initVolume(){ valPotmeterVolume =(analogRead(potmeterVolume) / 30); if (volume réel> valPotmeterVolume) { do { digitalWrite(fxVolumeArray[fxVolDn], LOW); réelVolume--; retard(20); digitalWrite(fxVolumeArray[fxVolDn], HAUT); retard(20); } while (volume réel> valPotmeterVolume); } else if (volume réel  valPotmeterVolume) { digitalWrite(fxVolumeArray[fxVolDn], LOW); réelVolume--; retard (40); digitalWrite(fxVolumeArray[fxVolDn], HAUT); if (volume réel ==0) { enableAmpPower(false); } } else if (volume réel  -1) { matrix2.print(highScore); } else { matrice2.print(0); } matrix2.writeDisplay();}void playSound(int sound){ if (currentPlayingSound !=sound) { for (int counter =0; counter <11; counter++) { digitalWrite(fxTriggerArray[counter], HIGH); } digitalWrite(fxTriggerArray[son], LOW); currentPlayingSound =son ; }}void enableAmpPower(bool state){ digitalWrite(ampPower, state);}

Pièces et boîtiers personnalisés

Pièces MDF découpées au laser 6mm OC9CvHjuTzsYL9POZCJt.dxf Pièces MDF découpées au laser 9mm 1irkeqvO4ABzhKqhmyG7.dxfPièces en plexiglas découpées au laser 3mm j4Tnmni6dQ0KXJtiHcy1.dxf Custom Arduino Mega Shield 5yiRX1RdQuPX0gNXjYkm.zip Support d'ampli imprimé 3D, impression 2x3D imprimé arduino mega mount Support de panneau de connexion arrière imprimé 3DPanneau de connexion arrière imprimé 3DClip de câble imprimé 3D, imprimez autant que vous le souhaitezSupport d'écran LED imprimé 3D, imprimez 2x3D verrou de montage d'écran LED imprimé, imprimez 4x3D écran LED imprimé cadre supérieur, impression 2x3D support de montage du capot supérieur imprimé 3D avant support du capot supérieur, impression 2x3D côté montage du capot supérieur, impression 2x

Schémas


Processus de fabrication

  1. Comment choisir les boutons d'instrument
  2. Comment choisir les vis à tête cylindrique
  3. Bouton
  4. Bouton AWS IoT à contrôle de mouvement
  5. UnifiedWater v1
  6. Comment choisir une entreprise de fabrication de prototypes de PCB
  7. Comment choisir la vitesse de sciage ?
  8. Comment choisir la meilleure pompe submersible ?
  9. Pourquoi choisir les centres de tournage verticaux ?