Минимальная программа для обработки данных OBD-II

gumeldiman
Offline
Зарегистрирован: 05.02.2020

Не пойму, - чего ты так завёлся? Тема вроде в разделе для начинающих. Мне то нужно, чтобы вы (те которые хорошо разбираются) указали на мои ошибки, да подсказали где-то как сделать правильней. Полезную ссылочку может какую дали, где можно почитать, да получить знания. А ты начинаешь сравнивать меня с болваном, сочиняешь про какой-то навоз, говоришь что я полный ноль...

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

Привыкайте искать информацию сами. Уж такие простые вещи гуглятся за три секунды. Форум чуть для другого. 

b707
Offline
Зарегистрирован: 26.05.2017

gumeldiman пишет:
Не пойму, - чего ты так завёлся? Тема вроде в разделе для начинающих. Мне то нужно, чтобы вы (те которые хорошо разбираются) указали на мои ошибки, да подсказали где-то как сделать правильней.

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

gumeldiman
Offline
Зарегистрирован: 05.02.2020

sadman41 пишет:
...

Поищи хотя бы картинки в гугле по фразе "mcp2515 arduino".

Ну да, поискал, посмотрел, проанализировал. Все подключают по одной схеме. Некоторые не подключают INT. Про CS вычитал где-то что по умолчанию он может быть 9, а не 10. Подключение остальных пинов модуля 2515 похоже где-то прописано. Короче, один фиг, мало чего понял, но схему поправил:

 

Еще прочитал, что на 1 пине разъема OBD-II на автомобилях семейства VAG приходит +12V от зажигания. Нужно будет проверить этот момент. Если действительно так и будет, по запитаюсь от этого пина, а не от 16.

sadman41
Offline
Зарегистрирован: 19.10.2016

Это на модели фритцинга In- и In+ перепутаны или схема таки не до конца выверена?

gumeldiman
Offline
Зарегистрирован: 05.02.2020

Это на преобразователе что ли?
По факту там нарисовано In+ и In+. Я в пэйтбраше исправил один плюс на минус. Ой, только сейчас заметил, что не тот плюс ))

OBD-II там коряво нарисован. В верхнем ряду наименования пинов соответствует картинке 16..9. А нижний ряд пинов назван 1..8, а нарисован 8..1. Я соединил провода в соответствии с картинкой. По факту этот разъем так и выглядит, если смотреть на него снаружи

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

5V после преобразователя нужно не на Vin, а на Vcc (5v) arduino. 

gumeldiman
Offline
Зарегистрирован: 05.02.2020

MaksVV пишет:

5V после преобразователя нужно не на Vin, а на Vcc (5v) arduino. 

О, точно. Спасибо!

 

Т.е. на VIN нужно подавать 7..12V? И соответственно 5 Вольт будет мало...

Но, судя по схеме, контакт 5V может быть и вход и выходом.

А что лучше преобразователь 7V подключить на контакт VIN или преобразователь 5V на контакт 5V?

gumeldiman
Offline
Зарегистрирован: 05.02.2020

Хотя вот тут написано:

Буду искать регулятор напряжения

------------------------------

И еще у меня возник вопрос. Критичная ли разница в чипах ATMEGA168 и ATMEGA328P?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

gumeldiman пишет:

И еще у меня возник вопрос. Критичная ли разница в чипах ATMEGA168 и ATMEGA328P?

Изучай. http://avr.ru/docs/d-sheet/atmega

gumeldiman
Offline
Зарегистрирован: 05.02.2020

DetSimen пишет:

gumeldiman пишет:

И еще у меня возник вопрос. Критичная ли разница в чипах ATMEGA168 и ATMEGA328P?

Изучай. http://avr.ru/docs/d-sheet/atmega

Спасибо! Разница ATMEGA168 и ATMEGA328P в объеме памяти, полагаю что для моей задачи вполне хватит и 168 ))

b707
Offline
Зарегистрирован: 26.05.2017

gumeldiman пишет:

Спасибо! Разница ATMEGA168 и ATMEGA328P в объеме памяти, полагаю что для моей задачи вполне хватит и 168 ))

разница в обьеме памяти - в 2 раза, а в цене - хорошо если процентов 15. Так что делаем выводы.

А если потом вдруг захочется повесить вместо светодиодов экранчик - сразу поймешь, как промахнулся, выбрав 168

 

gumeldiman
Offline
Зарегистрирован: 05.02.2020

Эх, заказал ещё и 328, посмотрим что приедет быстрее.
Пока читаю литературу по ардуино, да учусь паять ))

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

