Бортовой компьютер для Опель Зафира.

MaksVV
Offline
Зарегистрирован: 06.08.2015

вот рабочий эмулятор для проги опком которая к-лайн. Адаптер должен быть подключен на 10, 11 пин ардуино. Второй адаптер нужен юсб К-лайн (подключаем к проге опком). Соединяем к-лайны.   Подключение идёт. Дата стрим тоже. Там можно определить какой байт за что отвечает, отправляя с ком порта (нужно только поставить в настройках 115200 и нет конца строки) символ "+", при этом будет изменяться значение байта №10, и смотрим что в датастриме меняется. Следующий байт выбирается отправкой символа "a". Отправка символа "b" возвращает опять к байту №10. 



int bytenumber = 10;


///////////////////////////////////////////////////////////////////////
// Всё что выше для считывания кнопки 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); //R,T
unsigned long prevTimedelay = 0; 

int length5 = 5;
int length7 = 7;
byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения

byte messageCOMUN[7] = {0x83, 0xF1, 0x11, 0xC1, 0x6B, 0x8F, 0x40};
byte messagePRES[5] = {0x81, 0xF1, 0x11, 0x7E, 0x01};

int length44 = 44;
byte messageIDEN1[44] = {0xA8, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x91, 0x6B, 0x03,
0x92, 0x6B, 0x03, 0x93, 0x01, 0x03, 0x94, 0x6A, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97, 0x69, 
0x03, 0x98, 0x6A, 0x03, 0x99, 0x44, 0x03, 0x9A, 0x02, 0x03, 0x9F, 0x6A, 0xFF, 0xAC};
                       //  A8 F1 11 5A 81 04 90 6F 62 03 91 6B 03
                       //  92 6B 03 93 01 03 94 6A 03 95 02 03 96 66 03 97 69 
                       //  03 98 6A 03 99 44 03 9A 02 03 9F 6A FF AC 

int length100 = 100;
int temp;
byte messageIDEN2[100] = {0x80, 0xF1, 0x11, 0x5F, 0x5A, 0x80, 0x57, 0x30, 0x4C, 0x30, 0x54, 0x47, 0x46, 0x37,
0x35, 0x31, 0x32, 0x32, 0x33, 0x33, 0x37, 0x31, 0x34, 0x32, 0x34, 0x34, 0x31, 0x37, 0x31, 0x36, 0x39, 0x20,
0x50, 0x44, 0x42, 0x4F, 0x53, 0x20, 0x20, 0x30, 0x31, 0x30, 0x35, 0x30, 0x35, 0xFF, 0x4B, 0x4D, 0x37, 0x4D,
0x33, 0x30, 0x34, 0x30, 0x5F, 0x53, 0x00, 0x06, 0x42, 0x30, 0x31, 0x30, 0x31, 0x35, 0x59, 0x32, 0x30, 0x44,
0x54, 0x48, 0x20, 0x44, 0x33, 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36, 0x39, 0x34, 0x30, 0x20, 0x07, 0x07,
0x25, 0x05, 0x48, 0x30, 0x32, 0x38, 0x31, 0x30, 0x031, 0x30, 0x32, 0x36, 0x38, 0xFF};


int length81 = 81;
byte messagePIDS[81] = {0x80, 0xF1, 0x11, 0x4C, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x0C, //Coolant Temperature
0x37, //Coolant Temperature
0x01, //Actual injection start
0x92, //Actual injection start
0x0C, //Engine Oil Temperature
0xEB, //Engine Oil Temperature
0x00, //Accelerator Position Sensor Signal
0x00, //Accelerator Position Sensor Signal
0x02, //System Voltage
0xB3, //System Voltage
0x00, //High Pressure Diagnosis 1
0x00, //High Pressure Diagnosis 1
0x11, //Mass Air Flow Sensor
0x89, //Mass Air Flow Sensor
0x04, //Boost Pressure
0x30, //Boost Pressure
0x00, //High Pressure Diagnosis 2
0x00, //High Pressure Diagnosis 2
0x03, //Engine Speed
0x20, //Engine Speed
0x0B, //EGR Command (Exhaust-Gas Recirculation Command)
0x55, //EGR Command (Exhaust-Gas Recirculation Command)
0x03, //Barometer Sensor
0xA3, //Barometer Sensor
0x04, //Boost Pressure Command
0x2D, //Boost Pressure Command
0x03, //Desired Engine Idle Speed
0x20, //Desired Engine Idle Speed
0xEE, 
0xB9, 
0x00, //Vehicle Speed
0x00, //Vehicle Speed
0x00, //Vehicle Speed Command
0x00, //Vehicle Speed Command
0x0C, 
0x35, 
0x03, //Desired Injection Quantity
0x0A, //Desired Injection Quantity
0x02, //Injection Quantity
0xD9, //Injection Quantity
0x08, //Start of Delivery
0xA3, //Start of Delivery
0x01, //Pump Speed
0x90, //Pump Speed
0x0C, //Fuel Temperature
0x27, //Fuel Temperature
0xA0, 
0x00, 
0x01, //EGR Pulse Ratio (Exhaust Gas Recirculation)
0x5C, //EGR Pulse Ratio (Exhaust Gas Recirculation)
0x02, //Swirl Level Control Solenoid Valve Pulse Ratio
0x76, //Swirl Level Control Solenoid Valve Pulse Ratio
0xAD, 
0x08, 
0x01, 
0x30, 
0x00, //Pulse Ratio Boost Pressure Solenoid Valve
0x03, //Pulse Ratio Boost Pressure Solenoid Valve
0x01, //Desired Injection Start
0x7B, //Desired Injection Start
0x0B, //Intake Air Temperature
0xDB, //Intake Air Temperature
0x03, 
0xA3, 
0x00, 
0x02, 
0x1F};

int waitbyte=5;

long prev = 0;

void setup() {
 Serial.begin (115200);
mySerial.begin (9600);
//pinMode (10, OUTPUT);
//digitalWrite (10,0);
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");
}

