Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Whac-A-Mole (Button Edition)

Компоненты и расходные материалы

Arduino Mega 2560
× 1
Adafruit 1.4 "4-значный 7-сегментный дисплей с рюкзаком I2C
Выберите нужный цвет
× 2
Большая аркадная кнопка Adafruit со светодиодной подсветкой (60 мм)
Выберите 5 разных цветов
× 5
Adafruit Audio FX Board 16 МБ
× 1
Adafruit 2.5w amp
× 2
Динамик:3 Вт, 4 Ом
× 2
Кнопка включения / выключения Adafruit со светодиодной подсветкой
× 1
Потенциометр Adafruit 10 кОм
× 2
Ручка потенциометра Adafruit
× 2
провод
× 1
Винты с потайной головкой M3 + гайки
× 1
Винты с потайной головкой M4 + гайки
× 1
Все детали, напечатанные на 3D-принтере
× 1
Все детали лазерной резки из МДФ
× 1
Пользовательский мегашит Arduino
× 1
Мега штабелируемые заголовки Arduino (для интервала)
× 1
Понижающий преобразователь постоянного тока Adafruit 5v 3A
× 1
Блок питания 12 В
× 1
Шина блока питания женского пола
× 1
Крепление для панели USB-B
× 1

Необходимые инструменты и машины

3D-принтер (общий)
отвертка
Паяльник (универсальный)

Приложения и онлайн-сервисы

IDE Arduino
Сервис лазерной резки MDF

Об этом проекте

Это кастомная игра в жанре «воткни крота». На данный момент он запрограммирован на базовую игру, но в этой функции можно создавать обновления.

Ключевые особенности:

  • 5 бутылок на саму игру. Каждая кнопка имеет свой яркий светодиод. Светодиоды управляются ШИМ (используются для последовательности окончания игры).
  • 10 выбираемых уровней. Уровень с 1 (легкий) до 10 (безумный). Во время игры вы должны нажать правильную кнопку в течение определенного времени. Эта продолжительность варьируется внутри каждого уровня (поэтому иногда приходится нажимать быстрее, чем на других этапах).
  • (псевдо) случайный выбор кнопки во время игры. Следующим шагом (кнопка, которую необходимо нажать) всегда является другая кнопка.
  • Отображаются 2 светодиодные цифры. Один для текущего счета / обратного отсчета / выбора уровня и один для отображения рекордов.
  • цифровой регулятор громкости
  • Сохранение рекордов
  • Звуковые эффекты. Во время различных состояний игры звуковые петли воспроизводятся через встроенные динамики.
  • Корпус для лазерной резки
  • Многие детали, напечатанные на 3D-принтере.
  • Пользовательский Mega Shield для Arduino

Корпус

Сначала начнем со сборки корпуса.

Установите монтажные кронштейны на 3D-принтере на верхнюю крышку.

Если хотите, покрасьте корпус.

Затем установите крепления для светодиодного дисплея. Не забудьте разместить болты под креплениями, иначе вертикальные перекладины невозможно будет закрепить.

Соберите щит Arduino. Я использовал дополнительный набор штабелируемых заголовков, чтобы было больше места между щитом и Arduino.

Соберите заднюю панель управления.

Соберите верхнюю крышку (кнопки и светодиодные панели).

Задняя панель управления включает два регулятора потенциометра; один для регулятора громкости, один для выбора уровня.

Выводы

Готово!

на левой светодиодной панели цифр вы можете увидеть выбранный уровень. Вы можете выбрать уровень от 1 (легкий) до 10 (безумный). На правой светодиодной панели с цифрами вы можете увидеть высокий балл для соответствующего уровня. Во время активной игры на левой цифровой панели отображается текущий счет. Теперь нажмите зеленую кнопку, чтобы начать игру. После обратного отсчета начнется игра.

Код

  • Whac_A_Mole_v1.0.0
