ATmega328P自作スロットマシン「エイリアン侵略」 - デュアルMCU、I2C連携、確率設計解説付き
必要な部品と材料
| ATmega328P-PU(スロットマシン本体用+クレジット表示スレーブ用) | ×2 |
| 7セグメントLED 8桁表示モジュール(クレジット残高表示) | ×1 |
| 8×8 LEDマトリックス 4セグメント MAX7219搭載(リール表示用、3セグメント使用) | ×1 |
| I2C 20×4 文字LCDモジュール(メニュー表示) | ×1 |
| ブレッドボード 830ポイント | ×2 |
| モーメンタリタクトスイッチ(リール回転、メニュー操作、リセット用) | ×6 |
| RGB LED(共通カソード)、ブザー×2、各種抵抗・コンデンサ・水晶発振子・7805レギュレータ等 | ×1式 |
| FTDI USB-シリアル変換アダプタ(書き込み用)、はんだ付け用ユニバーサル基板、プロジェクトケース | ×1式 |
必要な工具
- はんだごて、ヘルピングハンズ
使用ライブラリ
- LedControl(MAX7219制御)
- TimerFreeTone(ブザー音階再生)
- LiquidCrystal / LiquidCrystal_I2C(LCD制御)
プロジェクト概要
2個のATmega328P-PUをI2Cで連携させ、本格的な確率設計に基づくエイリアンテーマのスロットマシンを自作。3リール×25種類シンボル、5種類の当たり役(ジャックポット=宇宙船3つ、宇宙船2つ/1つ、シンボル3つ/2つ揃い)、ホールレート(胴元利益率)設定可能、オートプレイで100万回シミュレーション可能、全メトリクスをLCDとシリアルで表示。教育・娯楽目的のDIYプロジェクトです。
ゲームルールと確率設計
各リールに同一の25ユニークシンボル(宇宙船1種、エイリアン等24種)。全組み合わせ 25³ = 15,625通り。
| 当たり役 | 組み合わせ数 | 確率 | オッズ | 配当倍率(ホール0%時) |
|---|---|---|---|---|
| 宇宙船3つ(ジャックポット) | 1 | 0.000064 | 1:15,624 | 600倍 |
| 同一シンボル3つ(宇宙船除く) | 24 | 0.001536 | 1:650 | 122倍 |
| 宇宙船2つ | 72 | 0.004608 | 1:216 | 50倍 |
| 宇宙船1つ | 1,728 | 0.110592 | 1:8 | 3倍 |
| 同一シンボル2つ | 1,656 | 0.105984 | 1:8.4 | 2倍 |
| ハズレ | 12,164 | 0.777216 | - | 0倍 |
配当表はボラティリティ指数(VI)< 20となるようスプレッドシートで試行錯誤し決定。ホールレート(0〜15%)はメニューから設定可能。当たり役は排他(最高配当のみ適用)。
主な機能
- LCDメニュー(再生、ベット変更、設定、メトリクス表示、リセット、ホール設定)
- 外部割り込み活用の高度なデバウンス付きボタン操作
- オートモード: 100万回まで自動連続プレイでメトリクス収集
- EEPROMへの定期書き込み(1万回ごと)でデータ永続化、書き込み回数監視で寿命管理
- クレジット残高は別MCU(I2Cスレーブ)の7セグ8桁表示で常時表示
- RGB LEDとブザーで演出(起動時「未知との遭遇」テーマ、当たりでサイレン)
ソフトウェア構成
SlotMachine.ino(マスター)
- リール制御: 3つの8×8マトリックスをLedControlで駆動、正弦波フェードイン/アウトアニメーション
- 乱数生成: 浮動ピン(A0)ADC値をシードに
random()使用 - 状態管理:
machineStateビットマスク(IDLE, SPINNING, AUTO, SHOW_MENU等) - イベント駆動:
ProcessEvents()でボタン/メニュー操作を処理 - I2Cマスター: クレジット表示スレーブ(アドレス0x10)へ残高送信、LCD(0x3F)へメニュー描画
SlotMachine.h
全25シンボルの8×8パターン定義(バイナリリテラルで可視化)、音階定義(NOTE_C4=262Hz等)、配当定数、ピン割り当て等を集約。
slotCreditsDisplaySlave.ino(スレーブ)
- I2Cスレーブアドレス0x10でマスターから残高データ受信
- LedControlで7セグ8桁表示を制御、残高変化時はカウントアップ/ダウンアニメーション
- 独自ブザーで音響フィードバック
製作手順
- FTDIアダプタで両ATmega328Pにブートローダー書き込み(Arduino Unoでも可)
- ブレッドボード上で「Arduino on Breadboard」構成(水晶、コンデンサ、レギュレータ、リセット回路)を2セット構築
- フリッツィング回路図(記事内画像および.fzzファイル)に従い配線。I2Cライン(A4/A5)で2チップ接続
- 各スケッチを書き込み、動作確認後ユニバーサル基板にはんだ付け、ケースへ収納
既知の課題とTODO
- リール停止位置が現在表示中のシンボルと同一の場合、見た目上回らない(仕様)
- リール停止順が左→右でない(シンプル化のため)
- グローバル変数メモリ使用率80%(不安定領域)、ブラウンアウト検出・ウォッチドッグタイマー未実装
- シンボルデザインの一部はスペースインベーダー風(自作も混在)
回路図とリソース
フリッツィング回路図(slotmachine_1nXzMvYVPH.fzz)、配当計算スプレッドシート(パスワード "password")、GitHubリポジトリで全ファイル公開。
製造プロセス