Домашние велопроекты: часть 2, самодельный велостанок

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

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

Теория

Если разобрать станок “по кубикам”, то в случае smart-станков, вроде Tacx Flow/Flux/Vortex и им подобных, имеем ряд интерфейсов “на выход”, которые отдают те или иные данные тренировочным программам, и интерфейс “на вход”, который принимает данные от той же программы. К первым относятся датчики скорости колеса, каденса, мощности. В случае подключения аксессуаров добавляется, например, передача угла поворота руля. Ко вторым относится управление электронным тормозом на станке – то, что позволяет менять нагрузку на трансмиссию и, в конечном счете, на ноги велосипедиста.

Рассмотрим датчики ближе. Типичное подключение станка в Zwift’e – мощность, каденс, сопротивление. Зачастую станок анонсирует себя еще как датчик скорости – в каких-то случаях может пригодиться и этот вариант – например, при записи тренировки велокомпьютером, когда GPS-координаты не меняются, а виртуальную “скорость” брать откуда-то надо.

Если посмотреть на экран сопряжения датчиков в Zwift’e, то можно заметить, что для выбора доступен или датчик мощности, или датчик скорости. С датчиком мощности все проще, подключил, откалибровал и работаешь. В случае с датчиком скорости надо указать размер колеса, потом тип станка и уже потом можно всем этим пользоваться. В чем разница? Забавно, но особо ни в чем.

Большинство станков на рынке – будь это простой Tacx Satori с ручной регулировкой усилия или “навороченный” Tacx Neo – не измеряют непосредственно мощность. Если посмотреть на внутренности Tacx Flux, то можно увидеть, что датчик всего один – оптический датчик скорости вращения маховика (это вот тот, на белом шлейфе). И… все. Все данные, которые в дальнейшем станок “отдает наружу”, строятся исключительно на этой скорости.

Как это происходит? У нас есть маховик определенной массы (в случае Tacx Neo мы вращаем напрямую вал двигателя – фактически, тот же маховик), на вращение этой массы нужно прикладывать определенную мощность. Условно: если маховик крутится со скоростью 5 оборотов/секунду, то тратится 200 Вт энергии, если 10 оборотов/сек – то уже 500 Вт. Данная кривая соответствия скорости/мощности сохранена непосредственно в станке, что и позволяет ему отдавать “наружу” данные в виде мощности. Что происходит, если в Zwift’e выбрать источником данных датчик скорости (например, если датчика мощности все же нет)? Точно то же самое: размером колеса мы лишь выбираем передаточное соотношение между, собственно, колесом и валом маховика станка, где и стоит датчик “скорости”. А дальше мы выбираем тип станка – фактически, одну из предустановленных и сохраненных непосредственно в Zwift’e кривых мощности. Если подвести итог, то источником данных в любом случае служит скорость вращения колеса (реального или внутри станка), а дальше эта скорость пересчитывается в мощность либо в станке, либо в Zwift’e. Далее в эту мощность вносится поправочный коэффициент в зависимости от установленного уровня сопротивления: например, если колесо крутится со скоростью 5 оборотов/сек, то это 200 Вт, но если при этом тормоз работает для симуляции градиента 5%, то это уже 500 Вт.

Стоит отметить, что в современных станках, например, от Elite – Drivo и Direto – есть оптический датчик крутящего момента (OTS), что позволяет мерять непосредственно мощность.

Ну и, раз уж была затронута “внутренняя кухня” станка, то что происходит с каденсом? В станках ведь обычно нет выносного датчика, меряющего частоту вращения педалей, источником данных является все тот же датчик скорости колеса, скорость которого может меняться в зависимости от передаточного числа трансмиссии и других факторов. Измерение происходит за счет замеров неоднородности вращения этого самого колеса. Велосипедист в любом случае не способен вращать педали идеально равномерно. В конечном счете это выливается в то, что в один момент времени колесо крутится со скоростью, например, 5 оборотов/сек, через полсекунды – 5.05 об/сек, потом тормозится до 5, снова разгоняется до 5.05. Выделяем эту частоту, делим на 2 (трансмиссию-то мы “толкаем” двумя ногами по очереди) – вот и готовы данные по каденсу. В Tacx Neo сделали даже анализ педалирования на базе этого – возможно, в станке есть еще какой-нибудь акселерометр, чтобы знать, какие данные к какой педали относятся за счет наклонов станка. Update: в описании Neo 2T встречается наличие емкостного сенсора положения педалей – вероятно, где-то в передней части станины.

