Вопрос по ISO-14230-4
- Войдите на сайт для отправки комментариев
Втр, 04/12/2018 - 12:08
Добрый день. Есть автомобиль VW. Хочу считать данные по температуре с K-line. При запросе получил 55h 6Bh 8Fh. Как выполнить инициализацию?
http://arduino.ru/forum/apparatnye-voprosy/mc-33290-i-k-line-adapter-vop... вот с этим скетчем я получил ответ 55h 6Bh 8Fh.
В общем понял, что нужно в ответ отправить инвертированный 2й байт и получить в ответ инвертированный 33h.
верно мыслите. 55h это синхробайт 6Bh и 8Fh это keyword 1 и keyword 2. отправляете на эбу инвертированный 8Fh это 70h и инициализация будет закончена.
Спасибо MaksVV. От Вас и хотел услышать ответ. На базе вашего третьего скетча http://arduino.ru/forum/apparatnye-voprosy/mc-33290-i-k-line-adapter-vop... сделал свой.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); //Rx,Tx
#define TX 3
unsigned long prevTimedelay = 0;
int Delay = 0;
byte ECUaddress = 0x01; // адрес блока двигателя, можно попробовать с другими адресами
void setup() {
Serial.begin (115200);
Serial.println(F("---KWP 5 baud init"));
delay (500);
pinMode (TX, OUTPUT);
digitalWrite (TX, HIGH); // BUS IDLE
delay (500);
send5baud(ECUaddress); // функция отправки адреса блоку
mySerial.begin (10400);
}
void loop() {
if (mySerial.available()) {
delay (20) // W2(51)
unsigned long curTimedelay = millis ();
Delay = curTimedelay-prevTimedelay;
Serial.println ("");
Serial.print(Delay);
Serial.println ("ms");
prevTimedelay = millis();
while(mySerial.available()) {
byte inByte = mySerial.read();
if (inByte == 0x8F) mySerial.write(0x70); // если получили 8F, то отправили инверсию
Serial.print(" ");
Serial.print(inByte,HEX);
}
}
}
//ниже отправка блоку байта адреса на 5бод 1 стартбит, 7бит данных, 1 бит проверки четности odd, 1 стоп бит
void send5baud(uint8_t data){
// // 1 start bit, 7 data bits, 1 parity, 1 stop bit
#define bitcount 10
byte bits[bitcount];
byte even=1;
byte bit;
for (int i=0; i < bitcount; i++) {
bit=0;
if (i == 0) bit = 0;
else if (i == 8) bit = even; // computes parity bit
else if (i == 9) bit = 1;
else {
bit = (byte) ((data & (1 << (i-1))) != 0);
even = even ^ bit;
}
Serial.print(F("bit"));
Serial.print(i);
Serial.print(F("="));
Serial.print(bit);
if (i == 0) Serial.print(F(" startbit"));
else if (i == 8) Serial.print(F(" parity"));
else if (i == 9) Serial.print(F(" stopbit"));
Serial.println();
bits[i]=bit;
}
// now send bit stream
for (int i=0; i < bitcount+1; i++) {
if (i != 0) {
delay(200);// wait 200 ms (=5 baud), adjusted by latency correction
if (i == bitcount) break;
}
if (bits[i] == 1) { // high
digitalWrite(TX, HIGH);
} else { // low
digitalWrite(TX, LOW);
}
}
mySerial.flush();
}
незнаю как код вставить по нормальному.
А как мне теперь захватить данные?
https://www.drive2.ru/c/479335393737572613/
Вот здесь есть что то похожее, но я не уверен что для меня это подойдет.
для начала вставляем скетч правильно. Лучше использовать скетч Александра (немец вроде он). Там уже реализовано считываение ваговских блоков данных.
Спасибо MaksVV. Вечером попробую. Отпишусь.
а скорость к-лайн у вас 10400 смотрю? это точно?
Я пробовал 4800, 9600, 10400. Синхро байт 55h получил на 10400. Предположил что протокол ISO14230-4.
Вот здесь есть немного описание. https://ru.scribd.com/document/388728618/1278519259-K-line-Communication...
Не совсем уверен, что код от Александра подойдет.
у вас есть рабочая диагностика, которая подключается к ЭБУ? Типа VAGcom или подобная? Если да, то нужно просниффить диагностическую сессиию и всё станет понятно какой там протокол
К сожалению нет. Буду пытаться в слепую.
Вот еще нашел кое что https://www.instructables.com/id/Low-Cost-OBD2-Communications-on-K-line-ISO-9141-2-/
Там есть main. Принцип инициализации такой же.
В общем останавливается на
---KWPSend sz=3 blockCounter=0.
И заново
------ connect addr=1 baud=10400
179 строка.
ну так пробуем.
в строке 11 нулевой байт массива можно попробовать также сделать 0xC1
первый вариант(самый первый)
строка 42 пробуем убрать delay (1). Также строку 38 пробуем сделать такую
Если сделать 0xC1, тогда и контрольную сумму пересчитать?
Или ее здесь нет?
кстати байт FE это как раз удачный конец инициализации - эбу шлёт на диагностику (нам) свой инвертированный адрес. 01 в инверсии это FE
значит первый байт 81 сработал?
нет, сработал отправленный байт 0х70, это инверсия на keyword 2. После удачного инита запрос {0x81, 0x01, 0xF1, 0x81, 0xF4}; не сработал.
Что я примерно должен получить?
можно также попробовать строку 11 сделать такую
какие-нибудь байты в ответ если прилетят то уже хорошо
КС в скетче сама подсчитывается, её исправлять в массиве сообщения не надо
Нет ничего. Только когда добавил delay(10); ответ стал:
delay (1) пробовал убирать?
пробуем поочереди такие строки 11?
byte
initMes[] = {0x68, 0x01, 0xF1, 0x81, 0xE7};
byte
initMes[] = {0x68, 0x01, 0xF1, 0x01, 0x00, 0xE7};
byte
initMes[] = {0x68, 0x6A, 0xF1, 0x01, 0x00, 0xE7};
byte
initMes[] = {0x68, 0x6A, 0xF1, 0x81, 0xE7};
byte
initMes[] = {0xC2, 0x33, 0xF1, 0x01, 0x00, 0xE7};
byte
initMes[] = {0xC1, 0x33, 0xF1, 0x81, 0xE7};
byte
initMes[] = {0xC2, 0x01, 0xF1, 0x01, 0x04, 0xE7};
Хорошо завтра.
Чет не совсем понятно. в main идет инит 5 бод, а потом запрос параметров.
Сделал что то подобное как на PICe.
Получил ответ:
синхробайт получаю 55h.
потом получаю E9h и 8Fh
Вот нашел немного информации про OBD. http://blog.perquin.com/blog/category/odbii/
пробуем такой скетч. вверху можно адрес ЭБУ попробовать 0x01 и задержку между отправкой байт сделать 0
MaksVV, спасибо за отклик. В общем на твой скетч получил ответ.
вот ответы
Все понятно. Все таки адрес у эбу 33h. Поэтому он отвечает инверсией на 33h байтом ССh а у меня в скетче проверка на FEh была, поэтому периодические запросы не посылались. Могу завтра поправить скетч. Также можно другие данные вытянуть по стандартным пидам
И сделать получше парсинг входящих сообщений с проверкой КС.
Да. Нужно 8Eh переворачивать. И слушать перевернутый 33h. Код нужно оптимизировать. Я не силен в программировании. По поводу параметров. Еще хотел скорость, чтоб зуммер пикал. И напряжение борт сети. Кстати если заметил. Там у меня дин. индикация. Только почему-то 2 й таймер, если я инициализирую. То ногодрыг Тх. Не работает.
С таймером разобрался. Все норм.
вот код опроса напряжения,температуры ДВС и скорости а/м . Можно подключить кнопку и считывать стирать DTC. (Расскоментировать в скетче для кнопки).
Добрый день MaksVV. Спасибо за скетч. У меня работает свой сейчас. Читаю параметры температуры, скорости и обороты двигателя. Но с напряжением по адресу 0x42h почему-то не получается. Возвращает 0x83 0xF1 0x10 0x7F 0x01 0x12 0x16.
Где 0x7F это ошибка. Я так понял, что ответ идет только на первые 20 PID. Или я не правильно запрашиваю напряжение 0xC2, 0x33, 0xF1, 0x01, 0x42, 0x29.
вот исправленный скетч, в том есть косяки . Видимо такой PID 01 42 ЭБУ не поддерживает.
нужно на эбу послать такой PID 01 00 ну т.е. С2 33 F1 01 00 E7 и тогда получишь ответ от ЭБУ - какие пиды он поддерживает
тынц
У меня работает свой сейчас. Читаю параметры температуры, скорости и обороты двигателя.
ну дак нужно сюда выложить. Тема ведь не только для вас , другие тоже читают. Глядишь и про косяки в скетче кто-нибудь чего скажет. Только код сворачиваем под кат, не нужно этих простыней тут. Внимательно читаем как это сделать .
на текущий момент рабочий вариант примерно такой.
А #45 работает?
Вариант бортового мк через терминал http://timothyshaffer.com/website/obdii.php