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

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

Привет. Планирую сделать довольно простую штуку. Никак не могу определится с железом. Прошу вашего совета.

Хочу собрать устройство для индикации температуры автомобильного двигателя.

Индикацию планирую выводить посредством RGB-светодиода. Допустим: синий - холодно, зеленый - можно ехать, желтый - температура двигателя в норме, красный - температура достигла предельных значений (перегрев). При желании можно добавить и других цветов, миганий и т.п. (все будет зависеть от настроения). Главная фишка такой индикации - это простота и возможность легкой интеграции в интерьер автомобиля.

Данные планируется читать с CAN шины автомобиля через диагностический разъем OBD-II

Для начала хотелось бы получить совет железу. Хотелось бы получить компактное устройство. Какая платформа подойдет для моих целей? В идеале хорошо было бы сделать устройство на базе Arduino Nano. Какой при этом использовать shield для общения с CAN-шиной автомобиля?

Заранее благодарен.

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

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

Что касается оборудования - вам понадобится любая ардуина и модуль mcp2525 CAN.

 

 

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

И, самое главное - адреса блоков и номера регистров. где хранится температура двигателя на конкретно вашей модели авто - известны? Без них у вас вряд ли что получится

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

У меня автомобиль, где показывается только перегрев. Лампочка ни разу не загоралась )) Хотелось бы получать более детальную информацию, поскольку не горящая лампочка не устраивает. Есть ребята, которые делают цифровую индикацию температуры, но я бы хотел минимализма + самому интересно разобраться, библиотеки для работы с этим вроде протоколом имеются. 

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

Мобила + обд-2 блюпуп адаптер не подойдут?

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

Вариант с мобилой и адаптером работает, но он неудобный...

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

Дурдуина+гвозди+палки+немного_клея=наше_всё!    Let It be - Forever!

nik182
Offline
Зарегистрирован: 04.05.2015

У меня показыватель был. Это не спасло на трассе на семидесятом километре от закипания и клина после отказа термостата. Хорошо сцепление успел выжать. Потом долго ругал себя что пищалку не поставил, как хотел.  

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

b707 пишет:
...

И, самое главное - адреса блоков и номера регистров. где хранится температура двигателя на конкретно вашей модели авто - известны? Без них у вас вряд ли что получится

Вот это вопрос. Предполагал, что температура одинаково определятся для разных авто...

-NMi- пишет:

Дурдуина+гвозди+палки+немного_клея=наше_всё!    Let It be - Forever!

Ахаха, настрой очень правильный ))

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

gumeldiman пишет:
b707 пишет:
...

И, самое главное - адреса блоков и номера регистров. где хранится температура двигателя на конкретно вашей модели авто - известны? Без них у вас вряд ли что получится

Вот это вопрос. Предполагал, что температура одинаково определятся для разных авто...

И про то, что на Bentley можно поставить докатку от Жыгуля - не предполагали? ;)

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

gumeldiman пишет:

Предполагал, что температура одинаково определятся для разных авто...

ну может и так, так как температура ОЖ входит в базовую спецификацию CAN. А может и нет

Тут тебе к MaksVV надо - он на Кане собаку схел.

 

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

протокол OBD, он одинаковый для всех авто. Дак вот PID температуры двс там обязательно есть. Надо гуглить , какие запросы слать в кан чтобы по OBD температуру выудить. Я думаю этой инфы полно в интернете

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

MaksVV пишет:

протокол OBD, он одинаковый для всех авто. Дак вот PID температуры двс там обязательно есть. Надо гуглить , какие запросы слать в кан чтобы по OBD температуру выудить. Я думаю этой инфы полно в интернете

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

информацию взял отсюда

а вот тут, человек пишет такое: температура двигателя: адрес 0x288, [байт 1] *0,75-48

пока не очень понимаю, запишу тут эту информацию, может вы чего еще подскажете ))

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

сейчас попробовал снять лог диагностики форд фокус2 по протоколу OBD.  В принципе совпадает с вашей таблицей. PID температуры ДВС действительно 01 05(hex). См. рис. Там в CAN диагностика шлёт запрос с ID 7DF   02 01 05 00 00 00 00 00 . Где 02 это скорее всего количество байт в запросе. 01 05 это сам запрос. 