По питанию можно взять простой и надёжный dc-dc 7805 в любом магазине и навесить на входе и выходе по паре конденсаторов (по одному электролиту 25В  47 uF и по одному керамику 1uF неполярную до 50В) и подавать на 5В ардуино, не верьте что там пишут. 12В на вход DC-DC на всякий случай лучше через предохранитель в 2А. 

Вешать все это только на зажигание (НЕ на постоянный плюс), иначе АКБ разрядится. 

gumeldiman
Offline
Зарегистрирован: 05.02.2020

MaksVV пишет:

По питанию можно взять простой и надёжный dc-dc 7805 в любом магазине и навесить на входе и выходе по паре конденсаторов (по одному электролиту 25В  47 uF и по одному керамику 1uF неполярную до 50В) и подавать на 5В ардуино, не верьте что там пишут. 12В на вход DC-DC на всякий случай лучше через предохранитель в 2А. 

Вешать все это только на зажигание (НЕ на постоянный плюс), иначе АКБ разрядится. 

Я заказал такие штуки: сначала на , а потом, подумав что 5 Вольт возможно будет мало, заказал еще и с регулировкой, в расчете выставить там 7-8 Вольт.

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

Что значит 5В мало? Я говорю вам - подавайте на пин "5V" ардуины, там и должно быть 5В. 

Это бред 12В преобразовывать в 7В, а потом, подав на их Vin, уже в 5В стабом ардуины. Регулировка со временем окисляется и напряжение убегает. 

Тем более по ссылке такой же DC-DC заказали, как на борту у ардуины. С таким успехом можно просто 12В на Vin заводить  и всё, только ардуина так долго не протянет. 14, а то и 15 бывает в бортовой сети, а ей даже 12В много - греется. Всегда в машину ставил либо 7805 (1000мА), либо младшие братья -  78M05 (500мА) или 78L05 (100мА). Проблем не было ниразу. 

gumeldiman
Offline
Зарегистрирован: 05.02.2020

MaksVV пишет:

... С таким успехом можно просто 12В на Vin заводить  и всё, только ардуина так долго не протянет ...

Хм, я тут взял и измерил мультиметром напряжение на китайском блоке питания, которым питаю свою первую ардуино-поделку. Про неё написал тут. На блоке питания написано 12 Вольт. А мультиметр показал что-то около 18! Вот такие пироги. Ардуино (уно) работает, не знаю тяжело ли ей приходится. Шаговые движки ппц какие горячие.

Полагаю, что с "нано"-версией ардуины нужно поаккуратней с напряжением )) Спасибо за совет, буду питать 5V на одноименный пин.

Sergey_K
Offline
Зарегистрирован: 22.03.2020

MaksVV, не поделитесь библиотекой mcp_can, которую Вы использовали. Она под 8 или 16МГц?

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

Она под обе частоты. Выбирается это при ините mcp

Sergey_K
Offline
Зарегистрирован: 22.03.2020

Ссылочкой на библиотеку киньтесь пожалуйста)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

gumeldiman пишет:
На блоке питания написано 12 Вольт. А мультиметр показал что-то около 18!
Поди без нагрузки измеряли?

gumeldiman
Offline
Зарегистрирован: 05.02.2020

Да, без нагрузки.

Sergey_K
Offline
Зарегистрирован: 22.03.2020

Попробовал подключиться к машине используя код из поста 21, только строку 92 поправил на if(CAN0.begin(MCP_NORMAL, CAN_500KBPS, MCP_8MHZ) == CAN_OK) В изначально варианте у меня мср не инициализировалась. В остальном работает без проблем. Код из поста 26 у меня при подключении к шине Рт-Can (моторник, коробка, джойстик акпп и dsc) не увидел температуру. Хотелось бы конечно использовать вариант без запросов в OBD.

MaksVV, а Вы с BMW работали? Не поможете с вариантом без запросов? Очень уж хочется обзавестись индикатором температуры, т. к. сигнализатор перегрева срабатывает когда уже "почки отвалились". А стрелочного индикатора нет.

ЗЫ Наверно правильнее будет if(CAN0.begin(MCP_STDEXT, CAN_500KBPS, MCP_8MHZ) == CAN_OK) 

b707
Offline
Зарегистрирован: 26.05.2017

Код не видит температуру.... А хоть что видит?

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

Код из поста 26 предназначен именно для VW Polo. Если у вас другой авто - снимаете разъем с датчика температуры ДВС. Вставляете туда переменный резистор 0...100кОм. Запускаете CANHacker. Крутите резистор - смотрите какой байт начинает изменяться. Так определяется какой байт отвечает за t двс. 

