Arduino-лабиринт для шарика: картонная настольная игра с джойстиком
Компоненты и материалы
- Arduino UNO (любая плата) — 1 шт.
- Сервоприводы SG90 (9g) — 2 шт. (ось X и Y)
- Джойстик-модуль (аналоговый) — 1 шт.
- Макетная плата + перемычки
- Картон 3 мм, клей-пистолет, нож, линейка, карандаш
- Стальной шарик (5-8 мм) — 1 шт.
- 2 винта/гайки M3×12 (крепление рычагов серв)
Идея и дизайн
Классическая игра «Лабиринт» (BRIO, 1946): наклоняем поле, водим шарик к финишу, не уронив в дыры. Здесь поле наклоняют два сервопривода по осям X и Y, управляемые джойстиком. Корпус и лабиринт — из картона, собираются за час.
Чертежи и раскрой (см. раздел CAD)
- Основание: квадрат 20×20 см.
- Боковые стенки: 2 трапеции 14×16 см. В одной — прямоугольное окно под серво X, в другой — отверстие 3 мм под вал.
- Внутренние ребры: 4 планки 14×4 см. В одной — окно под серво Y, в другой — отверстие под вал.
- Поле лабиринта: 12×12 см (напечатать шаблон, наклеить на картон, вырезать стены 1.5×12 см и наклеить по контуру).
- Рычаги: серво-рога приклеены к планкам с отверстиями под валы.
Схема подключения
- Серво X (ось крен) → D8 (жёлтый), Серво Y (ось дифференга) → D9.
- Джойстик: VRx → A0, VRy → A1, VCC/GND → 5V/GND.
- Сервопитание: красный/коричневый на шину макетки, оттуда на 5V/GND Arduino (для SG90 допустимо, лучше — отдельный 5V источник).
Скетч
Библиотека Servo.h. Джойстик считывается через map(0..1023 → 0..12), мёртвая зона ±3. Сервы сглаженно поворачиваются на ±20° от центра (90°). Задержка 100×(7-значение) даёт плавность.
#include
Servo myServoX, myServoY;
int ServoXPin=8, ServoYPin=9;
int ServoXHome=90, ServoYHome=90;
int ServoXPos=103, ServoYPos=135; // стартовые углы (подстроить под сборку)
int XAxlePin=A0, YAxlePin=A1;
int range=12, center=range/2, threshold=range/4;
void setup() {
myServoX.attach(ServoXPin); myServoY.attach(ServoYPin);
myServoX.write(ServoXHome); myServoY.write(ServoYHome);
Serial.begin(9600);
}
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;
}
void loop() {
int x = readAxis(XAxlePin);
int y = readAxis(YAxlePin);
if (x > 0) { ServoXPos++; myServoX.write(ServoXPos); delay(100*(7-x)); }
if (x < 0) { ServoXPos--; myServoX.write(ServoXPos); delay(100*(7+x)); }
if (y > 0) { ServoYPos++; myServoY.write(ServoYPos); delay(100*(7-y)); }
if (y < 0) { ServoYPos--; myServoY.write(ServoYPos); delay(100*(7+y)); }
// Лимиты ±20°
ServoXPos = constrain(ServoXPos, ServoXHome-20, ServoXHome+20);
ServoYPos = constrain(ServoYPos, ServoYHome-20, ServoYHome+20);
delay(10);
}
Идеи для улучшения
- Добавить датчики в финишной зоне → звук/свет победы.
- Сделать сменные карты лабиринта (магниты/слоты).
- Использовать более мощные сервы (MG90S) и внешний BEC 5V/2A.
- Добавить Bluetooth-модуль для управления с телефона.
Производственный процесс
- TinyML-детектор языка на Arduino Nano 33 BLE Sense с Edge Impulse
- Создание игры в реальном времени на Arduino Nano с гироскопом MPU-6050 и OLED-дисплеем
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- Строим Iron Man на Arduino: компоненты, сенсоры и пошаговый гайд
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением
- Измерение расстояния в реальном времени: Ардуино-сонар с визуализацией в Processing
- MobBob: Самостоятельная сборка Arduino-робота под управлением Android-смартфона
- Сборка аудиореактивной настольной лампы на Arduino Nano
- NeoPixel Matrix Pong на Arduino Nano: неоновая игра Pong на матрице 15×10