ЭБУ отвечает 7E7   03 41 05 3B 00 00 00 00 .  Где 03 - кол-во байт в ответе , 41 05 это значит ответ на 01 05. А 3B это в DEC будет равно 59 и нужно отнять 40, получаем 19 градусов, Всё сходится , см. рис. 19 градусов и есть. 

Думаю так должно работать и на других машинах с CAN

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

запрос с ID 7DF это широковещательный запрос. Ответ от блока обычно приходит +8 к ID запроса. Т.е. 7DF + 8 = 7E7 , что мы и получаем. Поэтому вот как получается по адресам на форде: 

 

Блоки       ID  адреса блоков (запросы)    ID ответа от блоков

PCM                 7E0                                         7E8

TCM                 7E1                                         7E9

ABS                 760                                         768

Приборн доска 720                                         728

Усил руля        730                                         738  

     

raven78
Offline
Зарегистрирован: 03.11.2019

Не нужно слать никаких запросов в can шину это чревато не умелыми руками. Данные по температуре итак проскакивают в шине очень часто, главное их выцепить.

gumeldiman]</p> <p>[quote=MaksVV пишет:

а вот тут, человек пишет такое: температура двигателя: адрес 0x288, [байт 1] *0,75-48

пока не очень понимаю, запишу тут эту информацию, может вы чего еще подскажете ))

Вот как раз по адресу 0x288, берём первый байт умножаем-вычитаем-получаем нашу заветную температуру

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

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

вот новичкам пример кода (в работе не проверял). 

#include <mcp_can.h>
#include <SPI.h>

MCP_CAN CAN0(10);     // Set CS to pin 10

#define SID              01      // SID запроса 
#define PIDTEMP          05      // PID запроса температуры ДВС
#define ECUADDRESS       0x7E0   // адресс блока PCM 
#define INTERVALTEMPPID  3000    // периодичность запроса PID, мс
#define RED              6       // пины LED
#define GREEN            7       // пины LED
#define BLUE             8       // пины LED
#define CAN0_INT 2               // подключить пинINT MCP2515 to pin 2 arduino 

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

enum LEDscontrol {REDON, GREENON, BLUEON};


//------------------------------отправка запросов в CAN 
void RequestTempPID()
{
  static uint32_t prevsendPID = 0;
  if (curmillis - prevsendPID > INTERVALTEMPPID) 
    {
      byte data[] = {2, SID, PIDTEMP, 0,0,0,0,0};
      byte sndStat = CAN0.sendMsgBuf(ECUADDRESS, 0, 8, data);
      prevsendPID = curmillis;
    }
  
}

//------------------------------чтение из 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 == 0x7E8 && rxBuf[1]==0x41 && rxBuf[2] == 0x05) //если получили ответ на запрос температуры
         {
          CoolTemp = rxBuf[3]-40;                                     // расчёт t 
          Serial.print (F("COOLTemp = ")); Serial.println (CoolTemp); // печать t в отладку
          if (CoolTemp <38)                   LED (BLUEON);           // зажгем диоды     
          if (CoolTemp >=38 && CoolTemp <110) LED (GREENON);          // зажгем диоды     
          if (CoolTemp >=110)                 LED (REDON);            // зажгем диоды     
          CANFail = 0;            // контроль CAN переводим в норму
          prevcheck = curmillis;  // и сбрасываем таймер контроля CAN       
         }
  }
}

//------------------------------контроль CAN 
void CANcheck()
{
 if (curmillis - prevcheck > 15000) // через 15 сек 
   {
    CANFail = 1; // LED переводим в аварию (если не поступают сообщения t из CAN)
    prevcheck = curmillis;
   }
}

//------------------------------управляем диодами
void LED(byte led)
{
       if (led == REDON)   {digitalWrite (BLUE, 0); digitalWrite (GREEN, 0); digitalWrite (RED, 1);}
  else if (led == GREENON) {digitalWrite (BLUE, 0); digitalWrite (GREEN, 1); digitalWrite (RED, 0);}
  else if (led == BLUEON)  {digitalWrite (BLUE, 1); digitalWrite (GREEN, 0); digitalWrite (RED, 0);}
}

//------------------------------предупреждение (миганием диодов), что из CAN температура не читается 
void LEDErrorIND()
{
 static uint32_t preverrorled = 0;
 static byte i=0;
   if (curmillis - preverrorled > 500)
    {
      LED (i); 
      preverrorled = curmillis;
    }
 i++; if (i>2) i=0; 
}


