Домашние велопроекты: часть 1, steering plate

Первым из завершенных и запущенных в работу велопроектов (как самый простой в реализации) стал аналог Elite Sterzo Smart – подставки под переднее колесо велосипеда, позволяющее управлять персонажем в Zwift.

Кстати, за время моей сборки подставки, Zwift успел выкатить обновление, в котором можно задействовать кнопки на руле на специальных велотренажерах – т.е., появилось разделение на “analog steering” и “digital steering”. В последнем случае дорога виртуально делится на полосы и по нажатию кнопки персонаж сдвигается на соседнюю полосу.

Реализация аналогового steering’а довольно простая: любой элемент, которым можно регистрировать смену положения – переменный резистор, энкодер и тому подобное – отдает сигнал (напряжение с резистора или импульсы с энкодера) на микроконтроллер, тот его преобразует в угол, анонсирует себя в беспроводной сети как steering device и отдает Zwift’у установленный сейчас угол. Иначе говоря, реализация подставки за 110$ может быть выполнена на трех деталях: ESP32 в качестве  дешевого (около 3$) контроллера, в котором достаточно ресурсов для всего этого + есть Bluetooth; переменный резистор по цене меньше 1$ за штуку, который можно выдрать со старого радиоприемника или телевизора; ну и аккумулятор, чтобы это все питать. В идеале поставить еще стабилизатор, чтобы меньше зависеть от уровня заряда аккумулятора.

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

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

Наиболее простым в повторении и без лишних зависимостей оказался этот вариант, однако 3D-принтера у меня пока нет и я пошел другим путем – использовал большой старый подшипник, размещенный на деревянной основе, плюс площадка для колеса с упорами, связанная с подвижной частью подшипника. В качестве доработки добавил потом еще мелкий вертикальный подшипник, чтобы площадка могла в него упираться на случай спринтов “на ногах”, когда большая часть веса переносится на руль.

Процесс изготовления:

Как выяснилось в процессе сборки электроники, в хозяйстве не оказалось подходящего стабилизатора для питания ESP32 – его нельзя питать напрямую от Li-ion-аккумулятора. В итоге поставил то, что было под рукой: step up до 10В и потом step down на mp2307 до 3.3V. Поставил старый микропереключатель для отключения аккумулятора и предусмотрел разъем для его подзарядки без снятия верхней площадки. Для определения положения использовал первый попавшийся под руку малогабаритный резистор на 33 КОм с длинным штоком. В общем-то, пойдет любой от единиц до десятков КОм. Для использования энкодера придется немного переделать код – опыта с ними у меня еще нет, так что пошел по простому пути.

Размещение электроники:Пока электроника была еще не закреплена и ESP’шка была на отладочной плате – поставил верхнюю платформу и снял данные о ее крайних положениях (сообщения об этом можно почитать в мониторе последовательного порта в Arduino IDE если подключить ESP’шку через USB). Дальше эти значения прописал прямо в прошивке ESP’шки – на тех лимитах, что были указаны изначально, платформа была сильно чувствительной. Да и в данном случае подогнал прошивку непосредственно под свою конструкцию. Углы ограничил на уровне -35/+35 градусов. Сейчас думаю, что можно было сделать еще меньше.

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

float readAngle() {
int potVal = analogRead(POT);
Serial.println(potVal);
if (potVal < 960) {
return -35;
} else {
if (potVal > 2370) {
return 35;
} else {
//return (float)((potVal / 25) - 80);
return (float) map(potVal,960,2370,-35,35);
}
}
}

Соответственно, 960-2370 – диапазон регулировки резистора, -35-35 – углы, отдаваемые при этом Zwift’у.

Подключение проводов к ESP32, в общем-то, тривиально: +3.3 на соответствующий пин, GND – на любой удобный (например, тот, что рядом с 3.3V), резистор – края на GPIO 17 и 18, движок – на GPIO32 (смотрим блок setup() в коде, если что).

Первые пробы:

В целом вышло нормально. При нормальной погоде выкрашу, чтобы не так бросалось в глаза. Вышел, правда, немного оверинжиниринг – можно было не заморачиваться с подшипником и сделать ближе к оригинальному варианту, который напечатан на 3D-принтере, только сделать его из дерева. Взять 2 куска фанеры, на верхней части с торца закрепить пару мелких подшипников, а на противоположной части сделать ось (как при этом связать это все с резистором – пока не думал). Конструкция получится более плоской, да и не придется искать громоздкий подшипник.В моем варианте колесо приподнялось на 4 см, но так как планирую под станок положить плотный коврик, плюс вместо колеса использовать climber, то в итоге эти 4 см компенсируются. А для всяких там Tacx Flow проблемы вообще не было бы – просто заменяешь штатную подставку. Еще из небольших доработок – надо будет проложить между “статором” и “ротором” лист толстой резины, чтобы руль не так легко крутился. А в  идеале (но это надо было изначально заложить в конструкцию) – сделать 2 пружины с центровкой верхней площадки.

Видео калибровки: https://youtu.be/4SHySgrykrw

Итого затрат:

  • ESP32 – 96 грн
  • Резистор и выключатель – найдены в хламе
  • Фанерка и детали из гетинакса выпилены из подручных средств.
  • Аккумулятор взят с дохлого садового светильника
  • Стабилизаторы когда-то купил на ebay по 0.5$/штука.
  • Пара старых подшипников с каких-то станков.

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

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