Сборка игровой консоли «Ниндзя Доллар» на 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
О проекте
Простая LCD-игра. Вдохновлялся игрой «Динозавр» из Google Chrome, но добавил свои фишки. Доллар-воин движется постоянно, может прыгать над препятствиями и собирать «звезды» (очки). Прыжок над препятствием = 1 очко, пойманная звезда = 5 очков. Можно стрелять и уничтожать препятствия впереди. Светодиоды индицируют прыжок или выстрел. Каждые 10, 20, 30 очков скорость растет. На 50 очков — победа. Столкновение с препятствием — проигрыш. Границы легко меняются в коде. Добавлен пассивный зумер: звуки при прыжке/выстреле, мелодии победы и поражения. Мой первый проект здесь — жду комментариев!
Видео
(В оригинале встроено видео демонстрации)
Подключение
LCD-модуль имеет 16-пиновый разъем снизу. Вставьте в макетную плату как на фото. Все сигналы питания и управления идут через этот разъем.
Пины слева направо:
- GND — земля питания
- VCC — +5V
- V0 — регулировка контраста
- RS — выбор регистра
- R/W — чтение/запись
- E —_ENABLE_
- D0–D3 — данные 0–3 (не используются в 4-битном режиме)
- D4 — данные 4
- D5 — данные 5
- D6 — данные 6
- D7 — данные 7
- A — анод подсветки
- K — катод подсветки
Соедините 5V Arduino с красной шиной макетной платы, GND — с синей.
- VSS → GND
- VDD → 5V
- V0 → средний вывод потенциометра
- RS → Arduino pin 12
- RW → GND
- E → Arduino pin 11
- D4 → pin 5
- D5 → pin 4
- D6 → pin 3
- D7 → pin 2
- A → 5V
- K → 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 Nano с гироскопом MPU-6050 и OLED-дисплеем
- Создание рулетки на 37 светодиодов с Arduino Nano
- 3D RGB Arduclock — Bluetooth-часы на адресных LED с RTC
- Мониторинг состояния реки: Arduino-система контроля качества воды
- Интерактивная игра с джойстиком и LED-обратной связью на Arduino
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Самодельный осциллограф на Arduino Nano (10 Гц – 50 кГц) с ЖК-дисплеем 128×64