Sergey_K
Offline
Зарегистрирован: 22.03.2020

b707 пишет:
Код не видит температуру.... А хоть что видит?

А что он может увидеть, если настроен на отлов только адреса 0х288.

Sergey_K
Offline
Зарегистрирован: 22.03.2020

MaksVV пишет:

Код из поста 26 предназначен именно для VW Polo. Если у вас другой авто - снимаете разъем с датчика температуры ДВС. Вставляете туда переменный резистор 0...100кОм. Запускаете CANHacker. Крутите резистор - смотрите какой байт начинает изменяться. Так определяется какой байт отвечает за t двс. 

Спасибо за подсказку! Обязательно попробую.

А то я наснимал логов CANHaker'ом при разных температурах и пытаюсь из этой мешанины что-то выудить. Пока из моей затеи ничего не вышло.

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

Короче - не надо питать от пинов. У Вас для этого БП существует. А 2-3 транзистора стоят копейки.

Sergey_K
Offline
Зарегистрирован: 22.03.2020

MaksVV пишет:

Если у вас другой авто - снимаете разъем с датчика температуры ДВС. Вставляете туда переменный резистор 0...100кОм. Запускаете CANHacker. Крутите резистор - смотрите какой байт начинает изменяться. Так определяется какой байт отвечает за t двс. 

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

В итоге нужны байт нашелся под ID 1D0. Из первого байта надо вычесть 48 что бы получить температуру двигателя. Теперь хочу отыскать температуру масла в двигателе и акпп. Определенный алгоритм поиска вроде понятен. Очень помогает обычный Excel с его функцией фильтрации.

Кстати в обмене приборной панели (она висит на другой шине) температура присутствует с тем же ID и в том же формате.

Мне совсем непонятен алгоритм работы фильтров и масок mcp2515. Может, кто плотно с ними общался, сможет доходчиво и простым языком с примерами объяснить их работу?

sadman41
Offline
Зарегистрирован: 19.10.2016

Фильтр работает по совпадению с ID. Если в обоих биты совпадают - пакет переносится в буфер. Маска определяет какие биты должны сравниваться. Таким образом часть ID может быть исключена из сравнения и не учитываться

venga
venga аватар
Offline
Зарегистрирован: 31.03.2020

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

Sergey_K
Offline
Зарегистрирован: 22.03.2020

sadman41 пишет:
Фильтр работает по совпадению с ID. Если в обоих биты совпадают - пакет переносится в буфер. Маска определяет какие биты должны сравниваться. Таким образом часть ID может быть исключена из сравнения и не учитываться

Не могли бы Вы накидать пару произвольных примеров с разбором? Что то понимание этой части мне никак не дается.

Температура масла в двигателе 0x1D0 второй байт минус 48.

sadman41
Offline
Зарегистрирован: 19.10.2016

Какой мне интерес накидывать несколько примеров с разбором? Посмотрите в примерах к библиотеке, поэкспериментируйте. Это же ваше хобби и оно должно ваше время поглощать, а не мое.

b707
Offline
Зарегистрирован: 26.05.2017

Sergey_K пишет:

Не могли бы Вы накидать пару произвольных примеров с разбором?

http://www.cse.dmu.ac.uk/~eg/tele/CanbusIDandMask.html

https://forum.arduino.cc/index.php?topic=156069.0

 

Sergey_K
Offline
Зарегистрирован: 22.03.2020

b707, спасибо, буду изучать.

gumeldiman
Offline
Зарегистрирован: 05.02.2020

Итак, есть и мне что рассказать. Протестировал свой разъем ОБД, на первом пине у меня появляется напряжение при включении зажигания, посему переделал схему на такую:

Ну и наконец-то дождался всех комплектующих, собрал:

Загрузил код из 26 поста и пошел в гараж.

 

Либо я где-то накосячил, либо что-то еще, но похоже что связь с шиной установить не получается...

Монитор порта выглядит так:

И спустя некоторое время светодиод начинает перемигивать тремя цветами по очереди...

Что можно сделать, как проверить что я ничего не спалил (ну или спалил)?

Скажу честно, когда собирал перепутал два провода. С платы ардуино D6 соединил с VCC модуля MCP2515_CAN. Ну и когда тестировал RGB светодиод подавал туда напряжение...  (хотя туда так и так надо подавать напряжение)

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Нет обмена МК с MCP.

Sergey_K
Offline
Зарегистрирован: 22.03.2020


В итоге у меня родился следующий код

 

