Набор «Инопланетный слот-машин» на ATmega328P — DIY игровой автомат с NeoPixel и I2C дисплеем
Компоненты и материалы
- ATmega328P-PU — 2 шт. (один для игры, второй — I2C ведомый для 7-сегментного дисплея)
- 7-сегментный дисплей 8 разрядов — 1 шт. (баланс кредитов)
- Матрица 8×8, 4 сегмента, драйвер MAX7219 — 1 шт. (используются 3 сегмента для барабанов)
- I2C LCD 20×4 (синяя подсветка) — 1 шт. (меню настроек)
- Беспаечные макетные платы (830 точек) — 2 шт.
- Тактильные кнопки — 6 шт. (старт, навигация меню, сброс чипов)
- RGB LED общий катод — 1 шт.
- Обычный LED (индикатор питания) — 1 шт.
- Резисторы: 10к (6 шт.), 1к (4 шт.), 330 (3 шт.)
- Кварц 16 МГц — 2 шт.
- Выключатель-тоггл — 1 шт.
- Пьезо-зуммер — 2 шт. (по одному на чип)
- Конденсаторы: 22 пФ (4), 0.1 мкФ (6), 100 нФ (1), 10 мкФ (2)
- Стабилизатор 7805 (5В) — 1 шт.
- Перемычки, блок питания 5В
- Arduino Mini USB Serial Adapter (опционально, для прошивки) — 1 шт.
- FTDI USB-TTL адаптер — 1 шт. (прошивка в схеме)
- Паяльные макетные платы (полноразмерная и мини) — по 1 шт.
- Корпус пластиковый водонепроницаемый — 1 шт.
Инструменты
- Паяльник
- Третья рука (Helping Hands)
Библиотеки (Arduino IDE)
- Timer Free Tone Library
- LED Control Library (LedControl)
- LiquidCrystal / LCD Library
- LiquidCrystal I2C Library
Описание проекта
Инопланетная слот-машина на ATmega328P

Проект вдохновлен Alien Invasion Slot Machine Кори Поттера. Реализовано на двух ATmega328P: основной чип управляет игрой, второй — I2C ведомый для 8-разрядного 7-сегментного дисплея баланса. Сборка на макетках, корпус заказан. Проект занял 2 месяца досуга. Сложнейшая часть — математика выплат для реалистичного Volatility Index (VI).

Как работает игра
Три барабана с 25 уникальными символами каждый. 5 способов выиграть:
- 3 космических корабля — джекпот.
- 1 или 2 корабля — меньший выигрыш.
- 2 или 3 совпадающих символа (не корабли) — выигрыш.
- Корабль + 2 совпадающих символа — выигрыш по более редкому событию (события взаимоисключающие).

Функции (меню на LCD 20×4)
Навигация: две кнопки вверх/вниз, выбор — селект. Кнопка спина отдельная. Меню прокручивается (6 пунктов).

- Play — вращение барабанов.
- Bet — изменение ставки (шаг 5 кредитов).
- Settings — Auto/Manual режим (авто до 1 млн спинов), звук вкл/выкл.
- Metrics — статистика: баланс, джекпоты, другие выигрыши, всего спинов.
- Reset — сброс метрик (кроме записи в EEPROM).
- Hold — настройка удержания казино (%), обычно до 15%. После Reset нужно задать заново.





Баланс всегда виден на 7-сегментном дисплее.

Математика выплат
Вероятности (25 символов на барабане, всего 15625 комбинаций):
- 3 корабля: 1/15625 = 0.000064 (шанс 1 к 15624)
- 3 символа (не корабли): 24/15625 = 0.001536 (1 к 650)
- 2 корабля: 72/15625 = 0.004608 (1 к 216)
- 1 корабль: 1728/15625 = 0.110592 (1 к 8)
- 2 символа: 1656/15625 = 0.105984 (1 к 8.44)
Выплаты подобраны в таблице (Excel) для VI < 20. При нулевом Hold сумма выплат ≈ сумме ставок. При Hold 15% — доход казино в ожидаемом диапазоне (90% доверительный интервал). Подробности в таблице (пароль «password»).