//------------------------------ SETUP
void setup()
{
  Serial.begin(115200);
  if(CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) 
      Serial.println("MCP2515 Initialized Successfully!");
  else Serial.println("Error Initializing MCP2515...");
  CAN0.setMode(MCP_NORMAL); 

 pinMode (RED,   OUTPUT); digitalWrite (RED,   0);
 pinMode (GREEN, OUTPUT); digitalWrite (GREEN, 0); 
 pinMode (BLUE,  OUTPUT); digitalWrite (BLUE,  0);
 pinMode(CAN0_INT, INPUT);            // Configuring pin for /INT input (D2 arduino)
}



//------------------------------ LOOP
void loop()
{
 curmillis = millis();
 RequestTempPID();
 CANread();
 CANcheck();
 if (CANFail) LEDErrorIND();
}



 

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

raven78 пишет:
Не нужно слать никаких запросов в can шину это чревато не умелыми руками. Данные по температуре итак проскакивают в шине очень часто, главное их выцепить...

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

MaksVV пишет:
...вот новичкам пример кода (в работе не проверял)...

Спасибо за пример, визуально код очень понятный, и довольно красивая реализация (даже с таймером)!

А что будет, если вовсе не выполнять RequestTempPID? Как-то уж боязно что-то отправлять в шину в бесконечном цикле.. И вообще, интересно, как часто повторяется информация в шине? Быть может, в случае с температурой, эта информация поступает в шину лишь при изменении своего значения? И тогда будет достаточным вызвать RequestTempPID лишь один раз, а потом останется просто слушать шину? 

Как думаете?

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

Нет, если инфа по температуре в шине есть, она там будет периодически (раз в секунду или может чаще) а не по изменению. Чтоб выяснить где t нужен сниффер шины или хотя бы елм327. В моем коде в шину поступает запрос раз в 3 секунды. Если не выполнять request то ничего и неполучить. LED через 15 сек покажет аварийный режим. Прием настроен на сообщение именно по запросу. Если просто в кане есть температура , она с другим id будет.

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

Макс, а чего ты фильтры не заюзал? Тебе же всё равно только один ID ловить. Разгрузил бы сразу ардуину...

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

да я на коленке код по-быстрому написал, да лучше с фильтрами. И там ошибочка небольшая. функцию ошибки надо так 

void LEDErrorIND()
{
 static uint32_t preverrorled = 0;
  if (curmillis - preverrorled > 500)
    {
       static byte i=0;
       LED (i); 
       i++; if (i>2) i=0; 
       preverrorled = curmillis;
    }
}

 

raven78
Offline
Зарегистрирован: 03.11.2019

gumeldiman пишет:

 

И вообще, интересно, как часто повторяется информация в шине? Быть может, в случае с температурой, эта информация поступает в шину лишь при изменении своего значения?

Как думаете?

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

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

MaksVV пишет:

...да лучше с фильтрами. И там ошибочка небольшая. 

добавил аппаратный фильтр, ошибку исправил

#include <mcp_can.h>
#include <SPI.h>

MCP_CAN CAN0(10);     // Set CS to pin 10

#define SID              01      // SID запроса 
#define PIDTEMP          05      // PID запроса температуры ДВС
#define ECUADDRESS       0x7E0   // адресс блока PCM 
#define INTERVALTEMPPID  3000    // периодичность запроса PID, мс
#define RED              6       // пины LED
#define GREEN            7       // пины LED
#define BLUE             8       // пины LED
#define CAN0_INT         2       // подключить пинINT MCP2515 to pin 2 arduino 

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

enum LEDscontrol {REDON, GREENON, BLUEON};


//------------------------------отправка запросов в CAN 
void RequestTempPID()
{
  static uint32_t prevsendPID = 0;
  if (curmillis - prevsendPID > INTERVALTEMPPID) 
    {
      byte data[] = {2, SID, PIDTEMP, 0,0,0,0,0};
      byte sndStat = CAN0.sendMsgBuf(ECUADDRESS, 0, 8, data);
      prevsendPID = curmillis;
    }
  
}

