工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

DIY LEDルーレットゲーム – Arduino Nanoで作る1人用アーケードゲーム

部品と材料

部品数量備考
LED (汎用)9赤6、黄2、緑1
タクトスイッチ 12mm (SparkFun等)1
Arduino Nano R31
ピンヘッダ メス 8ピン1Arduino搭載用
DCバレルジャック1外部電源入力用

必要な工具と機器

アプリとオンラインサービス

プロジェクト概要

1人で遊べるシンプルかつ中毒性のあるゲーム「LEDルーレット」をArduino Nanoで製作しました。9個のLED (赤6・黄2・緑1) が左右に往復し、ボタン押下で停止。緑LEDで停止すれば勝利、赤/黄なら敗北というルールです。

ゲームメカニクス

製作ステップ

  1. 設計・切削: Fusion 360でフロントパネル設計 (9 LED穴 + スイッチ穴)、CNCルーターで切り出し (合板等)。手工具でも可能。
  2. 組み立て: サンドペーパーで面取り、ホットグルーでパネル接着。
  3. 配線・プログラミング: スケッチ書き込み、動作確認。

スケッチ (TTBOUNCEライブラリ使用)

ライブラリ: TTBOUNCE (デバウンス・クリック/ダブルクリック検出)

/* LEDルーレット - Arduino Nano
 * ピン割当: LED=D4〜D11 (9個), Button=D2 (割り込み対応)
 * TTBOUNCEライブラリ必要
 */
#include <TTBOUNCE.h>

int delay_time = 0;
const uint8_t led_array[9] = {4,3,5,6,7,8,9,10,11}; // 物理配置順
const uint8_t button = 2;

uint8_t difficulty = 0;
uint8_t current_led = 0;
bool dir_flag = true;       // true=右方向, false=左方向
bool game_ended = false;
bool is_win = false;
bool is_finished_selecting = false;

TTBOUNCE b = TTBOUNCE(button);

void doubleClick() {
  Serial.println("double click");
  is_finished_selecting = true;
  delay_time = floor(500 / (difficulty + 1)); // 難易度に応じたディレイ
  Serial.println("difficulty: " + String(delay_time));
  sweep();
}

void click() {
  Serial.print("Click | ");
  digitalWrite(led_array[difficulty], LOW);
  difficulty++;
  if (difficulty > 8) difficulty = 0;
  digitalWrite(led_array[difficulty], HIGH);
  Serial.println("Difficulty is: " + String(difficulty));
  delay(100);
}

void setup() {
  Serial.begin(9600);
  b.attachDoubleClick(doubleClick);
  b.attachClick(click);
  b.setActiveLow();
  b.enablePullup();
  
  for (int i = 0; i < 9; i++) pinMode(led_array[i], OUTPUT);
  
  sweep();    // 起動演出
  pulse();    // 全点滅
  difficulty = 0;
  digitalWrite(led_array[difficulty], HIGH);
  
  while (!is_finished_selecting) b.update(); // 難易度選択待機
  b.update();
  
  pinMode(button, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(button), button_pressed, FALLING);
  delay(1000);
}

void loop() {
  if (!game_ended) {
    move_led();
    delay(delay_time);
  } else {
    Serial.println("Game over");
    if (is_win) {
      Serial.println("you won");
      for (int i = 0; i < 5; i++) { pulse(); delay(100); } // 勝利演出
    }
    sweep();
    game_ended = false;
    is_win = false;
    delay(2000);
  }
}

void move_led() {
  digitalWrite(led_array[current_led], LOW);
  if (current_led == 8) { dir_flag = false; current_led--; }
  else if (current_led == 0) { dir_flag = true; current_led++; }
  else if (dir_flag) current_led++;
  else current_led--;
  digitalWrite(led_array[current_led], HIGH);
}

void pulse() {
  for (int i = 0; i < 9; i++) digitalWrite(led_array[i], HIGH);
  delay(100);
  for (int i = 0; i < 9; i++) digitalWrite(led_array[i], LOW);
}

void sweep() {
  for (int i = 0; i < 9; i++) { digitalWrite(led_array[i], HIGH); delay(50); digitalWrite(led_array[i], LOW); }
  for (int i = 8; i >= 0; i--) { digitalWrite(led_array[i], HIGH); delay(50); digitalWrite(led_array[i], LOW); }
}

void button_pressed() {
  Serial.println("Button pressed on LED: " + String(current_led));
  game_ended = true;
  if (current_led == 4) is_win = true;   // 緑LED (中央)
  else is_win = false;
  current_led = 0;
  delay(500); // チャタリング対策
}

回路図

DIY LEDルーレットゲーム – Arduino Nanoで作る1人用アーケードゲーム

拡張アイデア

まとめ

部品点数最小限、コードもシンプルで、電子工作入門者が「ゲーム機を作った」という達成感を得られる好例です。CNCがなくても、ユニバーサル基板やブレッドボード上で動作確認後、プラケースや段ボールケースに収めるだけでも十分楽しめます。

製造プロセス

  1. Arduino NanoとMPU-6050で作るリアルタイムジャイロスコープゲーム
  2. Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
  3. Arduino Nanoで37LEDルーレットゲームを自作:ヨーロピアンスタイル完全再現
  4. DIY Arduino USBゲームコントローラー - 高性能ゲームパッドを自作
  5. 自作16×8 LEDマトリックスでテトリスゲーム:Arduino Nano実装
  6. ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
  7. スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
  8. Pixel Chaser: Arduino Nanoで作るワンタップLEDゲーム
  9. Bolt IoTとArduino UNOでLED輝度をシームレス制御
  10. Arduino Nanoで作る8×8 LEDマトリックスのフリップクロック - 自作リアルタイムクロック
  11. Arduino RGB LEDカラーミキサー:初心者向けDIYプロジェクト