Перейти к содержимому

Документация

Колёса по маркам

Что поддерживается у каждой марки и насколько это проверено на живых колёсах.

Приложение разбирает протокол каждой марки отдельно. Ниже честно написано, что работает, а что собрано по разбору фирменной программы и ждёт проверки на живом колесе.

Правило, по которому всё это делается: команда отправляется в колесо только тогда, когда её смысл подтверждён живой записью или реальной записью в колесо. Разбор чужой программы это всего лишь предположение. Исключение — настройки KingSong и старых InMotion: их команды собраны по двум независимым источникам, которые совпали байт в байт, но на живом колесе ещё не проверялись. Это сказано у каждой из этих марок.

Если колесо переименовано и по имени его не узнать, приложение узнаёт Begode, KingSong и LeaperKim по первым же байтам от колеса и само переключается на нужный разбор. NOSFET по байтам от LeaperKim не отличить, поэтому переименованный NOSFET покажется как LeaperKim.

На экране настроек колеса значения подписаны словами там, где слово точнее числа: выключенный тилтбэк — это «Выключен», а не «0 км/ч», порог в King Song, который не сработает, — тоже «Выключен», единицы Begode — «Километры» или «Мили», а таймер автоотключения — «3 мин», а не «180». Так подписан и ползунок, за который вы держитесь, а не только уже сообщённое колесом значение: сдвинув тилтбэк в самый низ, вы видите слово «Выключен» ещё до записи. Подписи идут на языке интерфейса — раньше часть марок писала их только по-русски, а часть только по-английски, независимо от того, на каком языке у вас приложение.

Настроек, которых у вашего колеса нет, на этом экране не видно, а раздел, где не осталось ни одной, не показывается вовсе. Раньше на Android такие строки стояли с пометкой «Не поддерживается».

Сам экран собран разделами, и разделы свёрнуты: у P6 настроек три с половиной десятка, и развёрнутыми они превращаются в тринадцать экранов прокрутки. Открыт сразу первый раздел — «Управление», ради которого сюда обычно и заходят, — у остальных в заголовке написано, сколько в них настроек. Строка поиска над разделами разворачивает всё, что подошло: «тилтбэк» находится за три буквы. Переключатель «Отладочные значения» дописывает под каждой настройкой смещение байта и сырое число — это для разбора протокола, и по умолчанию он выключен. Всё это одинаково на Android и на iPhone.

LeaperKim#

Самая полная поддержка.

  • Вся телеметрия, включая углы, токи левой и правой батарей и пороги колеса.
  • Батарея по ячейкам, страницами.
  • Настройки колеса пишутся из приложения: жёсткость педалей, тилтбэк по скорости, скоростной аларм, тилтбэк по ШИМ, подсветка экрана, угол педалей, транспортный режим, единицы, поправка измерения напряжения, старт на низкой батарее, высокоскоростной режим, громкость кнопок, максимальное напряжение зарядки, помощь при разгоне и торможении и другое.
  • Профили настроек.
  • Автофара, автогромкость.
  • Фара включается на всей марке, включая старшие модели. Sherman, Sherman Max, Sherman S и Abrams понимают только текстовую команду света — двоичной в их прошивке нет вовсе, и кнопка фары на них раньше молчала. Теперь приложение смотрит, какое колесо ответило, и шлёт ту команду, которую эта прошивка разбирает.
  • Удержание стоящего колеса включённым. Настройка остаётся включённой, если выключить колесо из приложения: раньше на Android кнопка выключения молча снимала галку.
  • Максимальное напряжение заряда показывается в вольтах, только когда база известна: её сообщило колесо или она известна для этой модели или прошивки (Lynx, Sherman-L — 145). Иначе видна только поправка, например «+6,2 В». Раньше такие колёса показывали неверное число — 134,2 В вместо настоящих 151,2 В, с концом ползунка на 140 В.
  • Загрузка прошивки в колесо — отдельным пунктом в меню дашборда, и только на колёсах LeaperKim и NOSFET: на других марках этого пункта нет. Проверена она пока на двух колёсах — LeaperKim Lynx S и NOSFET Aeon; у остальных колёс LeaperKim формат файла тот же, но вход в загрузчик никто не проверял, а у Sherman L вдобавок другой микроконтроллер. Настоятельно не советую этим пользоваться: неудачная прошивка превращает колесо в тяжёлый предмет мебели.
  • Восстановление прошивки — на Android, в меню сохранённого колеса по долгому нажатию в гараже: «Попробовать восстановить прошивку». Это для колеса, которое после неудачной прошивки молчит — в поиске его нет, телеметрии нет, — но на «Связь во сне» отвечает. Приложение подключается по сохранённому адресу и льёт выбранный файл вслепую, без проверки наклона. Способов два: как восстановление в родном приложении LeaperKim, без команды, и с командой входа в режим прошивки впереди. Ни один на живом колесе пока не проверен; если первый не помог, выключите и включите колесо и попробуйте второй.
  • Журнал событий — отдельным пунктом в меню дашборда, на Android и на iPhone. Колесо ведёт свой журнал: события, срабатывания защит, ошибки. Кнопка «Прочитать журнал» просит колесо отдать записи; обычная телеметрия при этом не прерывается, а когда записи кончаются, чтение останавливается само. Прочитанное можно скопировать кнопкой «Скопировать» — например, чтобы прислать нам. Туда же пишут отладку кастомные прошивки, если вы их ставили. На живом колесе чтение журнала пробовали только с Android; с iPhone оно собрано и проверено на эмуляторе колеса, но не на настоящем.

