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

В шину диагностики втыкается адаптер ЕЛМ327 и по воздуху он соединяется с планшетом, телефоном, смартом, где установлена и запущена программа TorquePro
Для того, что бы понять что на картинке, нужно знать следующие вещи:
Протокол ОБД2 из википедии. ru.wikipedia.org/wiki/OBD-II_PIDs
Протокол ОБД2 из википедии, более подробный en.wikipedia.org/wiki/OBD-II_PIDs
Протокол ISO9141-2 embeddedsystem.ru/index.p…=protokoly-standarta-obd2
С поиском протколов уже гораздо все хуже. Так как у меня этот протокол, так и буду описывать только его.
OBD2 распиновка — prohelps.ru/raspinovka-obd2-razema/
ELM327, описание АТ команд — www.sparkfun.com/datashee…ts/ELM327_AT_Commands.pdf
А теперь подключаем анализатор к тестовому компьютеру двигателя Toyota 2ZZ-GE, и "разбираем" по полочкам данные. Они такие:

Хоть и описание протокола в документах есть, но производители могут его немного видоизменять, менять скорости, какие либо тайминги и т.д., так что рабочий лог с рабочей железки и есть самый верный источник информации.
1. — Под цифрой 1 идет фрейм так называемой первоначальной инициализации соединения. На этом этапе микроконтроллер должен передать 8 битное "приветствие" с частотой 5 бит в секунду. Первый импульс, это как и положено протоколу UART стартовый бит, который говорит о том, что следом за ним пойдут данные. Стоповый бит на картинке не указан. Узнать, какое значение должно быть можно и поиска строк инициализации под свою машину для проги Torque. В ЕЛМ за это отвечает команда ATIIA. На картинке значению ATIIA соответствует числу 0х13 (ATIIA13) оно же в двоичном виде соответствует числу 0b00010011, оно там и видно (незабываем, что единичка — это притягивание шины к земле, то есть логический уровень нуля на шине). После того, как приветствие передано, мозги 2ZZ-GE через 0.3 секунды ответили:
2. — Это три байта, которые отправят ECU Первый байт, это байт синхронизации. передается он на той частоте, на которой ECU желает с нами общаться. Для 2ZZ-GE это 9600б\с Дальше через 7.3 миллисекунды следуют два байта KW1 и KW2, у меня это 0хЕ9 и 0x8F. Далее следует пауза в 31мс . Следует учесть, что пауза после приема обусловлена задержкой передачи от софта в ЕЛМ и с него в шину. Так что привязываться к ней не стоит.
3. — Проверка на ошибки. Это два байта. Первый байт отравляет микроконтроллер, это инверсия принятого ранее байта KW2, второй байт — это отклик ECU с инверсией первоначального адреса.
Все, после этого считается, что все подружилось, и можно отправлять команды запросов и получать ответы на эти запросы.
4. — Пример запроса "Температура охлаждающей жидкости" Первый отправляется хeдер. Это значение, которое в Torque указано командой ATSH. Далее, согласно стандарту ОДБ передается 0x01. Show current data — Считывание текущих параметров работы системы управления. После него идет сам пид датчика. Для запроса температуры ОЖ он имеет значение 0х05 Завершает запрос байт контрольной суммы. Если запрос был успешным, то ECU ответит. Если что то в запросе будет не то, то ECU просто промолчит. Ответ:
5. — Ответ начинается с хeдера ECU. Для режима опроса датчиков он всегда один и тот же, для других режимов (чтение ошибок и т.п.) он другой. После этого следует номер запрашиваемого пида для проверки и значение показания датчика. Завершает ответ байт контрольной суммы. Все.
Формула расчета показания датчика есть в таблице описания протокола ОБД на Википедии.
Данные ответа могут быть различной длинны, например в два байта, или как запрос на активные пиды у меня дает ответ в 10 байт.
Таблица пидов не всегда соответствует тому, что там написано. Производители могут что то сами мутить с адресами и отходить от стандартов. К примеру, на моторах 1ZZ-FE пид данных температуры АКПП имеет значение 0хВ4 с ответом в два байта с формулой расчета (А/256)-40, он не виден в запросе списка пидов и не выделяется цветом активного датчика в Torque
Подсчет контрольной суммы обычный классический, пример:
0х82+0х13+0хF1+0x01+0x05=0x018C
Все данные запроса или приема суммируются и в итоге подсчета отсекается все, кроме первых двух бит
Ради интереса, срисовал передающую часть K-Line шины электросхемы ECU 2ZZ-GE:

Можно сказать, что схема имеет вид "открытый коллектор" с цепями защиты и легкой подтяжкой к шине питания.
Вот так у меня все выглядело на столе:



Комментарии 6
Почти у всех тойот обд2 эры, скорость протокола 9600б\с, B4 есть в торке в активных данных, так же почти у всех тойот температура АКПП это B4, method 2.
Возможно, я не спорю. Конкретно у меня Torque даже запрос по списку пидов не делает по этому разделу, судя по логам, и поэтому не активен.
Скажите пожалуста, как сделать синхронизацию на 0.2с? Delay-ем?
Таймерами.
whooami
Скажите пожалуста, как сделать синхронизацию на 0.2с? Delay-ем?
Как будет удобней. Если процессору есть что делать в эти 1.8 секунд, то на таймере. Настало время, быстро изменили состояние на выходе порта и делаете свои дела дальше. Если делать нечего, и индикация через обд это единственное, что делает контроллер, то можно тупо делать на делеях, не морочась на всякие таймеры. Я на делеях делал
👍