Honda CR-V (5G) (2.4 Prestige)

Лунапарк с CR-V, Arduino и CAN ч1: Arduino и CANHacker

Я їжджу на Honda CR-V (5G)
Київ, Україна

После очередной неудачи со шторками, решил попробовать сделать их с помощью ESP или Arduino.

Чтобы можно было что-то накодить, нужно минимум три параметра:
— температура двигателя (она же температура охлажающей жидкости)
— температура наружного воздуха
— скорость движения
Самое логичное, взять эти параметры из CAN-шины. Может что-то попутно найдется полезного, что поможет улучшить будущий алгоритм (нагрузка на двигатель, передача D или S и тп)…

В машинах, обычно, минимум две CAN-сети с разными скоростями:
Быстрая/High-Speed-CAN — CAN-шина с быстрой скоростью (в нашей машине 500 кб/с). Отвечает за обмен данными между "жизненноважными" блоками и датчиками: двигатель, коробка, ABS, ESP, руль и тп.
Медленная/Low-Speed-CAN/Комфорт — CAN-шина с более медленной скоростью (у нас 33.333 кб/с), для тех блоков, скорость обмена информации и/или потеря информации не есть критичной. Например, стеклоподьемники, климат, кнопки на руле, концевики и тп.

Решил начать с быстрой шины, т.к. 99% она есть рядом с ЭБУ и ее легче сниффать, т.к. она есть в диагностическом порте.

Полтора года тому прикупил себе такой девайс от Сhipsoft (wertex76), с помощью которого подключался для диагностики диллерским софтом и как канхакером. Больше всего пользовался именно для разбора CAN-шины. Сейчас стоит дороже, но как по мне, она того стоит. Штука достаточно прикольная, хоть и не совсем для этих задач. Автору респект.

Небольшую часть информации получилось расшифровать, но с температурами засада, определить не удалось. Решил пойти другим путем и сравнивать данные из CAN-шины с данными из дилерского софта i-HDS. Некоторые находки подтвердились, некоторые стали более понятными, часть оказалась полностью неправильными.
i-HDS возвращает много разных показаний температур: температура охлаждающей, всасываемого воздуха, масла в коробке и прочие, часть которых мне не понятна. :) Температуры внешнего воздуха, к сожалению, нет.

Но часть данных плавала и сопоставить их с данными в CAN-шине не представлялось возможным. Адаптер нужно перепрошивать с режима канхакера в J2534 и обратно… i-HDS знатно медленно работает… За это время данные успевают измениться и приходится сравнивать теплое с мягким.

Решил пойти другим путем — подключить одновременно и адаптер, и arduino со скетчем для CANHacker-а. Хотел параллельно получать данные из CAN-шины и смотреть на данные в i-HDS для поиска совпадений.

Для реализации идеи взял стандартный набор:
— Arduino NANO
— модуль MCP2515 c TJA1050
— "витая пара"
— две иголки
— скетч

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

Подключение модуля к ардуино "стандартное". Скетч прикладываю ниже. В целом это оригинальный пример из либы arduino-canhacker, но добавлена строка с указанием частоты кварца на mcp2515 (у меня 8 mhz).

#### Start ####
/**
* github.com/autowp/arduino-canhacker
* Commit: 7bcbf0a751f198edbee1844c7b6020c252c8c08d
*
* github.com/autowp/arduino-mcp2515
* Commit: cdc0141ee734f47f54628b1ac8acaafa9120511b
*
*/
#include <can.h>
#include <mcp2515.h>

#include <canhacker.h>
#include <canhackerlinereader.h>
#include <lib.h>

#include <spi.h>
#include <softwareserial.h>

const int SPI_CS_PIN = 10;
const int INT_PIN = 2;

const int SS_RX_PIN = 3;
const int SS_TX_PIN = 4;

CanHackerLineReader *lineReader = NULL;
CanHacker *canHacker = NULL;

SoftwareSerial softwareSerial(SS_RX_PIN, SS_TX_PIN);

void setup() {
Serial.begin(115200);
while (!Serial);
SPI.begin();
softwareSerial.begin(115200);

Stream *interfaceStream = &Serial;
Stream *debugStream = &softwareSerial;

canHacker = new CanHacker(interfaceStream, debugStream, SPI_CS_PIN);
canHacker->setClock(MCP_8MHZ); // MCP_8MHZ, MCP_16MHZ or MCP_20MHZ
lineReader = new CanHackerLineReader(canHacker);

pinMode(INT_PIN, INPUT);
}

void loop() {
CanHacker::ERROR error;

if (digitalRead(INT_PIN) == LOW) {
error = canHacker->processInterrupt();
handleError(error);
}

error = lineReader->process();
handleError(error);
}

void handleError(const CanHacker::ERROR error) {

switch (error) {
case CanHacker::ERROR_OK:
case CanHacker::ERROR_UNKNOWN_COMMAND:
case CanHacker::ERROR_NOT_CONNECTED:
case CanHacker::ERROR_MCP2515_ERRIF:
case CanHacker::ERROR_INVALID_COMMAND:
return;

default:
break;
}

softwareSerial.print("Failure (code ");
softwareSerial.print((int)error);
softwareSerial.println(")");

digitalWrite(SPI_CS_PIN, HIGH);
pinMode(LED_BUILTIN, OUTPUT);

while (1) {
int c = (int)error;
for (int i=0; i<c; i++) {
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
}

delay(2000);
} ;
}
#### End ####

Кроме этого был собран второй, такой же по железу, набор, но со скетчем, который расшифровывает известные данные из CAN-шины в читабельный вид и возвращает обратно в монитор порта (serial).

Все это дело тестировалось на столе с помощью того же адаптера. С его помощью через CANHacker отправлял пакеты, а arduino должна была их получать и что-то с ними делать. Для нее использовал другую либу, т.к. мне нужен функционал попроще. Одна ардуина должна была выводить данные в другое окно CANHacker-а, а вторая ардуина — возвращать готовые данные (температуры, статусы, скорость и тп) в читабельном виде.

На столе все работало отлично, поэтому довольный пошел к машине…

И что на этот раз меня ждало?)) Правильно, снова облом! Ардуино тупо не может обработать такой обьем информации. Слишком большая скорость и большой обьем данных. Несмотря на разные либы и задачи, обе ардуины уходят в себя или перезагружаются. Пробовал Arduino UNO, но такая же ситуация.
Если кто-то сталкивался/решал эту проблему — буду благодарен за инфу. Сам копать дальше не планирую пока, т.к. в быстрой шине нет всех нужных данных.

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

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

Кстати, пару недель тому поменял еще лампочки в багажнике) Стало намного светлее.

P.S. Жаль, что нет тега для вставки кода в пост… :(

Содержание:
Лунапарк с CR-V, Arduino и CAN ч1: Arduino и CANHacker
Лунапарк с CR-V, Arduino и CAN ч2: Быстрая CAN шина

Пробіг 25350 км.
Опубліковано: 13 квітня 2020р. 05:04
0 0 0

Коментарі

Щоб залишати коментарі, потрібно авторизуватись.