Arduino UNO и MCP2515 CAN

chiptuningnt
chiptuningnt аватар
Offline
Зарегистрирован: 22.01.2018

Помогите подружить ардуино c CAN)
Имею Arduino UNO и модуль MCP2515_CAN
https://yadi.sk/i/U4XMOr6z3SH7Zm (вот фото, не смог почему то на сервер форума загрузить)
Перепробовал разные библиотеки, но хоть какой то результат получил только вот с этой: https://github.com/autowp/arduino-mcp2515

Использую скетч из пример а к библиотеке для передачи
 

#include <SPI.h>
#include <mcp2515.h>

struct can_frame canMsg1;
struct can_frame canMsg2;
MCP2515 mcp2515(10);


void setup() {

  canMsg1.can_id  = 0x0F6;
  canMsg1.can_dlc = 8;
  canMsg1.data[0] = 0x8E;
  canMsg1.data[1] = 0x87;
  canMsg1.data[2] = 0x32;
  canMsg1.data[3] = 0xFA;
  canMsg1.data[4] = 0x26;
  canMsg1.data[5] = 0x8E;
  canMsg1.data[6] = 0xBE;
  canMsg1.data[7] = 0x86;

  canMsg2.can_id  = 0x036;
  canMsg2.can_dlc = 8;
  canMsg2.data[0] = 0x0E;
  canMsg2.data[1] = 0x00;
  canMsg2.data[2] = 0x00;
  canMsg2.data[3] = 0x08;
  canMsg2.data[4] = 0x01;
  canMsg2.data[5] = 0x00;
  canMsg2.data[6] = 0x00;
  canMsg2.data[7] = 0xA0;
  
  while (!Serial);
  Serial.begin(115200);
  SPI.begin();
  
  mcp2515.reset();
  mcp2515.setBitrate(CAN_125KBPS);
  mcp2515.setNormalMode();
  
 // Serial.println("Example: Write to CAN");
}

void loop() {
  
  mcp2515.sendMessage(&canMsg1);
  mcp2515.sendMessage(&canMsg2);

  // Serial.println("Messages sent");
  
  delay(100);

}

Подключаю модуль к CANHacker, прием есть, но:
вначале получаю пакет canMsg1 899 раз с периудом 251 микросекунды, далее начинается цикличный прием canMsg2 до бесконечности с периудом 1 микросекунда.
Судя по скетчу он должен поочередно отправлять пакеты с периудом 100 милисекунд, почему не так не могу понять. Пробовал задержку ставить больше но все ровно так же.

Еще при установке скорости кан более 125, приема нет.

Подскажите что не так или какую библиотеку лучше использовать.
кварц ардуино 16Мгц, кан модуля 8Мгц

 

chiptuningnt
chiptuningnt аватар
Offline
Зарегистрирован: 22.01.2018

поправка, в строке 38 писал так 
mcp2515.setBitrate(CAN_125KBPS, MCP_8MHZ);

при установке например 
mcp2515.setBitrate(CAN_500KBPS, MCP_8MHZ);
приема вообще нет, в канхакере соответственно стокость приема тоже менял на 500

chiptuningnt
chiptuningnt аватар
Offline
Зарегистрирован: 22.01.2018

Попробовал библиотеку с двуя ардуино, УНО и НАНО, в одну записал прием из примера, в другую передачу. Поставил задержку между отправкой пакетов 500мс. Так по очереди отправляет и принимает. Работает на скорости максимум 250Кбит, при установке 500 так же передачи нет.
Поменял кварцы в шилдах на 16Мг результата не дало. Помогите пожалуйсто рабочей библиотекой и скетчем для отправки приема сан сообщений обд формата чтоб в дальнейшем применять на авто

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

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

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

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

И использовал я не шилды , а дешёвые модули как по ссылке, они также нормально работают. 

chiptuningnt
chiptuningnt аватар
Offline
Зарегистрирован: 22.01.2018