Код
Основной скетч SlotMachine.ino (огромный, сильно прокомментирован). Используются глобальные переменные (80% RAM) — на AVR это допустимо для одиночного проекта. Библиотеки: LedControl (матрицы и 7-сегмент), TimerFreeTone (звук), LiquidCrystal_I2C (LCD). I2C ведомый — slotCreditsDisplaySlave.ino. Символы барабанов заданы в SlotMachine.h в бинарном виде (8 байт на символ). Известные баги: иногда барабан не крутится (выпал тот же символ), барабаны не останавливаются слева направо (упрощение). TODO: brown-out detection, watchdog.
Код на GitHub (ссылка в оригинале).
Сборка
Прошивка через FTDI (нужен конденсатор 100 нФ на линии RTS-Reset). Или через Arduino Uno как ISP. Настройка «Arduino на макетке» по гайду. Загрузчик загружается через AVRISP mkII или Arduino as ISP.
Детали подключения (пины)
Основной чип (Slot Machine)
- Pin 1 (PC6/Reset) — RTS FTDI, кнопка сброса
- Pin 2 (PD0/RX) — TXD FTDI
- Pin 3 (PD1/TX) — RXD FTDI
- Pin 4 (PD2) — 1кΩ → кнопка Spin
- Pin 5 (PD3) — 330Ω → RGB Blue
- Pin 6,7 — не используются (заземлите)
- Pin 7 (VCC) — шина питания, 0.1мкФ
- Pin 8 (GND) — шина земли, 0.1мкФ
- Pin 9 (PB6/XTAL1) — кварц 16МГц + 22пФ на GND
- Pin 10 (PB7/XTAL2) — кварц 16МГц + 22пФ на GND
- Pin 11,12,13 — не используются
- Pin 14 (PB0) — DIN матриц 8×8
- Pin 15 (PB1) — 330Ω → RGB Red
- Pin 16 (PB2) — 330Ω → RGB Green
- Pin 17 (PB3) — пьезо +, минус на GND
- Pin 18 (PB4) — CS матриц
- Pin 19 (PB5) — CLK матриц
- Pin 20 (AVCC) — питание, 0.1мкФ
- Pin 21 (AREF) — питание
- Pin 22 (GND) — земля
- Pin 23 (PC0/ADC0) — висит в воздухе (seed для random)
- Pin 24 (PC1) — 1кΩ → кнопка Nav Up
- Pin 25 (PC2) — 1кΩ → кнопка Nav Down
- Pin 26 (PC3) — 1кΩ → кнопка Select
- Pin 27 (PC4/SDA) — SDA ведомого дисплея
- Pin 28 (PC5/SCL) — SCL ведомого дисплея
Ведомый чип (Credit Display Slave)
- Pin 1 — RTS FTDI, сброс
- Pin 2 — TXD FTDI
- Pin 3 — RXD FTDI
- Pin 4–13 — не используются (заземлите)
- Pin 14 — не используется
- Pin 15 — пьезо +, минус на GND
- Pin 16 (PB2) — CS 7-сегментного дисплея
- Pin 17 (PB3) — CLK 7-сегментного
- Pin 18 (PB4) — DIN 7-сегментного
- Pin 19 — не используется
- Pin 20 (AVCC) — питание, 0.1мкФ
- Pin 21 (AREF) — питание
- Pin 22 (GND) — земля
- Pin 23–26 — не используются
- Pin 27 (PC4/SDA) — SDA основного чипа
- Pin 28 (PC5/SCL) — SCL основного чипа
Код
SlotMachine.ino (фрагмент)
/*SlotMachine.ino Version: 1.0 ...*/ #include#include #include #include "LedControl.h" #include "SlotMachine.h" #include #include #include #include // Payout Table #define THREE_SPACESHIP_PAYOUT 600 #define THREE_SYMBOL_PAYOUT 122 #define TWO_SPACESHIP_PAYOUT 50 #define ONE_SPACESHIP_PAYOUT 3 #define TWO_SYMBOL_PAYOUT 2 // VI = 16.43 // ... остальной код (см. полный файл на GitHub) ...
SlotMachine.h (символы и ноты)
const byte reel[] = { // 25 символов по 8 байт каждый
// 0 star
B10011001, B01011010, B00111100, B11111111, B11111111, B00111100, B01011010, B10011001,
// 1 one spot on dice
B00000000, B00000000, B00000000, B00011000, B00011000, B00000000, B00000000, B00000000,
// ... (все 25 символов) ...
// 24 three
B11111111, B00000010, B00000100, B00011100, B00000010, B00000100, B00001000, B11100000 };
// Ноты для пьезо (NOTE_C4 = 262 и т.д.)
slotCreditsDisplaySlave.ino
/*slotCreditsDisplaySlave.ino ...*/ #include#include "LedControl.h" #define BAUD_RATE 38400 #define CREDITS_SLAVE_ADDR 16 // ... инициализация LedControl на пинах 12,11,10 ... // I2C приём 10 байт: startingBalance (4 байта), increment (2 байта), endingBalance (4 байта) // Анимация счётчика баланса с бипом на каждом шаге.
Схемы

Fritzing файл: slotmachine_1nXzMvYVPH.fzz. Таблица выплат (Excel, пароль «password»): slotpayouttablecalc_v1_1_SfcpHOBOvf.xlsx.
Ссылка на Fritzing.org: Close Encounters Slot Machine
Итог
Увлекательный проект, объединяющий электронику, программирование AVR и теорию игр. Самое сложное — математика выплат. Надеюсь, вам понравится. Вопросы и баги — на email dan-murphy@comcast.net. Часть 2 будет про корпус.
Производственный процесс
- ЭЭГ-аппараты: дизайн, производство и новые применения
- Торговые автоматы: индустрия США на $36,6 млрд
- Голосовальные машины: история, технологии и стандарты
- Экспертное руководство по современным обменным автоматам: дизайн, компоненты и будущие тренды
- Современные ЭКГ-аппараты: технологии, производство и будущие инновации
- Эволюция и производство швейных машин: от изобретений XIX века к современной автоматизации
- Основные узлы токарного станка: функции и обзор
- Понимание токарных станков: история, типы и применение
- Ключевые компоненты фрезерного станка: подробное объяснение
- Что такое машина: определение, принцип работы и механизмы