DIY Exergaming в самоизоляции

Самоизоляция у каждого своя. В моём случае, главной проблемой быстро стало поддержание организма в нормальной физической форме. Работа в офисе и хождение по магазинам живьём, оказывается, неплохо держали организм в тонусе. Мне повезло обзавестись самым дешёвым велотренажёром до кризиса, до того, как их везде раскупили, так что я думал, что проблема решена—но не тут-то было. Когда кручение педалей становится монотонной ежедневной необходимостью, следующая проблема—скука. А от всего, что скучно, человеку свойственно отлынивать. Как сделать поинтереснее? Может, совместить с игрой? Почему бы и нет? Я давно уже думал, как было бы здорово, если бы в игрушке-леталке скорость твоего самолёта зависела от скорости кручения педалей, и вот настало время воплотить идею на практике. Для этого, оказывается, уже и слово придумали—“exergaming”.

Первая мысль была найти готовый джойстик с колёсиком для регулирования скорости, и как-то хакнуть его. К счастью, джойстика, который не жалко было бы ломать, под рукой не было, и я решил сделать его сам. В ящике стола нашёлся Arduino Micro, купленый пару лет назад для другого проекта, и так и не использованный. У Micro есть USB разъём, и комьютер опознаёт его как клавиатуру. А где клавиатура, там недалеко и до других HID (Human Interface Device) устройств. Библиотека для джойстика нашлась быстро и оказалась вполне удобной ( github.com/MHeironimus/ArduinoJoystickLibrary ). Добавим несколько кнопок и джойстик от картинка SparkFun—готово! Схема совершенно тривиальна—Arduino, кнопки, два переменных сопротивления в джойстике.

Следующий вопрос—как получить скорость кручения педалей с тренажёра. Почти в любом современном тренажёре есть дисплей и датчик, но ковырять тренажёр (и заодно лишаться гарантии) не хотелось. К тому же, хотелось, чтобы любой желающий мог без проблем повторить весь процесс. Для начала я использовал простую кнопку на макетной плате, проверить что Arduino работает. Проверил, но так увлёкся, что к концу проверки кнопка буквально развалилась. Время подумать о серьёзном датчике. В финал вышли магнитный и оптический датчике, и я остановился на магнитном, предполагая (правильно), что с ним будет меньше проблем.

Магнитных датчиков на эффекте Холла оказалось множество разных моделей, я остановился на Diodes AH3572, потому что ему не важна полярность, ему достаточно 3.3 вольта с Arduino, он относительно дешёвый и бывает в двух типах корпусов, что удобно и для макетной платы, и потом для монтажа на печатную плату. Самый интересный вопрос был—с какого расстояния датчик будет срабатывать. Тут мне повезло, в закромах Родины нашёлся довольно сильный китайский магнит в виде кубика со стороной около сантиметра. С этим магнитом датчик уверенно срабатывал на расстоянии до 3 сантиметров. Магнит на педаль, датчик скотчем на корпус—работает.







Единственная сложность, что датчик, который срабатывает один раз за оборот, не даёт готовых данных, пригодных для использования в качестве значения скорости. Из одного клика на оборот надо как-то получить относительно плавное значение, но в то же время чтобы оно довольно быстро реагировало на изменения скорости, и особенно на остановку. Проблема решилась примерно в 20 строчек кода.

// Прерывание на срабатывание датчика
void interruptHandler() {
  unsigned long now = millis();
  if (lastInterrupted + DEBOUNCE_MS < now) {
    lastInterrupted = now;
    throttleBuffer += THROTTLE_BOOST;
    if (throttleBuffer > MAX_AXIS) {
      throttleBuffer = MAX_AXIS;
    }
  }
}

// Вычисление текущего значения скорости в главном цикле
void calculateThrottle() {
  if (throttleBuffer < RELEASE_PER_TICK) {
    throttle += throttleBuffer;
    throttleBuffer = 0;
  } else {
    throttle += RELEASE_PER_TICK;
    throttleBuffer -= RELEASE_PER_TICK;
  }

  if (throttle > MAX_AXIS) {
    throttle = MAX_AXIS;
  }
  
  if (throttle > DECAY_PER_TICK) {
    throttle -= DECAY_PER_TICK;
  } else {
    throttle = 0;
  }
}


До этого момента всё было легко, дальше начались сложности. Удивительно сложно оказалось подобрать подходящую игрушку. За пару дней я перепробовал множество вариантов. Мне было нужно, прежде всего, чтобы она нормально работала на относительно слабом офисном ноутбуке. На этом моменте отсеялись все современные красивые леталки. Старые леталки или не запускались, или были очень унылыми. Первой подходящей игрой оказался Ил-2 Штурмовик, но тут я понял, что серьёзные симуляторы тут не подходят. Во-первых, слишком мало органов управления, да и джойстик недостаточно точный. Во-вторых, там надо слишком много внимания и думать головой в процессе—не забывайте, мы тут не в игрушки играем, а усиленно крутим педали, прежде всего. Ну и самое главное, всё равно очень уныло, кто видел его цветовую гамму, тот поймёт. Надо было что-то аркадного типа, несложное, яркое и лёгкое.

В конце концов я остановился на Sky Rogue ( store.steampowered.com/app/381020/Sky_Rogue ). Что интересно, у известного популяризатора космоса Scott Manley есть её обзор ( youtu.be/bRCsB5QoxEM ). Простая, но яркая, стилизовання под 8-битную, графика, минимальные требования, алгоритмически генерируемый (неповторяющийся) ландшафт, бодрящее действие, бесконечное оружие—что ещё надо для получаса безостановочной движухи? Sky Rogue больше приспособлена для gamepad, но, к счастью, Steam в полноэкранном режиме позволяет переназначать органы управления джойстика для эмуляции gamepad.



Теперь остался последний штрих—корпус. Играть с макетной платой в руке, как оказалось, можно—но довольно неудобно. Autodesk Fusion 360 в одну руку, 3д принтер в другую, вперёд! Но сначала надо немного подумать. С контроллером надо управляться одной рукой, другая нужна держаться за тренажёр. Обидно было бы в самоизоляции увлечься игрушкой и навернуться с тренажёра. Форма должна быть симметричной, чтобы можно было пользоваться любой рукой. Ну и желательно, чтобы было просто печатать и собирать—в самоизоляции не каждый найдёт у себя три одинаковых винта М2 нужной длины.



Остановился на дизайне картинка из двух половинок, склеенных между собой. Уж моментальный клей точно есть везде. Для быстрого совмещения половинок, пока клей не высох, использованы направляющие штырьки, которые представляют из себя 5мм куски материала для принтера. Кнопка печатается отдельно и вкладывается в корпус при сборке. У неё нет оси, она как бы катается по поверхности печатной платы, и прижимается к ней нижней половиной корпуса. Подбором наиболее удобной формы я, конечно, немножко увлёкся. Самая первая версия, сделанная точно по размеру компонентов, оказалась слишком маленькой, чтобы её можно было удобно держать в руке.



Изготовление нескольких контроллеров обошлось (в Сингапуре) примерно в 3000 рублей, включая изготовление печатной платы в Шеньжене ( www.pcbsino.com )—к счастью, китайская электронная промышленность продолжала работать, несмотря на эпидемию. Примерно половина стоимости—Arduino Micro, второй дорогой компонент—джойстик. При серийном производстве можно было бы сделать раза в три дешевле, но таких глобальных планов у меня не было (если кому интересно—пишите).

Но самое главное—с тех пор, как я сделал мой контроллер, полчаса на тренажёре пролетают совершенно незаметно. Держите себя в тонусе и будьте здоровы!

Источник: habr.ru