Игра «UFO Attack» на Arduino UNO и матрице MAX7219 — Собираем аркаду с джойстиком Atari
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Arduino UNO | 1 |
| Модуль матрицы MAX7219 «4 в 1» (4 каскадированных 8×8) | 1 |
| Разъем DB9 (9-pin) для джойстика Atari | 1 |
| Транзистор NPN (например, 2N2222) | 1 |
| Макетная плата (breadboard) | 1 |
| Пассивный пьезо-зуммер | 1 |
| Провода-перемычки (Male/Female) | 5 |
| Провода-перемычки (обычные) | 10 |
| Резистор 1 кОм | 1 |
| Джойстик Atari-совместимый (9-pin) | 1 |
О проекте
Классическая аркада «UFO Attack» на Arduino UNO с дисплеем из четырех матриц 8×8 на драйвере MAX7219. Управление — старым джойстиком Atari (9-pin). Код написан с использованием библиотек Max72xxPanel, Adafruit GFX и SPI.
Геймплей: на каждом уровне нужно сбить заданное количество НЛО, после чего появляется босс. 10 уровней с нарастающей сложностью. В будущем планируется портативная версия.
Схема подключения
Схема в разделе Schematics. Основные соединения:
- MAX7219: DIN → MOSI (D11), CLK → SCK (D13), CS → D10
- Джойстик: Up→D2, Down→D3, Left→D4, Right→D5, Fire→D6 (все с INPUT_PULLUP)
- Зуммер: D9 через резистор 1кОм и транзистор
- Питание: 5V и GND от Arduino
Код (основные моменты)
Полный скетч (~1300 строк) доступен в разделе Code. Здесь ключевые фрагменты:
Инициализация дисплея и спрайтов:
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
const int pinCS = 10;
const int numberOfHorizontalDisplays = 4;
const int numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
// Спрайты 8x8 в PROGMEM
const unsigned char ship[] PROGMEM = { 0x80, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
const unsigned char ufo[] PROGMEM = { 0x40, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
const unsigned char boss[] PROGMEM = { 0x18, 0x24, 0x42, 0xff, 0x24, 0xff, 0x7e, 0x3c };
// ... explosion, bouncer, faller, riser, LT, ufoLaser, bossBoom1/2
Настройка матрицы (setup):
void setup() {
pinMode(buzzerPin, OUTPUT);
// Джойстик
pinMode(up, INPUT_PULLUP); pinMode(down, INPUT_PULLUP);
pinMode(left, INPUT_PULLUP); pinMode(right, INPUT_PULLUP);
pinMode(trigger, INPUT_PULLUP);
// Матрица: интенсивность, позиция, поворот
matrix.setIntensity(0);
for (int i = 0; i < 4; i++) {
matrix.setPosition(i, 3-i, 0);
matrix.setRotation(i, 3);
}
matrix.fillScreen(LOW);
}
Игровой цикл (loop):
void loop() {
if (!gameStart) Ticker(true); // Бегущая строка «UFO ATTACK! - Press fire to start»
SpawnTimer(); // Таймеры спавна врагов
JoystickControl(); // Движение корабля и стрельба
UfoControl(); // Движение НЛО
BouncerControl(); // Движение баунсеров
LaserControl(); // Лазер игрока + коллизии
ScreenLimit(); // Границы экрана
BossBattle(); // Сирена + спавн босса
BossControl(); // Движение босса, стрельба, миньоны
UFOLaserControl(); // Лазеры босса
LTControl(); // Мини-босс LT
FallerControl(); // Падающие враги (от лвл 4)
RiserControl(); // Поднимающиеся враги (от лвл 5)
ShipCollision(); // Проверка попаданий в корабль
matrix.write();
delay(50);
matrix.fillScreen(LOW);
}
Уровни сложности (функция Level):
void Level(int level) {
if (level == 1) { spawnTime=3000; spawnTime2=10000000; killsTarget=10; bossHealth=10; bossLaserTimer=1000; }
if (level == 2) { spawnTime=3000; spawnTime2=8000; killsTarget=20; bossHealth=15; bossLaserTimer=900; }
// ... до уровня 10: spawnTime=2000; spawnTime2=5000; killsTarget=100; bossHealth=55; bossLaserTimer=100;
}
Особенности реализации
- Таймеры на millis() — без блокирующих delay для плавной анимации.
- Коллизии по пикселям — проверка координат каждого спрайта.
- Звук — простые tone() для выстрелов, взрывов, сирены босса (синусоидальная частота).
- Бегущая строка — для титулов, счета и Game Over.
Перспективы
Автор планирует сделать портативную версию (handheld) с встроенным джойстиком и батареей. Код открыт — можете форкать и добавлять новые типы врагов, бонусы, хайскоры в EEPROM и т.д.
Производственный процесс
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- Эффект огня на воде: проект с Arduino UNO, NeoPixel и ультразвуковым увлажнителем
- 3D RGB Arduclock — Bluetooth-часы на адресных LED с RTC
- Мониторинг состояния реки: Arduino-система контроля качества воды
- Строим Iron Man на Arduino: компоненты, сенсоры и пошаговый гайд
- Интерактивная игра с джойстиком и LED-обратной связью на Arduino
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Сборка функционального 3D-печатного манипулятора на Arduino: пошаговое руководство
- Портативный дальномер на Arduino Nano: HC-SR04, питание 18650, 3D-корпус
- DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением