Данные из K-line Эбу

TWANs
Offline
Зарегистрирован: 08.02.2019

Доброго времени суток. Поставлена задача достать информацию с эбу (Январь 5.1). Собрана схема на L9637D

(Взята с интернета) подключена к Arduino Uno aTmega328p. Подключен дисплей для вывода темпреатуры ОЖ(для примера). Пробовал разное колличество скетчей , итог один не работает. 

#include <Wire.h> 

// set the LCD address to 0x27 for a 16 chars and 2 line display
//LiquidCrystal_I2C lcd(0x27,16,2);
#include <OLED_I2C.h>
OLED  myOLED(SDA, SCL, 8);

#define BUFFER_SIZE 256

extern uint8_t BigNumbers[];

unsigned char startCommunication[]                 = {0x81,0x10,0xf1,0x81,0x03};                          //старт диагностического сеанса
unsigned char readDataByLocalIdentifier_RLI_ASS[]  = {0x82,0x10,0xF1,0x21,0x01,0xA5};                     //запрос диагностических данных
unsigned char readDTCByStatus[]                    = {0x84,0x10,0xF1,0x18,0x00,0x00,0x00,0x9D};           //запрос кодов ошибок

byte To = 0;
short obr = 0;
float u = 0;

byte To1 = 0;
short obr1 = 0;
byte i = 0;
unsigned char buffer[BUFFER_SIZE];                                      //буфер для приема сообщений с тачки
byte bufSize = 0;
int t = 2;
int k = 0;

uint8_t clr[8] = {B00000,B00000,B00000,B00000,B00000,B00000,B00000,B00000};

uint8_t load_2[8] = {B00111,B00111,B00111,B11111,B11111,B11111,B11111,B11111};
uint8_t load_3[8] = {B11111,B11111,B11111,B11111,B11111,B00111,B00111,B00111};
uint8_t load_4[8] = {B11111,B11111,B11111,B11111,B11111,B11100,B11100,B11100};
uint8_t load_5[8] = {B11100,B11100,B11100,B11111,B11111,B11111,B11111,B11111};

void setup() {
  
  Serial.begin(10400);
  myOLED.begin();
    myOLED.setFont(BigNumbers);
  
}

void loop() {
  Serial.write(startCommunication, 5);
  delay(25);
  
  Serial.write(readDataByLocalIdentifier_RLI_ASS, 6);
  bufSize = 0;
      if(Serial.available() > 0) {
        bufSize = Serial.available();
   
        for (i = 0; i < bufSize; i++)  
          buffer[i] = Serial.read();            
      }
    if ((bufSize > 11) || (buffer[10] == 0x61)) {
      To1 = buffer[20]; // - 40
      obr1 = buffer[23] * 40;
        Serial.println(buffer[20]);
   }


myOLED.update();
    myOLED.printNumF(buffer[22], 2, 25, 10);

}      

Пока писал возник еще вопрос. Можно ли выставить монитор порта в 10400 бод?

Просьба сильно камнями не кидаться. Начал баловаться с Arduino меньше недели назад

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Можно. Я разрешаю :)

TWANs
Offline
Зарегистрирован: 08.02.2019

mykaida пишет:

Можно. Я разрешаю :)

Спасибо , конечно , но где?

 

TWANs
Offline
Зарегистрирован: 08.02.2019

mykaida пишет:

Можно. Я разрешаю :)

Спасибо , конечно , но где?

 

PRC
Offline
Зарегистрирован: 03.02.2019

ТС не думал что два устройства на одном аппаратном порту serial будут немножечко конфликтовать?

TWANs
Offline
Зарегистрирован: 08.02.2019

PRC пишет:

ТС не думал что два устройства на одном аппаратном порту serial будут немножечко конфликтовать?

 

Можно чуть по подробнее , а то с этими портами я конкретно запутался

PRC
Offline
Зарегистрирован: 03.02.2019

Куда уж подробней? У Uno на Serial висит переходник USB-COM, который может тупо мешать работе L9637D. Соответственно надо использовать пустой порт, например софтовый.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Уважаемый, схема, которую Вы привели и Ваша программа - это 4 большие разницы. Вы хотите что-то читать по CAN - замечательно. Тогда организуйте программный серийный порт (гугл в помощь) на пинах 2 и 3. Вы хотите выводить на I2C дисплей - так у Вас в схеме его нет. Вы хотите получать отчет на штатный серийный порт - так вот Serial.print() это и делает. Пишите программу от простого к сложн ому - сначала напишите вывод на серийный порт, потом допишите дисплей, а уж потом создавайте еще один серийник и подключайте Ваше устройство. По другому - никак.

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

У вас есть обычный к-лайн юсб адаптер? Если да , то так будет проще понять почему ниче не работает.

TWANs
Offline
Зарегистрирован: 08.02.2019

Заного собрал схему. Попытался сам написать скетч , опираясь на вышенаписанное. Пришел к тому что в монитор порта приходят мусорные значения ( 0 ... 165...255.. дублируются много раз).  

#include <SoftwareSerial.h>                                          // Подключаем библиотеку SoftwareSerial для общения с модулем по программной шине UART
SoftwareSerial softSerial(10,11);                                      // Создаём объект softSerial указывая выводы RX, TX (можно указывать любые выводы Arduino UNO)
                                                                     // В данном случае вывод TX модуля подключается к выводу 10 Arduino, а вывод RX модуля к выводу 11 Arduino.



#define BUFFER_SIZE 256
unsigned char startCommunication[]                 = {0x81,0x10,0xf1,0x81,0x03};                          //старт диагностического сеанса
unsigned char readDataByLocalIdentifier_RLI_ASS[]  = {0x82,0x10,0xF1,0x21,0x01,0xA5};                     //запрос диагностических данных
byte bufSize = 0;
unsigned char buffer[BUFFER_SIZE]; 
byte i = 0;

void setup(){                                                        //
    softSerial.begin(10400);                                         // Инициируем передачу данных по программной шине UART на скорости 10400 (между модулем и Arduino)
        Serial.begin(9600);                                          // Инициируем передачу данных по аппаратной  шине UART на скорости  9600 (между Arduino и компьютером)
}                                                                    //
                                                                     //
void loop(){                                                        
    softSerial.write(startCommunication, 5);
    delay(25);
    softSerial.write(readDataByLocalIdentifier_RLI_ASS, 6);
    bufSize = 0;
      if(softSerial.available() > 0) {
        bufSize = softSerial.available();
   
        for (i = 0; i < bufSize; i++)  
          buffer[i] = softSerial.read();            
      }

      //  Выполняем ретрансляцию:                                          // Всё что пришло с модуля - отправляем компьютеру, а всё что пришло с компьютера - отправляем модулю
    if(softSerial.available()){    Serial.write(softSerial.read());} // Передаём данные из программной шины UART в аппаратную  (от модуля     через Arduino к компьютеру)
    if(    Serial.available()){softSerial.write(    Serial.read());} // Передаём данные из аппаратной  шины UART в программную (от компьютера через Arduino к модулю    )

    Serial.println(buffer[20]);
}

 

TWANs
Offline
Зарегистрирован: 08.02.2019

Пока искал , наткунлся на такую информацию. Если залить пустой скетч то Opendiag через данную схему заработает

P.S если не использовать монитор порта (а использовтаь дисплей). Можно ли использовать tx и rx которые на самой ардуинке?(питание брать с повербанка , например)

PRC
Offline
Зарегистрирован: 03.02.2019

Проще проц на время выковырять.

TWANs
Offline
Зарегистрирован: 08.02.2019

PRC пишет:

Проще проц на время выковырять.

Странно , но если залить пустой скетч и закинуть на пины 0 и 1 ,то опендиаг находит его( работоспособность проверю чуть позже)

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

TWANs пишет:

Пока искал , наткунлся на такую информацию. Если залить пустой скетч то Opendiag через данную схему заработает

P.S если не использовать монитор порта (а использовтаь дисплей). Можно ли использовать tx и rx которые на самой ардуинке?(питание брать с повербанка , например)

если вы подключили к-лайн к пинам 10 и 11 , то нужно залить такой скетч. Потом подключаете свою связку ардуино-к_лайн к opendiag по юсб проводу и диагностируете. 

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
 Serial.begin(10400);
 mySerial.begin(10400);
             }

void loop()  { 
  if (mySerial.available()) Serial.write(mySerial.read());
  if (Serial.available())   mySerial.write(Serial.read());
             }

 

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

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

PRC
Offline
Зарегистрирован: 03.02.2019

TWANs пишет:
PRC пишет:

Проще проц на время выковырять.

Странно , но если залить пустой скетч и закинуть на пины 0 и 1 ,то опендиаг находит его( работоспособность проверю чуть позже)

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

Если у проца отгнуть ножку TX, то можно и принимать данные процессором, не мешая остальным.

TWANs
Offline
Зарегистрирован: 08.02.2019

MaksVV пишет:

TWANs пишет:

Пока искал , наткунлся на такую информацию. Если залить пустой скетч то Opendiag через данную схему заработает

P.S если не использовать монитор порта (а использовтаь дисплей). Можно ли использовать tx и rx которые на самой ардуинке?(питание брать с повербанка , например)

если вы подключили к-лайн к пинам 10 и 11 , то нужно залить такой скетч. Потом подключаете свою связку ардуино-к_лайн к opendiag по юсб проводу и диагностируете. 

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
 Serial.begin(10400);
 mySerial.begin(10400);
             }

