Аркадный автомат из куска светодиодной ленты и Arduino: собираем залипательную игру
- Цена: 1450 руб.
- Перейти в магазин
Всем привет! После давнего ремонта и экспериментов с подсветками у меня в столе остался лежать без дела обрезок адресной светодиодной ленты и китайский клон Arduino Nano.
Лежало всё это добро долго, пока не наметились очередные посиделки с друзьями на даче. Захотелось сделать на вечер какую-нибудь простую, но интерактивную штуку. Делать обычную цветомузыку или «бегущий огонь» было скучно. Крутя в руках ленту, я пришел к забавной мысли: по сути, адресная лента это одномерный дисплей. А значит, на ней можно написать игру!
Самое очевидное, что ложится на одну ось это пинг-понг. Концепт созрел быстро:
1) Лента это игровое поле.
2) Один (или несколько) горящих пикселей это «мячик», который бегает от края до края.
3) По краям ленты стоят две кнопки для игроков.
4) Задача успеть нажать свою кнопку ровно в тот момент, когда мячик находится в твоей зоне. Нажал вовремя мяч отлетает обратно, причем с каждым ударом скорость растет. Нажал рано или поздно — проиграл.
Идея показалась отличной убивалкой времени, так что я расчехлил паяльник. Ниже расскажу и покажу, что из этого вышло, как это собрать за пару часов и какой код для этого нужен.
1. Железо (Комплектующие)
-Arduino Nano.
300 руб
-Адресная лента.
900 руб
-Две кнопки.
250 руб
2. Схема и сборка
Для примера показал схему подключения:
Позже вторую кнопку вынес на второй «пульт» второго игрока
Ленту питаем от 5V, управляющий пин кидаем, например, на D6. А вот кнопки обязательно нужно вешать на пины D2 и D3 (в Arduino Nano), так как они аппаратно поддерживают прерывания (interrupts). Это важный нюанс! Если опрашивать кнопки в основном цикле, игра будет «тормозить», а через прерывания реакция на удар будет мгновенной.
3. Логика кода и интересные фишки
Чтобы не изобретать велосипед с таймингами и цветами, я использовал популярную библиотеку FastLED. Она работает быстрее стандартного Adafruit NeoPixel и имеет кучу встроенных математических функций.
Весь проект написан на C++ и выложен в моем репозитории: GitHub — 1D-Pong-Arduino. Кому нужен готовый исходник — забирайте. А для тех, кому интересно, как это работает изнутри, расскажу о главных хитростях:
1. Эффект «Кометы» (затухающий шлейф)
Чтобы мячик летел не просто одной светящейся точкой, а оставлял красивый хвост, я не стал писать сложные циклы для каждого предыдущего пикселя. В FastLED есть шикарная функция fadeToBlackBy. Каждый кадр мы немного затемняем всю ленту:
fadeToBlackBy(leds, NUM_LEDS, 80);
В итоге старые позиции мяча плавно гаснут сами по себе, создавая эффект летящей кометы.
2. Дробная скорость без «тормозного» float
Слабый 8-битный контроллер Ардуино очень не любит числа с плавающей точкой (float), они сильно тормозят работу. Но нам нужно, чтобы мяч плавно ускорялся после каждого удара. Решение — целочисленная математика.
Позиция мяча в коде умножена на 10. То есть он летит по координатам 10, 20, 30… 45, 60. А когда нам нужно зажечь конкретный светодиод, мы просто делим координату на 10 (pos / 10). Это позволяет менять скорость микрошагами, не нагружая процессор.
3. Динамический цвет (зависимость от скорости)
Мячик меняет цвет в зависимости от того, как быстро он летит. Сделано это через цветовую модель HSV:
hue = map(abs(vel), 10, 50, 96, 0);
Мы берем текущую скорость и перекладываем ее на спектр: на старте мячик летит медленно и светится зеленым (hue 96), но с каждым отбиванием скорость растет, и цвет плавно переходит через желтый в агрессивный красный (hue 0).
4. Программный антидребезг кнопок
Дешевые тактовые кнопки при нажатии физически «пружинят», замыкая контакт по 5-10 раз за миллисекунду. Использовать обычный delay() для подавления дребезга нельзя — игра зависнет и мы пропустим кадры анимации мяча. Поэтому кнопки опрашиваются через таймер millis() в отдельной структуре. Если прошло меньше 50 мс с прошлого изменения состояния — контроллер просто игнорирует шум контактов.
Итог:

