Текущее время: 10 июл 2026, 00:39



Ответить на тему  [ Сообщений: 6 ] 
 Области тьмы или чертоги харлеевского разума 
Автор Сообщение

Зарегистрирован: 31 мар 2011, 22:34
Сообщения: 1492
Откуда: СВАО
Мотоцикл(ы): Road King
Непрочитанное сообщение Области тьмы или чертоги харлеевского разума
Привет, парни.

Возможно, эта тема не будет интересна широкому кругу любителей Harley-Davidson, но я все равно буду вести ее как памятник собственной упертости.
Два месяца у меня не было желания идти в гараж, хотя до него всего 20 метров, и заниматься доделками стенда. Но от самой идеи я никуда не ушел. Наоборот, чем больше думал, тем сильнее понимал, что хочется не просто собрать очередную железку, а разобраться во всем с самых азов. Казалось бы, чего сложного. Для диностендов существует куча готового ПО и оборудования: американское, австралийское, эстонское, норвежское, отечественное на ESP32 , даже решения на Ардуино. Покупай, подключай и работай. Для стартовых прогонов я тоже купил готовое ПО, но быстро уперся в один важный момент: для точного расчета показателей нужно максимально точно знать обороты двигателя в конкретный момент времени. Один из способов — считать передаточное отношение между коленвалом и барабаном стенда. Формально это можно рассчитать. Но если в коробке нестандартное соотношение, стоят кастомные шкивы, меняется давление в задней шине или степень ее износа, точность начинает гулять. Этот момент можно частично решить процедурой синхронизации, например по наличию искры в высоковольтном проводе.
Но где взять такое устройство? В итоге я купил китайский стробоскоп для выставления угла зажигания, взял от него только индуктивную прищепку, собрал свою схемку и получил датчик синхронизации. Казалось бы, теперь можно спокойно заниматься стендом.

Но нет. Видимо, спокойно — это не мой метод. Мне захотелось сделать свое ПО, которое будет измерять показатели с максимально возможной точностью. В теорию глубоко пока лезть рано, но один из путей повышения точности — брать обороты двигателя напрямую из шины мотоцикла. С CAN-шиной все более-менее понятно. А вот с J1850, который встречается на Harley примерно с начала 2000-х и до переходного периода 2012–2014 годов, все гораздо веселее. Описание протокола найти можно, можно даже изловчиться, подключиться через ELM327 и получить обороты через OBD. Но это слишком скучно.
Параллельно всплыла еще одна история. На рынке есть Power Vision, TechnoResearch, KESS от Alientech, Diag4bike и другие готовые решения. Можно купить лицензии, не тратить время на исследования и спокойно настраивать мотоциклы. Но несколько лет назад я уже пробовал играться с CAN-шиной Harley, потом навалилась основная работа, и все это ушло в долгий ящик. Сейчас я начал собирать по крупицам старые файлы с разных компьютеров, систематизировать то, чем занимался раньше, и постепенно вырисовалась интересная закономерность в прошивках.
Поэтому начну, наверное, с J1850. Для меня это новое направление, с кучей неизвестного, ошибок, проверок, осциллографа, логов и маленьких побед. Процесс исследований буду стараться освещать почти онлайн: что получилось, что не получилось, где ошибся, где пришлось переделывать.

Главная цель простая: не просто купить готовый продукт, а пройти путь самому — от физического уровня шины до логгера, декодера, анализа данных и дальше к своему инструменту.

Ну что, погнали?


Вчера, 00:54
Профиль

Зарегистрирован: 12 ноя 2012, 20:10
Сообщения: 592
Откуда: Тольятти
Мотоцикл(ы): FXST 2006г.
Непрочитанное сообщение Re: Области тьмы или чертоги харлеевского разума
GELIK писал(а):
Привет, парни.

Ну что, погнали?


Паша,
Вот, для Харлея, в шине J1850, можно использовать вот этот фрейм.
28 1b 10 02 xx xx : rpm, xxxx = rotations/minute * 4, дискретность 10 раз в секунду, точность параметра 1/4 оборота.

Пользуйся.


Вчера, 07:35
Профиль