void loop()  { 
  if (mySerial.available()) Serial.write(mySerial.read());
  if (Serial.available())   mySerial.write(Serial.read());
             }

 

А там точно написано и там и там 10400? Или же в одном 9600?

PRC
Offline
Зарегистрирован: 03.02.2019

Везде 10400. Этот скетч нужен для работы через программу на компе, чисто для проверки.

TWANs
Offline
Зарегистрирован: 08.02.2019

PRC пишет:

Везде 10400. Этот скетч нужен для работы через программу на компе, чисто для проверки.

 

Не нравиться ему данный скетч. Перестает видит , когда подключаю к 10 и 11 пину и заливаю данный скетч.

PRC
Offline
Зарегистрирован: 03.02.2019

Похоже решение лежит тут - http://arduino.ru/forum/programmirovanie/nestandartnaya-skorost-serial

TWANs
Offline
Зарегистрирован: 08.02.2019

PRC пишет:

Похоже решение лежит тут - http://arduino.ru/forum/programmirovanie/nestandartnaya-skorost-serial

То ли я не догоняю , то ли SoftSerial уже давным давно переделан и там нет данной таблицы. Даже в другом месте лежит. Гугления пока ни к чему не привели. Можно ли как-нибудь использовать 0 и 1 пин и выводить данные на дисплей? А если перейти на arduino nano?

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

TWANs пишет:
Не нравиться ему данный скетч. Перестает видит , когда подключаю к 10 и 11 пину и заливаю данный скетч.

кто перестаёт видеть? Opendiag как раз на скорости 10400 и должен подключаться к ЭБУ. Вместо ЭБУ у вас ардуина, она же это всё транслирует через софт-сериал на к-лайн и на ЭБУ. Должно работать.

TWANs
Offline
Зарегистрирован: 08.02.2019

Вот именно что должно. Но в итоге на 0 1 пинах все работает , а на других пинах через софт сериал нет, говорит что адаптер не обнаружен. Заливаю пустой скетч ( переставляю в 0 1) Opendiag сразу его находит

PRC
Offline
Зарегистрирован: 03.02.2019

Замкни 10 и 11 вывод, поставь скорости 9600 везде и проверь эхо в терминале.

У меня софт сериал почему-то не работает

 

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

точно из отсутствия эха не работает. Ведь к-лайн физически сам эхо создает. 

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

пробуем такой скетч

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
 Serial.begin(10400);
 mySerial.begin(10400);
             }

void loop()  { 
  if (mySerial.available()) Serial.write(mySerial.read());
  if (Serial.available()) {byte inbyte = Serial.read(); Serial.write (inbyte); mySerial.write(inbyte); }
             }

 

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

опендиаг шлёт на блок два сообщения для начала диагностической сессии: 

81 10 F1 82 04

81 10 F1 81 03

читаем описание протокола . У вебасто он очень похожий. 

 

PRC
Offline
Зарегистрирован: 03.02.2019

Софт порт не работает одновременно с аппаратным. Поэтому идем в менеджер библиотек и ставим AltSoftSerial. Переключаем адаптер на ноги 8 и 9 и пробуем этот скетч

#include <AltSoftSerial.h>
AltSoftSerial mySerial(8, 9); // RX, TX

void setup() {
 Serial.begin(10400);
 mySerial.begin(10400);
             }
void loop()  {
  if (mySerial.available()) Serial.write(mySerial.read());
  if (Serial.available())   mySerial.write(Serial.read());
}

 

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

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

PRC
Offline
Зарегистрирован: 03.02.2019

MaksVV пишет:

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

Я скопировал этот скетч, замкнул ножки 10 и 11, выставил везде скорости 9600 и эха у меня не было. В интернетах много жалоб на этот софт сериал. Заменил его на альсериал и эхо появилось.

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

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

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

меня софт ни разу не подвел . Всё всегда работает хорошо. 

PRC
Offline
Зарегистрирован: 03.02.2019

У меня скетч №13 при замкнутых 10 и 11 не давал эха. Вот и вся его работоспособность. Хотя теоретически должен.

А №25 будет работать на эхо даже если софт сериал вообще убрать))

TWANs
Offline
Зарегистрирован: 08.02.2019

Как проверить на эхо? #25 скетч залил , но opendiag его не нашел. А нужно ли 1 0 пин замыкать?

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

перевоткните юсб ардуины, как не нашел? Чето вы не то делаете. Ниче замыкать не нужно

PRC
Offline
Зарегистрирован: 03.02.2019

Попробуй мой, из №27. С другой библиотекой и ножками.

Ножки 0 и 1 трогать не нужно вообще.

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

PRC пишет:

У меня скетч №13 при замкнутых 10 и 11 не давал эха. Вот и вся его работоспособность. Хотя теоретически должен.