NOSFET#

Протокол тот же, что у LeaperKim, поэтому доступно всё то же самое: телеметрия, батарея, настройки колеса, профили, свет, выключение.

Нет только удержания стоящего колеса включённым: оно пока привязано к LeaperKim. Если найдутся желающие проверить его на живом NOSFET, добавлю.

Журнал событий читается так же, как у LeaperKim — тем же пунктом меню дашборда.

Загрузка прошивки и её восстановление на Android есть и у NOSFET: прошивка у марки — ветка прошивки LeaperKim, с тем же форматом файла и той же командой входа в загрузчик. На живом Aeon загрузка из LoEUC проверена — заливается и заводская прошивка, и изменённая. Остальные модели NOSFET и восстановление прошивки пока никто не проверял, так что для них всё сказанное выше про LeaperKim верно вдвойне. Файл прошивки у каждой модели свой, номер модели стоит в его имени:

Модель Файл
Apex _main5010xx.bin
Aero _main5020xx.bin
Aeon _main5030xx.bin
Xeno _main5040xx.bin

Экран прошивки сверяет номер в файле с тем, что называет подключённое колесо, и предупредит, если они не совпадают.

InMotion#

Поддерживаются V11 и всё, что новее. Лучше всего разобраны V12, V13, V14 и P6.

  • Полная телеметрия.
  • Батарея.
  • Список ошибок и предупреждений от самого колеса.
  • Быстрые действия: ближний и дальний свет, автосвет, выключение.
  • У P6 дополнительно давление в шине, уровень сигнала LTE и максимумы поездки, которые считает само колесо: скорость, мощность батареи и мощность мотора.
  • Показания P6 обновляются вдвое чаще: приложение по очереди запрашивает у колеса два набора показаний, как это делает фирменное приложение.
  • Общий пробег колеса: приложение спрашивает его раз в пару секунд, как это делают WheelLog и фирменное приложение.
  • У V11 на прошивке платы 1.4 и новее пробег поездки теперь читается из того поля, где колесо его на самом деле считает; раньше он стоял нулём.
  • Частота опроса колеса настраивается: чаще опрос даёт более плавные показания, но сильнее нагружает соединение.

Для V12 и для семейства V14 вместе с P6 пишутся настройки света: включение автосвета, пороги его датчика освещённости и яркость. У V12 и V14 эти настройки устроены по-разному внутри, и это учтено.

У V11 пишется больше: ограничение скорости, угол и жёсткость педалей, громкость озвучки, автовыключение, яркость фары, помощь при разгоне и торможении, звук, дневные ходовые огни и собственный автосвет колеса. После каждой записи LoEUC просит колесо перечитать настройки, поэтому на экране видно то, что колесо приняло, а не то, что было отправлено. Две строки про вентилятор показываются, но не пишутся: одна из них — состояние, о котором колесо сообщает, а не настройка, и команды записи, которой я доверяю, нет ни для одной из них.

