В этом проекте будет рассмотрено, как создать простую и интересную игру «Мраморный лабиринт» из картона, управляемого с двухосевого джойстика.
Мне стало скучно от электронных игр, и я начал думать, какие интересные физические игры можно сделать. Идея сделать "Лабиринт" мне понравилась.
Идея игры заключается в том, чтобы перемещать шарик по лабиринту из начальной точки в конечную, чтобы выиграть игру.
Конечно, есть много идей, чтобы улучшить эту игру и сделать ее более увлекательной, например, добавить датчик в конце и реализовать воспроизведение звуков по достижении конца лабиринта. Или вырезать отверстия в лабиринте, в которые может шарик упасть, чтобы сделать прохождение сложнее.
Лабиринт - это игра, требующая физических навыков, которые влияют на скорость прохождения игры. Цель игры состоит в том, чтобы, наклоняя игровое поле направлять шарик к концу лабиринта и, если на поле присутствуют отверстия, не допускать падения шарика в них.
Приступим к созданию нашей игры!
Я начал создавать свой собственный лабиринт, используя sketch up pro, чтобы представить, как будет выглядеть эта игра. Мне было так удобней что бы продумать конструкцию, размеры и сделать его максимально простым в сборке и интересным для игры. Теперь, когда вся конструкция готова, та часть по которой катается шарик (собственно сам лабиринт) можно заменить на другую, если надоест.
Чтобы упростить смену лабиринтов, стенки можно не клеить на прямую в короб. Можно взять дополнительный квадрат картона и уже на него клеить стенки, а затем вкладывать в короб.
Если будете использовать не микросервоприводы (SG90 или подобные), а более мощные (допустим "стандартного" типоразмера, они потребляют намного больший ток), тогда запитывайте их не от Arduino, как на изображении выше, а от внешнего источника (не забывая соединить "землю" Arduino с "землёй" внешнего источника).
Учтите, что не все порты USB (на одной плате схема питания может быть разной) и не на всех платах способны выдать достаточный ток для питания даже таких маломощных сервоприводов. Ещё для экономии производители иногда не используют схему защиты питания портов USB и при слишком большой нагрузке они могут "сгореть". Если не знаете, сколько тока может выдать USB порт Вашего компьютера/ноутбука, к которому подключаете, лучше запитывать от другого источника питания (перед загрузкой скетча в Arduino, не забудьте отключать сервоприводы).
#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; }
В меню "Инструменты" выберите плату, которую используете и порт, к которому она подключена.
Загружаем скетч в Arduino и можно приступать к игре