Если вернуться к теме практической реализации велостанка, то все датчики, работающие “наружу”, вполне могут не быть частью станка. Фактически, мне не так важно, указывать в Zwift’e виртуальный измеритель мощности в моем Tacx Flux или реальный Garmin Vector 2S (с той оговоркой лишь, что S-вариант меряет мощность только одной ноги, удваивая ее). В итоге, при наличии ваттметра непосредственно на велосипеде – а его стоит там иметь, чтобы пользоваться не только на станке, а и при реальных заездах – все функции станка можно свести лишь к управляемому тормозу (т.е., работу исключительно на прием данных от Zwift и подобных приложений).

В качестве ваттметра (с датчиком каденса, так как это обычно неотъемлемая часть таких измерителей) можно использовать как промышленный вариант (вроде упомянутого Vector’а), так и повторив какой-либо проект для самостоятельного изготовления. Иначе говоря, не вижу смысла тратить силы на реализацию ваттметра в станке, если можно потратить их на изготовление ваттметра на велосипеде.

Реализовывать ли потом ваттметр в станке по схеме, описанной выше? Пока не знаю. С одной стороны из “железа” это требует лишь датчик скорости колеса/маховика. С другой – в прошивке надо реализовать, как минимум, кривую соответствия параметров (а это надо делать уже под конкретное железо, с которым я пока еще не определился), а как максимум – универсальный алгоритм калибровки, позволяющий по моменту инерции раскрученного до определенных оборотов колеса, получить зависимость мощности для поддержания этих самых оборотов. Т.е., технически – говорим пользователю раскрутить колесо до определенных оборотов, далее – замеряем дельту времени, за которую обороты упадут до определенного уровня. Получаем момент инерции / потери мощности. Исходя из этого строим зависимость. И, я так понимаю, то же самое нужно повторить для какого-то другого значения на тормозе, чтобы знать зависимость скорости торможения от того, что мы подаем на тормоз. Или это так не будет работать? Пока не знаю. Забавно, но в Zwift’e калибровка датчика мощности выполнена именно по такой же схеме, а вот если подключить датчик скорости и выбрать вариант “другой велостанок”, то нет даже минимальной калибровки и данные в Zwift’e весьма далеки от реальных. Очередная недоделка?

Поиск проектов

Сведение задачи к реализации исключительно управляемого тормоза позволяло сделать все даже на довольно простых микроконтроллерах, ведь задача сводилась к анонсированию себя в той или иной (если быть точным, то BLE или ANT+) беспроводной сети, прием данных от софта и установка какого-то параметра пропорционально полученному градиенту. Начал присматриваться к готовым проектам в сети, поиск дал несколько результатов.

Самым интересным был проект на базе Arduino Nano + какой-то модуль для ANT+. Штатно проект заменял собой оригинальный компьютерный модуль на старых версиях станка Tacx iFlow, подключаясь непосредственно к электронному тормозу и взаимодействуя, например, со Zwift’ом через ANT+ – фактически, идеальный готовый вариант. Однако автор так и не предоставил какие-либо детали реализации проекта; я даже зарегистрировался на форуме и написал ему сообщение, но ответа так и не получил (автор уже месяц как не появлялся на форуме вообще).

Было пару проектов на базе Raspberry Pi, но довольно крупных, с работой с тем же старым Tacx iFlow, но со штатным компьютерным модулем, подключаемым через USB. Соответственно, куча лишних модулей и лишнего кода. Была даже идея написать авторам о том, что неплохо бы сделать возможность простого вывода пропорционального сопротивлению параметра где-нибудь на гребенке GPIO, независимо от USB-подключения.

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

В качестве базы в проекте использовался ESP32 – ресурсов хоть и больше, чем нужно, зато штатно есть BLE, так что весь “мозг” устройства можно реализовать на одном модуле.