Whac_A_Mole_v1.0.0 Arduino
Код Arduino, написанный в 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_7segment (); Adafruit_7segment matrix1 =Adafruit_7segment_7segment (); Adafruit_7segment (); # define debounceTime 10 // объявить элементы управления potmeter # определить potmeterVolume 0 # определить potmeterGameLevel 1 // объявить вывод питания усилителя # определить ampPower 32 // объявить кнопки # определить btn1Pin 22 # определить btn2Pin 24 # определить btn3Pin 26 # определить btn4Pin 28 # define btn5Pin 30byte btnArray [] ={btn1Pin, btn2Pin, btn3Pin, btn4Pin, btn5Pin}; # определить btn1 0 // для использования массива btn # определить btn2 1 // для использования массива btn # определить btn3 2 // для с использованием массива btn # define btn4 3 // для использования массива btn # define btn5 4 // для использования массива btn // объявить светодиоды кнопок # определить btnLed1Pin 9 # определить btnLed2Pin 10 # определить btnLed3Pin 11 # определить btnLed4Pin 12 # определить btnLed5Pin 13 байт btnLedArray [] ={btnLed1Pin, btnLed2Pin, btnLed3Pin, btnLed4Pin, btnLed5Pin}; # определить btnLed1 0 // f или используя массив btn # define btnLed2 1 // для использования массива btn # define btnLed3 2 // для использования массива btn # define btnLed4 3 // для использования массива btn # define btnLed5 4 // для использования массива 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 41 #defx7TriggerPin 45Trigger #define fx7TriggerPin 49 #define fx7TriggerPin 45 #define определим fxVolUpPin 51 # определить fxVolDnPin 53byte fxTriggerArray [] ={fx0TriggerPin, fx1TriggerPin, fx2TriggerPin, fx3TriggerPin, fx4TriggerPin, fx5TriggerPin, fx6TriggerPin, fx7TriggerPin, fx8TriggerPin, fx9TriggerPin, fx10TriggerPin}; байт fxVolumeArray [] ={fxVolUpPin, fxVolDnPin}; # определить fx0Trigger 0 // для использования массива btn # определить fx1Trigger 1 // для использования массива btn # определить fx2Trigger 2 // для использования массива btn # определить fx3Trigger 3 // для использования массива btn # определить fx4Trigger 4 // для использования b tn array #define fx5Trigger 5 // для использования массива btn #define fx6Trigger 6 // для использования массива btn #define fx7Trigger 7 // для использования массива btn #define fx8Trigger 8 // для использования массива btn #define fx9Trigger 9 // для использования массива btn # define fx10Trigger 10 // для использования массива btn # define fxVolUp 0 // для использования массива btn # define fxVolDn 1 // для использования массива btnigned int currentPlayingSound =-1; byte btnPressed [5 ], ledState [5]; // мигает ledunsigned long previousMillisLedBlink =0; // для мигания светодиода # определить intervalLedBlink 750 //// последовательность запуска игры без знака long previousMillisGameStarting =0; #define intervalCountDown 1000byte gameStartCountDown; //// шаги игры без подписи long previousMillisGameStep =0; int gameStepLength =0; // длина отдельного шага int gameStepBtn =0; // кнопка, которую нужно нажать // int valPotmeterVolume =0; int volume =0; int actualVolume =35; // объем adafruit fx boardint valPotmeterGameLevel =0; int gameLevel; int currentScore; int highScore; int highScoreAddr =1; byte activeBtn; bool debug; // включить отладку или отключение байта wackAMoleState; // состояние gamebool SystemInitialized =false; #define stateUnknown 0 # определить waitForStart 1 # определить начало 2 # определить выполнение 3 # определить gameOver 4 # определить остановлено 5void setup () {Serial.begin (9600); // инициализация вывода питания усилителя pinMode (ampPower, OUTPUT); digitalWrite (ampPower, LOW); // инициализируем контакты btn для (int Pin =0; Pin <5; Pin ++) {pinMode (btnArray [Pin], INPUT); } // инициализируем выводы светодиодов btn для (int Pin =0; Pin <5; Pin ++) {pinMode (btnLedArray [Pin], OUTPUT); } // инициализируем контакты btn fx для (int Pin =0; Pin <11; Pin ++) {pinMode (fxTriggerArray [Pin], OUTPUT); digitalWrite (fxTriggerArray [Pin], HIGH); } // инициализируем контакты громкости btn fx for (int Pin =0; Pin <2; Pin ++) {pinMode (fxVolumeArray [Pin], OUTPUT); digitalWrite (fxVolumeArray [Pin], HIGH); } matrix1.begin (0x70); matrix2.begin (0x71); в то время как (! eeprom_is_ready ()); // Ждем готовности EEPROM cli (); highScore =eeprom_read_word ((uint16_t *) (gameLevel * 2)); sei (); matrix1.print (0); matrix1.writeDisplay (); matrix2.print (0); matrix2.writeDisplay (); initializeSystem ();} недействительный цикл () {checkButtonInputs (); // при проверке переключателей мы получим текущее состояние readVolumePotmeter (); если (wackAMoleState ==waitForStart) {playSound (fx0Trigger); если (btnPressed [btn4]) {wackAMoleState =начало; } readGameLevelPotmeter (); ledBlinkStart (); } если (wackAMoleState ==начало) {startGame (); } если (wackAMoleState ==работает) {playSound (fx1Trigger); checkNextGameStep (); }} void checkNextGameStep () {беззнаковый длинный currentMillisGameStep =millis (); int amountOfButtonPresses =0; для (int btn =0; btn <5; btn ++) {если (btnPressed [btn]) {amountOfButtonPresses ++; }} если (previousMillisGameStep ==0) {previousMillisGameStep =currentMillisGameStep; digitalWrite (btnLedArray [btnLed4], LOW); randomSeed (analogRead (2)); gameStepBtn =random (0, 5); gameStepLength =random (3000 / gameLevel, 5000 / gameLevel); digitalWrite (btnLedArray [gameStepBtn], HIGH); // загорается индикатор новой кнопки} if ((currentMillisGameStep - previousMillisGameStep>
 =gameStepLength) || (amountOfButtonPresses> 1) || (amountOfButtonPresses ==1) &&! btnPressed [gameStepBtn]) {// Игра окончена ... playSound ( fx2Trigger); wackAMoleState =gameOver; previousMillisGameStep =0; for (int counter =0; counter <5; counter ++) {analogWrite (btnLedArray [счетчик], 255); } для (int яркость =255; яркость> 0; яркость--) {analogWrite (btnLedArray [btnLed1], яркость); analogWrite (btnLedArray [btnLed2], яркость); analogWrite (btnLedArray [btnLed3], яркость); analogWrite (btnLedArray [btnLed4], яркость); analogWrite (btnLedArray [btnLed5], яркость); задержка (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»); если (currentScore> highScore) {while (! eeprom_is_ready ()); // Ждем готовности EEPROM cli (); eeprom_write_word ((uint16_t *) (gameLevel * 2), currentScore); // Давайте инициализируем наше значение в EEPROM sei (); } int counter =0; делать {задержка (1); checkButtonInputs (); счетчик ++; } while ((counter <1000) &&! btnPressed [btn1] &&! btnPressed [btn2 &&! btnPressed [btn3] &&! btnPressed [btn4] &&! btnPressed [btn5]]); // ждем освобождения кнопки matrix1 .print (0); matrix1.writeDisplay (); wackAMoleState =waitForStart; } иначе, если (btnPressed [gameStepBtn] &&(amountOfButtonPresses ==1)) {digitalWrite (btnLedArray [gameStepBtn], LOW); // выключить светодиод предыдущей кнопки int counter =0; делать {задержка (1); checkButtonInputs (); счетчик ++; } while ((counter <1000) &&btnPressed [gameStepBtn]); // ждем отпускания кнопки previousMillisGameStep =currentMillisGameStep; int tempStepBtn =0; сделать {tempStepBtn =random (0, 5); gameStepLength =random (3000 / gameLevel, 5000 / gameLevel); } while (gameStepBtn ==tempStepBtn); gameStepBtn =tempStepBtn; digitalWrite (btnLedArray [gameStepBtn], HIGH); // загорается подсветка новой кнопки currentScore ++; matrix1.print (currentScore); matrix1.writeDisplay (); если (currentScore> highScore) {matrix2.print (currentScore); matrix2.writeDisplay (); }}} void ledBlinkStart () // мигание светодиода без задержки {unsigned long currentMillisLedBlink =millis (); если (currentMillisLedBlink - previousMillisLedBlink> =intervalLedBlink) {previousMillisLedBlink =currentMillisLedBlink; если (ledState [0] ==LOW) {ledState [0] =HIGH; } еще {ledState [0] =НИЗКИЙ; } digitalWrite (btnLedArray [btnLed4], ledState [0]); // зеленый светодиод / кнопка}} void startGame () // последовательность запуска самой игры {unsigned long currentMillisGameStarting =millis (); digitalWrite (btnLedArray [btnLed4], 0); // выключаем зеленый светодиод / кнопку currentScore =0; если (gameStartCountDown ==0) {playSound (fx3Trigger); previousMillisGameStarting =millis (); gameStartCountDown =4; задержка (300); matrix1.print (gameStartCountDown, DEC); matrix1.writeDisplay (); } если (currentMillisGameStarting - previousMillisGameStarting> =intervalCountDown) {previousMillisGameStarting =currentMillisGameStarting; если (gameStartCountDown> 0) {gameStartCountDown--; matrix1.print (gameStartCountDown, DEC); matrix1.writeDisplay (); если (gameStartCountDown ==0) {wackAMoleState =работает; }}}} void initializeSystem () {// добавьте сюда код инициализации ... digitalWrite (btnLedArray [btnLed1], HIGH); задержка (75); digitalWrite (btnLedArray [btnLed2], HIGH); задержка (75); digitalWrite (btnLedArray [btnLed3], HIGH); задержка (75); digitalWrite (btnLedArray [btnLed4], HIGH); задержка (75); digitalWrite (btnLedArray [btnLed5], HIGH); задержка (1000); digitalWrite (btnLedArray [btnLed5], LOW); задержка (75); digitalWrite (btnLedArray [btnLed4], LOW); задержка (75); digitalWrite (btnLedArray [btnLed3], LOW); задержка (75); digitalWrite (btnLedArray [btnLed2], LOW); задержка (75); digitalWrite (btnLedArray [btnLed1], LOW); задержка (1000); отладка =правда; wackAMoleState =waitForStart; initVolume (); если (фактический объем> 0) {enableAmpPower (истина); }} void checkButtonInputs () // проверка изменений кнопки {static byte previousstate [5]; статический байт currentstate [5]; статический длительный срок службы; байтовый индекс; // устранение неполадок if ((lasttime + debounceTime)> millis ()) {return; } lasttime =millis (); // for (index =0; index <5; index ++) {currentstate [index] =digitalRead (btnArray [index]); // считываем кнопку if (currentstate [index]! =btnPressed [index]) {if ((btnPressed [index] ==HIGH) &&(currentstate [index] ==LOW)) {if (debug) {Serial.print ("кнопка отпущена:"); Serial.println (индекс + 1); } btnPressed [индекс] =0; } if ((btnPressed [index] ==LOW) &&(currentstate [index] ==HIGH)) {if (отладка) {Serial.print ("кнопка нажата:"); Serial.println (индекс + 1); } btnPressed [индекс] =1; }}}} void initVolume () {valPotmeterVolume =(analogRead (potmeterVolume) / 30); если (actualVolume> valPotmeterVolume) {делать {digitalWrite (fxVolumeArray [fxVolDn], LOW); actualVolume--; задержка (20); digitalWrite (fxVolumeArray [fxVolDn], HIGH); задержка (20); } while (actualVolume> valPotmeterVolume); } else if (actualVolume  valPotmeterVolume) {digitalWrite (fxVolumeArray [fxVolDn], LOW); actualVolume--; задержка (40); digitalWrite (fxVolumeArray [fxVolDn], HIGH); если (фактический объем ==0) {enableAmpPower (ложь); }} else if (actualVolume  -1) {matrix2.print (highScore); } else {matrix2.print (0); } matrix2.writeDisplay ();} void playSound (int sound) {if (currentPlayingSound! =звук) {для (int counter =0; counter <11; counter ++) {digitalWrite (fxTriggerArray [counter], HIGH); } digitalWrite (fxTriggerArray [звук], LOW); currentPlayingSound =звук; }} void enableAmpPower (логическое состояние) {digitalWrite (ampPower, state);} 

Изготовленные на заказ детали и корпуса

Лазерная резка деталей из МДФ 6 мм OC9CvHjuTzsYL9POZCJt.dxf Лазерная резка деталей из МДФ 9 мм 1irkeqvO4ABzhKqhmyG7.dxfLasercut детали из оргстекла 3 мм j4Tnmni6dQ0KXJtiHcy1.dxf Пользовательский Mega Shield для Arduino 5yiRX1RdQuPX0gNXjYkm.zip3D печатное крепление усилителя, печать 2x3D печатное крепление Arduino Mega Mount Крепление для задней панели с 3D-печатью3D печатная задняя панель для подключения Кабельный зажим с 3D-печатью, печать любого количества Крепление для светодиодного дисплея с 3D-печатью, печать 2x3D печатный замок для крепления светодиодного дисплея, печать 4x3D печатный светодиодный дисплей верхняя рамка, печать 2x3D печать на верхней крышке сзади 3D печать на верхней крышке спереди, печать 2x3D сторона крепления верхней крышки с печатью, печать 2x

Схема


Производственный процесс

  1. Как выбрать инструментальные ручки
  2. Как выбрать винты с головкой под торцевой ключ
  3. Кнопка
  4. Кнопка AWS IoT с управлением движением
  5. UnifiedWater v1
  6. Мобильный ящик для голосования
  7. Как выбрать компанию по производству прототипов печатных плат
  8. Как выбрать скорость пиления?
  9. Как выбрать лучший погружной насос?
  10. Почему выбирают вертикальные токарные центры?