Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Whac-A-Mole (Edisi Tombol)

Komponen dan persediaan

Arduino Mega 2560
× 1
Adafruit 1.4" 4 digit layar 7 segmen dengan ransel I2C
Pilih warna yang Anda inginkan
× 2
Adafruit Tombol arcade besar dengan led (60mm)
Pilih 5 warna berbeda
× 5
Adafruit Audio fx board 16mb
× 1
Adafruit 2.5w amp
× 2
Speaker:3W, 4 ohm
× 2
Adafruit on/off button with led
× 1
Adafruit potensiometer 10 k
× 2
Kenop potensiometer adafruit
× 2
kawat
× 1
Sekrup countersunk M3 + mur
× 1
Sekrup countersunk M4 + mur
× 1
Semua bagian cetakan 3d
× 1
Semua bagian MDF lasercut
× 1
Pelindung mega Arduino kustom
× 1
Arduino mega stackable header (untuk spasi)
× 1
Konverter step-down DC Adafruit 5v 3A
× 1
PSU 12v
× 1
Bus psu wanita
× 1
Panelmount USB-B
× 1

Alat dan mesin yang diperlukan

Printer 3D (generik)
obeng
Besi solder (generik)

Aplikasi dan layanan online

Arduino IDE
Layanan lasercut MDF

Tentang proyek ini

Ini adalah permainan whac-a-mol khusus. Untuk saat ini diprogram dengan permainan dasar, tetapi dimungkinkan untuk membuat pembaruan di fitur tersebut.

Fitur utama:

  • 5 botton untuk game itu sendiri. Setiap tombol memiliki led terangnya sendiri. Led dikontrol oleh PWM (digunakan untuk urutan game-over).
  • 10 level yang dapat dipilih. Level 1 (mudah) hingga 10 (gila). Selama bermain game Anda harus menekan tombol yang benar dalam waktu tertentu. Durasi ini bervariasi di dalam setiap level (jadi terkadang Anda harus menekan lebih cepat daripada langkah lainnya).
  • (pseudo) pemilihan tombol acak selama bermain game. Langkah berikutnya (tombol yang perlu ditekan) selalu merupakan tombol lain.
  • 2 tampilan angka LED. Satu untuk pemilihan skor/hitung mundur/level saat ini dan satu untuk menampilkan skor tinggi.
  • kontrol volume digital
  • Penyimpanan skor tinggi
  • Efek suara. Selama berbagai status permainan, loop suara dimainkan melalui speaker bawaan.
  • Penutup potongan laser
  • Banyak bagian cetakan 3D
  • Perisai Arduino Mega kustom

Lampiran

Pertama, mulailah dengan merakit enklosur.

Pasang braket pemasangan yang dicetak 3D di penutup atas.

Jika mau, cat penutupnya.

Selanjutnya, pasang dudukan layar LED. Jangan lupa untuk meletakkan baut di bawah dudukan, jika tidak, palang vertikal tidak dapat diperbaiki.

Pasang pelindung Arduino. Saya menggunakan satu set header tambahan yang dapat ditumpuk, jadi ada lebih banyak ruang antara perisai dan Arduino.

Pasang panel kontrol belakang.

Pasang penutup atas (tombol &panel LED).

Panel kontrol belakang mencakup dua kontrol potensiometer; satu untuk kontrol volume, satu untuk pemilihan level.

Kesimpulan

Selesai!

pada panel digit led kiri Anda dapat melihat level yang dipilih. Anda dapat memilih level 1 (mudah) hingga 10 (gila). Di panel digit led kanan Anda dapat melihat skor tinggi untuk level yang sesuai. Selama permainan aktif panel digit kiri akan menampilkan skor saat ini. Sekarang tekan tombol hijau untuk memulai permainan. Setelah hitungan mundur, permainan akan dimulai.

Kode

  • Whac_A_Mole_v1.0.0