Примерно вник в логику работы кода целиком – поверхностно, правда: у меня не было знаний об алгоритме работы используемого там шагового двигателя, да это и не требовалось, так что даже не искал. В итоге вычистил из кода все, что касается работы с кнопками, шаговым двигателем и дисплеем – ведь у нас smart-станок, зачем ему лишние органы управления? В итоге функция установки градиента свелась поначалу к простому отображению полученного от Zwift градиента, а позже – в выводе значения в виде PWM на одном из GPIO.

Из темных пятен для меня пока остается установка Bluetooth-сессии. Автор проекта (он ли?) реализовал фейковый датчик мощности, показывающий постоянную мощность в 256Вт и для подключения управляемого тормоза сначала надо подключить этот виртуальный ваттметр. В дальнейшем его можно отключить и подключить уже реальный ваттметр.

В дальнейшем я расширил функционал прошивки, добавив лимиты для возможных градиентов в Zwift’e – максимальный в 23% видел в Richmond’e; соответственно надо, чтобы станок по возможности мог менять сопротивление в рамках этого градиента. Если же железо станка не позволит работать с таким усилием торможения, то всегда можно поправить величину максимального градиента для более реалистичной работы с доступным диапазоном. Плюс не забываем, что в Zwift’e есть своя настройка “trainer difficulty” (и она дефолтно стоит на 50%), так что в случае чего можно сделать подстройку и там. В случае со спуском нет смысла симулировать градиенты до 23% (по крайней мере, пока не проработан вариант “подкручивания” колеса на спусках, как это сделано в Tacx Neo), поэтому лимитировал значением в 5%. Кроме того, Zwift устанавливает на спусках сопротивление станка только на 1/2 от реального градиента – т.е., мы получаем симуляцию спуска до 10%.

В итоге основной выход PWM меняется в диапазоне значений -10% – +23%, по факту диапазон значений от Zwift’a приходит -5% – +16.7%. Почему так происходит с положительным значением – непонятно.

Пара технических уточнений:

  • Zwift шлет градиент в сотых долях процента. Иначе говоря, для диапазона, указанного выше, используются значения -500 – 1670.
  • Для нулевого градиента все равно используется подтормаживание, так как вращать ненагруженный тормоз в станках обычно гораздо проще, чем при реальной езде. А вот уже при уходе градиента в отрицательные значения торможение пропорционально снижается до нуля. В итоге на градиенте, например, -5% (-10% с учетом математики Zwift’а) мы вращаем исключительно маховик, без влияния электроники. При реализации симуляций спуска, пожалуй, надо сделать более узкий диапазон – например, -2%, ниже которых уже будет включаться двигатель для “подкручивания” колеса.

Для удобства дальнейших экспериментов добавил еще 2 PWM-выхода: один для положительных значений градиента, второй – для отрицательных. Иначе говоря, один для управления тормозом, второй – для управления двигателем.

Немного о реализации тормоза

Если посмотреть на существующие станки, то можно отметить, что управляемый тормоз обычно представляет собой или электромагнит, взаимодействующий со стальной пластиной, закрепленной на маховике (такая себе современная модификация станков с ручной регулировкой усилия, где тросик от манетки на руле приближал или удалял постоянные магниты от стального маховика), или чуть более продвинутый вариант – использование электродвигателя в режиме генератора.

Собственно, использование любого подходящего генератора – пожалуй, самый легкий в реализации способ электронного тормоза. Берем на olx’e б/у генератор от машины за 500-700 грн, прижимаем к колесу (или можно изобразить более продвинутый вариант, поставив на закрепленную на станине ось второй шкив и барабан с кассетой и связав все ремнем – такой себе direct drive), запитываем обмотку возбуждения (да, минус таких генераторов – необходимость в первоначальной запитке. Дальше можно использовать ту же энергию, что дает сам генератор), а на выход цепляем нагрузку – лампочку на 12В, например. Больше лампочек – больше нагрузка. Соответственно, при наличии контроллера, связанного с Zwift’ом, мы с его помощью с PWM-выхода управляем ключом, создающим нагрузку для генератора. Все, smart-станок готов.

