Pull to refresh

Comments 11

И вопрос, ради которого я, честно говоря, и пишу:

ELM за шесть долларов плюс Pyren или PyClip читают Рено вдоль и поперек.

Кариста с тем же адаптером читает и позволяет частично что-то менять в Шкоде.

Я даже и не знаю, что сказать. Пирен вроде даже не скрывает кода.

В точку, и возразить нечем. Проверял я на одном клоне — том, что представляется как v1.5. Написал «обойти нельзя», а честно было бы «на этом обойти не вышло».

Полез смотреть Pyren после вашего комментария и наткнулся на неприятную для себя вещь. В версии для компьютера у меня с самого начала была лестница из трёх способов заставить адаптер дочитать длинный ответ: ATCRA и адаптер справляется сам; ATCRA плюс вручную заданный кадр разрешения; сырые кадры, где разрешение шлёт сама программа. А в Android-порт я эту лестницу просто не перенёс — приложение получало первый кадр и сдавалось. Заметить было нечем: заглушка в обоих случаях отдавала только первый кадр, разницы не видно. Нашлось только сверкой кода с кодом, и повод посмотреть дал ваш комментарий.

Теперь лестница есть в обеих версиях, и в журнал пишется, какой способ сработал, вроде «0x70A: длинный ответ дочитан — адаптер справился сам (ATCRA)». Мой клон по-прежнему не умеет, доходит до третьей ступени и там встаёт.

Если тот адаптер, которым Pyren читает Рено, у вас под рукой — скажите, что на плате написано и что он отвечает на ATI. Хочу собрать список «какой адаптер что умеет»: такого списка нигде нет, а вопрос «какой ELM327 брать» задают постоянно. Пока в списке одна строка, и та отрицательная.

Планируется ли портирование на андроид?

Уже не планируется — уже лежит. Kotlin и Compose, не обёртка над питоновской версией, протокол переписан.

Исходники: https://github.com/gdm0991/vagdiag/tree/main/android-app

Готовый APK: https://github.com/gdm0991/vagdiag/releases

Ради чего вообще стоило делать: Bluetooth-адаптеры. Из браузера к ним не подобраться, из Termux тоже, а в бардачке у большинства лежит именно такой. Wi-Fi и USB через OTG тоже есть, но USB живьём проверить не смог — кабеля у меня нет.

Чтобы не было завышенных ожиданий: полный цикл приложение прошло пока через программную заглушку адаптера, на двух телефонах — Redmi Note 13 (Android 15) и Mi 11 Lite (Android 13). На живой машине компьютерная версия обкатана куда лучше. Поставите и что-то отвалится — заводите issue, мне это сейчас полезнее всего.

А почему бы не использовать VAG-KKL, VAG-COM или что-то подобное?

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

А для нормальной работы с машинами есть диагностические сканеры

Спорить не буду: для регулярной работы нормальный сканер быстрее и удобнее.

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

VAG-KKL — это K-line, на Polo Sedan с CAN он бы не помог. VCDS хорош, но у меня его нет, а покупать ради одного перебитого провода не хотелось.

Автор, спасибо за статью. Однако на хабр заходишь за человеческими текстами, которые писал человек, в своем собственном авторском стиле. После прочтения этой статьи остался осадок будто пообщался с claude/gpt - это не исправление ошибок нейронкой в готовом тексте, тут реально половина статьи нейронкой написана.

Но буду объективен. Технические несоответствия:

Сама последовательность специально короткая: ATZATE0 (выключить эхо), ATSP6 (ISO 15765-4, CAN 11 бит, 500 кбит/с), ATCAF1. Всё. Каждая лишняя команда — риск получить пустоту вместо ответа.

В тексте выше у вас 4 команды. В гите в методе Elm327.init - 9 штук. Плюс _recover добавляет поверх еще 2 штуки, но это уже мелочи.
Либо если речь о сбросе идет (reset_state), то там тоже больше 4 команд - 7 штук или более.

Elm327.init

Оставался вопрос: какой из восьми датчиков

В коде задкументированы "все четыре задних датчика" и нет упоминания передних, если подразумевается что остальные 4 спереди. Либо LLM-ка выдумала +4 датчика?

Скрытый текст

PAD = 0xAA

В тексте статьи у вас "заполнитель" 0xAA, но на гите  0x00 - это прям разные байты. И в целом гит и статья будто бы расходятся.

Статья:

PAD = 0xAA   # заполнитель; блок его игнорирует

def build_single_frame(payload: bytes) -> bytes:
    if len(payload) > 7:
        raise ValueError("не помещается в одиночный кадр")
    frame = bytes([len(payload)]) + payload
    return frame + bytes([PAD]) * (8 - len(frame))