У меня тоже маленькие кан модули, так че то шилдом обозвал. Поставил сегодня перемычки на установку резистора, обмен между модулями на столе пошел нормально, на 500кб заработало, подключал между модулями кан хаккер (есть заводской адаптер для этой проги) тоже перехватывает сообения правильно, на машине проверить пока не получилось. Но попробовал так же меж модулями подключить шину диагностического сканера и дать команду на чтение ошибок, в монеторе порта ардуино уловило эти пакеты сообщений. Завтра попробую с библиотекой по твоей ссылке, спасибо! Правда придется кварцы опять на 8Мгц впаивать(((( 

 

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

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

chiptuningnt
chiptuningnt аватар
Offline
Зарегистрирован: 22.01.2018

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

#include <SPI.h>
#include <mcp2515.h>

struct can_frame canMsg; 
struct can_frame canMsg1;

MCP2515 mcp2515(10);

void setup() {  
  SPI.begin(); 
  mcp2515.reset();
  mcp2515.setBitrate(CAN_500KBPS);
  mcp2515.setNormalMode();
}

void loop() {
  
  if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) 
  { 
      if (canMsg.can_id==0x0F6 && canMsg.data[7]==0x86)
      {
          canMsg1.can_id  = canMsg.can_id;
          canMsg1.can_dlc = canMsg.can_dlc;
          canMsg1.data[0] = canMsg.data[0];
          canMsg1.data[1] = canMsg.data[1];
          canMsg1.data[2] = canMsg.data[2];
          canMsg1.data[3] = canMsg.data[3];
          canMsg1.data[4] = canMsg.data[4];
          canMsg1.data[5] = canMsg.data[5];
          canMsg1.data[6] = canMsg.data[6];
          canMsg1.data[7] = 0x11;

          mcp2515.sendMessage(&canMsg1);
      }
  }
}

при получении пакета с ID 0x0F6 и если 8й байт в сообении равен 0x86 копирует данный пакет подменяя 8й байт на 0х11 и отправляет в шину. Работает, это уже радует) На некоторых авто можно реализовать таким макором например CAN довотчик стекл, при получении данных о закрытии авто посылать команду на закрытие стекл и другое. Ну собственно поделки позже, хочется больше возможностей)
Теперь встал вопрос: как заставить работать ардуино с двумя модулями can одновременно в режиме фильтра. Т.е устанавливая в разрыв шины получить ретранслятор в обе стороны, но при получении определенного пакета подменять его что бы блок которому он был адресован получил то что мы хотим вместо того что ему отправили. Насколько я понимаю нужно будет использовать прерывания для общения с модулями по очереди и копировать и править библиотеку, но как это реализовать пока в полном замешательстве. Может кто встречал подобный пример или где почитать

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

я пробовал два кан модуля к ардуине - работают. Контакт CS (SS) одного кан модуля на пин 10 ардуины. Второго, например, на пин 9 ардуины. Остальные к тем же пинам ардуины (11, 12, 13). 

в скетче сейчас покажу как будет

 

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

вот скетч для двух модулей (можно и больше) к  одной ардуине.  В лупе просто распечатка в сериал принятых сообщений (остов фильтра нужно придумывать)

#include <SPI.h>
#include <mcp2515.h>

struct can_frame canMsginput;

struct can_frame canMsgoutput;

MCP2515 CANinput(9);     // это кан модуль куда поступает CAN трейс 
MCP2515 CANoutput(10);  // это выход уже отфильтрованного CAN трейса

void setup() {
  Serial.begin(115200);
  SPI.begin();
  
  CANinput.reset();
  CANinput.setBitrate(CAN_500KBPS);
  CANinput.setNormalMode();

  CANoutput.reset();
  CANoutput.setBitrate(CAN_500KBPS);
  CANoutput.setNormalMode();
  
  
}

void loop() {
  
  if (CANinput.readMessage(&canMsginput) == MCP2515::ERROR_OK) {
      
    Serial.print(canMsginput.can_id, HEX); // print ID
    Serial.print(" "); 
    Serial.print(canMsginput.can_dlc, HEX); // print DLC
    Serial.print(" ");
    
    for (int i = 0; i<canMsginput.can_dlc; i++)  {  // print the data
        
      Serial.print(canMsginput.data[i],HEX);
      Serial.print(" ");

    }

    Serial.println();      
  }


   if (CANoutput.readMessage(&canMsgoutput) == MCP2515::ERROR_OK) {
      
    Serial.print(canMsgoutput.can_id, HEX); // print ID
    Serial.print(" "); 
    Serial.print(canMsgoutput.can_dlc, HEX); // print DLC
    Serial.print(" ");
    
    for (int i = 0; i<canMsgoutput.can_dlc; i++)  {  // print the data
        
      Serial.print(canMsgoutput.data[i],HEX);
      Serial.print(" ");

    }

    Serial.println();      
  }

}

 

chiptuningnt
chiptuningnt аватар
Offline
Зарегистрирован: 22.01.2018

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

#include <SPI.h>
#include <mcp2515.h>

struct can_frame can1Msg;
struct can_frame can2Msg;

MCP2515 CAN1(9);
MCP2515 CAN2(10);

void setup() {
  SPI.begin();
  
  CAN1.reset();
  CAN1.setBitrate(CAN_500KBPS);
  CAN1.setNormalMode();

  CAN2.reset();
  CAN2.setBitrate(CAN_500KBPS);
  CAN2.setNormalMode();
 
}

void loop() {
  
  if (CAN1.readMessage(&canMsg1) == MCP2515::ERROR_OK) {
    CAN2.sendMessage(&canMsg1);
  }

   if (CAN2.readMessage(&canMsg2) == MCP2515::ERROR_OK) {
    CAN1.sendMessage(&canMsg2);
  }

}

 

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

да , должно работать. Между строками 29 и 30 вставляем подмены байтов т.е. фильтры.  

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

другой вопрос если кан шина сильно нагружена, то ардуина может не успевать принимать и/или отправлять все сообщения. Т.е. могут быть пропуски  сообщений , особенно на скоростях 500 кбит/с.  Слабоват для этого МК ардуино. Такие вещи обычно на STM32 собирают. Но надо пробовать, может и дуня справится 

chiptuningnt
chiptuningnt аватар
Offline
Зарегистрирован: 22.01.2018

Ну да, возможно и не хватит скорости дуни
щас попробовал с кан хакера воспроизвести лог сообщений ФФ2 и в монеторе ком порта принимать эти сообщения дуней,  скетч как последний с дублированием сигнала в обе стороны ну и соответственно вернул передачу в порт как в твоем примере. Так вот анализируя два лога (с кан хакера и дуни) наблюдал иногда пропущенные пакеты. Сократил код убрав пару строк передачи в порт, пакеты прошли все. Может и хватит скорости и пакеты не потеряются если передачу в порт вообще убрать и сделать фильтр только несколько пакетов не более.
Я только начал внимать в МК) AVR попроще, вот и начал с ардуино. Сам автоэлектроникой занимаюсь уже долгое время, оборудования для диагностики и ремонта хватает но бывают не ординарные случаи и нужно мастерить, вот и решил вникнуть малость в МК. Затягивает...)   Про STM32 натыкался в инете, сан модули в сигналках старлайн на STM и как понял они на борту уже имеют CAN и LIN интерфейсы, тк щас у них модули 2CAN-2LIN а на модуле только один камень STM32. 

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