void loop() {

long cur = millis();

if (Serial.available()) {

      delay(30);

  byte inbyte=0;

      

          inbyte = Serial.read();

           

           

  if (inbyte == 0x61)  bytenumber ++;

  if (inbyte == 0x62)  bytenumber = 10;

  if (inbyte == 0x2B) messagePIDS[bytenumber]++;

 if (inbyte == 0x2D) messagePIDS[bytenumber]--;

  if (bytenumber == 14) {if (messagePIDS[bytenumber]>0x0F) messagePIDS[bytenumber]==0;}

if (messagePIDS[14]<=0x0A) temp = ((messagePIDS[14]*26)-277)+messagePIDS[15]/10;

if (messagePIDS[14]==0x0B||messagePIDS[14]==0x0C) temp = ((messagePIDS[14]*26)-278)+messagePIDS[15]/10;

if (messagePIDS[14]>0x0C) temp = ((messagePIDS[14]*26)-279)+messagePIDS[15]/10;

Serial.flush();

  return;}

   

// if (cur-prev>1000) {Serial.print (messagePIDS[14]);  Serial.print("  ") ; Serial.print (messagePIDS[15]);

// Serial.print (messagePIDS[16]);  Serial.print("  ") ; Serial.print (messagePIDS[17]);

//Serial.print (messagePIDS[18]);  Serial.print("  ") ; Serial.println (messagePIDS[18]); prev=cur;}

      

 

  if (cur-prev>2000) { Serial.print ("A: 0x");

  if (messagePIDS[14]<0x10){ Serial.print("0"); } Serial.print (messagePIDS[14], HEX); Serial.print ("    ");

    Serial.print ("B: 0x"); if (messagePIDS[15]<0x10){ Serial.print("0"); }  Serial.println (messagePIDS[15], HEX);

Serial.println (""); Serial.print ("Coolant Temp:  "); Serial.println (temp);

Serial.println ("");prev=cur;}



if (mySerial.available()) {
      delay(100);
     int k=0;
     byte inbyte=0;
     
  while( mySerial.available() && k < 100) {
     inbyte = mySerial.read();
    MessageRx[k] = inbyte;
    k++;   }

      Serial.print ("Recieve:   ");

    for (int i = 0; i < k; i++) {
    Serial.print(MessageRx[i],HEX); Serial.print (" ");} 
    Serial.println ("");

if ((MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x81 && MessageRx[5]==0x04)|| (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x81 && MessageRx[4]==0x04)) {
  Serial.println ("Prinyat zapros init!  "); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length7; i++) {
    mySerial.write(messageCOMUN[i]);
    Serial.print(messageCOMUN[i],HEX); Serial.print ("  ");
   } 
    Serial.println("");
 
   }
if (MessageRx[0]==0x80 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[4]==0x3E && MessageRx[5]==0xC1) {
  Serial.println ("Prinyat zapros prisutstvia!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < 5; i++) {
    mySerial.write(messagePRES[i]);
    Serial.print(messagePRES[i],HEX); Serial.print ("  ");
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x80 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[4]==0x1A && MessageRx[5]==0x81 && MessageRx[6]==0x1F) {
  Serial.println ("Prinyat zapros identificacion 1!  "); Serial.println ("");  
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length44; i++) {
    mySerial.write(messageIDEN1[i]);
    Serial.print(messageIDEN1[i],HEX); Serial.print ("  ");
   } 
    Serial.println("");
   Serial.print ("Otvechayu DEC:    ");
    for (int i = 0; i < length44; i++) {
   
    Serial.print(messageIDEN1[i]); Serial.print ("  ");
   } 
    Serial.println("");
 
   }
   if (MessageRx[0]==0x80 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[4]==0x1A && MessageRx[5]==0x80 && MessageRx[6]==0x1E) {
  Serial.println ("Prinyat zapros identificacion 2!  "); Serial.println ("");  
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length100; i++) {
    mySerial.write(messageIDEN2[i]);
    Serial.print(messageIDEN2[i],HEX); Serial.print ("  ");
   } 
    Serial.println("");
  Serial.print ("Otvechayu DEC:    ");
 for (int i = 0; i < length100; i++) {
    
    Serial.print(messageIDEN2[i]); Serial.print ("  ");
    
   } 
   Serial.println("");
   }
   if (MessageRx[0]==0x80 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[4]==0x21 && MessageRx[5]==0x01 && MessageRx[6]==0xA6) {
  Serial.println ("Prinyat zapros datos!  "); Serial.println (""); 
    Serial.print ("Otvechayu:    ");
  for (int i = 0; i < length81; i++) {
    mySerial.write(messagePIDS[i]);
   
    Serial.print(messagePIDS[i],HEX); Serial.print ("  ");
   } 
    Serial.println("");
 
   }
}
}

 

 

Inglor
Offline
Зарегистрирован: 20.09.2017

Скорость 9600 выставить в настройке виртуального com порта для usb-k.line для программы op-com? На следующей неделе будет Arduino nano(для экспериментов), еще через неделю - op-com адаптер. До того времени сделаю пару k-line адаптеров.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Inglor пишет:
Скорость 9600 выставить в настройке виртуального com порта для usb-k.line для программы op-com?
Не получится. во первых, как раз нужна скорость не 9600 а 10400, она нестандартная, её в настройка порта не выставишь. А во вторых настройки порта роли не играют, т.к. эти настройки выставляет сама программа опком и не важно какие настройки в порту. 

Inglor
Offline
Зарегистрирован: 20.09.2017

Мой нынешний k-line адаптер напоминает набор ВМ9213, только микросхема в другом корпусе, порога op-com категорически отказывается устанавливать связь с авто(на других машинах и программах все ок), можно ли для моих целей рспользовать какую нибудь программу терминал для клайн, или терминал для elm327, или какую другую прогу? Если без вариантов, то сижу пока на попе ровно, жду op-com и остальные железки, курю теорию...

MaksVV
Offline
Зарегистрирован: 06.08.2015

через елм может программу ScanMasterELM попробовать.  Я думаю должна ваш опель взять 

 

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

Молодцом мужики. Вы прошли непростой путь и написали не один километр кода, пока все довели до ума. Хочу сделать тоже самое только с протоколом ISO 9141-2 для VW до 2000г. Прочитал не мало инфы но ничего не получается, вот и прошу помощи. Имеется MC33290, спаял её мне товарищ вот по такой схеме: 

https://www.google.by/search?q=mc33290&client=opera&hs=p8z&source=lnms&t...

Скачал библиотеку SoftwareSerial. В файле SoftwareSerial.cpp где F_CPU == 16000000 добавил строку
{ 10400,    106,       218,       218,      215,   }

Использую на данный момент Arduino UNO(но есть у меня и PRO MINI). Естественно  она отображается как COM-порт. Вот для начала начал, я так понимаю, сея схема должна работать как K-line адаптер. Закидываю этот кусок кода и потом открываю программу VAGCOM311.2RUS_2006. Когда провожу тест com-порта, то сей прибомбас находит, но в всплывающем окне пишет что происхождение шнурка "сомнительно". Где кнопка ТЕСТ а этой программе есть еще кнопка теста для светодиодов, когда нажимаю на её светодиоды TX и RX поргают по очереди(проходят тест). Был бывам признателен за подсказки куда копать.  
 

#include <SoftwareSerial.h>

SoftwareSerial mySerial(0,1); // RX, TX

void setup()
{
// Инициализируем последовательный интерфейс и ждем открытия порта:
Serial.begin(9600);
//while (!Serial){}


Serial.println("Goodnight moon!");

// устанавливаем скорость передачи данных для последовательного порта, созданного
// библиотекой SoftwareSerial
mySerial.begin(9600);
mySerial.println("Hello, !!!!!");
}

