Много раз слышал, что без резистора людям не удавалось нормально читать кан-шину этим шилдом. Резистор ставится на конце линии, чтобы не было отраженной волны от этого конца, которая исказит общий сигнал.
Летом в жару в подкапотном пространстве царит ад, когда заканчиваешь поездку приходится думать как остудить двигатель, прежде чем заглушить его. Глушить при температуре около 100 гр. я как-то не хочу, из-за остановки циркуляции антифриза он наверняка разогреется еще выше. Сейчас с этим справляется кондиционер, так как он принудительно включает вентилятор охлаждения :) Ну вот я озадачился сделать что-то на ардуине, чисто ради любопытства пока.
Поразбирался, получилось прочитать первый фрейм диагностических данных по команде 0x7E0 03 22 00 01, а вот следующие по команде 30 00 00 не получается пока читать(нули почему-то в буфере). Не понимаю как работает буфер у MCP2515 при настройке фильтров.. Фильтры настроил только на 0x7E8, то есть как я понимаю в буфер будут ложится только фреймы от 0x7E8. Нигде не нашел внятного описания этого момента.
Попробовал на гранте такой код и он не заработал, то есть не выводит температуру и напряжение, хотя снифер нормально работает:
ардуино
//#include <mcp_can.h> // подключение библиотеки для работы с контроллером MCP2515 #include <SPI.h> // подключение библиотеки протокола последоваетельного периферийного интерфейса #include <mcp2515_can.h>
mcp2515_can CAN1(10); // устанавливаем CS для приёма с 1 шины на пин 10
unsigned long timeOut; unsigned char len = 0; // длина CAN-сообщения unsigned char rxBuf[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // CAN-сообщение (Data) long unsigned int rxId; // id CAN-сообщения // int parameter; - запрашиваемый параметр // допустимые значения paramName: // 0 - температура двигателя // 1 - напряжение бортовой сети // 2 - обороты двигателя OBD2 // 3 - скорость OBD2 long int updPeriod[] = {5000, 2000, 500, 1000}; // период обновления данных long int updTime[sizeof(updPeriod)]; // время последнего обновления
//========================================================================== // Функция общения с ЭБУ ДВС по протоколу Renault //-------------------------------------------------------------------------- float enginePIDs(int parameter) { unsigned char PID[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; float retValue = 9999; // возвращаемое значение (если 9999 - ошибка) long unsigned int moduleIdRequest = 0x7E0; // id модуля в запросе данных long unsigned int moduleIdAnswer = 0x7E8; // id модуля в ответе PID[0] = 0x03; // количество байт в запросе PID[1] = 0x22; // префикс PID для запроса PID[2] = 0x00; PID[3] = 0x01;
// посылаем запрос ЭБУ CAN1.sendMsgBuf(moduleIdRequest, 0, 8, PID); PID[1] = 0x62; // префикс PID для ответа rxId = 0x000; // обнуляем идентификатор timeOut = millis() + 500; // крайнее время ожидания ответа // ждём нужного ответа while ((rxId != moduleIdAnswer || rxBuf[1] != PID[1] || rxBuf[2] != PID[2] || rxBuf[3] != PID[3]) && millis() < timeOut) { if (CAN_MSGAVAIL == CAN1.checkReceive()) { CAN1.readMsgBuf(&len, rxBuf); // чтение данных: len = data length, buf = data byte(s) rxId = CAN1.getCanId(); // получаем ID сообщения //testSniffer(rxId,rxBuf); } } if (rxId == moduleIdAnswer && rxBuf[1] == PID[1] && rxBuf[2] == PID[2] && rxBuf[3] == PID[3]) { // вычисляем параметр, A = rxBuf[4], B = rxBuf[5], C = rxBuf[6], D = rxBuf[7] switch (parameter) { case 0: // температура двигателя retValue = (256 * rxBuf[6] + rxBuf[7]) * 0.75 - 48; break; case 1: // напряжение бортовой сети retValue = 0.1 * rxBuf[5] ; break; } } return retValue; }
Поменял на плате полетника stm32 на gd32, в дфу режим заходит, но нужны уже свои драйвера. Скачал, поставил, прошил их фирменной утилитой прошивку, которой шил стм-ку и.. ничего, не запускается плата, com-порт не появляется.
Может быть можно подменить драйвера для dfu usb, чтобы шить из под родного приложения, не знаю дальше куда копать..)
А в dfu режим gd32 также входит? Прошить можно также без проблем через usb? Хочу попробовать использовать gd32 вместо stm32f405rtg6 в полетном контроллере для квадрокоптера(не военная тема), но не совсем понял ваши замечания про задержки на уартах, как они влияют на работу с девайсами, такими как gps модуль или приемник elrs.
Здравствуйте, у меня Гранта, блок ЭБУ М74CAN, хочу попробовать сделать свой простенький бортовой компьютер с каким-нибудь дисплеем. Для начала попробовать сделать вывод основных параметров, коды ошибок потом может добавить функционал для изменения температуры включения вентилятора и чего нибудь ещё.
Ваша статья очень кстати, может вы уже делали что-то в этом направлении на Ардуино? Я пока что на этапе ожидания шилдов с Али и пытаюсь ковырять инфу по адресации.
А заданную область съёмки она умеет отслеживать на движение или только весь кадр?
trashreg хорошая, помимо чистки удаляет ещё и триалы некоторых прог
А разве он будет брать заряд, если там будет просто вода?
Если бы он СиБи ловил хорошо, то в машину можно было бы взять, для прикола
Много раз слышал, что без резистора людям не удавалось нормально читать кан-шину этим шилдом.
Резистор ставится на конце линии, чтобы не было отраженной волны от этого конца, которая исказит общий сигнал.
А с чего вы взяли, что терминальный резистор на 120 Ом не нужен? Он там как раз обязателен к подключению.
Так ему надо фильтра настроить и всё работает как надо.
А вообще, есть более продвинутая статья на хабре https://habr.com/ru/articles/479672/?code=aaab0633102db86c17457d174809605b&state=FJeZsJfKzgTzWtBMse706XEo&hl=ru
Я использовал сниффер оттуда без проблем и ничего не переполнилось.
Ардуино нано или микро про прекрасно работают с каншиной с модулем mcp2515, просто надо фильтра настраивать в модуле, чтобы не собирал все подряд.
Летом в жару в подкапотном пространстве царит ад, когда заканчиваешь поездку приходится думать как остудить двигатель, прежде чем заглушить его. Глушить при температуре около 100 гр. я как-то не хочу, из-за остановки циркуляции антифриза он наверняка разогреется еще выше. Сейчас с этим справляется кондиционер, так как он принудительно включает вентилятор охлаждения :) Ну вот я озадачился сделать что-то на ардуине, чисто ради любопытства пока.
Поразбирался, получилось прочитать первый фрейм диагностических данных по команде 0x7E0 03 22 00 01, а вот следующие по команде 30 00 00 не получается пока читать(нули почему-то в буфере). Не понимаю как работает буфер у MCP2515 при настройке фильтров.. Фильтры настроил только на 0x7E8, то есть как я понимаю в буфер будут ложится только фреймы от 0x7E8. Нигде не нашел внятного описания этого момента.
Да, на планшете это почти невозможно :)
Попробовал на гранте такой код и он не заработал, то есть не выводит температуру и напряжение, хотя снифер нормально работает:
ардуино
//#include <mcp_can.h> // подключение библиотеки для работы с контроллером MCP2515
#include <SPI.h> // подключение библиотеки протокола последоваетельного периферийного интерфейса
#include <mcp2515_can.h>
mcp2515_can CAN1(10); // устанавливаем CS для приёма с 1 шины на пин 10
unsigned long timeOut;
unsigned char len = 0; // длина CAN-сообщения
unsigned char rxBuf[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
// CAN-сообщение (Data)
long unsigned int rxId; // id CAN-сообщения
// int parameter; - запрашиваемый параметр
// допустимые значения paramName:
// 0 - температура двигателя
// 1 - напряжение бортовой сети
// 2 - обороты двигателя OBD2
// 3 - скорость OBD2
long int updPeriod[] = {5000, 2000, 500, 1000}; // период обновления данных
long int updTime[sizeof(updPeriod)]; // время последнего обновления
//==========================================================================
// SETUP
//--------------------------------------------------------------------------
void setup() {
Serial.begin(115200);
while (CAN_OK != CAN1.begin(CAN_500KBPS, MCP_16MHz)); // init can bus : baudrate = 500k / 8MHz
Serial.println("CAN init ok.");
//RXB0 - первый приёмный буфер
CAN1.init_Mask(0, 0, 0x7F0); // маска
CAN1.init_Filt(0, 0, 0x7E0); // фильтры
CAN1.init_Filt(1, 0, 0x7E0);
//RXB1 - второй приёмный буфер
CAN1.init_Mask(1, 0, 0x7F0); // маска
CAN1.init_Filt(2, 0, 0x7E0); // фильтры
CAN1.init_Filt(3, 0, 0x7E0);
CAN1.init_Filt(4, 0, 0x7E0);
CAN1.init_Filt(5, 0, 0x7E0);
delay(100);
Serial.println("Masks and filters set.");
}
//==========================================================================
// LOOP
//--------------------------------------------------------------------------
void loop() {
if (millis() > (updTime[0] + updPeriod[0])) {
Serial.print("0 - Температура ДВС: ");
updTime[0] = millis();
Serial.print(enginePIDs(0), 1); // 1 знак после запятой
Serial.print(" С");
Serial.print(" / update_time: ");
Serial.print(millis()-updTime[0]);
Serial.println("");
}
if (millis() > (updTime[1] + updPeriod[1])) {
Serial.print("1 - Напряжение: ");
updTime[1] = millis();
Serial.print(enginePIDs(1), 2); // 2 знака после запятой
Serial.print(" V");
Serial.print(" / update_time: ");
Serial.print(millis()-updTime[1]);
Serial.println("");
}
}
//==========================================================================
// Функция общения с ЭБУ ДВС по протоколу Renault
//--------------------------------------------------------------------------
float enginePIDs(int parameter) {
unsigned char PID[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
float retValue = 9999; // возвращаемое значение (если 9999 - ошибка)
long unsigned int moduleIdRequest = 0x7E0; // id модуля в запросе данных
long unsigned int moduleIdAnswer = 0x7E8; // id модуля в ответе
PID[0] = 0x03; // количество байт в запросе
PID[1] = 0x22; // префикс PID для запроса
PID[2] = 0x00; PID[3] = 0x01;
// посылаем запрос ЭБУ
CAN1.sendMsgBuf(moduleIdRequest, 0, 8, PID);
PID[1] = 0x62; // префикс PID для ответа
rxId = 0x000; // обнуляем идентификатор
timeOut = millis() + 500; // крайнее время ожидания ответа
// ждём нужного ответа
while ((rxId != moduleIdAnswer || rxBuf[1] != PID[1] || rxBuf[2] != PID[2] || rxBuf[3] != PID[3]) && millis() < timeOut) {
if (CAN_MSGAVAIL == CAN1.checkReceive()) {
CAN1.readMsgBuf(&len, rxBuf); // чтение данных: len = data length, buf = data byte(s)
rxId = CAN1.getCanId(); // получаем ID сообщения
//testSniffer(rxId,rxBuf);
}
}
if (rxId == moduleIdAnswer && rxBuf[1] == PID[1] && rxBuf[2] == PID[2] && rxBuf[3] == PID[3]) {
// вычисляем параметр, A = rxBuf[4], B = rxBuf[5], C = rxBuf[6], D = rxBuf[7]
switch (parameter) {
case 0:
// температура двигателя
retValue = (256 * rxBuf[6] + rxBuf[7]) * 0.75 - 48;
break;
case 1:
// напряжение бортовой сети
retValue = 0.1 * rxBuf[5] ;
break;
}
}
return retValue;
}
}
Что-то не пойму как в программе развернуть нижнюю область где данные для тестовой отправки пакетов?
Поменял на плате полетника stm32 на gd32, в дфу режим заходит, но нужны уже свои драйвера. Скачал, поставил, прошил их фирменной утилитой прошивку, которой шил стм-ку и.. ничего, не запускается плата, com-порт не появляется.
Может быть можно подменить драйвера для dfu usb, чтобы шить из под родного приложения, не знаю дальше куда копать..)
А в dfu режим gd32 также входит? Прошить можно также без проблем через usb? Хочу попробовать использовать gd32 вместо stm32f405rtg6 в полетном контроллере для квадрокоптера(не военная тема), но не совсем понял ваши замечания про задержки на уартах, как они влияют на работу с девайсами, такими как gps модуль или приемник elrs.
А можете поделиться исходники для управления вентилятором? А то шилды пришли, теперь интересно хотя бы увидеть как выглядит код для чтения и записи.
Здравствуйте, у меня Гранта, блок ЭБУ М74CAN, хочу попробовать сделать свой простенький бортовой компьютер с каким-нибудь дисплеем. Для начала попробовать сделать вывод основных параметров, коды ошибок потом может добавить функционал для изменения температуры включения вентилятора и чего нибудь ещё.
Ваша статья очень кстати, может вы уже делали что-то в этом направлении на Ардуино? Я пока что на этапе ожидания шилдов с Али и пытаюсь ковырять инфу по адресации.
Плюс таможенный сбор, чисто таможенникам на пахавать
я вывожу на кредитку, суммы не большие, просто пополняю расход. смысла блокировать кредитку банку меньше.
Переводи их на биржу, потом п2п на карту