//------------------------------чтение из 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 == ECUADDRESS+8 && rxBuf[1]==(SID|0x40) && rxBuf[2] == PIDTEMP) //если получили ответ на запрос температуры
         {
          CoolTemp = rxBuf[3]-40;                                     // расчёт t 
          Serial.print (F("COOLTemp = ")); Serial.println (CoolTemp); // печать t в отладку
          if (CoolTemp <38)                   LED (BLUEON);           // зажгем диоды     
          if (CoolTemp >=38 && CoolTemp <110) LED (GREENON);          // зажгем диоды     
          if (CoolTemp >=110)                 LED (REDON);            // зажгем диоды     
          CANFail = 0;            // контроль CAN переводим в норму
          prevcheck = curmillis;  // и сбрасываем таймер контроля CAN       
         }
  }
}

//------------------------------контроль CAN 
void CANcheck()
{
 if (curmillis - prevcheck > 15000) // через 15 сек 
   {
    CANFail = 1; // LED переводим в аварию (если не поступают сообщения t из CAN)
    prevcheck = curmillis;
   }
}

//------------------------------управляем диодами
void LED(byte led) 
{
  digitalWrite (RED,   (led == REDON));
  digitalWrite (GREEN, (led == GREENON));
  digitalWrite (BLUE,  (led == BLUEON));
}

//------------------------------предупреждение (миганием диодов), что из CAN температура не читается 
void LEDErrorIND()
{
 static uint32_t preverrorled = 0;
  if (curmillis - preverrorled > 500)
    {
       static byte i=0;
       LED (i); 
       i++; if (i>2) i=0; 
       preverrorled = curmillis;
    }
}


//------------------------------ SETUP
void setup()
{
  Serial.begin(115200);
  if(CAN0.begin(MCP_STD, CAN_500KBPS, MCP_8MHZ) == CAN_OK) 
       Serial.println("MCP2515 Initialized Successfully!");
  else Serial.println("Error Initializing MCP2515...");
 
 CAN0.init_Mask(0, 0, 0x07FF0000);
 CAN0.init_Filt(0, 0, (ECUADDRESS+8 & 0xFFFFFFFF)<<16); // аппаратный фильтр чтобы получать только нужные нам сообщения
 CAN0.init_Mask(1, 0, 0x07FF0000);
 CAN0.init_Filt(1, 0, (ECUADDRESS+8 & 0xFFFFFFFF)<<16); // аппаратный фильтр чтобы получать только нужные нам сообщения
 
 CAN0.setMode(MCP_NORMAL); 
 
 pinMode (RED,   OUTPUT); digitalWrite (RED,   0);
 pinMode (GREEN, OUTPUT); digitalWrite (GREEN, 0); 
 pinMode (BLUE,  OUTPUT); digitalWrite (BLUE,  0);
 pinMode(CAN0_INT, INPUT);            // Configuring pin for /INT input (D2 arduino)
}



//------------------------------ LOOP
void loop()
{
 curmillis = millis();
 RequestTempPID();
 CANread();
 CANcheck();
 if (CANFail) LEDErrorIND();
}



 

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

Ёлки палки, у меня сейчас будет взрыв мозга! ))

Спасибо, что помогаете.

Нашел код, там вроде те же самые адреса (если говорить про температуру), плюс также используются неведомые мне фильтры.

Теперь мне непонятно это:

а вот тут, человек пишет такое: температура двигателя: адрес 0x288, [байт 1] *0,75-48

и адрес совсем другой, и формула тоже какая-то нестандартная..  

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

Как вариант:

void LED(byte led) {
  digitalWrite (BLUE,  (led == REDON)); 
  digitalWrite (GREEN, (led == GREENON)); 
  digitalWrite (RED,   (led == BLUEON));
}

// или 

void LED(byte led) {
  digitalWrite (RED,   LOW);
  digitalWrite (GREEN, LOW); 
  digitalWrite (BLUE,  LOW); 

  switch (led) {
    case REDON:   digitalWrite (RED,   HIGH); break;
    case GREENON: digitalWrite (GREEN, HIGH); break;
    case BLUEON:  digitalWrite (BLUE,  HIGH); break;
    default: 
  }
}


 

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

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

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

sadman41,  да так красивее, исправил

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

gumeldiman, вот вам пример БЕЗ подачи запросов в CAN, считывается только ID 0x288 (из рабочего обмена данными между блоками автомобиля)  и рассчитывается по вашей формуле температура