Зарегистрирован: 30 июл 2017, 11:04
Сообщения: 986
Откуда: Daugavpils, Latvia
Мотоцикл(ы): FLSTC 1999
Непрочитанное сообщение Re: Области тьмы или чертоги харлеевского разума
шины - это конечно хорошо... шины-это правильно...
но вот например такая "задачка со звездочкой"
аналоговый Эво... в котором даже нет тахометра... стоит коробка Baker DD6, у которой передаточные числа вообще все смещены и размазаны за счет 28-зубовой звезды компенсатора вместо стоковой 25-зубовой... да еще и в проводку спидометра вставлен speedometer recalibration unit...?
откуда будем брать сигнал rpm? даже если через индуктивную прищепку, то как считаем и учтем коэффициент рекалибровки...?
а...? "как тебе такое, Илон Маск?" :lol:

"Один из способов — считать передаточное отношение между коленвалом и барабаном стенда"
мне почему-то кажется что это самый оптимальный вариант, хоть и с возможными погрешностями.


Вчера, 08:48
Профиль

Зарегистрирован: 31 мар 2011, 22:34
Сообщения: 1492
Откуда: СВАО
Мотоцикл(ы): Road King
Непрочитанное сообщение Re: Области тьмы или чертоги харлеевского разума
Fed писал(а):
Паша,
Вот, для Харлея, в шине J1850, можно использовать вот этот фрейм.
28 1b 10 02 xx xx : rpm, xxxx = rotations/minute * 4, дискретность 10 раз в секунду, точность параметра 1/4 оборота.

Пользуйся.

Привет))))
Я прекрасно помню твою фразу из нашего с тобой общения 5 лет назад - "Даже на АВТОВАЗе уже забыли это протокол J18502)))) Огромное тебе спасибо за подсказку, без шуток. Любая информация, подтверждающая мои выводы - бесценна!!!


Вчера, 10:42
Профиль

Зарегистрирован: 31 мар 2011, 22:34
Сообщения: 1492
Откуда: СВАО
Мотоцикл(ы): Road King
Непрочитанное сообщение Re: Области тьмы или чертоги харлеевского разума
EUgeny писал(а):

"Один из способов — считать передаточное отношение между коленвалом и барабаном стенда"
мне почему-то кажется что это самый оптимальный вариант, хоть и с возможными погрешностями.


Именно для такого случая я и сделал "тахометр" от наличия искры в свечном проводе))) Там процедура довольно простая - выводишь обороты двигателя в зону 3-х тысяч, стараешься держать их неизменными, включаешь синхронизацию и за примерно 5 секунд автоматически из логов считаешь среднее. Вот тебе и точное передаточное соотношение))) Почему же не использовать такой "тахометр" в процессе замера, например, как эталон обоотов? Да очень просто - никто не застрахован от пропуска искры - раз, у нас 4-х тактный двигатель, а значит одна искра на два оборота - два. Вот именно эта искра на два оборота и вносит главную погрешность и делает замер дискретным, потому что у стенда тоже есть свой датчик оборотов. Лично я делаю два датчика - оптический с 2-мя импульсами на оборот и высокоточный оптический энкодер с 1000 импульсами на оборот, который в итоге, по своей логике, выдает 4000 фронтов на один оборот барабана диностенда. Так что чисто синхронизация и расчет относительно барабана!!!! Так к чему тогда я хочу брать данные из шины? Тут однозначного ответа нет, да и в двух словах не расскажешь)))) Постараюсь в процессе повествования осветить все причины))))


Вчера, 10:57
Профиль

Зарегистрирован: 31 мар 2011, 22:34
Сообщения: 1492
Откуда: СВАО
Мотоцикл(ы): Road King
Непрочитанное сообщение Re: Области тьмы или чертоги харлеевского разума
Не спорю, что повествование в режиме онлайн гораздо эффектнее описания процесса постфактум, но это довольно утомительно. Представьте: сидишь такой в куче проводов, паяешь, тут же бегаешь в гараж к мотоциклу и проверяешь результаты, потом несешься обратно с результатами, переосмысливаешь, вносишь коррективы, делаешь заметки, понятные тебе одному, а не широкой публике... А тут еще и нужно постараться написать высокохудожественный пост без матюгов))) Задачка со звездочкой!!!

