Arduino Unoで作るLEDモグラ叩きゲーム - ジョイスティック操作のインタラクティブ作品
必要な部品と用品
| 部品 | 数量 |
|---|---|
| Arduino UNO | 1 |
| LED(赤、緑、黄含む) | 7 |
| 抵抗 220Ω | 7 |
| アナログジョイスティック(汎用) | 1 |
| ジャンパーワイヤー | 8 |
| オス/メス ジャンパーワイヤー | 4 |
プロジェクト概要
初めてのArduinoプロジェクトとして、LEDとジョイスティックを使った「モグラ叩き」風ゲームを作成しました。初期のチュートリアルで学んだLED制御の知識を応用しています。
ゲームルール
- 7個のLEDを使用:左から2〜5番目が「モグラ」(4方向)
- ジョイスティックの上下左右で対応するLEDを「叩く」
- 左端の赤・緑LED:不正解・正解を表示
- 右端の黄色LED:ハイスコアを点滅回数で表示
- 間違えるとゲームオーバー、ハイスコア更新なら黄色LEDで新記録を点滅表示
ジョイスティック入力の処理
アナログジョイスティックのX/Y軸は0〜1023(実測値)の範囲を取ります。このプロジェクトでは4方向のみ必要なため、最大値(0または1023)を検出して方向を判定しています。
// X軸: 0=左, 1023=右
// Y軸: 0=上, 1023=下
// 内部的に 1:左, 2:右, 3:上, 4:下 にマッピング
シリアルモニターで実測値を確認し、閾値調整も可能です。
難易度設定
反応時間(ミリ秒)で4段階の難易度を定義。お好みで調整可能です。
const int easy = 1000;
const int medium = 500;
const int hard = 325;
const int stupid = 250; // 最速
スケッチ
// Whack a LED
// Joystick variables
int sX = A0; // joystick X axis
int sY = A1; // joystick Y axis
int sSX, sSY, sS;
// Game variables
int rNum; // random LED index
int wins = 0; // consecutive wins
int highScore = 0;
// Difficulty constants (reaction time in ms)
const int easy = 1000;
const int medium = 500;
const int hard = 325;
const int stupid = 250;
int ledPins[] = {5, 2, 4, 3, 6, 7, 8}; // LED pins
int pinCount = 7;
void setup() {
Serial.begin(9600);
pinMode(sX, INPUT);
pinMode(sY, INPUT);
for (int i = 0; i < pinCount; i++) {
pinMode(ledPins[i], OUTPUT);
}
}
void loop() {
rNum = random(4); // 0-3: 4つのモグラLEDから選択
delay(1000);
digitalWrite(ledPins[rNum], HIGH); // モグラ出現
delay(stupid); // 難易度に応じた制限時間
// ジョイスティック読み取り
sSX = analogRead(sX);
delay(100);
sSY = analogRead(sY);
// 入力を4方向に変換
sS = 0;
switch (sSX) {
case 0: sS = 1; break; // Left
case 1023: sS = 2; break; // Right
}
switch (sSY) {
case 0: sS = 3; break; // Up
case 1023: sS = 4; break; // Down
}
digitalWrite(ledPins[rNum], LOW); // モグラ消灯
// 判定: sS-1 が rNum と一致すれば正解(配列インデックス調整)
if (sS - 1 == rNum) {
wins++;
// 緑LED点滅(正解)
for (int k = 0; k <= 3; k++) {
digitalWrite(ledPins[4], HIGH); delay(50);
digitalWrite(ledPins[4], LOW); delay(50);
}
} else {
// ハイスコア更新チェック
if (wins > highScore) {
highScore = wins;
wins = 0;
}
// 赤LED点滅(不正解)
for (int i = 0; i <= 3; i++) {
digitalWrite(ledPins[5], HIGH); delay(50);
digitalWrite(ledPins[5], LOW); delay(50);
}
// 黄色LEDでハイスコア表示
for (int w = 0; w < highScore; w++) {
digitalWrite(ledPins[6], HIGH); delay(200);
digitalWrite(ledPins[6], LOW); delay(200);
}
}
}
回路図
ジョイスティックは5ピン(GND, +5V, VRx, VRy, SW)のうち4ピンを使用。GNDと+5VをArduinoのGND/5Vに、VRxをA0、VRyをA1に接続します。
製造プロセス