#include <mcp_can.h>
#include <SPI.h>

MCP_CAN CAN0(10);     // Set CS to pin 10

#define TEMP_ID          0x288   // ID где лежит температура
#define RED              6       // пины LED
#define GREEN            7       // пины LED
#define BLUE             8       // пины LED
#define CAN0_INT         2       // подключить пинINT MCP2515 to pin 2 arduino 

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

enum LEDscontrol {REDON, GREENON, BLUEON};



//------------------------------чтение из 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 == TEMP_ID) //если получили сообщение с температурой
         {
          CoolTemp = (float)rxBuf[1]*0.75-48;                         // расчёт t 
          Serial.print (F("COOLTemp = ")); Serial.println (CoolTemp); // печать t в отладку
          if (CoolTemp <38)                   LED (BLUEON);           // зажгем диоды     
          if (CoolTemp >=38 && CoolTemp <110) LED (GREENON);          // зажгем диоды     
          if (CoolTemp >=110)                 LED (REDON);            // зажгем диоды     
          CANFail = 0;            // контроль CAN переводим в норму
          prevcheck = curmillis;  // и сбрасываем таймер контроля CAN       
         }
  }
}

//------------------------------контроль CAN 
void CANcheck()
{
 if (curmillis - prevcheck > 15000) // через 15 сек 
   {
    CANFail = 1; // LED переводим в аварию (если не поступают сообщения t из CAN)
    prevcheck = curmillis;
   }
 if (CANFail)  // предупреждение (миганием диодов), что из CAN температура не читается 
   {
    static uint32_t preverrorled = 0;
    if (curmillis - preverrorled > 500)
       {
         static byte i=0;
         LED (i); 
         i++; if (i>2) i=0; 
         preverrorled = curmillis;
       }
   }
}

//------------------------------управляем диодами
void LED(byte led) 
{
  digitalWrite (RED,   (led == REDON));
  digitalWrite (GREEN, (led == GREENON));
  digitalWrite (BLUE,  (led == BLUEON));
}

//------------------------------ SETUP
void setup()
{
  Serial.begin(115200);
  if(CAN0.begin(MCP_STD, CAN_500KBPS, MCP_8MHZ) == CAN_OK) 
       Serial.println("MCP2515 Initialized Successfully!");
  else Serial.println("Error Initializing MCP2515...");
 
 CAN0.init_Mask(0, 0, 0x07FF0000);
 CAN0.init_Filt(0, 0, (TEMP_ID & 0xFFFFFFFF)<<16); // аппаратный фильтр чтобы получать только нужные нам сообщения
 CAN0.init_Mask(1, 0, 0x07FF0000);
 CAN0.init_Filt(1, 0, (TEMP_ID & 0xFFFFFFFF)<<16); // аппаратный фильтр чтобы получать только нужные нам сообщения
 
 CAN0.setMode(MCP_NORMAL); 
 
 pinMode (RED,   OUTPUT); digitalWrite (RED,   0);
 pinMode (GREEN, OUTPUT); digitalWrite (GREEN, 0); 
 pinMode (BLUE,  OUTPUT); digitalWrite (BLUE,  0);
 pinMode(CAN0_INT, INPUT);            // Configuring pin for /INT input (D2 arduino)
}



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



 

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

MaksVV, получается что сам принцип чтения информации одинаковый, что с запросами, что без?

Просто в первом случае (с диагностическим запросом) мы, грубо говоря, рыбачим с наживкой, а во втором случае, мы ловим всех всех подряд и выбираем нужную нам рыбу.

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

само чтение конечно одинаковое, хоть посылал запросы хоть нет. Ну и отсеваем только нужное нам при любом подходе. Отсеивать можем программно if (rxId == TEMP_ID) и/или аппаратно : 

CAN0.init_Mask(0, 0, 0x07FF0000);
 CAN0.init_Filt(0, 0, (TEMP_ID & 0xFFFFFFFF)<<16); // аппаратный фильтр чтобы получать только нужные нам сообщения
 CAN0.init_Mask(1, 0, 0x07FF0000);
 CAN0.init_Filt(1, 0, (TEMP_ID & 0xFFFFFFFF)<<16); // аппаратный фильтр чтобы получать только нужные нам сообщения

 

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