#include <mcp_can.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET -1
#define TEMP_ID          0x1D0 // ID где лежит температура
#define Light_On        0x21A // ID где включение света
#define CAN0_INT         2       // подключить пинINT MCP2515 to pin 2 arduino

Adafruit_SSD1306 display(OLED_RESET);
MCP_CAN CAN0(10);     // Set CS to pin 10

int Dim = 0; //переменная затемнения в функции display.dim()
int CoolTemp = 0;        // температура ДВС
int OilTemp = 0;         // температура масла двигателя
bool CANFail = 0;        // флаг ошибки чтения из CAN
uint32_t curmillis = 0;  // снимок системного времени
uint32_t prevcheck = 0;  // таймер контроля CAN


//------------------------------чтение из CAN
void CANread()
{
  if (!digitalRead(CAN0_INT))                    // если пришло сообщение из CAN
  {
    uint32_t rxId = 0;  byte len = 0; byte rxBuf[8] = {0};
    CAN0.readMsgBuf(&rxId, &len, rxBuf);
    if (rxId == Light_On) //если получили сообщение со светом
    {
      if (rxBuf[0] > 2 && rxBuf[0] < 66) {
        Dim = 1;
      }
      else {
        Dim = 0  ;
      }
    }
    if (rxId == TEMP_ID) //если получили сообщение с температурой
    {
      CoolTemp = rxBuf[0] - 48;                       // расчёт t охл жидкости
      OilTemp = rxBuf[1] - 48;                        // расчет t масла двигателя
      Serial.print (F("COOLTemp = ")); Serial.println (CoolTemp); // печать t в отладку
      Serial.print (F("Oil-Temp = ")); Serial.println (OilTemp); // печать t в отладку
      Serial.print (F("Flag of dim ")); Serial.println (Dim); // печать Dim в отладку
      display.clearDisplay();
      display.dim(Dim); // 1 - тускло 0 - ярко
      display.setCursor(0, 0);
      display.print("COOL T "); display.println(CoolTemp);
      display.print("OIL  T "); display.println(OilTemp);
      display.display();
      CANFail = 0;            // контроль CAN переводим в норму
      prevcheck = curmillis;  // и сбрасываем таймер контроля CAN
    }
  }
}

//------------------------------контроль CAN
void CANcheck()
{
  if (curmillis - prevcheck > 5000) // через 5 сек
  {
    CANFail = 1; //переводим в аварию (если не поступают сообщения t из CAN)
    prevcheck = curmillis;
  }
  if (CANFail)  // предупреждение, что из CAN температура не читается
  {
    Serial.println("Error");
    display.clearDisplay();
    display.setCursor(0, 0);
    display.println("CONNECTION");
    display.println("   LOST   ");
    display.display();

  }
}



//------------------------------ SETUP
void setup()
{
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("CONNECTING");
  display.println("  ......  ");
  display.display();

  pinMode(CAN0_INT, INPUT);            // Configuring pin for /INT input (D2 arduino)
  Serial.begin(115200);
  if (CAN0.begin(MCP_STDEXT, CAN_100KBPS, MCP_8MHZ) == CAN_OK)
    Serial.println("MCP2515 Initialized Successfully!");
  else Serial.println("Error Initializing MCP2515...");

  CAN0.init_Mask(0, 0, 0x0FFF0000);
  CAN0.init_Filt(0, 0, 0x01D00000); // аппаратный фильтр чтобы получать только нужные нам сообщения
  CAN0.init_Filt(1, 0, 0x021A0000);
  CAN0.init_Mask(1, 0, 0x0FFF0000);
  CAN0.init_Filt(2, 0, 0x021A0000); // аппаратный фильтр чтобы получать только нужные нам сообщения
  CAN0.init_Filt(3, 0, 0x021A0000);
  CAN0.init_Filt(4, 0, 0x021A0000);
  CAN0.init_Filt(5, 0, 0x021A0000);

  CAN0.setMode(MCP_NORMAL);

}