Да все верно говоришь. Serial.print много тактов МК занимает. Старлайны ага, тоже обращал внимание. Там кроме проца должны по идее быть только транссиверы CAN как MCP 2551 в наших модулях. Я пару лет ардуину ковыряю, затянуло сразу. Делал запуск вебасто через дуню. Занимаюсь также диагностикой и допами. В основном форды и хонды.

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

Реверс инжениринг интересная тема, сложная только) было время тут как то хакнул кан протокол обмена со щитком приборов ср-в 3 кузов. Можно чеки тушить дуней, эмуляторы рабочих блоков делать. Надо абс потушить? Плжалста дуня 150р и mcp 150. Вот тебе и эмуль готов.

msao
Offline
Зарегистрирован: 07.06.2018

Добрый день! с фильтрами id и масками пробовали? что то получалось ?

у меня на библиотеке CAN_BUS_Shield-master как то никакой адекватной реакции 

Silych
Offline
Зарегистрирован: 18.10.2018

Доброе время суток, коллеги!

Подскажите пожалуйста, как при использовании библиотеки mcp2515.h  работать с режимом 29bit ? 

У меня получается, что ID обрезаются с 0x12345678  до 0x678

Спасибо.

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

Как вы это узнали?

Silych
Offline
Зарегистрирован: 18.10.2018

 Я ковыряюсь с простой  сетью  из контроллера и исполнительного устройства, моргающего лампочками в зависимости от поступающих команд. К этой же сети подключен USB-CAN адаптер и программа CAN Hacker, где я вижу весь трафик. На ардуине собрано некоторое подобие шлюза. Если не пытаюсь работать с  ID, то ретранслирует пакеты без изменений, если задаю ID исходящего пакета - на  CAN Hacker-е вижу в ID только последние 3 цифры. Исполнительное устройство естественно на эти пакеты не реагирует. Скетч основан на примере chiptuningnt из 10-го сообщения. 

APJ
Offline
Зарегистрирован: 25.03.2015

Всем привет

