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

Макет печатной платы, часть 1 - Создание игры, по словам Саймона

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

Arduino UNO
× 1
Беспаечный макет, полный размер
× 1
LED (общий)
× 4
Кнопочный переключатель SparkFun, 12 мм
× 4
Зуммер
× 1
Перемычки (общие)
× 12
Резистор 10 кОм
× 4
Резистор 330 Ом
× 4
Кабель USB-A - B
× 1

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

IDE Arduino

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

Введение

Мы все видели старую игру Simon Says, в которой вы пытаетесь скопировать последовательность огней, нажимая кнопку, которая соответствует правильной последовательности света. Для Hackster Live мы продемонстрировали инструмент проектирования печатных плат под названием Upverter. Это забавный и простой проект для создания и превращения в печатную плату. Ниже представлен базовый проект, показывающий создание игры с аппаратным обеспечением и кодом.

Эта серия проектов состоит из трех частей.

  • Часть 1. Создание игры по словам Саймона
  • Часть 2: Разработайте печатную плату на основе игры Simon Says с помощью Upverter
  • Часть 3: Сделайте свою собственную печатную плату по дизайну, который вы создали на Upverter

Что вы узнаете из этой серии

  • Как разместить базовый проект на макете
  • Как разложить печатную плату в Upverter
  • Как фрезеровать печатную плату на станке с ЧПУ

Программное обеспечение

Если у вас нет Arduino IDE для написания и загрузки кода на Arduino, загрузите последнюю версию для своей операционной системы здесь.

Настройка оборудования

Я использовал пример Sparkfun Inventor’s Kit в качестве вдохновения для настройки моего оборудования и немного его скорректировал. Посмотрите на диаграмму Fritzing ниже.

Код

Самое интересное в этой игре то, что у вас может быть так много вариаций. Как я уже упоминал выше, я использовал пример Sparkfun в качестве отправной точки для настройки моего оборудования и написал код с нуля. Если написание собственного кода вас не интересует, вы можете использовать мой ниже, использовать код Sparkfun в примере, упомянутом выше, с некоторыми изменениями, или искать другие игры / коды, которые, по словам Саймона, будут работать с настройкой вашего оборудования. .

Я включил подробные комментарии и отладочные строки последовательной печати в свой код, чтобы вы могли видеть, что происходит на последовательном мониторе во время работы игры. Посмотрите видео об игре Simon Says в действии ниже!

Саймон говорит, что игровое видео

* Примечание:в этом видео я установил количество огней в ряду, которое мне нужно для победы, равным 5. Это можно изменить, чтобы усложнить игру, но я хотел, чтобы мое видео было относительно коротким :).

Теперь вы готовы превратить вашу макетную плату в печатную плату! Узнайте, как это сделать в разделе "Макетная плата на печатную плату. Часть 2 - Проектирование печатной платы с использованием апвертера".

Код

  • Саймон говорит, что код Arduino