void loop() // выполняется циклически
{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

у вас микросхема к-лайн подключена к ардуино к пинам 0 и 1 , а эти пины являются аппаратным Serial соединением (аппартаный UART) . Вы же в скетче пытаетесь на эти пины ещё приболтать программное сериал соединение (программный UART, который и используется когда не хватает аппартаных, но естественно это делается на другие пины -  НЕ 0 и 1).

Строго говоря, по вашей схеме, чтобы работало как обычный к-лайн адаптер, вообще можно никакой скетч не заливать. Просто замкните RST ардуино на GND и поидее (я не проверял) данные от к-лайн (и далее на пины 0 и 1 ) будут проходить "насквозь" в юсб (ну тоесть в виртуальный ком порт). Микроконтроллер при этом не задействован.  Т.е. по сути ардуина станет обычным переходником USB<->UART,  а точнее USB<->UART<->K-line 

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

MaksVV пишет:

у вас микросхема к-лайн подключена к ардуино к пинам 0 и 1 , а эти пины являются аппаратным Serial соединением (аппартаный UART) . Вы же в скетче пытаетесь на эти пины ещё приболтать программное сериал соединение (программный UART, который и используется когда не хватает аппартаных, но естественно это делается на другие пины -  НЕ 0 и 1).

Строго говоря, по вашей схеме, чтобы работало как обычный к-лайн адаптер, вообще можно никакой скетч не заливать. Просто замкните RST ардуино на GND и поидее (я не проверял) данные от к-лайн (и далее на пины 0 и 1 ) будут проходить "насквозь" в юсб (ну тоесть в виртуальный ком порт). Микроконтроллер при этом не задействован.  Т.е. по сути ардуина станет обычным переходником USB<->UART,  а точнее USB<->UART<->K-line 

Вот попробовал, как вы сказали..А именно: закинул пустой скетч, тогда при тестировании пишет "Адаптер не обнаружен или не готов". Когда перемыкаю RST на GND по ходу ардуинка просто перегружается и зависает.У меня есть еще программатор ch341a на нем тоже есть RX TX. только он определяется не как com. Может дрова поискать другие..или может как нить в машину сразу запрос какой послать (правда я не знаю сам как это сделать)??? сдесь есть  адреса для запросов:

http://obdcon.sourceforge.net/2010/06/obd-ii-pids/

MaksVV
Offline
Зарегистрирован: 06.08.2015

taha17 пишет:
Вот попробовал, как вы сказали..А именно: закинул пустой скетч..... Когда перемыкаю RST на GND по ходу ардуинка просто перегружается и зависает.

MaksVV пишет:
 вообще можно никакой скетч не заливать. .... Микроконтроллер при этом не задействован. 

taha17 пишет:
при тестировании пишет "Адаптер не обнаружен или не готов".

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

Вам нужно просто найти рабочую диагностику на свой авто. И просниффить её способом указанном выше 

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

MaksVV пишет:

taha17 пишет:
Вот попробовал, как вы сказали..А именно: закинул пустой скетч..... Когда перемыкаю RST на GND по ходу ардуинка просто перегружается и зависает.

MaksVV пишет:
 вообще можно никакой скетч не заливать. .... Микроконтроллер при этом не задействован. 

taha17 пишет:
при тестировании пишет "Адаптер не обнаружен или не готов".

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

Вам нужно просто найти рабочую диагностику на свой авто. И просниффить её способом указанном выше 

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

https://geektimes.ru/post/255012/

мне так сказать для начала, а там я сам буду  пробовать колдовать

MaksVV
Offline
Зарегистрирован: 06.08.2015

То что вы привели по ссылке это просто диагностика авто при помощи универсального адаптера elm327. Т.е. всю «грязную» работу делает он. И в ардуино уже идут готовенькие данные. Таким путем проще идти. Дак берите и делайте как там написано, где проблема?

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

MaksVV
Offline
Зарегистрирован: 06.08.2015

MaksVV пишет:

Inglor пишет:
Не работает программа ОПКОМ-К-ЛАЙН с моей машиной....

в этой программе ОПКОМ, которая через к-лайн они ошиблись видать со скоростью.  проснифил  - реальный обмен  от опкома идёт на 9600, хотя в окне программы вверху и написано 10400. Но байты отправляет не правильные если на 10400 щупать сниффером.  На 9600 байты совпадают с такими какие должны быть. Из-за этого и не коннектится.

Нет, это не в программе ОПКОМ ошиблись, это я ошибся. Дело вот в чем. 

Тут на днях нужно было задиагностировать старого опеля. адаптера ОПКОМ у меня не было. Но есть к-лайн адаптер на микросхеме Prolifiс PL-2303. Программа ОПКОМ, которая поддерживает К-лайн адаптер,  естесственно не связазлась с авто (что мы уже знали по нашему опыту ранее и как я выяснил ранее связи нет из-за того, что скорость программа ОПКОМ должна устанавливать 10400 а в реале была 9600). 

Но ошибка скорости не в программе ОПКОМ. А в драйверах чипа Prolific 2303, стандартный драйвер не знает скорости 10400 так как она не страндартная и выставляет итоговую 9600 - она и приходит уже на к-лайн адаптер и он в к-линию шлёт байты на 9600. 

Нашёл драйвер который поддерживает скорость 10400. Но старый нормально удалить не смог, поэтому не работало. Взял другой ноут. Там поставил этот драйвер и о чудо, скорость стала 10400. Программа подключилась к автомобилю. Так что, кто будет ещё пробовать бортовой комп на опель собирать не обязательно ОПКОМ адаптер иметь, можно и к-лайн адаптером обойтись

 

IronWarrior
Offline
Зарегистрирован: 01.06.2018

Приветствую всех кто мучил весь этот проект :)
Перечитал все от корки до корки!
но видать где то завтыкал почему вы юзаете 2 сериал порта для приборки и для связи с ебу..
на одном никак не получается это реализовать?
ну и хотелось бы увидеть окончательную схему этого бк..!! :)

 

 

 

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

Привет, потому что все данные идут по 7 пину обд и один параметр вроде чтение и стирание ошибок по 12 пину. Схема проста, все подключи по описанию, там нечего рисовать.

viki13viki
Offline
Зарегистрирован: 14.11.2016

Рисуй дуню с контактами, адаптер, датчики, стабилизатор, экран и разводить по описанию..... Вот и вся схема;)

IronWarrior
Offline
Зарегистрирован: 01.06.2018

стирание ошибое по 7 пину. 12 сугубо для приборки

viki13viki
Offline
Зарегистрирован: 14.11.2016

Я уже и забыл.... Давно было.....

IronWarrior
Offline
Зарегистрирован: 01.06.2018

та да :)))
и ще.. для связи с ебу и приборкой использовал 2 микрухи L9637? 
или все же удалось на однеой реализовать?

 

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

Используется просто 2 адаптера, один для 7 другой для 12 линии. На каждом одна микрухе. Если не нужно читать ошибки то, реализует один адаптер и одну линию.

IronWarrior
Offline
Зарегистрирован: 01.06.2018

фиг там, судя с программы 1 линии мало,
так как 90% данных берется с 7 пина обд
а показания уровня топлива и пробег с приборки... тобишь с 12го пина
хотя это все должно б было и в ебу быть..

viki13viki
Offline
Зарегистрирован: 14.11.2016

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

viki13viki
Offline
Зарегистрирован: 14.11.2016

Уровень топлива беру с двух мест, с приборки как устойчивый и с ебу как реальный

IronWarrior
Offline
Зарегистрирован: 01.06.2018

ну это я понял :) не блоки разные а контакты в ОБД разьеме..
для моторника идет 7 пин а для приборки 12тый..
вот и спрашивал почему не удалось подключится в паралель к 7 и 12 разьему ОБД.. :)
используя только 1 сериал порт ардуины ...

 

 

viki13viki
Offline
Зарегистрирован: 14.11.2016

Нет, разные блоки. По этому и отдельно что для каждого блока своя инициализация и запросы

IronWarrior
Offline
Зарегистрирован: 01.06.2018

примерно догнал...
но все же попробую как то через 1 порт задействовать :)
не выйдет, тогда буду юзать 2 порта... :)

viki13viki
Offline
Зарегистрирован: 14.11.2016

Все что есть в блоке мотора можешь с одним адаптером и одной линией, почитай что берётся со второй линии, если тебе не нужно..... Реализуй одну линию:)

viki13viki
Offline
Зарегистрирован: 14.11.2016

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

IronWarrior
Offline
Зарегистрирован: 01.06.2018

разжевали суперски :)!!!!!

но всеравно буду задавать вопросы по расшифровке ответов :))))))))))))))

viki13viki
Offline
Зарегистрирован: 14.11.2016

Если получится то , выложи готовое для народа. Будем рады результатам.

MaksVV
Offline
Зарегистрирован: 06.08.2015

IronWarrior пишет:

ну это я понял :) не блоки разные а контакты в ОБД разьеме..
для моторника идет 7 пин а для приборки 12тый..
вот и спрашивал почему не удалось подключится в паралель к 7 и 12 разьему ОБД.. :)
используя только 1 сериал порт ардуины ...