Обдумывая разные варианты реализации тормоза, пришла в голову идея – а зачем вообще промежуточные узлы, использование тренировочных покрышек на wheel-on-станках или перестановка кассеты на direct drive? Можно попробовать тормозить непосредственно колесо, разместив на спицах быстросъемные магниты, а электромагниты – на станине вокруг колеса. Такой себе гибридный вариант. Накупил набор неодимовых магнитов разных размеров, начал искать, а потом и мотать самостоятельно электромагниты, ставил эксперименты. В целом, идея жизнеспособна и я еще вернусь к ней позже, после других вариантов – хотя бы в качестве наработки опыта. На деле вышло так, что мелкие недорогие магниты на адекватном расстоянии от электромагнитов (1-2 см) не смогут оказать существенного сопротивления; более мощные и дорогие уже обойдутся по стоимости, как б/у генератор от машины. Плюс будет проявляться дискретность тормоза – на малых оборотах колеса будут сильно чувствоваться промежутки между магнитами. В идеале использовать сплошную стальную полосу – и уже к ней весьма мощный электромагнит. Получается весьма монстрообразная конструкция – и не факт, что дешевая.

Немного чисел. Сделал электромагнит, поставил под кухонными весами, далее пробовал разные предметы в качестве объекта притяжения (естественно, учитывая вес самого объекта на весах). Вот что вышло:

  • тяга крепежного неодимового магнита (т.е., закрытого в стальную оболочку и “работающего” только с одной стороны) диаметром 2 см и на расстоянии ~2-3 см от электромагнита получилась 15 грамм.
  • кучка стальных шайб и гаек большей площади притягивалась с силой 20 грамм.
  • прямоугольный неодимовый магнит (неэкранированный, пробовал 2 размера, оба плюс-минус по цене крепежного) давал тягу в 54 грамма.
  • Тот же магнит, но на вполовину меньшей катушке (при том же токе) давал тягу в 40 грамм.
  • Простое уменьшение расстояния примерно до 1 см (тот же магнит, большая катушка) давало тягу уже более 300 грамм.

Иначе говоря, можно вбрасывать средства в мощные магниты и снимать электромагниты с погрузочных кранов – а можно просто уменьшить зазор. Однако даже на самой жесткой станине закрепленное колесо будет “гулять” краем при педалировании, так что вряд ли получится сделать зазор меньше 1 см так, чтобы в один из моментов магниты на колесе (или стальная полоса) не въехали в электромагниты на станине. Продуктивнее проработать вариант с тем или иным готовым двигателем – зазоры от обмотки до магнитов там минимальные и в компактных габаритах выходит хорошая мощность.

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

Для эксперимента заказал мотор-колесо на 48V 1000W. Подходят только мотор-колеса с прямым приводом (слова для поиска: gearless, non-geared, с поддержкой рекуперации), так как редукторые имеют обгонную муфту и использовать его в режиме генерации (а значит – и торможения) не получится. Дальнейшие эксперименты покажут, требуется ли у колеса большая мощность или можно обойтись колесом поменьше. 1000 Вт – это номинал, при этом колесо крутится со скоростью 470 RPM. Даже на самой высокой передаче при каденсе 90 обороты вала двигателя будут более низкие, что уж говорить про вариант в стиле 34/25 @ 70 RPM, где будет лишь 1/5 от мощности? С другой стороны, это цифры для номинальных режимов, в варианте условно короткозамкнутого выхода (при PWM duty = 100%) все может быть гораздо интереснее.

Обвязка мотор-колеса поначалу планируется максимально простая: трехфазный мост, выход которого коротится мощным ключом, управляемым с ESP32. При дальнейшем развитии темы можно попробовать использовать датчики Холла в моторе, реализовать контроллер мотора и “подкручивать колесо” на спусках.

Когда писал эти абзацы, благодаря объявлениям на olx’e открыл для себя возможность торможения вращающегося алюминиевого обода в магнитном поле: один умелец сделал и продавал самодельный велостанок с магнитным тормозом. В качестве тормоза был близко расположенный к ободу штатного колеса велосипеда неодимовый магнит. При этом в принципе работы заявлялось взаимодействие магнита с алюминием. Не поверил, полез в гугл. Таки да. Провел эксперимент сам с электромагнитом – действительно, тормозится. Не особо сильно, но работает. Можно будет развить эту тему: будет вариация на тему изначального варианта, но без чего-либо на самом колесе.

