Pixel Chaser: игра на один тап с NeoPixel Ring и Arduino Nano
Компоненты и материалы
| Компонент | Количество | Примечание |
|---|---|---|
| Arduino Nano R3 | 1 | Любой МК с 2 свободными пинами |
| Adafruit NeoPixel Ring (WS2812, 24 LED) | 1 | Игровое поле |
| Половинчатая беспаечная плата | 1 | |
| Резистор 10 кОм | 1 | Pull-down для кнопки |
| Тактильная кнопка 12 мм | 1 | Единственное управление |
| Перемыточные провода | 1 набор |
Инструменты и софт
- Arduino IDE
- Библиотеки: Adafruit_NeoPixel, OneButton (из менеджера библиотек)
Концепция
Бывший геймдев, искал «святой грааль» мобильных игр — идеальную one-tap игру. Решил перенести идею на микроконтроллер: одна кнопка, кольцо LED, физика движения. Родился Pixel Chaser!
Пошаговая сборка
- Nano на краю платы — USB разъём наружу.
- Кнопка на противоположном краю — удобно жать большим пальцем.
- Резистор 10 кОм между одним контактом кнопки и GND (pull-down, защита от КЗ).
- Провод от другого контакта кнопки к VCC — при нажатии HIGH.
- Провод от GND-стороны кнопки к D3 Nano — считываем состояние.
- NeoPixel Ring: VCC → VCC шина, GND → GND шина, DI → D4 Nano.
- Питание: 5V Nano → VCC шина, GND Nano → GND шина.
- Загрузка кода — и играем!









Правила игры
- Игрок (зелёный пиксель) движется по кругу с постоянной скоростью.
- Одиночный тап — смена направления.
- Длинное нажатие — пауза/рестарт.
- Враг (красный) стоит на месте. Монета (жёлтая) — между игроком и врагом.
- Собрать монету → +1 очко, враг и монета перемещаются, скорость растёт.
- Удар во врага → Game Over, анимация, показ лучшего счёта.
Код (Pixel Chaser Game - Arduino Code)
/* Pixel Chaser Game - v1.0.0
Author: Seon Rozenblum (unexpectedmaker.com)
License: GNU GPL v3
*/
#include <Adafruit_NeoPixel.h>
#include "OneButton.h"
#define PIXELPIN 4
#define NUMPIXELS 24
#define BUTTON_TAP 3
OneButton buttonTAP(BUTTON_TAP, false);
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIXELPIN, NEO_GRB + NEO_KHZ800);
int playerIndex = -1, playerIndexTrail = -1, playerDirection = 1;
float nextMove = 0, currentPlayerSpeed = 150;
unsigned long countdown = 0;
int enemyIndex = -1, coinIndex = -1;
int score = 0, bestScore = 0, lastScore = 0;
bool gameOver = false;
void setup() {
pinMode(BUTTON_TAP, INPUT);
buttonTAP.attachClick(singleClick);
buttonTAP.attachLongPressStart(longClick);
pixels.begin();
pixels.setBrightness(20);
countdown = millis() + 2000;
}
void loop() {
buttonTAP.tick();
if (gameOver) return;
SetLevel();
if (countdown > millis()) { pixels.show(); return; }
DisplayPlayer();
pixels.show();
}
void ClearLevel() {
for (int i=0; i= 0) pixels.setPixelColor(playerIndexTrail, 0);
if (playerIndex >= 0) {
pixels.setPixelColor(playerIndex, pixels.Color(0,100,0));
playerIndexTrail = playerIndex;
}
playerIndex += playerDirection;
if (playerIndex < 0) playerIndex = NUMPIXELS-1;
else if (playerIndex == NUMPIXELS) playerIndex = 0;
pixels.setPixelColor(playerIndex, pixels.Color(0,255,0));
if (playerIndex == coinIndex) {
enemyIndex = -1; coinIndex = -1; score++;
currentPlayerSpeed = constrain(currentPlayerSpeed - 10, 50, 150);
ClearLevel();
pixels.setPixelColor(playerIndex, pixels.Color(0,255,0));
} else if (playerIndex == enemyIndex) {
lastScore = score; if (score >= bestScore) bestScore = score;
GameOver(); gameOver = true;
enemyIndex = -1; coinIndex = -1; playerIndex = -1;
}
}
}
void singleClick() {
if (countdown > millis()) return;
playerDirection = -playerDirection;
}
void longClick() {
gameOver = !gameOver;
if (gameOver) { enemyIndex = -1; coinIndex = -1; playerIndex = -1; currentPlayerSpeed = 150; ClearLevel(); }
else { ClearLevel(); score = 0; currentPlayerSpeed = 150; countdown = millis() + 2000; }
}
Контакты автора
- Twitter: @unexpectedmaker
- Facebook: unexpectedmaker
- Instagram: @unexpectedmaker
- Patreon: поддержка
- Tindie: магазин плат
Производственный процесс
- Создание игры в реальном времени на Arduino Nano с гироскопом MPU-6050 и OLED-дисплеем
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- Создание классической игры Pong на Arduino UNO с OLED-дисплеем: пошаговый урок
- Создание рулетки на 37 светодиодов с Arduino Nano
- DIY USB-геймпад на Arduino: собственный высокопроизводительный контроллер
- Arduino Breakout на сенсорном TFT 2.4″: классическая аркада своими руками
- Tetris на Arduino Nano: самостоятельная сборка 16×8 LED-матрицы на 74HC595
- Магнитная левитация на отталкивании с Arduino: Простая схема и DIY-руководство
- Автоматизация игры «Динозавр» в Chrome на Arduino и LDR с Python
- Arduino Home Controller с Alexa: умный дом голосовым управлением