в параллель это как интересно? Проблема в том, что пока вы общаетесь с одним блоком, с другим теряется связь, если не посылать ему сообщения присутствия. А чём, собственно, проблема использовать два сериал порта и два к-лайн адаптера?  На LM393 будет стоить копейки и ждать из китая не нужно. Ищите поиском по форуму я выкладывал инфу по LM393. Также можно оба собрать сразу на одной микрухе LM339. 

IronWarrior
Offline
Зарегистрирован: 01.06.2018

В некоторых адаптерах 1 порт и на 7 и 12 пин обд подключаются через сопро 470 ом

Targitai
Offline
Зарегистрирован: 05.10.2018

Приветсвую! Ох и занимательное чтиво намечается у меня на ближайшие пару дней. Называется, не было хлопот, да купила баба порося :) Собственно, машина Vectra B 1997 x16xel Multek-s KWP2000. Началось все с установки камеры заднего вида, и вот теперь захотелось избавиться от картины малевича и вывести что-то на экран во время движения. Сперва думал только часы да температуру. Это и стало моим первым скетчем к Ардуино. Поковырявшись пару дней, сделал чтоб устанавливались часики двумя стандартными кнопками. Затем думал подключаться к стандартным проводам, которые подходят к MID (сигнал расхода, сигнал скорости, сигнал оборотов) и тут на вашу тему наткнулся... Ну да ладно, похвастался и будет.

Первый вопрос у меня к Вам и, наверное, самый существенный - для чего у Вас используется библиотека Wire.h? Поясню - она не совместима с TV OUT, а вывод на другой экран мне не подходит, т.к. будет сложнее камеру подцепить, да под размеры штатного подобрать. Вот и хотел узнать - а без нее то работает, или даже не заморачиваться? Просто во многих примерах ее пихали "по дефолту", я от нее без проблем избавился.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Wire.h это библиотека для работы с шиной i2c. ТС использовал для подключения часов DS3231. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

MaksVV пишет:

MaksVV пишет:

Inglor пишет:
Не работает программа ОПКОМ-К-ЛАЙН с моей машиной....

в этой программе ОПКОМ, которая через к-лайн они ошиблись видать со скоростью.  проснифил  - реальный обмен  от опкома идёт на 9600, хотя в окне программы вверху и написано 10400. Но байты отправляет не правильные если на 10400 щупать сниффером.  На 9600 байты совпадают с такими какие должны быть. Из-за этого и не коннектится.

Нет, это не в программе ОПКОМ ошиблись, это я ошибся. Дело вот в чем. 

Тут на днях нужно было задиагностировать старого опеля. адаптера ОПКОМ у меня не было. Но есть к-лайн адаптер на микросхеме Prolifiс PL-2303. Программа ОПКОМ, которая поддерживает К-лайн адаптер,  естесственно не связазлась с авто (что мы уже знали по нашему опыту ранее и как я выяснил ранее связи нет из-за того, что скорость программа ОПКОМ должна устанавливать 10400 а в реале была 9600). 

Но ошибка скорости не в программе ОПКОМ. А в драйверах чипа Prolific 2303, стандартный драйвер не знает скорости 10400 так как она не страндартная и выставляет итоговую 9600 - она и приходит уже на к-лайн адаптер и он в к-линию шлёт байты на 9600. 

Нашёл драйвер который поддерживает скорость 10400. Но старый нормально удалить не смог, поэтому не работало. Взял другой ноут. Там поставил этот драйвер и о чудо, скорость стала 10400. Программа подключилась к автомобилю. Так что, кто будет ещё пробовать бортовой комп на опель собирать не обязательно ОПКОМ адаптер иметь, можно и к-лайн адаптером обойтись

 

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

 

Targitai
Offline
Зарегистрирован: 05.10.2018

Это хорошо, библиотека ds3231 обходится без wire.h....

А подскажите, плиз, сколько памяти нужног для всего этого добра? В UNO влезет, если использовать TV-out? У меня простенькие часики мои заняли аж 51% памяти. (кстати у меня код не компилируется, я так понял все функции нужно переставлять до  void(loop), иначе компилятор ругается на то, что они не декларированы.) Ну то я уже потом буду заниматься. интересно сколько кБ памяти он всего занимает. Возможно, придется заказывать и ждать Мега

MaksVV
Offline
Зарегистрирован: 06.08.2015

Targitai пишет:

Это хорошо, библиотека ds3231 обходится без wire.h....

А подскажите, плиз, сколько памяти нужног для всего этого добра? В UNO влезет, если использовать TV-out? У меня простенькие часики мои заняли аж 51% памяти. (кстати у меня код не компилируется, я так понял все функции нужно переставлять до  void(loop), иначе компилятор ругается на то, что они не декларированы.) Ну то я уже потом буду заниматься. интересно сколько кБ памяти он всего занимает. Возможно, придется заказывать и ждать Мега

код писался давно. Сейчас опыта поднабралось, многое можно исправить/улучшить. Но мега полюбому нужна, если использовать экран как у ТС, или как у вас TV-out. Попробуйте скомпилировать для меги, в чем проблема. 

Targitai
Offline
Зарегистрирован: 05.10.2018

Проблема в том, что не компилируется. Выдает кучу ошибок. Я не знаю по какой причине, но иногда ког "хавает", когда функции после  void(loop), а иногда - нет. И мне понадобится перелапатить весь код чтоб его хотя бы скомпилировать. Странно это вообще все. Для меня всегда 2+2=4, а тут не так.... Например, Ардуино IDE 1.6.8 успешно компилирует и работает мой код с часами, а вот последняя версия - никак не хочет.

Ну, я так и догадывался, что понадобится МЕГА. Буду заказывать из Китая, а пока попробую спаять k-line и поиграться с uno по серийнику, получая ответы. Хотя некотрые pid'ы на мой мотор известны.

MaksVV
Offline
Зарегистрирован: 06.08.2015

вот к-лайн шилд  для нано. Спаял себе - работает , рекомендую

MaksVV
Offline
Зарегистрирован: 06.08.2015

попробовал на своей иде 1.8.5 - компилируется. В папку со скетчем нужно положить шрифт GroteskBold16x32.с

Targitai
Offline
Зарегистрирован: 05.10.2018

У меня UNO сейчас, но думаю это не принципиально. Хотел спаять как посоветовал ТС на L9637D, но не могу найти нормальный корпус. Для работы с SMD нужно докупать паяльную станцию и т.п...

И еще вопросы появились - есть китайский OP-COM, но он только по 7 пину конектится (мне лень выяснять что с ним не так), и есть Опель-сканер. Вот вопрос - с Опель-сканер не проще ли  будет найти нужные данные? Прикол в том, что он по одному запросу через программу шлет. Т.е. открываем двигатель, и пока галочку не поставим, например на температуре, он ее и не покажет. Поставили - показал. Я так понимаю, как раз и шлет запрос в ЭБУ.

Ну я не знаю, у меня не хочет компилироваться. Хотелось бы увидеть все библиотеки, шрифты и т.п. Может в этом где-то косяк. ТС их не приложил, а из сторонних исочников не факт что те же.

MaksVV
Offline
Зарегистрирован: 06.08.2015

собирай на LM393 , всем советую. (схемы уже во всех темах про к-лайн я выкладывал, ищи) Че народ на эту L9637D западает все время, ждать её  долго. 393 в любом радиомагазе 10 рублей стоит, и корпус любой хоть дип хоть смд. L9637 в дипе не бывает. И какая нафиг паяльная станция, soic8 можно паяльником-бревном запаять. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Targitai пишет:
Собственно, машина Vectra B 1997 x16xel Multek-s KWP2000.