Саймон говорит, что код Arduino Arduino
 int ledArray [] ={12, 9, 5, 2}; // ledArray [0] зеленый, ledArray [1] красный, ledArray [2] желтый, а ledArray [3] синий. int buttonArray [] ={13, 10, 6, 3}; // buttonArray [0] зеленый, buttonArray [1] красный, buttonArray [2] желтый, а buttonArray [3] синий. int pinCount =4; // и ledArray, и buttonArray имеют одинаковый pinCount -> используйте это для кнопок и светодиодов int buzzer =8; int ledState =0; int gameState =0; #define NUMBERTOWIN 5 // Количество огней, которые вам нужно сопоставить, чтобы выиграть -> Вы можете изменить это число, чтобы сделать игру более или менее сложной для победы int gameValues ​​[NUMBERTOWIN]; int roundNum =0; беззнаковый длинный предыдущийМиллис =0; // это необходимо для состояния перед игрой, чтобы индикаторы мигали без задержки -> если вы используете задержку, нажатие кнопки для запуска игры может быть не замечено unsigned long interval1 =500; // это нужно для промежутка времени между миганиями // объявить функцииvoid setLed (int ledNum); void displayClue (int roundNum); boolean waitForInput (int buttonNum); void setup () {Serial.begin (9600); Serial.println ("настройка"); for (int Pin =0; Pin  функция setLed () сообщает, что если ledNum <0, светодиоды НИЗКОЕ setLed (-1); // установить нулевое число раунда, чтобы начать с первого раунда roundNum =0; задержка (1000); // устанавливаем gameState равным 1 gameState =1; }} если (gameState ==1) {gamePlay (); } if (gameState ==2) {// Вы выиграли !! - проиграйте выигрышный звук и прокрутите светодиоды (winDisplay) 3 раза, а затем проиграйте один раз для хорошего перехода. // задержка, чтобы дать игроку время отпустить нажатие кнопки перед воспроизведением выигрышного звука delay (500); win_sound (); winDisplay (); winDisplay (); winDisplay (); lostDisplay (); Serial.println ("winDisplay"); // кратковременная задержка перед запуском pre_game delay (1000); // сбрасываем gameState в ноль для вызова pre_game gameState =0; } if (gameState ==3) {// Вы проигрываете :( - проигрывайте звук и мигайте светодиодами (lostDisplay) 3 раза для хорошего перехода. // задержка, чтобы дать игроку время отпустить нажатие кнопки до потери звука, проигрывает задержку (500); Lost_sound (); LossDisplay (); LossDisplay (); LossDisplay (); Serial.println ("lostDisplay"); // задержка на короткое время перед запуском pre_game delay (1000); // сбрасываем gameState в ноль для вызова pre_game gameState =0;}} // pre_gamevoid pre_game () {// Проверяем, прошло ли достаточно времени между загоранием светодиодов unsigned long currentMillis =millis (); if (currentMillis - previousMillis> interval1) {// если прошло достаточно времени, то обновление загорится if ( ledState ==0) {Serial.println ("предварительно зеленый"); setLed (0); ledState =1;} else if (ledState ==1) {Serial.println ("предварительно красный"); setLed (1); ledState =2;} else if (ledState ==2) {Serial.println ("pre yellow"); setLed (2); ledState =3;} else if (ledState ==3) {Serial.println ("pre blue "); setLed (3); ledState =0;} // сбросить время previousMillis =currentMillis; }} // функция во время игрыvoid gamePlay () {Serial.println ("gamePlay"); // предварительно загружаем массив случайных чисел для игры for (int i =0; i  если какая-либо кнопка нажата, перейдите к остальной части кода if (! button0 ||! button1 ||! button2 ||! button3) {// Задержка на короткое время, чтобы избежать двойного подсчета задержки нажатия кнопки ( 250); // загорается соответствующий светодиод при нажатии кнопки if (buttonNum ==0) {digitalWrite (ledArray [0], HIGH); задержка (250); digitalWrite (ledArray [0], LOW); } иначе, если (buttonNum ==1) {digitalWrite (ledArray [1], HIGH); задержка (250); digitalWrite (ledArray [1], LOW); } иначе, если (buttonNum ==2) {digitalWrite (ledArray [2], HIGH); задержка (250); digitalWrite (ledArray [2], LOW); } иначе, если (buttonNum ==3) {digitalWrite (ledArray [3], HIGH); задержка (250); digitalWrite (ledArray [3], LOW); } // проверяем, была ли нажата правильная кнопка if (buttonNum ==0 &&button0 ==0) {Serial.println ("0 Pressed"); вернуть истину; } else if (buttonNum ==1 &&button1 ==0) {Serial.println ("1 нажато"); вернуть истину; } else if (buttonNum ==2 &&button2 ==0) {Serial.println ("2 нажатых"); вернуть истину; } else if (buttonNum ==3 &&button3 ==0) {Serial.println ("3 нажатых"); вернуть истину; } else {вернуть ложь; }}}} // после победы - быстро прокрутите свет, чтобы избежать winDisplay () {digitalWrite (ledArray [0], HIGH); delay (75); digitalWrite (ledArray [0], LOW); delay (75); digitalWrite (ledArray [1], HIGH); delay (75); digitalWrite (ledArray [1], LOW); delay (75); digitalWrite (ledArray [2], HIGH); delay (75); digitalWrite (ledArray [2], LOW) ); delay (75); digitalWrite (ledArray [3], HIGH); delay (75); digitalWrite (ledArray [3], LOW); delay (75); digitalWrite (ledArray [2], HIGH); delay (75) ); digitalWrite (ledArray [2], LOW); delay (75); digitalWrite (ledArray [1], HIGH); delay (75); digitalWrite (ledArray [1], LOW); delay (75); digitalWrite (ledArray [0], HIGH); delay (75); digitalWrite (ledArray [0], LOW); delay (75);} void Winning_sound (void) {// тон (номер контакта, частота - я поискал это в Интернете, чтобы найти частота нот, которые я хотел, продолжительность мелодии) Serial.println ("buzzer1"); тон (зуммер, 294, 250); задержка (200); тон (зуммер, 294, 250); задержка (200); тон (зуммер, 294, 250); задержка (200); тон (зуммер, 392, 500); задержка (500); Serial.println («второй 392»); тон (зуммер, 392, 250); задержка (200); тон (зуммер, 440, 250); задержка (200); тон (зуммер, 392, 250); задержка (200); тон (зуммер, 440, 250); задержка (200); тон (зуммер, 494, 500);} void lossDisplay () {digitalWrite (ledArray [0], HIGH); digitalWrite (ledArray [1], ВЫСОКИЙ); digitalWrite (ledArray [2], ВЫСОКИЙ); digitalWrite (ledArray [3], ВЫСОКИЙ); задержка (200); digitalWrite (ledArray [0], LOW); digitalWrite (ledArray [1], LOW); digitalWrite (ledArray [2], LOW); digitalWrite (ledArray [3], LOW); delay (200);} void loss_sound (void) {Serial.println ("Lost_sound"); тон (зуммер, 98, 250); задержка (250); тон (зуммер, 93, 250); задержка (250); тон (зуммер, 87, 250); задержка (250);} 

Схема

simon_says_fritzing_Yb8EdKPqD4.fzz

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

  1. Игра с гироскопом Arduino с MPU-6050
  2. Цифровые игральные кости Arduino
  3. Рулетка DIY 37 LED
  4. Игровой контроллер Arduino
  5. Игра с джойстиком
  6. Переносимый детектор дальности
  7. Игра Pixel Chaser
  8. Гальваника медью
  9. Производство 101:стать частью аэрокосмической отрасли
  10. Процессы, задействованные в производстве 4-слойных печатных плат — часть 2