Arduinoで作る段ボール迷路ゲーム:ジョイスティックで傾けてボールをゴールへ
必要な部品と材料
- Arduino UNO(任意のボード可) ×1
- SG90 マイクロサーボ ×2(X軸・Y軸用)
- ミニブレッドボード ×1
- ジョイスティックモジュール ×1
- ジャンパーワイヤー
- 段ボール 3mm厚
- ホットグルー、カッターナイフ、定規、鉛筆
- ネジ・ナット M3×12mm ×2(サーボホーン固定用)
プロジェクト概要
古典的な「ラビリンス(迷路)」ゲームをArduinoとサーボで自動化。ジョイスティックで迷路盤をX/Y方向に傾け、鉄球を穴に落とさずゴールへ導きます。段ボールで1時間程度で組み立て可能な低コスト工作です。
設計とカット
- 底板:20cm×20cm 正方形 1枚
- 側板:14cm×16cm 二等辺台形 2枚(片方にサーボ用長穴、もう片方に中心3mm穴)
- 内部支柱:14cm×4cm 長方形 4枚(中央にサーボ用長穴、中心に3mm穴)
- 迷路盤:12cm×12cm 正方形 1枚(お好みの迷路パターンを印刷して貼り付け)
- 壁:1.5cm×12cm 短冊 8枚以上(迷路に合わせてカット)
印刷した迷路パターンをガイドに壁をグルーで固定。サーボを側板と支柱に取り付け、サーボホーンを支柱/迷路盤にネジ止めしてリンク機構を形成。

配線
- サーボX(横傾き)信号 → Pin 8
- サーボY(縦傾き)信号 → Pin 9
- サーボ電源(赤/茶) → ブレッドボード経由で5V/GND
- ジョイスティック VRx → A0、VRy → A1
- ジョイスティック VCC/GND → ブレッドボード
- Arduino 5V/GND → ブレッドボード
スケッチ
ジョイスティックのアナログ値を読み、中心付近はデッドゾーンとして無視。傾きに応じてサーボ角度を±20度の範囲で滑らかに更新(遅延で速度調整)。
#include <Servo.h>
Servo myServoX, myServoY;
int ServoXPin = 8, ServoYPin = 9;
int ServoXHomePos = 90, ServoYHomePos = 90;
int ServoXPos = 103, ServoYPos = 135;
int XAxlePin = A0, YAxlePin = A1;
int XAxleValue = 0, YAxleValue = 0;
int range = 12, center = 6, threshold = 3;
void setup() {
myServoX.attach(ServoXPin);
myServoY.attach(ServoYPin);
myServoX.write(ServoXHomePos);
myServoY.write(ServoYHomePos);
Serial.begin(9600);
}
void loop() {
XAxleValue = readAxis(XAxlePin);
YAxleValue = readAxis(YAxlePin);
if (XAxleValue > 0) { ServoXPos++; myServoX.write(ServoXPos); delay(100*(7-XAxleValue)); }
if (XAxleValue < 0) { ServoXPos--; myServoX.write(ServoXPos); delay(100*(7+XAxleValue)); }
if (YAxleValue > 0) { ServoYPos++; myServoY.write(ServoYPos); delay(100*(7-YAxleValue)); }
if (YAxleValue < 0) { ServoYPos--; myServoY.write(ServoYPos); delay(100*(7+YAxleValue)); }
// 角度制限 ±20度
ServoXPos = constrain(ServoXPos, ServoXHomePos-20, ServoXHomePos+20);
ServoYPos = constrain(ServoYPos, ServoYHomePos-20, ServoYHomePos+20);
delay(10);
}
int readAxis(int pin) {
int reading = analogRead(pin);
reading = map(reading, 0, 1023, 0, range);
int distance = reading - center;
if (abs(distance) < threshold) distance = 0;
return distance;
}
拡張アイデア
- ゴール検知用センサー(フォトリフレクタ等)とブザーでクリア音
- 穴に落下検知でゲームオーバー音
- 迷路盤に複数の穴を開けて難易度アップ
- タイムアタック機能追加
回路図

製造プロセス
- TinyML言語検出器:Edge ImpulseとArduino Nano 33 BLE Senseで「はい」を多言語判別
- Arduino NanoとMPU-6050で作るリアルタイムジャイロスコープゲーム
- Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
- Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
- MobBob:Arduino製ロボットをAndroidスマホでシームレスに制御
- Arduino Nanoで作る音声反応デスクライト:音楽に合わせて光るイルミネーション
- Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
- ゲーム用カスタムArduinoジョイスティックハンドルの製作