вот рабочий эмулятор ЭБУ твоей машины. К-лайн адаптер к ардуино цепляем к 7 Rx  и 8 Tx пинам.  В OPCOM K-line подключаемся к ардуине-эмулятору. Не забываем там в настройках выбрать RS232/KL  и правильный компорт, на котором висит юсб -к-лайн адаптер. В мониторе порта поставить скорость 115200 нет конца строки. Отправляем символ "-" или "+" тем самым выбирая номер изменяемого байта. "." или "," соответсвенно увеличиваем или цменьшаем значение выбранного байта, "m" - меняет значение байта либо 0x00 либо 0xFF. Меняя значение байтов смотрим что и как меняется в текущих данных. 


int bytenumber = 6;


///////////////////////////////////////////////////////////////////////
// Всё что выше для считывания кнопки 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8); //R,T
unsigned long prevTimedelay = 0; 


byte MessageRx[110] = {0};  // массив байтов принимаемого сообщения

byte messageCOMUN[] = {0x83, 0xF1, 0x11, 0xC1, 0x6B, 0x8F, 0x40};
byte messagePRES[] = {0x81, 0xF1, 0x11, 0x7E, 0x01};


byte messageIDEN1[] = {0xA8, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x91, 0x6B, 0x03,
0x92, 0x6B, 0x03, 0x93, 0x01, 0x03, 0x94, 0x6A, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97, 0x69, 
0x03, 0x98, 0x6A, 0x03, 0x99, 0x44, 0x03, 0x9A, 0x02, 0x03, 0x9F, 0x6A, 0xFF, 0xAC};
                       //  A8 F1 11 5A 81 04 90 6F 62 03 91 6B 03
                       //  92 6B 03 93 01 03 94 6A 03 95 02 03 96 66 03 97 69 
                       //  03 98 6A 03 99 44 03 9A 02 03 9F 6A FF AC 


byte messageIDEN2[] = {0x80, 0xF1, 0x11, 0x5F, 0x5A, 0x80, 0x57, 0x30, 0x4C, 0x30, 0x54, 0x47, 0x46, 0x37,
0x35, 0x31, 0x32, 0x32, 0x33, 0x33, 0x37, 0x31, 0x34, 0x32, 0x34, 0x34, 0x31, 0x37, 0x31, 0x36, 0x39, 0x20,
0x50, 0x44, 0x42, 0x4F, 0x53, 0x20, 0x20, 0x30, 0x31, 0x30, 0x35, 0x30, 0x35, 0xFF, 0x4B, 0x4D, 0x37, 0x4D,
0x33, 0x30, 0x34, 0x30, 0x5F, 0x53, 0x00, 0x06, 0x42, 0x30, 0x31, 0x30, 0x31, 0x35, 0x59, 0x32, 0x30, 0x44,
0x54, 0x48, 0x20, 0x44, 0x33, 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x36, 0x39, 0x34, 0x30, 0x20, 0x07, 0x07,
0x25, 0x05, 0x48, 0x30, 0x32, 0x38, 0x31, 0x30, 0x031, 0x30, 0x32, 0x36, 0x38, 0xFF};

byte messagePIDS[] = {0x80, 0xF1, 0x11, 0x4C, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x0C, //Coolant Temperature
0x37, //Coolant Temperature
0x01, //Actual injection start
0x92, //Actual injection start
0x0C, //Engine Oil Temperature
0xEB, //Engine Oil Temperature
0x00, //Accelerator Position Sensor Signal
0x00, //Accelerator Position Sensor Signal
0x02, //System Voltage
0xB3, //System Voltage
0x00, //High Pressure Diagnosis 1
0x00, //High Pressure Diagnosis 1
0x11, //Mass Air Flow Sensor
0x89, //Mass Air Flow Sensor
0x04, //Boost Pressure
0x30, //Boost Pressure
0x00, //High Pressure Diagnosis 2
0x00, //High Pressure Diagnosis 2
0x03, //Engine Speed
0x20, //Engine Speed
0x0B, //EGR Command (Exhaust-Gas Recirculation Command)
0x55, //EGR Command (Exhaust-Gas Recirculation Command)
0x03, //Barometer Sensor
0xA3, //Barometer Sensor
0x04, //Boost Pressure Command
0x2D, //Boost Pressure Command
0x03, //Desired Engine Idle Speed
0x20, //Desired Engine Idle Speed
0xEE, 
0xB9, 
0x00, //Vehicle Speed
0x00, //Vehicle Speed
0x00, //Vehicle Speed Command
0x00, //Vehicle Speed Command
0x0C, 
0x35, 
0x03, //Desired Injection Quantity
0x0A, //Desired Injection Quantity
0x02, //Injection Quantity
0xD9, //Injection Quantity
0x08, //Start of Delivery
0xA3, //Start of Delivery
0x01, //Pump Speed
0x90, //Pump Speed
0x0C, //Fuel Temperature
0x27, //Fuel Temperature
0xA0, 
0x00, 
0x01, //EGR Pulse Ratio (Exhaust Gas Recirculation)
0x5C, //EGR Pulse Ratio (Exhaust Gas Recirculation)
0x02, //Swirl Level Control Solenoid Valve Pulse Ratio
0x76, //Swirl Level Control Solenoid Valve Pulse Ratio
0xAD, 
0x08, 
0x01, 
0x30, 
0x00, //Pulse Ratio Boost Pressure Solenoid Valve
0x03, //Pulse Ratio Boost Pressure Solenoid Valve
0x01, //Desired Injection Start
0x7B, //Desired Injection Start
0x0B, //Intake Air Temperature
0xDB, //Intake Air Temperature
0x03, 
0xA3, 
0x00, 
0x02, 
0x1F,
0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50};

bool debug = 0;
bool f =0;
void setup() {

byte CRC = 0;
for (byte i=0; i<sizeof(messageIDEN1); i++){if (i!=sizeof(messageIDEN1)-1) CRC+=messageIDEN1[i]; else messageIDEN1[i]=CRC;}
CRC = 0;
for (byte i=0; i<sizeof(messageIDEN2); i++){if (i!=sizeof(messageIDEN2)-1) CRC+=messageIDEN2[i]; else messageIDEN2[i]=CRC;}
CRC = 0;
messagePIDS[3]=sizeof(messagePIDS)-5;
for (byte i=0; i<sizeof(messagePIDS); i++){if (i!=sizeof(messagePIDS)-1) CRC+=messagePIDS[i]; else messagePIDS[i]=CRC;}

  
 Serial.begin (115200);
mySerial.begin (10400);
pinMode (10, OUTPUT);
digitalWrite (10,0);
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println ("");
}