Сделал эмулятор блока АБС и приборной панели на мотор БМВ М57. Мотор поставлен на катер. Всего 2 блока, эмулятор с гпс приёмником, к нему же подсоеденены термодатчики масла, температуры турбины , угол трима колонки , и прибор на  панели, с олед дисплеем.

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

 

 

 

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

Silych пишет:
Скетч основан на примере chiptuningnt из 10-го сообщения. 


Он секретный?

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

Silych пишет:

У меня получается, что ID обрезаются с 0x12345678  до 0x678

Спасибо.


Вместо 0x12345678 нужно отправлять 0x92345678
Вместо 0x02345678 нужно отправлять 0x82345678

Silych
Offline
Зарегистрирован: 18.10.2018

Нет, он не секретный. :) Он на работе, а я отвечал из дома. Там изменена только скорость шины на 250KBPS и добвлено 8MHZ. Ну и добавлено условие  по такому примеру.

18   if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK)
19   {
20       if (canMsg.can_id==0x0F6 && canMsg.data[7]==0x86)
21       {
22           canMsg1.can_id  = canMsg.can_id;
23           canMsg1.can_dlc = canMsg.can_dlc;
24           canMsg1.data[0] = canMsg.data[0];
25           canMsg1.data[1] = canMsg.data[1];
26           canMsg1.data[2] = canMsg.data[2];
27           canMsg1.data[3] = canMsg.data[3];
28           canMsg1.data[4] = canMsg.data[4];
29           canMsg1.data[5] = canMsg.data[5];
30           canMsg1.data[6] = canMsg.data[6];
31           canMsg1.data[7] = 0x11;
32  
33           mcp2515.sendMessage(&canMsg1);

 

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

Макс, как там CAN-звезда - заработала или не дошли руки?

Silych
Offline
Зарегистрирован: 18.10.2018

MaksVV пишет:
Silych пишет:

У меня получается, что ID обрезаются с 0x12345678  до 0x678

Спасибо.

Вместо 0x12345678 нужно отправлять 0x92345678 Вместо 0x02345678 нужно отправлять 0x82345678

 

Спасибо, попробую.

А межно немного теории - почему так или как я мог сам до этого докопаться? Описание к библиотеке смотрел, но не разобрался. 

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

Id 29 битный это только то что мы видим. Но там еще старше стоят три бита (в итоге размер id реально то 32битный получается или 4байтный если хотите). Дак вот самый старший бит и определяет стандартный id (11) или расширенный (29).
Для наглядности можно написать старший (левый) полубайт (ниббл) ID в бинарном формате: 0000. Дак вот мы видим только правый нолик (или единичку) левые три нолика (или единички) служебные. Самый левый если 1, то будет расширенный id. Соответственно 8 это в бинарке 1000. А 9 это 1001.

Update: а средние два бита отвечают за тип сообщения can. В кан шине есть сообщения с данными (обычное дело) и так называемые remote frame (или RTR). Это такие сообщения как бы запрос данных. Допустим хочет один их блоков получить данные которые лежат в сообщении , например 0x654. Он посылает в шину remote frame с таким же id, при этом поле данных обязательно должно отсутствовать (dlc=0). Другой блок получив такой frame remote уже отвечает данными с таким же id 0x654.
Дак вот средние два бита и говорят remote frame это или нет. Левый средний отвечает за frame remote в 29битных id, правый средний - в 11 битных (при этом соответственно самый левый бит должен быть 0)

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

sadman41 пишет:

Макс, как там CAN-звезда - заработала или не дошли руки?


Еще не дошли. Понятно что два луча, то это еще не звезда, а линия)) вот у меня пока как раз два луча только

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

MaksVV пишет:
Еще не дошли. Понятно что два луча, то это еще не звезда, а линия)) вот у меня пока как раз два луча только

А я тут через огрызок бухты витухи (100м) запустил траффик. Ничё, шустро так, потерь нет. 

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

А че такое огрызок

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

Огрызок - он и есть огрызок. Стандартная бухта 300м, осталось 100. Решил попробовать - пробьет или нет модуль с алиэкпресса. Может потом через полную запущу, если успею перехватить.

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

Понял. Я просто полную запакованную на 100м купил. Такие тоже бывают. А какие скорости пробовал? 500 должно тянуть я думаю. Проблемы видимо начинаются когда много мк навешивается. У меня вообще четко щас работает. 3 мк по витухе метров 40 наверное: 2 луча по 20 и одна дуня в центре

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