Полный исходный код проекта доступен на моем GitHub:
Лежало всё это добро долго, пока не наметились очередные посиделки с друзьями на даче. Захотелось сделать на вечер какую-нибудь простую, но интерактивную штуку. Делать обычную цветомузыку или «бегущий огонь» было скучно. Крутя в руках ленту, я пришел к забавной мысли: по сути, адресная лента это одномерный дисплей. А значит, на ней можно написать игру!
Самое очевидное, что ложится на одну ось это пинг-понг. Концепт созрел быстро:
1) Лента это игровое поле.
2) Один (или несколько) горящих пикселей это «мячик», который бегает от края до края.
3) По краям ленты стоят две кнопки для игроков.
4) Задача успеть нажать свою кнопку ровно в тот момент, когда мячик находится в твоей зоне. Нажал вовремя мяч отлетает обратно, причем с каждым ударом скорость растет. Нажал рано или поздно — проиграл.
Идея показалась отличной убивалкой времени, так что я расчехлил паяльник. Ниже расскажу и покажу, что из этого вышло, как это собрать за пару часов и какой код для этого нужен.
1. Железо (Комплектующие)
-Arduino Nano.
300 руб-Адресная лента.
900 руб-Две кнопки.
250 руб2. Схема и сборка
Для примера показал схему подключения:
Позже вторую кнопку вынес на второй «пульт» второго игрока
Ленту питаем от 5V, управляющий пин кидаем, например, на D6. А вот кнопки обязательно нужно вешать на пины D2 и D3 (в Arduino Nano), так как они аппаратно поддерживают прерывания (interrupts). Это важный нюанс! Если опрашивать кнопки в основном цикле, игра будет «тормозить», а через прерывания реакция на удар будет мгновенной.3. Логика кода и интересные фишки
Чтобы не изобретать велосипед с таймингами и цветами, я использовал популярную библиотеку FastLED. Она работает быстрее стандартного Adafruit NeoPixel и имеет кучу встроенных математических функций.
Весь проект написан на C++ и выложен в моем репозитории: GitHub — 1D-Pong-Arduino. Кому нужен готовый исходник — забирайте. А для тех, кому интересно, как это работает изнутри, расскажу о главных хитростях:
1. Эффект «Кометы» (затухающий шлейф)
Чтобы мячик летел не просто одной светящейся точкой, а оставлял красивый хвост, я не стал писать сложные циклы для каждого предыдущего пикселя. В FastLED есть шикарная функция fadeToBlackBy. Каждый кадр мы немного затемняем всю ленту:
fadeToBlackBy(leds, NUM_LEDS, 80);
В итоге старые позиции мяча плавно гаснут сами по себе, создавая эффект летящей кометы.
2. Дробная скорость без «тормозного» float
Слабый 8-битный контроллер Ардуино очень не любит числа с плавающей точкой (float), они сильно тормозят работу. Но нам нужно, чтобы мяч плавно ускорялся после каждого удара. Решение — целочисленная математика.
Позиция мяча в коде умножена на 10. То есть он летит по координатам 10, 20, 30… 45, 60. А когда нам нужно зажечь конкретный светодиод, мы просто делим координату на 10 (pos / 10). Это позволяет менять скорость микрошагами, не нагружая процессор.
3. Динамический цвет (зависимость от скорости)
Мячик меняет цвет в зависимости от того, как быстро он летит. Сделано это через цветовую модель HSV:
hue = map(abs(vel), 10, 50, 96, 0);
Мы берем текущую скорость и перекладываем ее на спектр: на старте мячик летит медленно и светится зеленым (hue 96), но с каждым отбиванием скорость растет, и цвет плавно переходит через желтый в агрессивный красный (hue 0).
4. Программный антидребезг кнопок
Дешевые тактовые кнопки при нажатии физически «пружинят», замыкая контакт по 5-10 раз за миллисекунду. Использовать обычный delay() для подавления дребезга нельзя — игра зависнет и мы пропустим кадры анимации мяча. Поэтому кнопки опрашиваются через таймер millis() в отдельной структуре. Если прошло меньше 50 мс с прошлого изменения состояния — контроллер просто игнорирует шум контактов.
Итог:

Полный исходный код проекта доступен на моем GitHub:
| +44 |
3160
52
|
свернутьразвернуть
Комментарии (4)
RSS
+1
- 09 июня 2026, 18:17
А в Ардуине деление на 10 есть? Может имеет смысл 16 использовать: сдвиг в 4 бита — это не деление на 10…
0
- 09 июня 2026, 18:22
У Гайвера было нечто подобное.
+2
- 09 июня 2026, 19:10
видео надо
+1
- 09 июня 2026, 19:17
Без видео неясно
Самые обсуждаемые обзоры