void loop() {
if (Serial.available()) {
     
  byte inbyte=0;
     
          inbyte = Serial.read(); delay(2);
  if (inbyte == '-')  {bytenumber  --; Serial.print ("        bytenumber: "); Serial.println (bytenumber);} 
  if (inbyte == '+')  {bytenumber  ++; Serial.print ("        bytenumber: "); Serial.println (bytenumber);} 
  
  if (inbyte == '.') {messagePIDS[bytenumber]++;Serial.print ("byte value: "); Serial.println (messagePIDS[bytenumber]);
  byte CRC = 0; for (byte i=0; i<sizeof(messagePIDS); i++){if (i!=sizeof(messagePIDS)-1) CRC+=messagePIDS[i]; else messagePIDS[i]=CRC;}}
  if (inbyte == 'm') {if (f)messagePIDS[bytenumber]=255;else messagePIDS[bytenumber]=0; f=!f; Serial.print ("byte value: "); Serial.println (messagePIDS[bytenumber]);
  
  byte CRC = 0; for (byte i=0; i<sizeof(messagePIDS); i++){if (i!=sizeof(messagePIDS)-1) CRC+=messagePIDS[i]; else messagePIDS[i]=CRC;}}
  if (inbyte == ',') {messagePIDS[bytenumber]--;Serial.print ("byte value: "); Serial.println (messagePIDS[bytenumber]);
  byte CRC = 0; for (byte i=0; i<sizeof(messagePIDS); i++){if (i!=sizeof(messagePIDS)-1) CRC+=messagePIDS[i]; else messagePIDS[i]=CRC;}}
  
  if (inbyte == 'p') debug=!debug;
Serial.flush();
  return;}

if (mySerial.available()) {
      delay(100);
     int k=0;
     byte inbyte=0;
     
  while( mySerial.available() && k < 100) {
     inbyte = mySerial.read();
    MessageRx[k] = inbyte;
    k++;   }

    if (debug)  Serial.print ("Recieve:   ");

    for (int i = 0; i < k; i++) {
    if (debug){Serial.print(MessageRx[i],HEX); Serial.print (" ");} }
   if (debug) Serial.println ("");

if ((MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x81 && MessageRx[5]==0x04)|| (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x81 && MessageRx[4]==0x04)) {
if (debug){  Serial.println ("Prinyat zapros init!  "); Serial.println (""); 
    Serial.print ("Otvechayu:    ");}
  for (int i = 0; i <sizeof(messageCOMUN); i++) {
    mySerial.write(messageCOMUN[i]);
    if (debug){Serial.print(messageCOMUN[i],HEX); Serial.print ("  ");}
   } 
    if (debug) {Serial.println("");}
 
   }
if (MessageRx[0]==0x80 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x01 && MessageRx[4]==0x3E && MessageRx[5]==0xC1) {
 if (debug){ Serial.println ("Prinyat zapros prisutstvia!  "); Serial.println (""); 
 //   Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya:   "); Serial.println (bytenumber); Serial.println (""); 
    Serial.print ("Otvechayu:    ");}
  for (int i = 0; i < sizeof(messagePRES); i++) {
    mySerial.write(messagePRES[i]);delay(1);
    if (debug) {Serial.print(messagePRES[i],HEX); Serial.print ("  ");}}
    
    if (debug) Serial.println("");
 
   }
   if (MessageRx[0]==0x80 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x02 && MessageRx[4]==0x1A && MessageRx[5]==0x81 && MessageRx[6]==0x1F) {
 if (debug){ Serial.println ("Prinyat zapros identificacion 1!  "); Serial.println ("");  
    Serial.print("Otvechayu:      ");}
  for (int i = 0; i < sizeof(messageIDEN1); i++) {
    mySerial.write(messageIDEN1[i]);delay(1);
    if (debug) {Serial.print(messageIDEN1[i],HEX); Serial.print ("  ");}
   } 
    if (debug){Serial.println("");
   Serial.print ("Otvechayu DEC:  ");}
    for (int i = 0; i < sizeof(messageIDEN1); i++) {
   
    if (debug) {Serial.print(messageIDEN1[i]); Serial.print ("  ");}
   } 
    if (debug) Serial.println("");
 
   }
   if (MessageRx[0]==0x80 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x02 && MessageRx[4]==0x1A && MessageRx[5]==0x80 && MessageRx[6]==0x1E) {
 if (debug){ Serial.println ("Prinyat zapros identificacion 2!  "); Serial.println ("");  
    Serial.print("Otvechayu:      ");}
  for (int i = 0; i < sizeof(messageIDEN2); i++) {
    mySerial.write(messageIDEN2[i]); delay(1);
    if (debug) {Serial.print(messageIDEN2[i],HEX); Serial.print ("  ");}
   } 
    if (debug) {Serial.println("");
  Serial.print ("Otvechayu DEC:  ");}
 for (int i = 0; i < sizeof(messageIDEN2); i++) {
    
    if (debug) {Serial.print(messageIDEN2[i]); Serial.print ("  ");}
    
   } 
   if (debug) Serial.println("");
   }
   if (MessageRx[0]==0x80 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x02 && MessageRx[4]==0x21 && MessageRx[5]==0x01 && MessageRx[6]==0xA6) {
if (debug){  Serial.println ("Prinyat zapros datos!  "); Serial.println (""); 
    Serial.print ("Otvechayu:    ");}
  for (int i = 0; i < sizeof(messagePIDS); i++) {
    mySerial.write(messagePIDS[i]);delay(1);
   
    if (debug) {Serial.print(messagePIDS[i],HEX); Serial.print ("  ");}
   } 
    if (debug) Serial.println("");
 
   }
}
}

вот убил время на работе выяснил за что байты отвечают, формулы уж сам подберёшь с помощью эмуля: 

13 MAP                Bar
14 system voltage     V
15 intake air temperature   V
16 intake air temperature  *C 
17  engine coolant temperature   V
18 engine coolant temperature   *C
19 УОЗ
20 Нагрузка на двигатель         %
22 номер ячейки детонации
23 цил1 уменшение УОЗ для уменьшения детонации
24 цил2 уменшение УОЗ для уменьшения детонации
25 цил3 уменшение УОЗ для уменьшения детонации
26 цил4 уменшение УОЗ для уменьшения детонации
27 throttle position  V
28 throttle position  %
29 скорость автомобиля          км/ч
30 обороты ДВС
30 УОЗ
31 время впрыска                 мс
32 регулятор холостого хода      шагов
33 Desired Idle P-N                      rpm
34 Desired Idle Drive (R-D-3-2-1)        rpm
35 лямбда зонд                   mV
36 O2 Integrator                 шагов 
37 O2 BLM Cell Number (Block Learn Multiplier)
38 O2 BLM Cell Content (Block Learn Multiplier)
40 клапан адсорбера              %
41 соотношение воздух/топливо
42 желаемое положение клапана ЕГР %
43 реальное положение клапана ЕГР % 
   а также какой то бит в байте отвечает за цикл по лямде (замкн или разомкн)Air/Fuel Status
44 bits : Vehicle Speed Pulse, Dec. Fuel Cutoff (Deceleration), Full Load Enrichment, O2-Loop BLM Enable (Block Learn Map)
45 bits : IAC Control Enable (Idle Air Control), torque control , Blink Code Request, положение селектора 
46 bits: air control solenoid, Idle Adjust P-N, Idle Adjust Drive (R-D-3-2-1), Idle Adjust, A/C Relay (Air Conditioning)
47 bits: Secondary Air Pump Relay, immobilizer, Telltale (Check Light)





 

taha17
taha17 аватар
Offline
Зарегистрирован: 08.10.2017

MaksVV пишет:

вот к-лайн шилд  для нано. Спаял себе - работает , рекомендую

Интересную идею ты замутил в натуре ))) Беру на вооружение )) В планах еще вот таких компонентов довавить:

С корпусом и подстроичником- понялно будет без слов. А вот кнопка перекидная, что бы плюсовой перекидывать или обрубать вовсе. Со стандартного разъема диагностики постоянный плюс идет, что не всегда удобно. Второе положение, для подочи плюса, например с включенного зажигания.

  

MaksVV
Offline
Зарегистрирован: 06.08.2015

Не, я не люблю когда в разъеме чето торчит. Мне проще скрутками сзади разъема к проводам примотаться.

В планах сделать шилд для меги с четырьмя к-лайнами на двух микрухах lm339. Это нужно для граммотного сниффа, чтобы понимать при сниффе кто какие сообщения шлет.

MaksVV
Offline
Зарегистрирован: 06.08.2015

к-лайн шилд для такого переходника USB-UART на FTDI  - получается граммотный USB - K-line адаптер, работающий на всех скоростях "из коробки".  драйвера для FTDI 

 

Targitai
Offline
Зарегистрирован: 05.10.2018