Гит:

def build_single_frame(payload):
    """Собирает одиночный кадр ISO-TP из полезной нагрузки, с добиванием до 8 байт."""
    frame = bytes([len(payload)]) + payload
    return frame.ljust(8, b"\x00")

Универсальный раздел OBD-II — на любом автомобиле с 2001 года

Подушню, есть машины 2001-2002 годов как минимум без OBD2. Тот же "патруль" например ( Nissan Patrol Y61 3.0 ZD30, 2002–2004). Наличие 16-пинового разъема не гарантирует поддержку OBD2. Полная поддержка пришла уже позже.

Далее ничего технического, чисто наблюдения:

OBD-II обязан покрывать только то, что влияет на выбросы

Какие именно выбросы в данном контексте имеются ввиду? Выбросы данных - все равно по контексту не подходит.

обе руки заняты сканером, а не жгутом

...

Руки свободны, хронология остаётся на диске

В руках жгут, руки заняты.

а на самом деле это интерфейс к блоку двигателя с боковым режимом «покажу сырые кадры, дальше сам»

Что такое "боковой режим"? С автомобилями и CAN знаком, но не понимаю этой формулировки.

Байт типа отказа говорит, что блок увидел электрически. 

увидел электрически - это как? Это ведь явно не технический сленг.

Как итог: человек с аналогичной проблемой будет вынужден разбираться с нейрослопом вместо реального "дебага".
Статья "от себя" и без LLM на условном drive2 была бы куда более полезна, чем обилие галюцинаций.

Спасибо за разбор. Открыть гит и сверить с текстом — это больше, чем я мог рассчитывать, и по делу почти всё.

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

Команды инициализации. Ваша правда. pdc_core.py, строки 229–238: ATZ, дальше ATE0, ATL0, ATS0, ATH1, ATSP6, ATCAF1, ATAT0, ATST32. В _recover сверху ещё ATCF000 и ATCM000. Хуже, чем просто неточность: три из них прямо про тему статьи. Без ATH1 не видно, с какого адреса пришёл ответ, и весь разговор про смещение теряет смысл. ATAT0 стоит вместо ATAR намеренно — в статье про это есть, а в списке команд нет. Кто повторил бы за мной, получил бы другое поведение адаптера и не понял почему.

PAD. Тоже ваша. Рабочий путь — pdc_core.py, строка 512, добивка нулями. 0xAA живёт в pdc_diag.py, строка 1224, в третьем способе с сырыми кадрами: я там проверял, отличает ли блок мою добивку от заводской — VAG добивает AA. Не отличает, длина берётся из первого байта. В статью значение уехало из эксперимента и было выдано за рабочее.

Восемь датчиков против четырёх. Тут противоречия нет, но виноват всё равно я — не объяснил. Датчиков восемь: четыре в переднем бампере, четыре в заднем. Отключаешь по одному бамперу за раз, поэтому в подсказке четыре. Формулировку в menu.py уже поправил, в статью допишу.

На любом автомобиле с 2001 года — ошибка, и ваш Patrol ровно тот случай. Правильно: в США OBD-II обязателен с 1996, в Европе EOBD для бензиновых с 2001 и для дизелей с 2004, а у машин с других рынков разъём на месте, а режимов нет. В README и в pdc_obd.py уже исправлено, в Android-версии тоже.

Выбросы — выхлопные. OBD-II затевался как экологическое требование, и обязательные режимы покрывают то, что влияет на состав выхлопа. Написал так, что вышла загадка.

Руки — поймали. Со сканером руки заняты сканером, с регистратором — жгутом, и это не «свободные руки». Имел в виду, что не надо одновременно смотреть в экран и щупать проводку.

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

Ещё одно, чего вы не писали, но что всплыло из комментария 200sx_Pilot: «обойти невозможно» сказано слишком широко. Проверял-то я на одном клоне.

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

наименование ELM327  гарантирует... да наверно практически ничего: сколь я помню там полно неоригиналов с очень разной степенью совместимости. это закрытая soc со своим промежуточным протоколом который пытаются эмулировать. так что да это тот случай когда "все свое" гораздо лучше

Да, и я на этом ровно и попался: решил, что ELM327 — это спецификация. А это марка, которую переписали кто во что горазд, и совместимость проверяется только опытом.

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

Про «всё своё» согласен целиком. SLCAN-адаптер, у которого логики транспортного уровня нет вообще, снял вопрос за вечер и стоит столько же.

Sign up to leave a comment.

Articles