Бортовой компьютер для Опель Зафира.
- Войдите на сайт для отправки комментариев
Ср, 18/01/2017 - 14:40
Доброе время суток. Делаю проэкт - Бортовой компьютер для Опель Зафира А 2001, Y20DTH дизель. Застрял на адаптерах K-Line. Уже месяц бьюсь. Сделал шесть разных адаптеров. 1. на МАХ232 (понял что он не TTL a RS232) 2. на 4N25 3. на 4N35 4. на BC547 5. на MC33290 6. на L9637D ( на него была последняя надежда что авто заговорит). Не один из них не разговорил машину. Толи адаптеры не верно работают, толи нет нормального скетча для разговора с авто, может нужно правильную инициализацию и запрос написать в скетче. Железо - мега 2560 + 6 адаптеров + OBD2 c Iso9141-2 + TFT 3,95(но это потом).

.......................................
Схемы прилагаю. Описание напряжений.
1.МАХ232
только питание 12в
К-Line : +9,6v RX:-8,25v TX:0v
питание 12в + ардуино
К-Line : 0v RX:+5,4v TX:+4,65v
тест с COMMTEST скачки напряжения
К-Line : 0v-(+9,14v) RX:+5,4v-(-0,75v) TX:+4,65v-(-0,56v)
.....................................................................
2.4N25
только питание 12в
К-Line:+11,72v RX:0v TX:0v
питание 12в + ардуино
К-Line:+11,5v RX:+2,98v TX:+4,65v
тест с COMMTEST скачки напряжения
К-Line:+11,5v-(+4,43v) RX:+2,98v-(+2,28v) TX:+4,65v-(0v)
.......................................................................
3.4N35
только питание 12в
К-Line:0v RX:0v TX:0v
питание 12в + ардуино
К-Line:+12,22v RX:+0,15v TX:+4,58v
тест с COMMTEST скачки напряжения
К-Line:+12,22v-(0v) RX:+0,15v-(+4,65v) TX:+4,58v-(0v)
..........................................................................
4.BC547
только питание 12в
К-Line:0v RX:-1,4v TX:0v
питание 12в + ардуино
К-Line:+8,87v RX:+5,29v TX:+4,65v
тест с COMMTEST скачки напряжения
К-Line:+8,87v-(0v) RX:+5,29v-(0v) TX:+4,65v-(0v)
..........................................................................
5.MC33290
только питание 12в
К-Line:+10,5v RX:+10,46v TX:0v
питание 12в + ардуино
К-Line:+4,68v RX:+4,44v TX:+4,68v
тест с COMMTEST скачки напряжения
К-Line:+4,68v-(+4,68v) RX:+4,44v-(+4,44v) TX:+4,68v-(+1,01v)
...............................................................................
6.L9637
только питание 12в
К-Line:+9,5v RX:+4,96v TX:+4,91v
питание 12в + ардуино
К-Line:+9,52v RX:+4,63v TX:+4,63v
тест с COMMTEST скачки напряжения
К-Line:+9,52v-(+9,37v) RX:+4,63v-(+4,63v) TX:+4,63v-(+1,03v)
...................................................................................
Покажите где я затупил. я уже и запутался во всем. Укажите какой из адаптеров работает правильно и может кто-то может подкинуть скетч для проверки, например чтобы я его загрузил в ардуино и подключил к авто и чтобы я хоть что-то уже увидел в терминале, хоть какие то ответы от авто. Как закончу проэкт, выложу его полностью с отчетом. Я только начинал работать с ардуино, прошу не пинать если что не так сказал. Спасибо.
извените ошибочка вышла в 6 адаптере
6.L9637
только питание 12в
К-Line:+12,4v RX:+5,01v TX:+4,96v
питание 12в + ардуино
К-Line:+12,4v RX:+4,69v TX:+4,69v
тест с COMMTEST скачки напряжения
К-Line:+12,4v-(+2,58v) RX:+4,69v-(+4,18v) TX:+4,63v-(+1,00v)
Попробуйте собрать K-line адаптер на микросхеме l9637D
Вот есчё схема для работы через com порт
http://cxema21.ru/publ/avtoehlektronika/k_l_line_adapter_na_max232_i_l9637d/25-1-0-215
если надо через usb выкидывайте MAX 232 и ставьте FT232RL
Спасибо. Но я уже собрал на l9637d, один из шести собраны, фото и схемы выше. И мне не юсб и не сом. У меня связка obd2-->adapter-->mega2560--> IDE por(в будущем экран 3.95).
пришлите схему в лучшем качестве на uu4juw собака yandex.ru на схеме очень плохо видно
Ок. Завтра вышлю. У меня все на рабочем компе.
ок, по возможности гляну, если на работу не выдернут на выходных
и так, подправил схему, добавил кандеры .
адаптер проверял разными способами, программами для ком портов, так же напряжение и скачки напряжений при запросе. эхо тоже работает. короче адаптер вроде как работет корректно. значит пробелма в инициализации.
нарыл на одном форуме скетч. у человека тоже мега2560 и L9637 и у него с этим скетчем проходит инициализация. у меня же машина упорно молчит, обидилась наврерно :). выкладываю скетч. может кто посмотрит и чета подскажет
правда не пойму почему закоментирована библиотека софтвара и еще некоторые строки, и почему он использовал RX1 и RX2 а не ТХ1 и RХ1 ........ но главное что у него инициализируется. у меня же машина молчит. дальше ....
логический 0 и1 уровни напряжения. значит напряжение должно быть на к линии -логическая "1" это от 9.6в до 12в и логический "0" от 2.4в до 0в. ардуино на ТХ и RХ логическая "1" от 3.5в до 5в и логический "0" от 1.5в до 0в. мой адаптер справляется на УРА.
и инициализация
вроде как в скетче вся инициализация соблюдена. какие-то мысли господа?
продолжаем штудировать инициализацию. произошла непонятка. подключил ОПКОМ. показывает протокол kwp2000 и при инициализации показало keyword 2027 protocol, keyword1 - 6B , keyword2 - 8F . по утверждению документов это протокол ISO14230. но этот протокол использовался на машинах с 2003 года, а моя машина 2001. вот выдержка
ISO14230-4 (KWP2000)
Very common protocol for 2003+ vehicles using ISO9141 K-Line. Uses pin 7.
Two variants of ISO14230-4 exist. They differ only in method of communication initialization. All use 10400 bits per second.
ISO9141-2
Older protocol used mostly on European vehicles between 2000 and 2004. Uses pins 7 and optionally 15.
как такое возможно? разве что машине мозги меняли с какой-то зафиры 2003-2004 года. фантастика..... продолжаю штурмовать. у этого протокола другая инициализация, даже две, быстрая и медленная. попробую с ними...... так же нарыл оф документ по ISO 14230 и там есть
как раз то что мне показал ОПКОМ keyword 2027 protocol, keyword1 - 6B , keyword2 - 8F . странности продолжаются....
но вот нашел еще однин документ и в нем с 2000 года уже ISO 14230
Доброе время суток. Извеняюсь за долгое отсутсвие, дела, заботы. И так..... я продвинулся вперед. выяснил что действительно у меня KWP 2000. выяснил подсоединив тестер к К-линии всесте с ОП-КОМ и посмотрел скачки напряжения они оказались быстрыми и короткими и не падали ниже 11 вольт. вывод , быстарая инициализация, так как при медленнной падает до 3 вольт (проверено). едем дальше..... вывод: Fast init KWP2000. инициализация происходит так:
и второй вариант ( не очень интересует, много всего и он делает все циклично, по новой и поновой и......)
Значит так, что делает этот скетч, он проходит инициализацию и получает положительный ответ на первое сообщение. Теперь вот на чем я застрял. Как я не пытался в этот скетч влепить второе сообщение для для присутствия адаптера, ничего не работает. Вот пробовал так:
добавил byte message2[6] и void sendpresent()
должен получить положительный 8131F1812483F131C1E98FDE где "С1" положительный ответ и на второе сообщение 8131F13EE181F1317E21 где "7E" положительный ответ. но теперь у меня не приходит положителный ответ на первый пакет ни на второй пакет , приходит вот это 8131F13E24 и почему-то в конце контрольная сумма от первого пакета. Что-то не так.....
Похоже я сам с собой тут разговариваю, ну и ладно, может мой труд пригодится таким как я, новичкам. Я все таки добился рабочего скетча, теперь я получаю ответы на все посылы.
Отправляю 81 31 F1 81 24 получаю 83 F1 31 C1 E9 8F DE //запрос соединения где С1 соединение ОК
Отправляю 81 31 F1 3E E1 получаю 81 F1 31 7E 21 //запрос присутсвия где 7E присутсвие ОК
что такое //запрос присутсвия где 7E присутсвие ОК ? вот ответ : Если обмен данными с клиентом в течение длительного времени не происходит, блок управления (ECU) автоматически выходит из текущего сеанса и возвращается к «сеансу по умолчанию» назад. Поэтому существует дополнительная услуга, целью которой является сигнализация устройству о том, что клиент все еще присутствует.
вот скетч с коментариями......
Теперь изучаю как выйти на опрос датчиков. сделал запрос 82 31 F1 01 00 A5 чтобы узнать потдерживаемые параметры, пока глухо. В терминале выводит 83F317F11136 (где 7F это ошибка запроса) . Штудирую дальше. Если кто может подсказать как сделать запрос хотябы для температуры охлаждающей жидкости, чтобы уловаить суть...... буду очень признателен.
Привет всем. продолжаю разговор сам с собой. Значит так, по способу описаному выше нашел два адреса это 28 (блок ABS) и 31 (блок напряжений). А блок мотора так и не нашелся. Я подцепил OP-COM в ардуино залил написаный скетч для прослушки К-линии и подцепился в OP-COMе на К-линию и массу. В итоге он подцепился по адресу 11 (81 11 F1). Обрадывался написал скетч инициализации а адаптер не инитится. Долго мучился и вспонил что kwp2000 имеет fast init и fast init 5baud, никогда не мог подумать что блоки могут иметь разную инициализацию. Написал скетч fast init 5baud и о чудо я зацепился, попробовал температуру посмотреть 82 11 F1 01 05 8A и сново чудо, получил 83 11 F1 41 05 4C 17, где 4С это температура , формула расчета это: 4С(HEX)=76(DEC), 76-40=36 градусов. Вот как-то так. следующая задача это найти все параметры , нарисовать скетч и вывести это все на экран TFT 3,95.
Выкладываю все скетчи:
Написал скетч для проверки всех 220-и возможных адресов. просто заливаете в ардуино, цепляетесь к ОБД2 и ждете 15 минут, в сериале порта вы увидите к каким блокам он подцепился, будет что-то типи 83 F1 31 C1 E9 8F DE , где С1 это положительный ответ,смотрите перед ответом какой запрос и с каким адресом был отправлен. Так же не забываем что он может найти как у меня разные блоки но не моторный блок, возможно что у вас он тоже на fast init 5baud, не растраиваемся и пробуем 5baud c адресами: с 10 до 17 вроде как вычитал что это моторные адреса, поищите в инете возможные варианты адресов к вашей машине. Этот скетч только для fast init.
-------------------------------------------------------------------------------------------------------------------
Теперь fast init 5baud. Секрет 5baud это при отправке задержка в 5-10 мили секунд между каждым байтом.
--------------------------------------------------------------------------------------------------------------------------------
Далее fast init может у гого-то сработает так а не 5baud
------------------------------------------------------------------------------------------------------------------------------------
Ну и самое вкусное скетч с fast init 5baud+present+температура мотора. Он еще кривоват, но работает.
Во всех моих скетчах просто заменяете на свои адреса блоков. например :byte message[5] = {0x81,0x11,0xF1,0x81,0x04};
второй байт 0x11 это мой блок мотора заменяете на свой например 0x17 который вы нашли , не забываем что последний байт это контрольная сумма при замене своего адрес перещитываем ,получаем 0x81,0x17,0xF1,0x81,0x0A. Как считать контрольную сумму, можно использовать калькулятор Виндоус а можно скачать приложение на телефон, я пользуюсь Simple HEX DEC найдете на плаймаркете. сумма выводится так пример: 0x81,0x17,0xF1,0x81,0x0A это 81+17+F1+81=0A контрольная сумма.
Еще не большая инфа по адресам.
с 10 по 17 адреса мотора
с 18 до 1F адреса коробки
с 28 до 2F адреса тормоза/ABS
с 30 до 37 адреса рулевого управления
Ну вот пожалуй пока и все , надеюсь новечкам очень поможет, все разжевано от а до я. Дерзайте. Всем удачи. Будут вопросы, спрашивайте , я не спец я как вы, но чем смогу помогу.
автору спасибо за труды. Предстоит тоже самое. Но у меня задача еще сложнее. Надо не только вытянуть информацию из K-Line но изапихать её в CAN. Машина хонда старая. Вернее двигатель от хонды старой. а теперь стоит на аккорде 7. где уже щиток приборов уже CANовый и нужно тахометр оживить.
MaksVV щ. Спасибо за спасибо. Предлагаю вам взять на АлиЕхспрес за пару евров CAN shield. Мне кажется с ним будет не так уж сложно как с моим случаем. шилд уже готов ко всему, и описаний по кану очень много и с премерами скетчей, по крайней мере мне очень много попадалось пока искал свои ответы. Удачи.
так и сделал только вместо шилда заказал модуль на mcp2515, вроде как тоже самое, только дешеле
По идеи у продавца есть библиотека. Если нет на сайте товара попроси у продовца. Просто шилд подключается на прямую к ардуино и имеет готовые библиотеки. Жаль что я далеко, в Испании, имею шилд, мог бы за пиво отдать.
библиотеку легко нашел в инете. Подключил can модуль к программе CAN Hacker - работает. Показывает пакеты, летающие в кане. Также программа может отправлять свои созданные пакеты (фреймы).
А вот k-line микруха пока ещё не пришла. Кстати есть идея использовать ELM адаптер, который сделает всю "грязную" работу общения с эбу и сам выберет протокол. Ардуине только останется взять нужную инфу с elm через АТ команды. Подключение ардуино-elm по Serial (есть даже готовые библиотеки для elm. всё придумано за нас)
А какую микруху для k-line заказал? На драйве несколько вариантов есть.
L9637D на али
недавно видел что такие микрухи стоят в иммобилайзерах
Я рад что тебе легче все далось, с каном проще. Какую микрухе заказал? Я как говорил из первого моего поста использую адаптер на l9637d, но так же проверил и мой четвёртый адаптер из первого поста на вс547, пашет супер. Я не хотел елм, надо кнопку делать для питания, короче я хотел на прямую без посредников. Я вот застрял на скетче для вывода инфы с перщитаной формулой, например температуры. Не могу въехать как это запихнуть в скетче. Я получаю ответ, но как как выделить из ответа конкретный байт и пересчитал его по формуле вывести в сериал. Может кто знает?
ну например так
то есть программа складывает 0-вой байт число 130 (0х82 в Hex) и 1 байт число 17 (0х11 в hex) и выводит в сериал. Получается естественно 147.
То есть, в кавычках 0 и 1 это позиция байта в ответе? Это значит что я могу взять четвертую позицию ( температура) пересчитать и вывести?
да, только не в кавычках, а в квадратных скобках
вот, например, так можно объединить два байта в одно число (один байт может нести число от 0 до 255, а если число больше, его несут два байта и более)
пока ковырялся в инете нашел ODBuino, детально не изучал, все на английском, может поможет чем :"OBDuino является открытым исходным кодом маршрутного компьютера дизайна , основанный на Arduino платформе. OBDuino может быть собран и настроен радиолюбителем; он отображает информацию , такие как мгновенная экономия топлива (например , л / 100 км, мили на галлон или километры на литр), параметры настройки двигателя и т.д. на ЖКАХ."
покажи строку и какие байты по какой формуле посчитать
Например запрос температуры в твоём примере выше, приходит 82 F1 11 70 cs. Четвёртый байт 70 в dec это 112 отнять 40 и получаем 72 градуса для вывода в монитор
..
Понятно, буду завтра как и все до этого методом тыка пробовать. Спасибо
ну вот, в сериале значение 72. По факту 0х70 это третий байт, т.к. начинается с нулевого. всего соответственно четыре
Сенкс. Завтра попробую. И отпишусь.
пока ковырялся в инете нашел ODBuino, детально не изучал, все на английском, может поможет чем :"OBDuino является открытым исходным кодом маршрутного компьютера дизайна , основанный на Arduino платформе. OBDuino может быть собран и настроен радиолюбителем; он отображает информацию , такие как мгновенная экономия топлива (например , л / 100 км, мили на галлон или километры на литр), параметры настройки двигателя и т.д. на ЖКАХ."
я так понял это тоже связка elm327 + arduino
MaksVV вы меня не поняли, мне надо вывести определенный байт из ответа, а ваши варианты выводят байт из отправленного сообщения. Мне нужно отправить сообщение
byte
message[6] = {0x82,0x11,0xF1,0x01,0x05,0x8A}; и приходит ответ 83 F1 11 41 05 6C 37 , мне нужно выловить только пятый байт (6С) перевести в DEC (108) и отнять 40, итог 68 градусов и вывести в Serial. Пробую так
int Temp;
Temp = mySerial.read (byte 5); // и так (byte [5])
Serial.println (Temp);
не компилится, ошибка. Может надо всеж таки применить буфер и char? Но пока еще до этого не дошел. Вопрос как правильно из ответа вылавливать нужный байт и обработать его.....
Пытаюсь разобратся с буфером и char. нашел скетч там.... приходит ответ 83 F1 10 C1 B6 8F CS и в скетче строка while (buffer[18] != 0xC1); //Положительный ответ на соединение ,как он высчитал что это 18 в буфере, или ответ 9E F1 10 61...........CS(или так 80 F1 10 26 61......CS не поню точно) в скетче строка if (buffer[10] == 0x61) { // Положительный ответ (buffer[10] == 0x61) как подсчитал что это buffer 10, или ответ 9E F1 10 61........... (где то тут температура).......CS в скетче строка To1 = buffer[20] - 40; //Температура ОЖ . Подтолкните плиз, обычно сам дохожу до всего, а вот с выводом значений застраял.
понятно, я то думал сообщение уже приведено к виду byte[] {тра та та }. нужно посмотреть весь скетч
Выше мои пост и написано # а теперь самое вкусное# там свернуть весь скетче, но через часа 2 закину ещё раз, чуток переделанный.
а в конце принятого сообщения всегда CS ?
На сколько я знаю да. CS это контрольная сумма. В посте 12 полный скетче, самое вкусное.
попробуй так, в этом скетче при принятии данных с mySerial они записываются в массив байтов MessageRx[8]. Записываются только 8 байт (можно поменять). Потом можно вытягивать нужные байты и делать вычисления, аналогично скетчам выше
Это интересно. Спасибо, завтра попробую и отпишусь.
ещё чуть поправил, убрал циклы фор, где не нужно
Ок. Огромное спасибо. Не терпится уже попробовать. Первый раз кто то пытается мне помочь. Огромное человеческое спасибо. Завтра отпишусь. Блин, ты убрал весь мусор в котором я сомневался, респект и увпжуха тебе.
Привет. Продолжим. Еще раз огромное спасибо MaksVV за толчок в нужном направлении. Есть парочка проблем. Я подкоррективровал все, повыкидывал лишнее и т.д. проблемы: 1. при ините идет пересчет байта из ответа после инита ( естественно не коректная температура), потом начинает показывать корректно температуру крутя loop. Я попытался вывести чтение в отдельную функцию tempdata(); но оно все равно считывает при старте из ответа после инита. Нужно чтобы чтение косалось только ответа из температуры. Может нудно как то после каждого запроса очищать масив? Тем более в будущем то будет много других параметров. 2. В void temp() хотел убрать строчку Serial.print(message6[i],HEX); чтобы не выводило на экран отправленное сообщение, так как в будущем это все будет выводится на TFT LCD и мне нужна будет только цифра, но после этого удалелния перестает читатся температура. MaksVV как всегда надежда на тебя. вот переделанный скетч:
а у тебя после инита в ответе только байт с температурой отличается? просто можно делать проверку по другим байтам при расчете температуры. Напиши ответ ЭБУ после инита и который приходит в loope .
дак толку то , у тебя выводиться в сериал только то, что ты отправляешь. Зря убрал запись всех байтов в массив и вывод в сериал всего сообщения от эбу.
типа так
и в строках 72 и 78 вместо print сделай println
можт и в этом проблема. но я буду выводить на TFT LCD и хотел все убрать, но только что подумал , пусть оно себе в сериал в воздух выводит а я на экран выведу только то что мне нужно типа myGLCD.printNumI(Temp, 410, 40); , я прав?