Даже использование искусственного интеллекта не спасает в создании постов для форума. Хотя тут я немного лукавлю: он хотя бы структурирует мои страдания, а уж потом этот скелет обрастает присущим мне гаражным юмором)))

К чему это я? Да к тому, что у меня готова следующая глава моих исследований. Можно обозвать это по-разному: страдания, пустое времяпрепровождение, но “исследования” мне нравятся больше)))

Так что продолжу тему моих попыток залезть в электронику Harley-Davidson не через готовую коробочку, а с самых низов.

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

С CAN-шиной все более-менее понятно. Там две линии, CAN_H и CAN_L, дифференциальный сигнал. В покое обе линии примерно около 2.5 В, при активном состоянии шины, том самом dominant, CAN_H уходит примерно к 3.5 В, CAN_L примерно к 1.5 В. То есть это не “один провод с нулем и единицей”, а нормальная дифференциальная история, где данные живут в разнице напряжений между двумя проводами.

А вот J1850, который встречается на Harley примерно с начала 2000-х и до переходного периода 2012-2014 годов, оказался отдельным видом развлечения. Причем из тех развлечений, где сначала кажется “да что там сложного”, а потом сидишь с осциллографом и начинаешь подозревать, что мотоцикл знает о тебе что-то неприятное.

Если объяснять по-простому, J1850 - это старая диагностическая шина. В моем случае это однопроводная линия, по которой блоки мотоцикла общаются между собой и с диагностикой. Там нет привычного “вот тебе RX, вот тебе TX, вот тебе красивые байтики, кушай, не обляпайся”. На проводе живут импульсы разной длительности. По этим длительностям потом надо понять, где ноль, где единица, где начало кадра, где конец, где полезные данные, а где контрольная сумма.

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

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

Для физического уровня J1850 я выбрал MC33390D. Это специализированная микросхема для работы с J1850-шиной. Она сидит между диагностической линией мотоцикла и моей логикой. В случае с MC33390D на BUS формируется waveshaped-сигнал примерно 0…7 В. То есть это не 3.3 В и не 5 В логика, которую можно радостно сунуть напрямую в микроконтроллер и потом удивляться, почему из проекта пошел характерный запах прогресса.

Дальше за обработку отвечает STM32F407VET6. Он ловит фронты, измеряет интервалы между ними и отправляет сырой поток данных на компьютер по USB.

Схема получилась такая.

По передаче:

STM32F407VET6 → 74HCT1G125GV → MC33390D → J1850 BUS

По приему:

J1850 BUS → MC33390D → SN74LVC1T45DBVR → STM32F407VET6

Да, у STM32F407 есть входы, толерантные к 5 В, и используемые PA0/PA1 как раз относятся к таким выводам. Но это не повод цеплять все подряд напрямую и надеяться, что “ну должно же работать”. Во-первых, сама J1850-шина живет не в 5-вольтовой логике, а около 0…7 В на BUS. Во-вторых, автомобильная электроника - это шумы, наводки, переходные процессы и прочие радости, которые очень любят объяснять схемотехнику через запах гари. Поэтому я решил перестраховаться и поставить нормальное согласование уровней.

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

И вот тут, конечно, начали вылезать ошибки. Потому что если в проекте с первого раза все работает, значит либо ты что-то не заметил, либо оно еще не успело сломаться.

Первая ошибка была ожидаемая: очень хотелось быстрее перейти от “вижу импульсы” к “вижу обороты”. То есть мозг уже рисует красивые графики, интерфейс, таблицы, диагностику, а железо в этот момент скромно намекает: “Может, сначала проверим уровни сигналов?” Пришлось вернуться на землю, взять осциллограф и спокойно пройти физический уровень. Где что приходит, какие амплитуды, какие фронты, что реально видит вход STM32.

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