V12S, V11Y и V9 теперь разбираются своей раскладкой. V12S раньше читался как V12, и скорость, ШИМ, заряд и мощность у него были неверными. У V13, V11Y, V12S и V9 появился экран настроек: пишутся громкость озвучки, звук и автосвет, остальное пока только на чтение. У V12, V12S, V9, V11Y и V11 с прошивкой платы 1.4 и новее на виджете есть звуковой сигнал. У V13, V14 и P6 его нет: источники расходятся в байтах.

Осторожно: запись настроек проверена на расчётах и разборе фирменного приложения, но на живом колесе подтверждена не полностью. Часть настроек, например порог переключения дальнего света и состояние поворотников, доступна только на чтение, потому что способа записать их я не знаю.

Старые InMotion: V5, V8, V10 и Solowheel Glide 3#

Экспериментально. Это другой протокол, чем у V11 и новее, и живое колесо этой серии к LoEUC ещё не подключалось. Разбор проверен только на настоящих записях V5F, V8F и V8S, опубликованных в WheelLog. Если у вас такое колесо — пришлите запись с поездки, это ровно то, чего не хватает.

  • Скорость, напряжение, ток, мощность, температура, пробег поездки и общий, наклон.
  • Заряд — по напряжению, собственной батареи со страницами ячеек у этих колёс нет.
  • Модель, серийный номер и прошивка колеса.
  • Настройки колеса пишутся из приложения, и после записи колесо перечитывается: максимальная скорость, фара, декоративная подсветка, громкость, режим езды, горизонт педалей, кнопка на ручке, жёсткость педалей. Что доступно, зависит от модели — у V5F, например, только фара, максимальная скорость и горизонт педалей.
  • Быстрые действия: фара и звуковой сигнал.

Приложение входит в колесо с ПИН-кодом по умолчанию 000000. Если ПИН на колесе меняли, колесо промолчит — ввода своего ПИН пока нет.

Команды настроек взяты из WheelLog и сверены с фирменным приложением InMotion — байты совпали, но в живое колесо они ещё не уходили. Начинайте с малого шага. Жёсткость педалей источники масштабируют по-разному ниже 100, здесь сделано как в WheelLog. Выключения колеса нет: в фирменном приложении такой команды нет, а соседние коды там — блокировка. Калибровки, блокировки и транспортного режима не будет.

Begode#

Поддерживаются и современные модели, и старые вроде RS.

Что читается уверенно:

  • напряжение батареи,
  • напряжения ячеек обеих батарей,
  • заряд,
  • скорость,
  • ШИМ,
  • температура,
  • температура батареи, максимальная и минимальная.

Не все колёса Begode сообщают ШИМ и температуру мотора: у EX30, например, это поле в эфире пустое. Раньше приложение показывало у таких колёс ровно 0 % ШИМ всю поездку — то есть шкала перегрузки читалась как «нагрузки нет» вплоть до отруба. Теперь у них ШИМ считается по скорости и напряжению, как это делается на старых Begode, а температура мотора не показывается вовсе, раз колесо её не сообщает.

Температуру батареи сообщают не все: из трёх записей одно колесо отвечает в этом поле ровным нулём. Ноль там означает «датчика нет», а не «батарея замёрзла», поэтому у такого колеса плитка и алерт на перегрев АКБ просто не предлагаются — вместо цифры, которой можно поверить.

Ток батареи и мощность у современных Begode идут со знаком: плюс, пока батарея тянет мотор, минус, когда торможение и спуск возвращают энергию. Колесо само передаёт этот ток наоборот — расход там со знаком минус, — и раньше приложение показывало его как есть: у поездки вперёд мощность АКБ и расход на километр выходили отрицательными, а полная мощность тоже уходила в минус. Теперь знак переворачивается, расход считается как затраченная энергия, а полная мощность всегда положительна. Поездки, записанные до исправления, приложение исправляет само при первом запуске новой версии — и те, что приедут потом из старого архива, тоже. Не трогаются только поездки, где старый знак по данным не распознать: стоянка на зарядке или поездка целиком под горку остаются как были. Выученная приложением модель батареи такого колеса училась на перевёрнутом токе, поэтому при исправлении она сбрасывается и собирается заново — по следующим поездкам или кнопкой «Обучить по поездкам».