Ого, тут уже за меня пиды нашли :) А разве ключи, адрес блока и т.п. для эмулятора не важны?

Но по порядку. Залил снифер в свою UNO. При проверке на столе, когда к машине не подключено, получил так:

935ms
 0 3F 77 7 3F 1F
3386ms
 0 3F 77 7 3F 1F
3371ms
 0 3F 77 7 3F 1F
3390ms
 0 3F 77 7 3F 1F
3366ms
 0 3F 77 7 3F 1F
3391ms
 0 3F 77 7 3F 1F

На машине, получил так:

347ms
 81 11 F1 3E C1 81 F1 11 7E 1
342ms
 81 11 F1 3E C1 81 F1 11 7E 1
340ms
 81 11 F1 3E C1 81 F1 11 7E 1
816ms
 0 81
56ms
 11 F1 81 4 83 F1 11 C1 EF 8F C4
251ms
 82 11 F1 1A 81 1F A2 F1 11 5A 81 4 90 6F 62 3 98 6A 3 99 44 3 92 44 3 91 6B 3 94 64 3 95 2 3 96 66 3 97 66 3 9A 2 FF D3
278ms
 82 11 F1 1A 80 1E 80 F1 11 44 5A 80 57 30 4C 30 30 30 30 33 36 56 31 31 36 36 37 37 32 53 30 30 31 30 30 34 39 32 34 19 98 12 14 16 20 22 80 31 36 32 30 32 33 31 39 20 4E 4C 43 4D 58 4A 0 8 44 39 36 30 30 33 58 31 36 58 45 4C 1 2 A3
399ms
 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 FA 79 33 78 51 C0 8A 12 34 0 0 0 0 0 1E 0 0 0 8B 26 0 0 56 80 12 74 0 FF 7B 0 0 0 84 8 27 34 0 0 0 33
663ms
 81 11 F1 3E C1 81 F1 11 7E 1
216ms
 81 11 F1 3E C1 81 F1 11 7E 1
219ms
 81 11 F1 3E C1 81 F1 11 7E 1
219ms
 81 11 F1 3E C1 81 F1 11 7E 1
214ms
 81 11 F1 3E C1 81 F1 11 7E 1
217ms
 81 11 F1 3E C1 81 F1 11 7E 1
219ms
 81 11 F1 3E C1 81 F1 11 7E 1
215ms
 81 11 F1 3E C1 81 F1 11 7E 1
216ms
 81 11 F1 3E C1 81 F1 11 7E 1

Мне кажется, или где-то что-то не то?  Как-то у ТС и количество байтов другое.

Ключи, кстати: Keyword 2031 protocol, Keyword #1: EF, Keyword #2: 8F

Далее попытался посмотреть как он к приборке по 7 пину бует подключаться. На столе просто 0 в серийнике.

На машине:


8727ms
 0
2239ms
 E6 E6
55ms
 18 E6 0 FE FE
89ms
 0 F8 0 FE 0 F8 6 F8 0 F8 E6 F8 F8 F8 6 F8 FE F8 0 F8 E6 F8 0
56ms
 F8 0 F8 F8 F8 6 F8 F8 F8 0 F8 0 F8 F8 F8 6 F8 F8 F8 0 F8 0 F8
60ms
 FE F8 6 F8 FE F8 0 F8 0 F8 6 F8 18 F8 0 F8 1E F8 F8 0 FE
71ms
 0 F8 0 FE 0 F8 6 F8 0 F8 E6 F8 F8 F8 6 F8 FE F8 0 F8 E6 F8 0 F8
60ms
 0 F8 F8 F8 6 F8 F8 F8 0 F8 0 F8 F8 F8 6 F8 F8 F8 0 F8 0 F8 FE F8
59ms
 6 F8 FE F8 0 F8 0 F8 6 F8 18 F8 0 F8 1E F8 F8 0 FE 18 0
55ms
 FE 0 18 FE F8 0 18 C6 0 E0 18 F8
57ms
 0 C0 6 38 F8 0 18 C6 0 E0 18 F8
57ms
 0 E0 6 18 F8 0 18 C6 0 E0 18 F8
57ms
 0 C0 6 38 F8 0 18 C6 0 C0 18 F8
58ms
 0 E0 6 38 18 6 E0 0 1E E0 6 F8
57ms
 6 FE E0 0 0 0 0 0 0 0 0 0
55ms
 0 0 6 0 0 0 0 1E FE 6 F8 6 F8 6 FE
55ms
 F8 C6 6 F8 1E E0 F8 1E FE 1E FE FE 18 F8 FE F8 6 F8
54ms
 38 6 6 F8 6 FE E0 0 0
54ms
 0 0 0 0 0 0 0 0 0 6 0
56ms
 0 0 0 E0 FE 6 F8 6 F8 6 FE F8 E6 6 F8 1E E0 F8
54ms
 1E FE 1E F8 FE 6 F8 FE F8 6 F8 6 6
64ms
 6 F8 6 FE E0 0 0 0 0 0 0 0 0
56ms
 0 0 0 6 0 0 0 0 E0 FE 6 F8 6 F8
54ms
 6 FE F8 E6 6 F8 1E E0 F8 1E FE 1E FE FE 1E F8 FE F8 6
55ms
 F8 C0 6 6 F8 6 FE C0 0
54ms
 0 0 0 0 0 0 0 0 0 0 6
55ms
 0 0 0 0 1E FE 18 F8 18 F8 6 FE F8 C6 6 F8 1E
54ms
 E0 F8 1E FE 1E FE FE 6 F8 FE F8 6 F8 3E 6
69ms
 6 F8 6 FE E0 0 0 0 0 0 0 0 0
54ms
 0 0 0 6 0 0 0 0 E0 FE 6 F8 6 F8
54ms
 0 FE F8 E6 6 F8 1E E0 F8 1E FE 1E FE FE 18 F8 FE F8 6 F8
60ms
 38 6 6 F8 6 FE E0 0 0
55ms
 0 0 0 0 0 0 0 0 0 6 0
54ms
 0 0 0 E0 FE 6 F8 6 F8 6 FE F8 C6 6 F8 1E E0 F8
54ms
 1E FE 1E F8 FE 1E F8 FE F8 6 F8 3E 6
65ms
 6 F8 6 FE E0 0 0 0 0 0 0 0 0
55ms
 0 0 0 6 0 0 0 0 1E FE 18 F8 18 F8
55ms
 6 FE F8 C6 6 F8 1E E0 F8 1E FE 1E FE FE 6 F8 FE F8 6 F8
59ms
 3E 6 6 F8 6 FE E0 0 0
55ms
 0 0 0 0 0 0 0 0 0 6 0
56ms
 0 0 0 E0 FE 6 F8 6 F8 6 FE F8 E6 6 F8 1E E0 F8
54ms
 1E FE 1E FE FE 18 F8 FE F8 6 F8 3E 6
64ms
 6 F8 6 FE E0 0 0 0 0 0 0 0 0
56ms
 0 0 0 6 0 0 0 0 E0 FE 6 F8 6 F8
54ms
 6 FE F8 E6 6 F8 1E E0 F8 1E FE 1E F8 FE 1E F8 FE F8 6 F8
60ms
 3E 6 6 F8 6 FE E0 0 0
55ms
 0 0 0 0 0 0 0 0 0 6 0
55ms
 0 0 0 1E FE 18 F8 18 F8 6 FE F8 C6 6 F8 1E E0 F8 1E
55ms
 FE 1E FE FE 6 F8 FE F8 6 F8 1E 6
64ms
 6 F8 6 FE E0 0 0 0 0 0 0 0 0
54ms
 0 0 0 6 0 0 0 0 1E FE 6 F8 6 F8