В какой-то момент у меня как раз всплыло, что тестовый режим передачи еще может дергать линию. Для лабораторного эксперимента это допустимо, а для подключения к мотоциклу уже нет. Потому что приходишь ты такой “я только послушать”, а устройство вдруг решает тоже поучаствовать в разговоре. Очень инициативно. Очень плохо. Пришлось приводить это в порядок и отдельно контролировать, чтобы устройство именно слушало J1850, а не пыталось быть самым общительным участником шины.

Третья ошибка оказалась особенно показательной. Уже не в железе, а в логике прошивки.

На первом варианте я поставил одинаковый приоритет на обработку сигнала с J1850 и на отправку данных в USB. На бумаге все выглядит красиво: пришел сигнал, записали, отправили в компьютер. Бумага вообще терпит многое. Особенно когда рядом нет осциллографа.

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

После этого приоритет был выставлен правильно: сначала J1850, потом USB. Сначала любой переход на шине нужно быстро поймать и сохранить его описание в буфер, а уже потом, когда процессору будет удобно, отправлять эти данные на компьютер. USB, как выяснилось, вполне может подождать. J1850 - нет. Он вообще не интересуется моими удобствами, что в целом похоже на весь этот проект.

Тут важный момент. На этом этапе я еще не работал с красивыми готовыми байтами J1850. Я ловил сырую картину с линии: пришел фронт, изменился уровень, сколько длился предыдущий участок, какой был интервал, нет ли потерь и прочая служебная информация. То есть один принятый переход сигнала - это не просто “один бит данных”, а целое маленькое описание того, что произошло на шине.

И вот тут я сначала сильно недооценил объем. Речь именно о внутреннем битовом буфере сырого описания сигнала, а не о готовых байтах J1850-пакета. Буфер был на 128 бит, и на бумаге казалось, что этого должно хватить. Но как только пошли реальные пакеты, стало понятно, что 128 бит для такого сырого описания маловато. Потому что в буфер попадают не только сами логические нули и единицы будущего пакета, а еще длительности, признаки фронтов и служебная информация, без которой потом нормально восстановить кадр не получится.

После этого буфер пришлось увеличить до 1024 бит. На этапе сырого захвата это оказалось правильным решением: лучше иметь запас и не терять данные, чем потом героически декодировать дырки и делать вид, что так и задумано.

А потом случилось забавное. Когда из этого сырого описания удалось собрать нормальные пакеты и перейти уже к декодированию, оказалось, что 1024 бита - это даже слишком жирно. То есть сначала 128 бит было мало, потом 1024 бита стали спасением, а после нормального разбора пакетов 1024 внезапно превратились в “да куда столько?”. Но это нормальный путь: сначала снимаем с шины максимально полную сырую картину, а уже потом понимаем, что реально нужно хранить и передавать дальше.

Сейчас базовая часть уже ожила. Устройство на MC33390D и STM32F407VET6 пассивно слушает J1850, ловит фронты, измеряет интервалы и пишет сырой лог в компьютер. Это еще не “готовый сканер”, не “диагностический комплекс” и не коробочка из рекламы, где все красиво, дорого и с лицензиями. Это нижний слой. Но именно с него все и начинается.

Потому что если на физическом уровне ошибка, дальше можно сколько угодно красиво декодировать, рисовать графики и делать интерфейс. В итоге получится просто красивый мусор. А мне хочется понимать, что происходит на самом деле: от сигнала на проводе до нормального кадра, CRC, идентификаторов, диагностических ответов и полезных параметров.

Следующий этап - собрать из сырых импульсов полноценные кадры J1850, проверить контрольные суммы и начать разбирать обмен между блоками. В первую очередь меня интересуют обороты двигателя, потому что они нужны для стенда. Но уже понятно, что рядом лежит гораздо больше интересного: диагностические запросы, ответы ECM, идентификаторы, данные приборки и вообще вся эта внутренняя кухня Harley.

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

Короче, от “что это за импульсы?” медленно двигаемся к “что мотоцикл хотел сказать?”.


Вчера, 11:17
Профиль
Показать сообщения за:  Поле сортировки  
Ответить на тему   [ Сообщений: 6 ] 

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by STSoftware for PTF.
Русская поддержка phpBB