А №25 будет работать на эхо даже если софт сериал вообще убрать))

нафиг вам эхо? Говорю вам, только что проверил. ВСЁ работает. Вы не правильно понимаете это эхо походу. Какая вся работоспособность?  Соединил  такую связку с обычным юсб к-лайн адаптером. Открыл два терминала порта - данные передаются и принимаются у обоих устройств. Также открыл ардуину вы опендиаге - второй к-лайник открыт в терминале и видит запросы от опендиага. Что ещё надо?!

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

#27 работать НЕ будет 100%. Там не хватает программной организации эха (которое должна давать шина к-лайн, а её на этом Serial-е нет)

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

12В не забываем подавать на к-лайн адаптер

PRC
Offline
Зарегистрирован: 03.02.2019

Заменить строчку 10 на:   if (Serial.available())   {byte inbyte = Serial.read(); Serial.write (inbyte); mySerial.write(inbyte); }

и будет программное эхо.

У меня просто пример этого сериального порта из библиотеки не работает.

TWANs
Offline
Зарегистрирован: 08.02.2019

Грустно как-то все выходит пока что. Малость ошибся по поводу контроллера ATmega16U2( может важно). Не 25 не 27 скетч не может с OpenDiagom законнектиться. Во время поиска он чуть останавливается на COM3(где ардуина) ( диод на L гаснет в этот момент) и дальше продолжает искать 

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

пробуем так 

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
 Serial.begin(10400);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
 
 
 
 mySerial.begin(10400);
 
             }

void loop()  { 
  if (mySerial.available()) Serial.write(mySerial.read());
  if (Serial.available()) {byte inbyte = Serial.read(); Serial.write (inbyte); mySerial.write(inbyte); }
             }

 

TWANs
Offline
Зарегистрирован: 08.02.2019

На K-line подаю +12В без софтсериал все работает , стоит перекинуть ножки и радость уходит. 

TWANs
Offline
Зарегистрирован: 08.02.2019

И так, что имеем. Последний скетч заработал , но не знаю правильно ли. Если цеплять к 0 1 пину то Opendiag показывает все показания. А если цеплять к 8 9 пину(ради интереса поменял) через софт , то Opendiag его находит , но определять данные с него не может. Т.е в настройках он говорит что все хорошо и адаптер найден, а в определении комплектации и параметров он говорит что не может получить данные. 

PRC
Offline
Зарегистрирован: 03.02.2019

Попробуй так

#include <AltSoftSerial.h>
AltSoftSerial mySerial(8, 9); // RX, TX

void setup() {
 Serial.begin(10400);
 while (!Serial);
 mySerial.begin(10400);
             }
void loop()  {
  if (mySerial.available()) Serial.write(mySerial.read());
  if (Serial.available())   mySerial.write(Serial.read());
}

 

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

Насколько знаю у атмега 16u2 соединение с юсб называется SERIAL и используется только для прошивки мк и отладки в юсб. (К ногам не подключен канал),  а ноги 0 и 1 это SERIAL1 . Так что не понятно, как и что у вас заработало.  

Или вы неправильно сказали про ваш МК. Т.е. 16U2 это просто переходник уартТТЛ-юсб. А основной проц всеже атмега 328

PRC
Offline
Зарегистрирован: 03.02.2019

Пусть ТС фотку своей платы выложит)))

TWANs
Offline
Зарегистрирован: 08.02.2019

MaksVV пишет:

Насколько знаю у атмега 16u2 соединение с юсб называется SERIAL и используется только для прошивки мк и отладки в юсб. (К ногам не подключен канал),  а ноги 0 и 1 это SERIAL1 . Так что не понятно, как и что у вас заработало.  

Или вы неправильно сказали про ваш МК. Т.е. 16U2 это просто переходник уартТТЛ-юсб. А основной проц всеже атмега 328

 

https://ibb.co/xmvdxzh

Вот фото. Не хочет она на сайт заливаться. Вы правы на счет основного

TWANs
Offline
Зарегистрирован: 08.02.2019

 

Исполтзовал #41 скетч , только пины были 8 и 9.

 

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

значит к-лайн неправильно у вас работает. в курсе, что RX  L9637 нужно цеплять к RX ардуино? А то может перекрёстно подключили. Говорю вам, скетч #25 проверен и работает. 

TWANs
Offline
Зарегистрирован: 08.02.2019

MaksVV пишет:

значит к-лайн неправильно у вас работает. в курсе, что RX  L9637 нужно цеплять к RX ардуино? А то может перекрёстно подключили. Говорю вам, скетч #25 проверен и работает. 

Получается когда мы пишем Softwareserial (8 ,9) мы подключаем к 8 rx а к 9 tx? Сейчас проверю пойду 25.