//------------------------------ LOOP
void loop()
{
  curmillis = millis();
  CANread();
  CANcheck()

 

Убрал индикацию на светодиодах, добавил индикацию температуры масла двигателя. Использовал дисплей 128х32. Спасибо b707 за разъяснения по фильтрам! Скорость CAN 100кбит потому что в итоге подключился к приборке. Странные фильтры обусловлены особенностью обмена, указывающего на включение головного света. Кому по БМВ интересно, опишу отдельно.

Sergey_K
Offline
Зарегистрирован: 22.03.2020

 gumeldiman выложите свой код

Кстати, связка нанопро+мср2515 не в состоянии адекватно отлавливать единичные пакеты из обмена ни по моторной шине (PT-CAN, 500кбит), ни по шине К-САN (100кбит).

-NMi-
Offline
Зарегистрирован: 20.08.2018

Sergey_K пишет:

не в состоянии адекватно отлавливать единичные пакеты из обмена ни по моторной шине (PT-CAN, 500кбит), ни по шине К-САN (100кбит).

100+ кбит должно сдюжить на дурдуине. Смотря как парсить. А 500+ "синяя таблЭтка" фпомощь.

gumeldiman
Offline
Зарегистрирован: 05.02.2020

Sergey_K пишет:

 gumeldiman выложите свой код

...

Да я пока ничего не выдумывал, использую код из 26 поста.

... 

Блин, нашел у себя косяк, опять перепутал провода... Перепаял, теперь монитор порта выдает следущее:

 

Сильно смущет "Error Initializing MCP2515...", получается что не работает CAN0.begin(MCP_STD, CAN_500KBPS, MCP_8MHZ) == CAN_OK)

gumeldiman
Offline
Зарегистрирован: 05.02.2020

пробовал (CAN0.begin(MCP_EXT, CAN_100KBPS, MCP_8MHZ) == CAN_OK), результат аналогичный..

проверил еще раз все провода, подключено по схеме.

Возник вопрос, - для чего нужны эти контакты?:

Как вообще понять что плата MCP работает? Может заказать еще одну?

-NMi-
Offline
Зарегистрирован: 20.08.2018

По спецификации CAN на "концах" линиЙ должны стоять "терминаторы" - резисторы по ~120 Ом. Вот этой перемычкой ты включаешь терминатор. Если модуль "стоит" в середине линии CAN - перемычку ставить не нужно.  Общее сопротивление линии CAN = ~60 Ом.

b707
Offline
Зарегистрирован: 26.05.2017

gumeldiman пишет:

Как вообще понять что плата MCP работает? Может заказать еще одну?

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

Вы ветку читали? - всем новичкам НАСТОЯТЕЛЬНО рекомендуется для начала попытаться установить связь между двумя КАН-модулями. А только когда схема на столе заработает - пробовать на машине.

gumeldiman
Offline
Зарегистрирован: 05.02.2020

b707 пишет:

gumeldiman пишет:

Как вообще понять что плата MCP работает? Может заказать еще одну?

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

Вы ветку читали? - всем новичкам НАСТОЯТЕЛЬНО рекомендуется для начала попытаться установить связь между двумя КАН-модулями. А только когда схема на столе заработает - пробовать на машине.

Ок хорошо, я понял, спасибо.

Строка в коде CAN0.begin(MCP_STD, CAN_500KBPS, MCP_8MHZ) == CAN_OK) что проверяет?

Ну или, по другому сформулирую вопрос, - будет ли разница в результате её работы при подключенной или отключенной кан-шине?

b707
Offline
Зарегистрирован: 26.05.2017

gumeldiman пишет:

Строка в коде CAN0.begin(MCP_STD, CAN_500KBPS, MCP_8MHZ) == CAN_OK) что проверяет?

Ну или, по другому сформулирую вопрос, - будет ли разница в результате её работы при подключенной или отключенной кан-шине?

строка проверяет инициализацию (ответ ) КАН-модуля. Если не отвечает, как у вас - либо соединение неверное, либо плата дохлая.

Насколько я знаю, для инициализации подключение КАН-шины не обязательно.

gumeldiman
Offline
Зарегистрирован: 05.02.2020

Спсаибо, в очередной раз убеждаюсь, что пайка мне даётся с трудом (вот такой я руко*оп). Закажу еще ))

b707
Offline
Зарегистрирован: 26.05.2017

gumeldiman пишет:

Спсаибо, в очередной раз убеждаюсь, что пайка мне даётся с трудом (вот такой я руко*оп). Закажу еще ))

Заказывайте сразу пару или тройку.

и еще - судя по фото, вы провода прямо в ардуину и в модуль впаиваете... А что, штырьковых контактов разве в комплекте не было? Для моделирования они удобнее

gumeldiman
Offline
Зарегистрирован: 05.02.2020

b707 пишет:

...и еще - судя по фото, вы провода прямо в ардуину и в модуль впаиваете... А что, штырьковых контактов разве в комплекте не было? ...

Один очень умный человек посоветовал делать на пайке:

b707 пишет:

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

На самом деле, все хорошо! Заодно научусь паять ))

b707
Offline
Зарегистрирован: 26.05.2017

подловили :)

Но для моделирования штырьки и правда удобнее.