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

Сборка игровой консоли «Ниндзя Доллар» на Arduino UNO с LCD-дисплеем

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

Arduino UNO ×1
Adafruit Standard LCD 16×2 (белый на синем) ×1
Макетные платы (я использовал 2 для пространства, хватит одной) ×2
Потенциометр 10 кОм (однооборотный) — для контраста LCD ×1
Светодиоды (generic) ×2
Резистор 1 кОм ×4
Тактильные кнопки 12 мм (SparkFun) ×2
Пьезо-зумер (RobotGeek) ×1
Перемычки ×1 набор

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

О проекте

Простая LCD-игра. Вдохновлялся игрой «Динозавр» из Google Chrome, но добавил свои фишки. Доллар-воин движется постоянно, может прыгать над препятствиями и собирать «звезды» (очки). Прыжок над препятствием = 1 очко, пойманная звезда = 5 очков. Можно стрелять и уничтожать препятствия впереди. Светодиоды индицируют прыжок или выстрел. Каждые 10, 20, 30 очков скорость растет. На 50 очков — победа. Столкновение с препятствием — проигрыш. Границы легко меняются в коде. Добавлен пассивный зумер: звуки при прыжке/выстреле, мелодии победы и поражения. Мой первый проект здесь — жду комментариев!

Видео

(В оригинале встроено видео демонстрации)

Подключение

LCD-модуль имеет 16-пиновый разъем снизу. Вставьте в макетную плату как на фото. Все сигналы питания и управления идут через этот разъем.

Пины слева направо:

Соедините 5V Arduino с красной шиной макетной платы, GND — с синей.

Крайние выводы потенциометра → 5V и GND.

Пьезо-зумер 3 пина: S → pin 7, «-» → GND, третий → 5V. Если 2 пина: один → GND, второй → pin 7.

Кнопки по схеме: кнопка прыжка → pin 1, кнопка выстрела → pin 6. Светодиоды управляются только кнопками (не Arduino): анод к пину кнопки, подключенному к Arduino, катод → GND.

Код

dollar_warrior (Arduino)
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
const int buttonPin1 = 1;
const int buttonPin2 = 6;
const int buzzer = 7;
unsigned long pts = 0;
bool buttonState1 = 0, buttonState2 = 0;
int randomNums[6], randomNum = 0;
int randomNums1[3], randomNum1 = 0;
unsigned int myDelay = 500;
bool temp = 0;
int tempI[16];
bool temp1 = 0;
int tempI1[3];
int button2IsPressed = 0;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  lcd.begin(16, 2);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buzzer, OUTPUT);
  lcd.setCursor(4, 0); lcd.print("THE GAME");
  lcd.setCursor(2, 1); lcd.print("STARTS IN 5"); delay(1000);
  lcd.setCursor(12, 1); lcd.print("4"); delay(1000);
  lcd.setCursor(12, 1); lcd.print("3"); delay(1000);
  lcd.setCursor(12, 1); lcd.print("2"); delay(1000);
  lcd.setCursor(12, 1); lcd.print("1"); delay(1000);
  lcd.clear();
}