Сам ток в этом поле колесо меряет не всегда точно. У X-Way он выходит примерно в 1,3 раза меньше настоящего, у RACE на стоянке вместо нуля стоит −2,8 А, и расход за поездку уезжал в минус. Если у колеса есть умная BMS, она меряет ток батареи сама, и приложение подтягивает ток колеса к её показаниям: быстрые изменения берёт у колеса, а средний уровень у BMS. Подстройка включается примерно через полминуты езды: за это время приложение по данным понимает, в какую сторону у этой BMS идёт знак. Пока колесо только стоит, ток показывается как его передаёт колесо. Старые поездки не пересчитываются: тока BMS в них не сохранено.

Модель колеса#

Заряд по напряжению считается делением напряжения пакета на число банок в серии, и это число берётся из каталога — вместе с ёмкостью и напряжением полного заряда. Ключ к каталогу один: название модели. Большинство колёс его сообщает, Begode — нет: в эфире он зовётся GotWay_005913, это серийный номер, а на запрос имени не отвечает вовсе.

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

То же и у King Song без умного BMS — S18 и его родня. У S22 заряд собирается из страниц BMS, это измерение; у S18 таких страниц нет вовсе, а процента King Song не шлёт нигде в протоколе, и до выбора модели заряд взять неоткуда.

Пока модель не выбрана и не опознана, заряд не показывается. Вывести число банок из одного напряжения нельзя даже в принципе: полный 36S даёт 151.2 В, и ровно столько же даёт 40S по 3.78 В на банку. Раньше приложение в этом месте угадывало по напряжению, и на T4 угадывало неверно — просадка ниже 90 В уводила делитель с 24S на 20S, и заряд показывал 100 % на наполовину пустой батарее до конца поездки.

У кого класс напряжения был выставлен вручную раньше — он продолжает работать, пока модель не выбрана.

Настройки#

Настройки Begode пишутся из приложения: меню на дашборде → Настройки колеса.

  • Тилтбэк по скорости и его выключение.
  • Режим езды: мягкий, средний, жёсткий.
  • Ослабление поля.
  • Наклон педалей в поворотах и угол педалей.
  • Угол отключения при падении набок — две строки: уровнем (низкий, средний, высокий) и в градусах.
  • Громкость пищалки.
  • Режим ленты подсветки.
  • Первый скоростной аларм — включён или выключен; второй остаётся включённым в обоих случаях.
  • Тилтбэк по запасу мощности и порог, при котором он срабатывает.
  • Единицы на дисплее самого колеса.
  • Таймер автоотключения — только на чтение.

Порог мощности показан как остаток запаса: «предупреждать, когда запас мощности ниже 30 %» значит, что колесо начнёт предупреждать, когда свободного запаса останется 30 %. По проводу идёт обратное число, уровень загрузки, — фирменные приложения показывают то один конец, то другой, и это сбивает с толку. Остаток понятнее.

Важная особенность марки: колесо не подтверждает записанное. Ни ответа, ни эха, ни контрольной суммы в протоколе нет. Обратно оно сообщает всего пять настроек — тилтбэк по скорости, таймер автоотключения, единицы, режим езды и порог по запасу мощности, — и только у них на экране есть текущее значение. У остальных строк значения нет намеренно: подставить туда последнее отправленное значило бы показать вам ваше же намерение под видом состояния колеса.

Чего нет и не будет: калибровки гироскопа. Байты этой команды разобраны, но наружу она не выставляется ни на одной марке. Команда расцепляет мотор и требует ручной процедуры выключения и выставления колеса; отправка её вслепую из приложения — это падение.

Чего нет пока: гоночный режим (в протоколе это переключатель без возможности запросить конкретное состояние, а колесо о нём не сообщает) и третье положение скоростных алармов — два независимых разбора разошлись в том, выключает оно второй аларм или все сразу. Райдер, который думает, что второй аларм у него остался, а его нет, останется без предупреждения вовсе. Появится, когда проверим на живом колесе.