Да по скорости что-то не экспериментировал. 125кбит на 4 ноды + 1 гейт хватает с посылками каждые 5 сек. В квартире наврядли такой траффик будет. Сейчас всё на лонгтесте стоит, я не трогаю систему. Как буду модифицировать - погоняю на скоростях повыше.

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

Хотя смысла в этих 500килобит нету. На самом деле, данных то всего ничего будет летать. 125 самое то. Просто я на столе както меньшие скорости пробовал. Помню почему то были проблемы ниже 125. У меня данные в шину передаются по трем событиям, смотря что раньше наступит:
- периодически (раз в 30 сек - причем начало отсчета смещено в зависимости от id.
- если параметр изменил свое значение
- по запросу от другого мк

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

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

Silych
Offline
Зарегистрирован: 18.10.2018

MaksVV пишет:
Id 29 битный это только то что мы видим. Но там еще старше стоят три бита (в итоге размер id реально то 32битный получается или 4байтный если хотите). .......

Огромное спасибо! Очень доходчиво. Пробовал Ваш скетч, обратил внимание, что он выводит в монитор порта принимаемые ID именно с 9, а не с 1. Посчитал это ошибкой, так как скетч chiptuningnt выводил с 1, как и CAN Hacker. Буду знать.

Oksymoron
Offline
Зарегистрирован: 28.01.2017

Доброго времени суток! попробовал скетч из 1 поста и получил

Arduino: 1.8.5 (Windows 7), Плата:"Arduino/Genuino Uno"
CAN_write:4: error: aggregate 'can_frame canMsg1' has incomplete type and cannot be defined
 struct can_frame canMsg1;
СAN_write:5: error: aggregate 'can_frame canMsg2' has incomplete type and cannot be defined
struct can_frame canMsg2;
CAN_write:6: error: 'MCP2515' does not name a type
 MCP2515 mcp2515(10);
C:\Users\8FEE~1\AppData\Local\Temp\arduino_modified_sketch_821615\CAN_write.ino: In function 'void setup()':
СAN_write:37: error: 'mcp2515' was not declared in this scope
 mcp2515.reset();
CAN_write:38: error: 'CAN_125KBPS' was not declared in this scope
mcp2515.setBitrate(CAN_125KBPS);
C:\Users\8FEE~1\AppData\Local\Temp\arduino_modified_sketch_821615\CAN_write.ino: In function 'void loop()':
CAN_write:46: error: 'mcp2515' was not declared in this scope
mcp2515.sendMessage(&canMsg1);
exit status 1
aggregate 'can_frame canMsg1' has incomplete type and cannot be defined
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 

подскажите в чем косяк, библиотеку скачал из 1 поста.

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

MaksVV пишет:
А какие скорости пробовал? 500 должно тянуть я думаю.

Сегодня поэкспериментировал на подрезанной бухте витой пары Cat5 в 240м и куске 100м. Ввел в свою систему колхозную процедуру подбора скорости на удаленном конце, на "главной" ноде менял скорости.

240м - 125кбит и ниже тянет, 250кбит - проблемы.
100м - 250кбит и ниже тянет, 500 - проблемы.

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

 

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

да, я тоже на низких скоростях ловил проблемы. Опытным путём пришёл к выводу, что самая оптимальная скорость 125 кбит/c. Если собираешься плотно работать с CAN, обязательно нужно сделать  монитор шины . см. пост #3

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

Что-то это хакер странный. MSCOMM32 какой-то ему нужен. Это мне еще студию вкрячить на комп нужно что ли...

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

Нет, не надо. Все в том посте есть.

sotyi
Offline
Зарегистрирован: 05.01.2017

MaksVV пишет:

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

И использовал я не шилды , а дешёвые модули как по ссылке, они также нормально работают. 

А какой скетч нашли на просторах инета, если не секрет?

Что-то у меня не получается работать с канхакером.

Подключение к CANHacker-у есть, а приёма посылок нет.

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

Из библиотеки пример usb чето там

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

Вам нужно поставить либо двое меньшую скорость на кан хакере либо вдвое большую . Если заработало. Значит под кварц 8 мгц не подстроили. 

sotyi
Offline
Зарегистрирован: 05.01.2017

usb_cdc - этот?

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

да. ссылка на библиотеку для кварца 8 мГц дана в сообщении #3 этой темы. библиотека для кварца 16мГц

sotyi
Offline
Зарегистрирован: 05.01.2017

Да я уж всякие пробовал библиотеки и кварцы. Не хочет КАНХакер принимать сообщения у меня. И версию скачал старую разлоченую ( вроде 07 или 09 ).

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

скорее всего у вас при этом не будет работать и простой пример receive из библиотеки CAN ( НЕ канхакер).  У этих модулей есть какой то глюк, когда с аппартаными фильтрами начинаешь играться , иногда перестают нормально приниматься сообщения. нужно в таких случаях опять позаливать примеры из библиотеки с аппаратными фильтрами.  

У меня был подобный косяк

ak62
Offline
Зарегистрирован: 03.01.2019

Приветствую. Разложите по полочкам, пожалуйста. Скачал по ссылке библиотеки. Из своей папки libraries удалил все, что там было и добавил содержимое архива. Имею две ардуины и два модуля MCP2515. Так же, как и у ТС с помощью других (и той, что была по его ссылке) библиотек модули между собой общаются, с авто нет. Причем перепробовал множество библиотек. В процессе экспериментов специально на 8MHZ кварц заливал скетчи, где явно видно, что скетч для 16MHZ. И все работало! Один передавал, другой принимал.

И так, ближе к делу. Открываю IDE, иду в примеры и пытаюсь загрузить скетч \arduino-canhacker-master\examples\usb_cdc\usb_cdc. Компиляция проходит без вопросов, а при загрузке вылазит сообщение: ..\Documents\Arduino\libraries\can-usb-master: нет заголовочных файлов (.h), найденных в ...\Documents\Arduino\libraries\can-usb-master. Удаляю из папки библиотек папку can-usb-master. Ура, скетч загрузился! Так и не понял, где (и нужно ли?) выставить скорость приема. Про то, что сами библиотеки настроены на 8МГц кварц я помню. Идем дальше. Из записи в скетче #include <can.h> #include <mcp2515.h> можно предположить, что скетч на передачу нужно брать из примера, который находится в папке с этими заголовочными файлами ...\Documents\Arduino\libraries\arduino-mcp2515-master\examples\CAN_write. В этом примере есть место с установкой скорости передачи mcp2515.setBitrate(CAN_125KBPS); Не трогаю его, загружаю в другую ардуино этот скетч. Компорт этой ардуино отвечает так, как ему и прописано в скетче. Т.е. начинает отсылать.

Example: Write to CAN

16:09:58.397 -> Messages sent

Messages sent
Messages sent
Messages sent
 

Запускаю программу CANHacker, настраиваю ее на порт первой ардуино, ставлю скорость 115200 и 125kBps. И ничего не вижу в окне канхакера. Что я делаю не так? Спасибо.

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

если кварцы не трогали (т.е. на данный момент стоят 8 МГц), делаете канхакер как по ссылке  в #3 посте. Грузите из нулевого поста библиотеку. заливаете во вторую дуню +mcp2515. такой скетч

#include <SPI.h>
#include <mcp2515.h>

struct can_frame canMsg1;

MCP2515 mcp2515(10);


void setup() {

  canMsg1.can_id  = 0x0F6;
  canMsg1.can_dlc = 8;
  canMsg1.data[0] = 0x8E;
  canMsg1.data[1] = 0x87;
  canMsg1.data[2] = 0x32;
  canMsg1.data[3] = 0xFA;
  canMsg1.data[4] = 0x26;
  canMsg1.data[5] = 0x8E;
  canMsg1.data[6] = 0xBE;
  canMsg1.data[7] = 0x86;

    while (!Serial);
  Serial.begin(115200);
  SPI.begin();
  
  mcp2515.reset();
  mcp2515.setBitrate(CAN_500KBPS);
  mcp2515.setNormalMode();
  
  Serial.println("Example: Write to CAN");
}

void loop() {
  
  mcp2515.sendMessage(&canMsg1);
  Serial.println("Messages sent");
  
  delay(1000);

}

в канхакере в настройках выбираете скорость 500 кбит. Подключаетесь,  Канхакер должен видеть сообщения от второй дуни + mcp2515. В противном случае у вас возможно глюк, описанный в сообщении #47

ПС. на машине обычно 500 кбит. 

Для проверки 2515, просто заливаете примеры из одной библы (на одной read на другой write), естественно скорости должны быть одинаковые. Не забываем также про джампер терминатора на одной из mcp2515 (когда подключаемся между собой, при подключении к автомобилю резистор не нужен). 

ak62
Offline
Зарегистрирован: 03.01.2019

Кварцы не трогал.

MaksVV пишет:
делаете канхакер как по ссылке в #3 посте
> Имеется в виду связка ардуино+МСР? Сейчас в сотый раз перепроверю. Но по моему все собрано 1 в 1.