void loop() {
here:
  randomNum = random(5);
  for (int i = 0; i < randomNum; ++i) randomNums[i] = random(16);
  randomNum1 = random(3);
  for (int i = 0; i < randomNum1; ++i) randomNums1[i] = random(16);
  temp = 0;
  for (int j = 0; j < 3; ++j) tempI1[j] = 0;
  button2IsPressed = 0;
  for (int i = 0; i < 16; ++i) {
    if (pts > 9 && pts < 20) { lcd.setCursor(14, 0); myDelay = 400; }
    else if (pts > 19 && pts < 30) { lcd.setCursor(14, 0); myDelay = 300; }
    else if (pts > 29 && pts < 50) { myDelay = 200; lcd.setCursor(14, 0); }
    else if (pts >= 50) {
      pts = 0; myDelay = 500; lcd.clear();
      lcd.setCursor(5, 0); lcd.print("VICTORY");
      tone(buzzer, 262); delay(200);
      tone(buzzer, 330); delay(200);
      tone(buzzer, 392); delay(100);
      tone(buzzer, 330); delay(100);
      tone(buzzer, 392); delay(100);
      tone(buzzer, 523); delay(200);
      noTone(buzzer); delay(3000); lcd.clear(); goto here;
    }
    else lcd.setCursor(15, 0);
    lcd.print(pts);
    buttonState1 = digitalRead(buttonPin1);
    buttonState2 = digitalRead(buttonPin2);
    // Препятствия
    if (!temp) {
      for (int j = 0; j < randomNum; ++j) {
        lcd.setCursor(randomNums[j], 1); lcd.print("#");
      }
    } else {
      for (int j = 0; j < randomNum; ++j) {
        if (tempI[0] > randomNums[j]) {
          lcd.setCursor(randomNums[j], 1); lcd.print("#");
        }
      }
    }
    // Очки (звезды)
    if (!temp1) {
      for (int j = 0; j < randomNum1; ++j) {
        lcd.setCursor(randomNums1[j], 0); lcd.print("*");
      }
    } else {
      for (int j = 0; j < randomNum1; ++j) {
        if (randomNums1[j] != tempI1[j]) {
          lcd.setCursor(randomNums1[j], 0); lcd.print("*");
        }
      }
    }
    // Прыжок
    if (buttonState1 == HIGH) { lcd.setCursor(i, 0); tone(buzzer, 131); delay(200); noTone(buzzer); }
    else lcd.setCursor(i, 1);
    lcd.print("$");
    // Выстрел
    if (buttonState2 == HIGH) {
      tone(buzzer, 175); delay(100); noTone(buzzer);
      temp = 1;
      if (buttonState1 == LOW) tempI[button2IsPressed] = i;
      ++button2IsPressed;
      for (int k = i + 1; k < 16; ++k) {
        if (buttonState1 == LOW) lcd.setCursor(k, 1);
        else lcd.setCursor(k, 0);
        lcd.print("~"); delay(5);
        if (buttonState1 == LOW) lcd.setCursor(k - 1, 1);
        else lcd.setCursor(k - 1, 0);
        lcd.print(" "); delay(5);
      }
    }
    delay(myDelay); lcd.clear();
    // Сбор звезд
    for (int j = 0; j < randomNum1; ++j) {
      if (i == randomNums1[j] && buttonState1 == HIGH) {
        temp1 = 1; tempI1[j] = i; pts += 5;
      }
    }
    // Столкновение с препятствием
    for (int j = 0; j < randomNum; ++j) {
      if (i == randomNums[j] && buttonState1 == LOW && temp == 0) {
        pts = 0; myDelay = 500; lcd.clear();
        lcd.setCursor(6, 0); lcd.print("GAME");
        lcd.setCursor(6, 1); lcd.print("OVER");
        tone(buzzer, 349); delay(200);
        tone(buzzer, 277); delay(200);
        tone(buzzer, 220); delay(100);
        tone(buzzer, 277); delay(100);
        tone(buzzer, 220); delay(200);
        noTone(buzzer); delay(3000); lcd.clear(); goto here;
      }
      else if (i == randomNums[j] && buttonState1 == HIGH) ++pts;
    }
  }
}

Схемы

game_aUIjA6VZxX.fzz (Fritzing)

Сборка игровой консоли «Ниндзя Доллар» на Arduino UNO с LCD-дисплеем

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

  1. Шахматы: от древних корней к современному производству — экспертный обзор
  2. Пинбол: история, дизайн и производство классической аркадной игры
  3. Эволюция и мастерство американского футбольного мяча: от древних игр к современным стандартам НФЛ
  4. Создание игры в реальном времени на Arduino Nano с гироскопом MPU-6050 и OLED-дисплеем
  5. Создание рулетки на 37 светодиодов с Arduino Nano
  6. 3D RGB Arduclock — Bluetooth-часы на адресных LED с RTC
  7. Мониторинг состояния реки: Arduino-система контроля качества воды
  8. Интерактивная игра с джойстиком и LED-обратной связью на Arduino
  9. Find Me: Умный поисковик вещей на Arduino и Bluetooth
  10. Самодельный осциллограф на Arduino Nano (10 Гц – 50 кГц) с ЖК-дисплеем 128×64