DIY-костюм Pac-Man на адресных светодиодах: светящийся пиксельный костюм на Halloween
Компоненты и материалы
| Компонент | Количество | Примечание |
|---|---|---|
| Arduino Uno | 1 | Управление лентой |
| WS2811 12мм адресные светодиоды (DC 5V) | ~170 на костюм | Ленты по 50 шт, всего 4 костюма |
| Портативный Power Bank 5V (2200-7800 мАч) | 1 на костюм | Вместо 8xAA (12V — не подходит!) |
| USB → DC-jack переходник | 1 на костюм | Питание ленты от Power Bank |
| Картон 3 мм (1/8 дюйма) | несколько листов | Основа панели |
| Калька/велюм/майлар (прозрачная бумага) | 1 рулон | Диффузор для пикселей |
| Велкро, дюк-лента, канцелярский клей, клеевой пистолет | 1 набор | Сборка и крепление |
| Лазерный резак (или ножницы/нож для ручной резки) | 1 | Опционально, но очень удобно |
О проекте
Семейные костюмы Pac-Man, Ms. Pac-Man и призраков Blinky/Pinky на адресных светодиодах WS2811. Каждый костюм — пиксельная панель 13x13 или 14x14, управляемая Arduino Uno и библиотекой FastLED. Анимации: открывание рта у Пакмена, движение ног и взгляд у призраков, «грустный» режим при съедении.
Планирование и спрайты
Использованы оригинальные 8-битные спрайты. Каждый кадр анимации разложен в Excel для определения номеров светодиодов. Призраки: 14x14 = 170 пикселей (LED 0-169). Pac-Man: 13x13 = 137. Ms. Pac-Man: 14x14 = 151 (с бантиком).
Масштабирование
Размер панели подобрали по младшему члену семьи: 22 дюйма (56 см) высота/ширина призрака. Масштаб: 22″ / 14 px = 1.57″/px (≈40 мм/пиксель). Все костюмы в одном масштабе.
Конструкция панели (картон + лазерная резка)
- Основа: Две половинки 32x18″, склеены дюк-лентой (лазер режет макс. 32x18″).
- Сетка (слайты): Вертикальные и горизонтальные ребра с пазами, собираются в клетки без клея. Надёжно фиксируются на основе. Каждый слайт помечен H#/V#.
- Отверстия под LED: 12 мм в центре каждой клетки.
- Задняя стенка: Важно! Автор забыл сделать её — светодиоды выпадали во время ходьбы. Обязательно сделайте заднюю стенку из картона (2.5″ полосы по периметру).
Раскладка и монтаж светодиодов
В Excel спланирован порядок LED (змейкой по соседним клеткам, шаг ленты ~75 мм). Начало ленты — рядом с местом монтажа Arduino/Power Bank. Светодиоды вставляются сзади, фланец держит их. Для надежности — капля термоклея.
Электрика и питание
- Лента: Красный = 5V, Зеленый = DATA, Белый = GND (проверьте свою ленту!)
- Первый LED: питание → DC-jack (от Power Bank), DATA → пин 3 Arduino, GND → общий GND.
- Power Bank 5V: 2200 мАч = ~3ч 40м, 7800 мАч = ~12ч 43м. 8xAA (12V) — не подходит, может сжечь ленту!
- Все соединения изолируйте дюк-лентой. Arduino и Power Bank на велкро сзади панели.
Программирование (FastLED)
Логика анимации: заливаем все LED цветом тела, затем перекрашиваем/гасим конкретные индексы для каждого кадра. Кадры циклятся с задержкой.
Призрак (170 LED): красный корпус, белые глаза, синие зрачки (смотрят влево/вправо), черные «пустоты» у ног (альтернация для анимации ходьбы). Режим «грустный»: синий корпус, желтые глаза, мигание.
Pac-Man (137 LED): желтый корпус, черная пасть (3 фазы: открыта/полуоткрыта/закрыта), красные/синие/фиолетовые акценты.
Ms. Pac-Man (151 LED): аналогично + бантик.
Код для Призрака (фрагмент)
#include "FastLED.h"
#define NUM_LEDS 170
#define DATA_PIN 3
CRGB leds[NUM_LEDS];
// Индексы пикселей для анимаций (определены в Excel)
int eyes_pixels_l[] = {17,20,21,24,37,38,39,40,41,47,48,49,94,102,103,106,119,120,121,122,123,129,130,131};
int pupils_pixels_l[] = {15,16,22,23,92,93,104,105};
int eyes_pixels_r[] = {38,39,40,46,47,48,49,50,63,66,67,75,120,121,122,128,129,130,131,132,145,148,149,152};
int pupils_pixels_r[] = {64,65,76,77,146,147,153,154};
int void_pixels_1[] = {8,29,30,31,83,84,85,86,138,139,140,161};
int void_pixels_2[] = {7,31,55,56,57,112,113,114,138,162};
int sad_ghost[] = {11,26,35,48,49,53,60,64,65,80,89,104,105,109,116,120,121,134,143,158};
int feet_delay = 120; // мс между кадрами ног
int eye_loop = (2*1000)/feet_delay; // 2 сек смотрит в сторону
void setup() {
delay(2000);
FastLED.addLeds(leds, NUM_LEDS);
FastLED.setBrightness(40); // 0-255
FastLED.clear();
}
void loop() {
// Обычный призрак: смотрит влево/вправо, ноги двигаются
for (int i = 0; i < 5; i++) { // 5 циклов по 2 сек = 10 сек
// Смотрит влево
for (int j = 0; j < eye_loop; j++) {
fill_solid(leds, NUM_LEDS, CRGB::Red);
set_pixels(eyes_pixels_l, 24, CRGB::White);
set_pixels(pupils_pixels_l, 8, CRGB::DarkBlue);
set_pixels(void_pixels_1, 12, CRGB::Black);
FastLED.show(); delay(feet_delay);
fill_solid(leds, NUM_LEDS, CRGB::Red);
set_pixels(eyes_pixels_l, 24, CRGB::White);
set_pixels(pupils_pixels_l, 8, CRGB::DarkBlue);
set_pixels(void_pixels_2, 10, CRGB::Black);
FastLED.show(); delay(feet_delay);
}
// Смотрит вправо (аналогично с _r массивами)
...
}
// Грустный призрак (после "смерти")
for (int i = 0; i < 50; i++) {
fill_solid(leds, NUM_LEDS, CRGB::Blue);
set_pixels(sad_ghost, 20, CRGB::Yellow);
set_pixels(void_pixels_1, 12, CRGB::Black);
FastLED.show(); delay(feet_delay);
fill_solid(leds, NUM_LEDS, CRGB::Blue);
set_pixels(sad_ghost, 20, CRGB::Yellow);
set_pixels(void_pixels_2, 10, CRGB::Black);
FastLED.show(); delay(feet_delay);
}
// Мигание грустного
for (int i = 0; i < 10; i++) {
fill_solid(leds, NUM_LEDS, CRGB::Yellow);
set_pixels(sad_ghost, 20, CRGB::Red);
set_pixels(void_pixels_1, 12, CRGB::Black);
FastLED.show(); delay(feet_delay);
...
}
}
void set_pixels(int* indices, int count, CRGB color) {
for (int i = 0; i < count; i++) leds[indices[i]] = color;
}
Файлы для лазерной резки
ghostlaser-1_8th_v5.dwg— призраки (поле лазера 32x18″)pacman-mspacman-laser.dwg— Pac-Man и Ms. Pac-Man
Можно распечатать PDF и резать вручную: пиксель ~40 мм, отверстие 12 мм, глубина ребра 50 мм.
Финальные штрихи
- Наклейте кальку/велюм на переднюю сетку (клей ПВА по верхнему краю вертикальных ребер). Под прессом до высыхания. Обрежьте края, загнуть и закрепите скотчем.
- Закрепите Arduino и Power Bank на велкро сзади.
- Изолируйте все соединения дюк-лентой.
- Ремень из тканого дюк-страпа для ношения на плече.
- Телефон с саундтреком Pac-Man + Bluetooth-колонка — для атмосферы.
Результат
Семья в светящихся пиксельных костюмах собирает конфеты и восхищенные взгляды. Проект требует времени на резку/сборку картона, но результат того стоит. Файлы и код открыты — повторяйте и адаптируйте под любые 8-битные персонажи!
Производственный процесс
- Светодиоды (LED): от зарождения к 100-летнему ресурсу
- Панель управления полётным симулятором 2020 на Arduino Nano: LCD и CDI-дисплеи
- Панель переключателей и LED для Microsoft Flight Simulator 2020 на Arduino
- Проект Arduino: мелодия Coffin Dance — сборка и воспроизведение вирусного трека
- DIY-костюм «Облако»: LED-лента, Arduino Nano и детали SparkFun
- Сборка потрясающего 5x5x5 LED-куба на Arduino Mega
- Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
- Звукоактивируемый светодиодный дисплей 8 LED на Arduino
- Пошаговое руководство: сборка умного четырёхногого робота на Arduino
- Pixel Chaser: игра на один тап с NeoPixel Ring и Arduino Nano