+7-960-0655211 (Билайн)
+7-987-4207734 (МТС)

интернет-магазин
доставка по России и СНГ
работаем с 2010 года

Лабиринт на Arduino, управляемый с джойстика

Лабиринт на Arduino, управляемый с джойстика

01.jpg
02.jpg

В этом проекте будет рассмотрено, как создать простую и интересную игру «Мраморный лабиринт» из картона, управляемого с двухосевого джойстика.

Мне стало скучно от электронных игр, и я начал думать, какие интересные физические игры можно сделать. Идея сделать "Лабиринт" мне понравилась.

Идея игры заключается в том, чтобы перемещать шарик по лабиринту из начальной точки в конечную, чтобы выиграть игру.

Конечно, есть много идей, чтобы улучшить эту игру и сделать ее более увлекательной, например, добавить датчик в конце и реализовать воспроизведение звуков по достижении конца лабиринта. Или вырезать отверстия в лабиринте, в которые может шарик упасть, чтобы сделать прохождение сложнее.

Лабиринт - это игра, требующая физических навыков, которые влияют на скорость прохождения игры. Цель игры состоит в том, чтобы, наклоняя игровое поле направлять шарик к концу лабиринта и, если на поле присутствуют отверстия, не допускать падения шарика в них.

Приступим к созданию нашей игры!

Шаг 1: Дизайн

03.jpg

04.jpg

Я начал создавать свой собственный лабиринт, используя sketch up pro, чтобы представить, как будет выглядеть эта игра. Мне было так удобней что бы продумать конструкцию, размеры и сделать его максимально простым в сборке и интересным для игры. Теперь, когда вся конструкция готова, та часть по которой катается шарик (собственно сам лабиринт) можно заменить на другую, если надоест.

Шаг 2: компоненты

  • Лист картона 3мм
  • Клеевой пистолет (для соединения деталей вместо него можно использовать клей, липкую ленту и т.д.)
  • Нож с острым лезвием
  • Линейка
  • Карандаш
  • Arduino (любая, которая Вам нравиться)
  • Макетная плата
  • Соединительные провода
  • Два микро сервопривода (SG90, MG90, FS90MG, ...)
  • Модуль двухосевого джойстика
  • Два винта и гайки 12 мм на 3 мм


Шаг 3: корпус

05.jpg

06.png
07.png
08.png
09.jpg
10.jpg
11.jpg
12.jpg
13.jpg
14.jpg

Чтобы упростить смену лабиринтов, стенки можно не клеить на прямую в короб. Можно взять дополнительный квадрат картона и уже на него клеить стенки, а затем вкладывать в короб.

Шаг 4: электроника

15.jpg 

Подключите провода сервоприводов и джойстика, как показано на рисунке.
• Контакт Arduino 8 к желтому проводу в серво оси X
• Контакт Arduino 9 с желтым проводом в серво оси Y
• Красные провода сервоприводов через макетную плату к пину 5В на Arduino
• Коричневые провода через макетную плату к пину GND на Arduino
• Контакт Arduino A0 - контакт джойстика VRx
• Контакт Arduino А1 к контакту джойстика VRy
• VCC и GND джойстика через макетную плату к VCC и GND на Arduino

Если будете использовать не микросервоприводы (SG90 или подобные), а более мощные (допустим "стандартного" типоразмера, они потребляют намного больший ток), тогда запитывайте их не от Arduino, как на изображении выше, а от внешнего источника (не забывая соединить "землю" Arduino с "землёй" внешнего источника).

Учтите, что не все порты USB (на одной плате схема питания может быть разной) и не на всех платах способны выдать достаточный ток для питания даже таких маломощных сервоприводов. Ещё для экономии производители иногда не используют схему защиты питания портов USB и при слишком большой нагрузке они могут "сгореть". Если не знаете, сколько тока может выдать USB порт Вашего компьютера/ноутбука, к которому подключаете, лучше запитывать от другого источника питания (перед загрузкой скетча в Arduino, не забудьте отключать сервоприводы).

Шаг 5: код


Подключите плату Arduino к ПК с помощью USB-кабеля.
Откройте Arduino IDE.
Скопируйте код скетча:

#include <Servo.h>
Servo myServoX;
Servo myServoY;
int ServoXPin = 8;
int ServoYPin = 9;
int ServoXHomePos =103; //small
int ServoYHomePos =134; //big
int ServoXPos =103; //small
int ServoYPos =135; //big
int XAxlePin = A0; //A0
int YAxlePin = A1; //A1
int XAxleValue = 0;
int YAxleValue = 0;
int Direction = 0;
int range = 12; // output range of X or Y movement
int center = range/2; // resting position value
int threshold = range/4; // resting threshold
void setup()
{
myServoX.attach(ServoXPin);
myServoY.attach(ServoYPin);
ServoXPos = ServoXHomePos;
ServoYPos = ServoYHomePos;
myServoX.write(ServoXPos);
myServoY.write(ServoYPos);
Serial.begin(9600);
}
void loop()
{
XAxleValue = readAxis(XAxlePin);
YAxleValue = readAxis(YAxlePin);

Serial.print(XAxleValue,DEC);
Serial.print(" - ");
Serial.println(YAxleValue,DEC);
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)); }

if (ServoXPos>ServoXHomePos+20) { ServoXPos=ServoXHomePos+20; }
if (ServoXPos<ServoXHomePos-20) { ServoXPos= ServoXHomePos-20; }
if (ServoYPos>ServoYHomePos+20) { ServoYPos=ServoYHomePos+20; }
if (ServoYPos<ServoYHomePos-20) { ServoYPos= ServoYHomePos-20; }
delay(10);
}
int readAxis(int thisAxis) {
// read the analog input:
int reading = analogRead(thisAxis);
// map the reading from the analog input range to the output range:
reading = map(reading, 0, 1023, 0, range);
// if the output reading is outside from the
// rest position threshold, use it:
int distance = reading - center;
if (abs(distance) < threshold) {
distance = 0;
}
// return the distance for this axis:
return distance;
}


В меню "Инструменты" выберите плату, которую используете и порт, к которому она подключена.


16.jpg

Загружаем скетч в Arduino и можно приступать к игре





Автор: Ahmed Azouz
Перевод и адаптация: RobotoTehnika.ru