Whac_A_Mole_v1.0.0Arduino
Kode Arduino, ditulis dalam 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 //deklarasikan kontrol potmeter#define potmeterVolume 0#define potmeterGameLevel 1//deklarasikan pin daya amp#define ampPower 32//deklarasikan tombol#define btn1Pin 22#define btn2Pin 24#define btn4Pin 28#define btn5Pin 30byte btnArray[] ={ btn1Pin, btn2Pin, btn3Pin, btn4Pin, btn5Pin};#define btn1 0 // untuk menggunakan btn array#define btn2 1 // untuk menggunakan btn array#define untuk btn3 menggunakan btn array#define btn4 3 // untuk menggunakan btn array#define btn5 4 // untuk menggunakan btn array//declare button leds#define btnLed1Pin 9#define btnLed2Pin 10#define btnLed3Pin 11#define btnLed4Pin 13 byte btnLedArray[] ={ btnLed1Pin, btnLed2Pin, btnLed3Pin, btnLed4Pin, btnLed5Pin};#define btnLed1 0 // f atau menggunakan btn array#define btnLed2 1 // untuk menggunakan btn array#define btnLed3 2 // untuk menggunakan btn array#define btnLed4 3 // untuk menggunakan btn array#define btnLed5 4 // untuk menggunakan btn array/ / declare audio yang digitals fx # mendefinisikan fx0TriggerPin 29 # mendefinisikan fx1TriggerPin 31 # mendefinisikan fx2TriggerPin 33 # mendefinisikan fx3TriggerPin 35 # mendefinisikan fx4TriggerPin 37 # mendefinisikan fx5TriggerPin 39 # mendefinisikan fx6TriggerPin 41 # mendefinisikan fx7TriggerPin 43 # mendefinisikan fx8TriggerPin 45 # mendefinisikan fx9TriggerPin 47 # mendefinisikan fx10TriggerPin 49 # mendefinisikan fxVolUpPin 51 # mendefinisikan fxVolDnPin 53byte fxTriggerArray [] ={fx0TriggerPin, fx1TriggerPin, fx2TriggerPin, fx3TriggerPin, fx4TriggerPin, fx5TriggerPin, fx6TriggerPin, fx7TriggerPin, fx8TriggerPin, fx9TriggerPin, fx10TriggerPin}; byte fxVolumeArray [] ={fxVolUpPin, fxVolDnPin}; # menentukan fx0Trigger 0 // untuk menggunakan array btn#define fx1Trigger 1 // untuk menggunakan array btn#define fx2Trigger 2 // untuk menggunakan array btn#define fx3Trigger 3 // untuk menggunakan array btn#define fx4Trigger 4 // untuk menggunakan b tn array#define fx5Trigger 5 // untuk menggunakan array btn#define fx6Trigger 6 // untuk menggunakan array btn#define fx7Trigger 7 // untuk menggunakan array btn#define fx8Trigger 8 // untuk menggunakan array btn#define fx9Trigger 9 // untuk menggunakan btn array#define fx10Trigger 10 // untuk menggunakan btn array#define fxVolUp 0 // untuk menggunakan btn array#define fxVolDn 1 // untuk menggunakan btn arraysigned int currentPlayingSound =-1;byte btnPressed[5 ], ledState[5];//blink ledunsigned long beforeMillisLedBlink =0; //untuk led berkedip#menentukan intervalLedBlink 750 ////urutan awal permainan tidak ditandatangani lama sebelumnyaMillisGameStarting =0;#menentukan intervalCountDown 1000byte gameStartCountDown;////langkah-langkah permainan lama sebelumnyaMillisGameStep =0;int gameStepLength =0; //panjang permainan langkah individuStepBtn =0; //tombol yang perlu ditekan //int valPotmeterVolume =0;int volume =0;int actualVolume =35; //volume papan adafruit fx valPotmeterGameLevel =0;int gameLevel;int currentScore;int highScore;int highScoreAddr =1;byte activeBtn;bool debug; //aktifkan debug atau notbyte wackAMoleState; //status 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 pinMode pin daya amp(ampPower, OUTPUT); digitalWrite(ampPower, RENDAH); //init btn pin for (int Pin =0; Pin <5; Pin++) { pinMode(btnArray[Pin], INPUT); } //init btn led pin for (int Pin =0; Pin <5; Pin++) { pinMode(btnLedArray[Pin], OUTPUT); } //init btn fx pin for (int Pin =0; Pin <11; Pin++) { pinMode(fxTriggerArray[Pin], OUTPUT); digitalWrite(fxTriggerArray[Pin], TINGGI); } //init btn fx volume pin for (int Pin =0; Pin <2; Pin++) { pinMode(fxVolumeArray[Pin], OUTPUT); digitalWrite(fxVolumeArray[Pin], TINGGI); } matrix1.begin(0x70); matrix2.begin(0x71); while (!eeprom_is_ready()); // Tunggu hingga EEPROM siap cli(); highScore =eeprom_read_word((uint16_t*)(gameLevel * 2)); sei(); matrix1.print(0); matrix1.writeDisplay(); matrix2.print(0); matrix2.writeDisplay(); initializeSystem();}void loop(){ checkButtonInputs(); // ketika kita memeriksa sakelar, kita akan mendapatkan status saat ini readVolumePotmeter(); if (wackAMoleState ==waitForStart) { playSound(fx0Trigger); if (btnPressed[btn4]) { wackAMoleState =mulai; } readGameLevelPotmeter(); ledBlinkStart(); } if (wackAMoleState ==mulai) { startGame(); } if (wackAMoleState ==berjalan) { playSound(fx1Trigger); checkNextGameStep(); }}void checkNextGameStep() { unsigned long currentMillisGameStep =milis(); int jumlahOfButtonPresses =0; for (int btn =0; btn <5; btn++) { if (btnPressed[btn]) { numberOfButtonPresses++; } } if (sebelumnyaMillisGameStep ==0) { sebelumnyaMillisGameStep =saatMillisGameStep; digitalWrite(btnLedArray[btnLed4], RENDAH); randomSeed(analogRead(2)); gameStepBtn =acak(0, 5); gameStepLength =acak(3000 / gameLevel, 5000 / gameLevel); digitalWrite(btnLedArray[gameStepBtn], TINGGI); //nyalakan lampu tombol baru } if ((currentMillisGameStep - sebelumnyaMillisGameStep>
=gameStepLength) || (amountOfButtonPresses> 1) || (amountOfButtonPresses ==1) &&!btnPressed[gameStepBtn]) { //Game over... playSound( fx2Pemicu); wackAMoleState =gameOver; sebelumnyaMillisGameStep =0; for (int penghitung =0; penghitung <5; penghitung++) { analogWrite(btnLedArray[penghitung], 255); } for (int kecerahan =255; kecerahan> 0; kecerahan--) { analogWrite(btnLedArray[btnLed1], kecerahan); analogWrite(btnLedArray[btnLed2], kecerahan); analogWrite(btnLedArray[btnLed3], kecerahan); analogWrite(btnLedArray[btnLed4], kecerahan); analogWrite(btnLedArray[btnLed5], kecerahan); penundaan (10); } analogWrite(btnLedArray[btnLed1], 0); analogWrite(btnLedArray[btnLed2], 0); analogWrite(btnLedArray[btnLed3], 0); analogWrite(btnLedArray[btnLed4], 0); analogWrite(btnLedArray[btnLed5], 0); Serial.println("Permainan Selesai"); if (currentScore> highScore) { while (!eeprom_is_ready()); // Tunggu hingga EEPROM siap cli(); eeprom_write_word((uint16_t*)(gameLevel * 2), currentScore); // Mari kita inisialisasi nilai kita ke EEPROM sei(); } int penghitung =0; lakukan { tunda(1); checkButtonInput(); penghitung++; } while ((penghitung <1000) &&!btnPressed[btn1] &&!btnPressed[btn2 &&!btnPressed[btn3] &&!btnPressed[btn4] &&!btnPressed[btn5]]);//tunggu rilis matriks tombol1 .cetak(0); matrix1.writeDisplay(); wackAMoleState =waitForStart; } else if (btnPressed[gameStepBtn] &&(amountOfButtonPresses ==1)) { digitalWrite(btnLedArray[gameStepBtn], RENDAH); //matikan led tombol sebelumnya int counter =0; lakukan { tunda(1); checkButtonInput(); penghitung++; } while ((penghitung <1000) &&btnPressed[gameStepBtn]);//tunggu rilis tombol sebelumnyaMillisGameStep =currentMillisGameStep; int tempStepBtn =0; lakukan { tempStepBtn =acak(0, 5); gameStepLength =acak(3000 / gameLevel, 5000 / gameLevel); } while (gameStepBtn ==tempStepBtn); gameStepBtn =tempStepBtn; digitalWrite(btnLedArray[gameStepBtn], TINGGI); //menyalakan lampu tombol baru currentScore++; matrix1.print(Skor saat ini); matrix1.writeDisplay(); if (Skor saat ini> Skor tinggi) { matrix2.print(Skor saat ini); matrix2.writeDisplay(); } }}void ledBlinkStart() //mengedipkan led tanpa penundaan{ unsigned long currentMillisLedBlink =millis(); if (MillisLedBlink saat ini - sebelumnyaMillisLedBlink>=intervalLedBlink) { sebelumnyaMillisLedBlink =saatMillisLedBlink; if (ledState[0] ==RENDAH) { ledState[0] =TINGGI; } else { ledState[0] =RENDAH; } digitalWrite(btnLedArray[btnLed4], ledState[0]); //hijau led/button }}void startGame() //mulai urutan game itu sendiri{ unsigned long currentMillisGameStarting =millis(); digitalWrite(btnLedArray[btnLed4], 0); //matikan led/tombol hijau saat iniScore =0; if (gameStartCountDown ==0) { playSound(fx3Trigger); sebelumnyaMillisGameStarting =milis(); gameStartCountDown =4; penundaan (300); matrix1.print(gameStartCountDown, DEC); matrix1.writeDisplay(); } if (currentMillisGameStarting - sebelumnyaMillisGameStarting>=intervalCountDown) { sebelumnyaMillisGameStarting =currentMillisGameStarting; if (gameStartCountDown> 0) { gameStartCountDown--; matrix1.print(gameStartCountDown, DEC); matrix1.writeDisplay(); if (gameStartCountDown ==0) { wackAMoleState =berjalan; } } }}void initializeSystem(){ //tambahkan kode init di sini... digitalWrite(btnLedArray[btnLed1], HIGH); penundaan (75); digitalWrite(btnLedArray[btnLed2], TINGGI); penundaan (75); digitalWrite(btnLedArray[btnLed3], TINGGI); penundaan (75); digitalWrite(btnLedArray[btnLed4], TINGGI); penundaan (75); digitalWrite(btnLedArray[btnLed5], TINGGI); penundaan (1000); digitalWrite(btnLedArray[btnLed5], RENDAH); penundaan (75); digitalWrite(btnLedArray[btnLed4], RENDAH); penundaan (75); digitalWrite(btnLedArray[btnLed3], RENDAH); penundaan (75); digitalWrite(btnLedArray[btnLed2], RENDAH); penundaan (75); digitalWrite(btnLedArray[btnLed1], RENDAH); penundaan (1000); debug =benar; wackAMoleState =waitForStart; initVolume(); if (Volume aktual> 0) { enableAmpPower(true); }}void checkButtonInputs() //periksa perubahan tombol{ static byte sebelumnya[5]; byte statis status saat ini[5]; statis lama terakhir; indeks byte; //debounce if ((terakhir kali + debounceTime)> milis()) { kembali; } terakhir kali =milis(); // untuk (indeks =0; indeks <5; indeks++) { status saat ini[indeks] =digitalRead(btnArray[indeks]); // baca tombol if (keadaan saat ini[indeks] !=btnPressed[indeks]) { if ((btnPressed[index] ==HIGH) &&(currentstate[index] ==LOW)) { if (debug) { Serial.print ("tombol dilepaskan:"); Serial.println(indeks +1); } btnDitekan[indeks] =0; } if ((btnPressed[index] ==LOW) &&(currentstate[index] ==HIGH)) { if (debug) { Serial.print("button ditekan:"); Serial.println(indeks +1); } btnDitekan[indeks] =1; } } }}void initVolume(){ valPotmeterVolume =(analogRead(potmeterVolume) / 30); if (Volume aktual> valPotmeterVolume) { lakukan { digitalWrite(fxVolumeArray[fxVolDn], RENDAH); volume aktual--; penundaan (20); digitalWrite(fxVolumeArray[fxVolDn], TINGGI); penundaan (20); } while (Volume aktual> valPotmeterVolume); } else if (actualVolume  valPotmeterVolume) { digitalWrite(fxVolumeArray[fxVolDn], RENDAH); volume aktual--; penundaan (40); digitalWrite(fxVolumeArray[fxVolDn], TINGGI); if (Volume aktual ==0) { enableAmpPower(false); } } else if (Volume aktual  -1) { matrix2.print(Skor tinggi); } else { matrix2.print(0); } matrix2.writeDisplay();}void playSound(int sound){ if (currentPlayingSound !=suara) { for (int counter =0; counter <11; counter++) { digitalWrite(fxTriggerArray[counter], HIGH); } digitalWrite(fxTriggerArray[suara], RENDAH); currentPlayingSound =suara; }}void enableAmpPower(bool state){ digitalWrite(ampPower, state);}

Suku cadang dan penutup khusus

Bagian MDF potong laser 6mm OC9CvHjuTzsYL9POZCJt.dxfLasercut bagian MDF 9mm 1irkeqvO4ABzhKqhmyG7.dxfLasercut bagian Plexiglass 3mm j4Tnmni6dQ0KXJtiHcy1.dxfArduino Mega Shield Kustom 5yiRX1RdQuPX0gNXjYkm.zip3D cetakan amp mount, cetak 2x3D arduino mega mount 3D print back connection panel mount3D print back connection panel3D printed Cable Clip, cetak sebanyak yang Anda suka 3D print led display mount, cetak 2x3D print led display mount lock, cetak 4x3D print led display bingkai atas, cetak penutup atas 2x3D dipasang di belakang, penutup atas 3D dipasang di depan, cetak 2x3D di samping penutup atas, cetak 2x

Skema


Proses manufaktur

  1. Cara Memilih Knob Instrumen
  2. Cara Memilih Sekrup Tutup Soket Tombol
  3. Tombol
  4. Tombol AWS IoT Terkendali Gerakan
  5. UnifiedWater v1
  6. Kotak Suara Seluler
  7. Cara Memilih Perusahaan Fabrikasi Prototipe PCB
  8. Bagaimana memilih kecepatan menggergaji?
  9. Bagaimana Memilih Pompa Submersible Terbaik?
  10. Mengapa Memilih Pusat Pembubutan Vertikal?