55ms
 6 FE F8 C6 6 F8 1E E0 F8 1E FE 1E FE FE 18 F8 FE F8 6 F8
60ms
 38 6 6 F8 6 FE E0 0 0
54ms
 0 0 0 0 0 0 0 0 0 6 0

Кстати, на каком-то форуме нашел некоторые пиды для z16xe, может можно формулы от туда будет содрать:

Name,"ShortName","ModeAndPID","Equation","Min Value","Max Value","Units","Header"
Opel z16XE Multec-S Fuel Tank,"Fuel Tank","2101","BK*100/255","0","100","L","8011F1"
Opel z16XE Multec-S Injection Pulse,"InjPls","2101","BN*25.6/255","0","25.6","ms","8011F1"
Opel z16XE Multec-S Manifold Absolute Pressure,"MAP","2101","AV","0","255","kPa","8011F1"
Opel z16XE Multec-S Coolant Temperature,"ECT","2101","AN-40","0","215","°C","8011F1"
Opel z16XE Multec-S Intake Air Temperature,"IAT","2101","AP-40","0","215","°C","8011F1"
Opel z16XE Multec-S A/C Pressure (Air Conditioning),"A/C Pressure","2101","BQ*5100/255","0","5100","kPa","8011F1"
Opel z16XE Multec-S Spark Angle,"ADV","2101","BO*128/255-64","0","100","°","8011F1"
Opel z16XE Multec-S Knock Retard Cylinder 1,"KnockRetCyl1","2101","BY","0","100","°","8011F1"
Opel z16XE Multec-S Knock Retard Cylinder 2,"KnockRetCyl2","2101","BZ","0","100","°","8011F1"
Opel z16XE Multec-S Knock Retard Cylinder 3,"KnockRetCyl3","2101","CA","0","100","°","8011F1"
Opel z16XE Multec-S Knock Retard Cylinder 4,"KnockRetCyl4","2101","CB","0","100","°","8011F1"
Opel z16XE Multec-S Battery Voltage,"Batt Volt","2101","AF*25.5/255","0","25.5","V","8011F1"
Opel z16XE Multec-S Calculated Pedal Position,"CalcPedPos","2101","AZ*100/255","0","100","%","8011F1"
Opel z16XE Multec-S Vehicle Speed,"Speed","2101","AK","0","255","km/h","8011F1"
Opel z16XE Multec-S Fuel Tank Ventilation Valve,"Tank Valve","2101","BI*100/255","0","100","%","8011F1"
Opel z16XE Multec-S O2 Bank1 Sensor1,"O2 B1S1","2101","CG*1106/255","0","1106","mV","8011F1"
Opel z16XE Multec-S O2 Bank1 Sensor2,"O2 B1S2","2101","CH*1106/255","0","1106","mV","8011F1"
Opel z16XE Multec-S Bank1 Long Term Fuel Trim,"LTFT","2101","(CN-128)*100/128","0","100","%","8011F1"
Opel z16XE Multec-S Bank1 Short Term Fuel Trim,"STFT","2101","(CE-128)*100/128","0","100","%","8011F1"
Opel z16XE Multec-S Desire Idle Engine Speed,"DesIES","2101","AJ*3187/255","0","3187","rpm","8011F1"
Opel z16XE Multec-S Engine Speed,"EngineSpeed","2101","(AG*256+AH)/4","0","65536","rpm","8011F1"
Opel z16XE O2 Sensor Loop,"Open-Clouse","2101","{W:0}","0","1","","8011F1"
Opel z16XE Tank Sensor Volt,"TankVolt","2101","BJ*14.92/255","0","14.92","V","8011F1"
Opel z16XE Intake Air Temp Volt,"IATVolt","2101","AO*5/255","0","5","V","8011F1"
Opel z16XE Coolant Temp Volt,"ECTVolt","2101","AM*5/255","0","5","V","8011F1"
Opel z16XE MAP Sensor Volt,"MAPVolt","2101","AU*5/255","0","5","V","8011F1"
Opel z16XE EGR Position Command,"EGR Pos","2101","BH*100/255","0","100","%","8011F1"
Opel z16XE EGR Position Feedback Volt,"EGR Volt","2101","BG*5/255","0","5","V","8011F1"
Opel z16XE Accelerator Pedal Position Sensor 1 Volt,"APP S1","2101","AW*5/255","0","5","V","8011F1"
Opel z16XE Accelerator Pedal Position Sensor 2 Volt,"APP S2","2101","AX*5/255","0","5","V","8011F1"
Opel z16XE Throttle Position Sensor 1 Volt,"TP S1","2101","BA*5/255","0","5","V","8011F1"
Opel z16XE Throttle Position Sensor 2 Volt,"TP S2","2101","BB*5/255","0","5","V","8011F1"
Opel z16XE Calculated Throttle Position,"Calc TP","2101","BD*100/255","0","100","%","8011F1"
Opel z16XE Total Missfire,"Missfire","2101","CK","0","255","","8011F1"
Opel z16XE MIL Status,"MIL","2101","{Z:0}","0","1","","8011F1"
Opel z16XE Service Vehicle Status,"Service","2101","{Z:7}","0","1","","8011F1"
Opel z16XE Fuel Flow,"Fuel Flow","","((VAL{Opel z16XE Multec-S Injection Pulse}/1000)*(169/60000)*(VAL{Opel z16XE Multec-S Engine Speed}/120))*14400","0","255","l/h",""
Opel z16XE Instant Fuel Consumption L/100km,"Ins L/100km","","100/VAL{Opel z16XE Multec-S Vehicle Speed}*VAL{Opel z16XE Fuel Flow}","0","255","L/100km","8011F1"

Кстати, по поводу подключения к эмулятору. Что-то торможу. Есть Ардуина, к ней прицеплен k-line на LM393. С него выход 12В, К-линия, земля. С другой стороны  USB-TTL, к которому нужно подключить еще один K-Line адаптер, так? и между собой их соединить 12 к 12, К-линия к К-линии, земля к земле? Так?

MaksVV
Offline
Зарегистрирован: 06.08.2015

а ты попробуй моей программой OPCOM K-line подключиться и попробуй такой сниффер. Сравним

#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8); //R,T
unsigned long prevTimedelay = 0; 
uint32_t Delay = 0;
void setup() {
 Serial.begin (115200);
mySerial.begin (10400);
}

void loop() {

if (mySerial.available()) {

unsigned long curTimedelay = millis ();
   Delay = curTimedelay-prevTimedelay;
Serial.println (""); Serial.print (Delay); Serial.println ("ms");
prevTimedelay = millis();  
while( mySerial.available()) {
    byte inByte = mySerial.read();
    delay (3);             // для правильной компановки кадров играем этой задержкой 
    Serial.print(" ");
    Serial.print(inByte,HEX);
   }
     
    }
}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Targitai пишет:
Кстати, по поводу подключения к эмулятору. Что-то торможу. Есть Ардуина, к ней прицеплен k-line на LM393. С него выход 12В, К-линия, земля. С другой стороны  USB-TTL, к которому нужно подключить еще один K-Line адаптер, так? и между собой их соединить 12 к 12, К-линия к К-линии, земля к земле? Так?

всё верно , со стороны компа можно взять стандартный к-лайн адаптер, который должен держать скорость 10400 (ну т.е. подключаться к автомобилю)

Targitai
Offline
Зарегистрирован: 05.10.2018

Нема такого. Есть USB-TTL, которой подключался к мозгам ГБО. На FT232RL, как вы ссылку давали. Завтра еще один k-line спаяю и к ней подключу. Или можно в параллель с тем, что к Ардуинке подключен?

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

нет низя