А можно наделать бед, посылая запросы в кан шину?

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

Наделать бед можно просто подключившись к OBD-разъёму.

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

если ссать, то можно вообще в жизни ничего не добиться. Делать вдумчиво и всё получится. Инфы в сети полно. как аппаратно всё собрать тоже куча инфы, даже на этом форуме. Схема и программа простая. Тем более вам пример ПОЛНЫЙ выложили уже. не знаю может ещё подключить всё за вас? 

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

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

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

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

ПС.  для проверки к OBD достаточно только два провода - CAN-H  и CAN-L.  Даже землю не обязательно. 

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

Ок!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

Тут тебе к MaksVV надо - он на Кане собаку съел.

...если повар нам не врёт... (В. Высоцкий)

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

только небольшая ремарка, я так понял у вас VW Polo . Не работал в фольксами, но слышал, что у них в obd вроде как выведена отдельная CAN шина , используемая только для диагностики. От остальных блоков сюда инфа прёт через шлюз. Дак вот просто так в шине ничего нет, пока не отправить соответствующие диагн. запросы. 

и вот тому подтверждение, последняя фраза из текста по вашей ссылке: 

 

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

Да, у меня поло седан. Не могу сказать почему, но слышал о проблемах у ребят с автоматическими коробками передач, которые использовали цифровой индикатор температуры (ссылку я приводил раньше). На МКПП проблем с этой приблудой ни у кого не было.

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

Заказал запчасти, как приедут буду экспериментировать.

С Ардуино знаком поверхностно, хотя получилось сделать ЧПУ-шную рисовалку, с кодом на 100 строчек.

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

Верно я схему накидал?

И правильно я понимаю, что если я захочу получать различные полутона на RGB светодиоде, то достаточно перекинуть провода на аналоговые выходы, а в них уже закидывать значения от 0 до 255?

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

Понимаешь правильно, но выражаешься некорректно. И схема неверная.

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

sadman41 пишет:
Понимаешь правильно, но выражаешься некорректно. И схема неверная.

Не совсем понял насчёт корректности.. а где ошибка в схеме?

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

Del

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

SPI не нарисован, светодиод без резистора не включают, аналоговых выходов у Nano не существует.

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

Почему-то считал, что выходы А0..А7 это и есть аналоговые, а те которые D - это цифровые (Digital).

Насчёт резисторов понял, а вот что такое SPI - что-то не понимаю...

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

Del. Ёлки-палки, опять дабл пост..

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

"Аналоговые", да не выходы. Для поставленной задачи нужны PWM-выходы.
SPI - шина такая, по ней CAN-модуль присоединяется.

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

Блин, не могу понять, схему рисовал полагаясь на текст программы:
...
MCP_CAN CAN0(10); // Set CS to pin 10
...
#define CAN0_INT 2 // подключить пинINT MCP2515 to pin 2 arduino
...
if(!digitalRead(CAN0_INT)) // если пришло сообщение из CAN
...

Разве другие пины упоминаются?

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

Вот как ты собрался в машину лезть, скажи мне... Не боишься потом в канаве перевёрнутым очнуться (в лучшем случае)?

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

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

gumeldiman пишет:
Разве другие пины упоминаются?

эти "другие пины" настолько очевидны для любого болвана, что их даже не упоминают...

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

Хмм, картинки видел, проводков между платами больше. Логики соединения не понимаю (не вижу в коде), оттого и спрашиваю совета.

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

gumeldiman пишет:
Хмм, картинки видел, проводков между платами больше. Логики соединения не понимаю (не вижу в коде), оттого и спрашиваю совета.

какого совета? Совет спрашивают, когда интерсен личный опыт, например "Дед Михей, а ты в чай сухой навоз добавляешь?"

А в данном случае советов спрашивать незачем, все в мануале прописано.

Судя по картинке выше  и задаваемым вопросам - вы в электронике полный ноль ( даже не в курсе, как светодиод подключать). Вам одно обьяснишь - вы в другом нкасячите. Если у вас и правда цель - приобрести опыт и разобраться - прежде чем лезть в машину, изучите хотя бы любую книжку "ардуино для чайников".

Что касается подключения КАН-модулей - читайте про шину SPI

Надеюсь, в программированииу вас дела получше? Или после построения схемы нас ждет вторая серия - "Помогите написать код"?