Update: как оказалось, есть промышленный вариант такого станка – Stac Zero (сборы на kickstarter, выпуск в 2016, более не выпускается). Причем, он с электроникой – магниты приближаются и удаляются от ободов с помощью сервоприводов, есть связь с компьютером через BLE/ANT+, измерение мощности. Отзывы неоднозначные: кому-то все нравится, у кого-то езда “как по песку” или “со слегка зажатыми тормозами”. Возможно, в варианте с электромагнитами и правильной модуляцией магнитного поля в зависимости от скорости колеса все было бы лучше? Далее, в одном из роликов (вроде от DC Rainmaker) был замер нагрева обода пирометром – 40 градусов после неизвестно каких нагрузок. Немного, но тоже повод для размышлений.


Итого на сейчас:

  • Заказано и ожидается мотор-колесо. Плюсы: конструктивно предназначено для того, чтобы разместить его прямо между дропаутами велосипеда, сразу есть посадочное место для кассеты. Остается только разместить это все на станине. Минусы – цена, около 170$. Хотя в любом случае это в разы дешевле wheel-on-станков на сейчас, не говоря уж про direct drive. А возможности у такого варианта открываются широкие: по тому же принципу сделан и Tacx Neo.
  • В качестве более дешевой модели можно проработать вариант с автомобильным генератором. Электрически схема будет отличаться минимально, разница лишь в конструкции. На сейчас генератора у меня нет, так что отработаю все на мотор-колесе, потом буду развивать эту сторону.
  • В качестве экспериментального варианта можно будет попробовать торможение обода электромагнитами. Вряд ли тут получится добиться хорошего торможения на низких оборотах и симулировать хорошие градиенты, но если получится добиться хотя бы 5%, то почему бы и нет? Надо полноценная симуляция – ставишь велосипед на “взрослый” станок. Надо просто потренироваться, пока на улице идет дождь – закрепил велосипед на такой вот “гибридный” (direct wheel? 🙂 ) станок и тренируешься. Модуляция сопротивления есть, лишь выбирай передачу повыше.
Станина

Для экспериментов пытался для начала найти у кого-нибудь разломанный станок, чтобы взять с него основу и уже на нее лепить свою электронику. Неудачно – ни у кого нет разломанных станков :). Неоднократно жалел, что не забрал на olx’e за 1500 грн старый рабочий iFlow – но продавали его незадолго до того, как я увлекся всей этой темой с микроконтроллерами. Пришлось делать станину самому.

Одной из идей, пришедших в голову, было изготовить основу из полипропиленовых фитингов и труб. Дешевый материал, используемый в сантехнике для водопровода и отопления. Трубы на 32 мм у меня было в достатке, фитинги тоже были, но в итоге докупил необходимое. По затратам – около 170 грн (~6$) на фитинги, с трубой – не знаю, но на все про все, думаю, 10$ хватит. В качестве зажимов использовал шпильку с гайками и шайбами, купленными в том же строительном магазине. Обрамление эксцентрика – 2 муфты для водопровода на 1/2 из черного металла.

Результат того, что получилось:

<вставить фото>

Итог: механической прочности достаточно: конструкция вполне выдерживает мой вес. Однако в точках зажима жесткости не хватает, в итоге колесо и велосипед в целом “гуляют”. С учетом статичности велосипеда – весьма сложно на нем держать равновесие, не говоря уж о размещении чего-то на станине возле колеса. Есть идея сделать вертикальные распорки к точкам выхода осей в непосредственной близости возле зажимов. Плюс, можно было бы уменьшить возможность раскачки велосипеда, заменив переднее колесо на статичную подставку (возможно, реализовав при этом какой-то из остальных проектов). Но, думаю, в итоге полипропиленовый вариант будет больше макетом для отладки различных экспериментов, а в окончательном виде надо будет ориентироваться на металлическую станину. Да и цена выходит на том же уровне – метр профиля 40x20x3 стоит около 80 грн, а надо его около трех метров.

*** продолжение следует ***

Одна мысль про “Домашние велопроекты: часть 2, самодельный велостанок”

Добавить комментарий