Сами команды собраны двумя независимыми разборами — фирменного приложения Begode и ветки Begode в EUC World, — и реализовано только то, в чём они сошлись. На живом колесе проверено не всё; начинайте с малого шага и смотрите, что колесо делает.

Кастомные прошивки#

При подключении приложение спрашивает у колеса версию прошивки и показывает её в настройках. Узнаются стоковая Begode, ExtremeBull, Freestyl3r и SmirnoV.

  • На Freestyl3r и SmirnoV ШИМ берётся из самого колеса, а не считается по скорости и напряжению.
  • На SmirnoV вдобавок читаются ток батареи, режим педалей и настройки регулятора — ПИД, компенсации, токи, экстремальный режим. Только на чтение: это настройки баланса, и второго источника для их записи нет.
  • На Freestyl3r пишется тилтбэк по ШИМ. Команду одинаково понимают WheelLog и EUC World.

Живых колёс с этими прошивками у меня не было, разбор сделан по WheelLog.

KingSong#

Собрано по фирменному приложению и одной живой записи с S22.

  • Телеметрия и статистика поездки.
  • ШИМ.
  • Потолок скорости и признак того, что колесо его удерживает.
  • Счётчики ватт-часов.
  • Батарея с ячейками и температурами. Разбор сходится сам на себе: тридцать ячеек дают практически то же напряжение, что колесо сообщает целиком.
  • Управление фарой: включена, выключена, автоматически.
  • Модель, прошивка и серийный номер колеса.
  • Вентилятор и зарядка.
  • Батарея F18 Pro и F22 Pro, которую эти колёса присылают одним длинным кадром: ячейки, температуры, заряд, циклы, датчики температуры и влажности.
  • Быстрые действия: звуковой сигнал и выключение.

Про температуры. King Song шлёт два датчика, и раньше приложение показывало из них не тот: в плитке «Температура контроллера» стояло более холодное и медленное из двух чисел. Теперь там тот датчик, который греется под нагрузкой — на записи с S18 Pro+ он за минуту езды вырос с 17 до 24 °C, пока второй дошёл только до 21 °C, — и он же совпадает с тем, что показывает WheelLog. Второй датчик — это мотор: так его называет родное приложение King Song, и с этим сходится физика прогрева. У мотора тепловая масса больше, чем у силовой части, поэтому он и греется медленнее — то самое отставание, которое видно на записи.

Плитка «Температура мотора» предлагается тем же правилом, что у Begode: когда колесо действительно прислало число. У мосфетов, платы, катушки, процессора и IMU датчиков у марки нет, и эти плитки ей больше не предлагаются. Пропали из выбора и метрики, которые у King Song не заполнятся никогда: ослабление поля, а у колеса без умного BMS — ячейки и токи пачек. Зато вернулась зарядка: её признак колесо шлёт, а из списка она уезжала по ошибке.

Настройки пишутся из приложения: скоростные алармы 1–3 и тилтбэк, режим педалей, фара, светодиодная лента, стробоскоп, автоотключение и ограничение заряда. Значение в строке — то, что сообщило колесо, а не то, что было отправлено.

Команды взяты из WheelLog и сверены с фирменным приложением KingSong. В двух местах источники расходятся, и там сделано как в приложении. Записью в живое колесо это ещё не проверено — начинайте с малого шага. Калибровки и углов гироскопа нет и не будет.

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

Ninebot Z#

Z6, Z8 и Z10 поддерживаются экспериментально. Реализован разбор телеметрии и батареи по протоколу WheelLog, но живой записи Ninebot для проверки в проекте пока нет. Значения и команды нельзя считать подтверждёнными на настоящем колесе.

Solowheel Xtreme#

Самое старое колесо здесь, от Inventist, ещё до InMotion. Оно передаёт коротким текстом всего три числа примерно раз в секунду.

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

Вашей марки нет в списке#

Напишите мне. Чтобы добавить поддержку, нужно две вещи:

  1. Запись обмена с колесом. Снимается прямо в приложении, через служебный экран, и выгружается файлом.
  2. Пара известных значений с экрана самого колеса или из фирменной программы: напряжение, скорость, пробег. Они нужны, чтобы проверить разбор, а не просто угадать красивые числа.

Чем длиннее запись и чем разнообразнее в ней езда, тем больше полей удаётся разобрать.