Arduino + CAN bus mcp2515

maincraft
Offline
Зарегистрирован: 22.10.2021

Здравствуйте, ребята. 
1) Имею китайский контроллер для управления электродвигателем
2) Китайская программа для Windows которая подключается по CAN через USB преобразователь (в комплекте)
У которого есть CAN-L, CAN-H, GND, GND, RX, TX, VCC
3) Контроллер не отсылает статус двигателя (обороты) без предварительного запроса, программа посылает пакет, контроллер отвечает.

Мои инструменты:
1) Arduino (UNO, Mega)
2) mcp2515 
3) Использую "Правильную библиотеку" и использую setBitrate(CAN_500KBPS, MCP_8MHZ);
(https://github.com/autowp/arduino-mcp2515)

В чём у меня трудность и проблема:
1) Я соединил (мне кажется правильно) mcp2515 по схеме с Arduino
2) Я параллельно подключил CAN-L/CAN-H от китайского контроллера (п.1) к USB преобразователю и mcp2515
3) Используя Sketch для Read packet (чтения пакетов), я должен увидеть пакеты которыми обменивается USB преобразователь с контроллером, но к сожалению при подключении ничего нет, более того, при попытке включения mcp2515 в цепь с USB, программа тоже перестаёт коммуницировать с контроллером электродвигателя.

Я не понимаю:
1) Можно ли параллелить провода CAN-L, CAN-H? 
2) Можно ли одновременно читать трафик mcp2515
3) Пакеты снифать мне не нужно, а вот can_id я не знаю как получить.
(Ранее этот контроллер работал по RX/TX и проблем с обменом не было, но сейчас производитель перешёл на CAN Bus и ввёл меня в ступор!)

Я предпринял попытку использовать CAN_Hacker v2, используя Arduino, но пакеты при подключенном состоянии не отображаются... 

Мне нужны ваши советы и помощь ребята! Спасибо!

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

CAN адаптеры, в сущности, все параллельно соединяются.

Если просто незапитанный модуль на шине оставить - тоже обмен прекращается?

maincraft
Offline
Зарегистрирован: 22.10.2021

Здравствуйте, если убрать VCC, GND с модуля MCP2515, то обмен данными в Windows программе - работает, а в Arduine по-прежнему нет входящих данных. 

rkit
Offline
Зарегистрирован: 23.11.2016

Джампер рядом с клеммником попробуй замкнуть.

maincraft
Offline
Зарегистрирован: 22.10.2021

rkit, здравствуйте, попробовал поставить перемычку на J1, ничего не изменилось.
Методом тыка поставил mcp2515.setListenOnlyMode(); вместо normalMode.
 

Получил ответ (уже что-то есть, лучше чем ничего):

ID  DLC   DATA
83FF27FB 8 FB 69 BF B9 FA FE B8 B8 
-----
Китайская программа параллельно обновляет статус (работает). :)
Arduino кроме этого пакета ничего не увидел
sadman41
Offline
Зарегистрирован: 19.10.2016

H и L замкнуть? Оригинальный совет.

maincraft
Offline
Зарегистрирован: 22.10.2021

Нет, он имел ввиду J1 ))) 
Я правильно понял, не переживайте xDDD

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

ListenOnlyMode - это правильный ход для сниффера. В противном случае 2515 будет слать ACK и может портить обмен.

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

J1 - это терминатор. Лишний резистор на линии не нужен.

maincraft
Offline
Зарегистрирован: 22.10.2021

sadman41, rkit

Ребята спасибо за моральную и физическую поддержку.
Я помучался еще часок, и решил просто попробовать сменить на другой (благо заказал их 4шт)
Подключил и всё заработало xDDD, спасибо нашим братьям Китайцам.

maincraft
Offline
Зарегистрирован: 22.10.2021

Ребята, пользуясь случаем, задам вопрос.
Каким образом узнать скорость bitrate ?
Никакой документации естественно нет, из готовых:

enum CAN_SPEED {
    CAN_5KBPS,
    CAN_10KBPS,
    CAN_20KBPS,
    CAN_31K25BPS,
    CAN_33KBPS,
    CAN_40KBPS,
    CAN_50KBPS,
    CAN_80KBPS,
    CAN_83K3BPS,
    CAN_95KBPS,
    CAN_100KBPS,
    CAN_125KBPS,
    CAN_200KBPS,
    CAN_250KBPS,
    CAN_500KBPS,
    CAN_1000KBPS
};

Соответственно из этих скоростей ни одна не подходит, потомучто пакет приходит кривой (не полный или вообще не такой). 

Единственная зацепка, которая у меня есть - это упоминание о "buadrate" в 115200.

 

rkit
Offline
Зарегистрирован: 23.11.2016

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

maincraft
Offline
Зарегистрирован: 22.10.2021

Ребят, ну какая-то чертовщина.
Вообщем суть такова, я написал китайцам, уточнил у них bitrate, ответили 250.
Окей, установил:

  mcp2515.reset();
  mcp2515.setBitrate(CAN_250KBPS, MCP_8MHZ);
  mcp2515.setListenOnlyMode();

Результат:

------- CAN Speedtest ----------
0 msg/sec
0 msg/sec
0 msg/sec
0 msg/sec

Если поставить 500KBPS, данные начинают идти, на 8MHZ, но пакет совершенно некорректный

------- CAN Speedtest ----------
290 msg/sec
254 msg/sec
291 msg/sec
294 msg/sec
294 msg/sec

И теперь самое интересное, меняю я на 16Mhz

  mcp2515.reset();
  mcp2515.setBitrate(CAN_250KBPS, MCP_16MHZ);
  mcp2515.setListenOnlyMode();

И данные начинают тоже ходить и тоже некорректные.
-------
Теперь вопросы: 
1) Какую библиотеку вы используете для работы с CAN и 8Mhz кварцем?
2) Почему на одном битрейте работает, на другом вообще молчит
3) VCC/GND всё-таки нужно подключать по схеме или нет? Потому-что с подключенным VCC/GND от 5V порта, перестаёт слать вообще что-либо
4) Давайте еще раз проверим подключение: (Верно?)
Arduino UNO:
INT (PIN2)
SCK (PIN13)
SI (PIN11)
SO (PIN12)
CS (PIN10)

Я даже предпринял попытку на второй плате поставить 16.000Mhz кварц HC-49S, но пакеты с ним вообще перестали ходить даже мусорные. (https://www.chipdip.ru/product/16mhz-hc-49s)

Помогите, пожалуйста, ребята. 

rkit
Offline
Зарегистрирован: 23.11.2016
maincraft
Offline
Зарегистрирован: 22.10.2021

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

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

gnd и VCC на модуль mcp2515 само собой нужно подключать . Подключите по CAN два модуля 2515 между собой  (на одной джампер j1 поставить)  , добейтесь устойчивых приема и отправки пакетов на 250 кбит/сек скорости, потом уже подключайте к шине мотора. Что за мотор то? 

maincraft
Offline
Зарегистрирован: 22.10.2021

MaksVV,

VOTOL контроллер и двигатель QSMotor

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

и попробуйте без ListenMode , должно работать и без него .  

mcp2515.reset();
mcp2515.setBitrate(CAN_250KBPS, MCP_8MHZ);
mcp2515.setNormalMode();

и после изменения любых настроек пересбрасывать питание на модуле mcp2515

maincraft
Offline
Зарегистрирован: 22.10.2021

Пробовал, не помогло,
Я попробую последовать совету и сделать CAN обмен между двумя ARDUINO

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

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

maincraft
Offline
Зарегистрирован: 22.10.2021

MaksVV пишет:

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

Сейчас попробую. 

maincraft
Offline
Зарегистрирован: 22.10.2021

Не помогло, я пересобрал по вашей ссылке на NANO, результаты теже самые 1 в 1
Библиотека используется кстати тажа самая)))) Сейчас попробую POSL

maincraft
Offline
Зарегистрирован: 22.10.2021

MaksVV,

Я прям взял скопировал ваши lib-ы в папку Arduino и согласно схеме 1 в 1 сделал подключение MCP2515.
Скетч скомпилился и загрузился, ошибок нет. Запустил CAN Hacker согласно примеру. Выбрал порт, выбрал LISTEN ONLY 115200 / 250Kbit, нажал CONNECT, подключилось, но входящие пакеты не видит ))))

Пойду убьюсь наверно... :)))
У меня есть еще подозрение что мои модули MCP2515 с браком, ну или я ))))

maincraft
Offline
Зарегистрирован: 22.10.2021

Проверил POSL библиотеку.

Entering Configuration Mode Successful!
Setting Baudrate Successful!
MCP2515 Initialized Successfully!
MCP2515 Library Receive Example...

И тишина. :)
Причём что 16Mhz ставить что 8Mhz всё равно показывает что всё ок. :)
maincraft
Offline
Зарегистрирован: 22.10.2021

Завтра всё-же осталось проверить Aduino<=> CAN <=> Arduino 
Чтобы ответить наверняка себе на вопрос, проблема:
1) во мне
2) в модулях
3) в псевдо-CAN-е китайского контроллера

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

Мне дохлые или фейковые модули такого вида не попадались. 125...500кбпс между ними вполне себе ходили через 100м UTP. По стандарту терминаторы должны стоять на обоих концах шины. Без них вообще ничего не ходило, с одним активированным бывали разные непонятные ситуации.  

Библиотеку юзаю ту же самую, от autowp, с небольшим допилингом по иниту - сбросом масок и фильтров. 

maincraft
Offline
Зарегистрирован: 22.10.2021

sadman41 пишет:

Мне дохлые или фейковые модули такого вида не попадались. 125...500кбпс между ними вполне себе ходили через 100м UTP. По стандарту терминаторы должны стоять на обоих концах шины. Без них вообще ничего не ходило, с одним активированным бывали разные непонятные ситуации.  

Библиотеку юзаю ту же самую, от autowp, с небольшим допилингом по иниту - сбросом масок и фильтров. 

Через несколько дней отпишусь, когда придут другие модули.
Самому теперь интересно.... 

maincraft
Offline
Зарегистрирован: 22.10.2021

Предварительное продолжение истории:
Собрал схему Arduino CAN <=> Arduino CAN
Приёмник входящих пакетов не видит :DDDD
Вывод: Модули не рабочие. xD Жду пару дней получения новых и пробую снова. 

Схема подключения Arduino и MCP2515

 

maincraft
Offline
Зарегистрирован: 22.10.2021

Продолжение истории :) 
Пришли новые модули. Поменял их в схеме с неисправными местами.
---
Всё работает. Спасибо, всем кто не остался в стороне и попытался помочь!

maincraft
Offline
Зарегистрирован: 22.10.2021

Ребята, такой вопрос.
Китайцы мне еще помогли с спецификацией передачи.
Длина пакета и сам пакет идут неверными, с чем может это быть связано? 
(Между двумя Arduino всё ок)


 

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

Есть предположение, что связано это с Extend ID (29 bit). Вероятно, что библиотечка работает со стандартным ID (11bit).

maincraft
Offline
Зарегистрирован: 22.10.2021

Есть из готовых решений что-то?)))
От чего отталкиваться? 

maincraft
Offline
Зарегистрирован: 22.10.2021

Сейчас попробую: https://github.com/coryjfowler/MCP_CAN_lib

maincraft
Offline
Зарегистрирован: 22.10.2021

sadman41, 

Подскажите пожалуйста частота должна быть 16Mhz или всё-же 8Mhz? На самом резонаторе написано 8000

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

Если на кварце 8, то и в библиотеке 8. Кварц под библиотеку не умеет подстраиваться.

maincraft
Offline
Зарегистрирован: 22.10.2021

Тогда я ничего не понимаю.

Если соединить по CAN две ардуины между собой :
То На 16Mhz коммуникация между Arduino работает, на 8Mhz нет - пакет некорректный.
При этом на кварце написано 8000 
 

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

Не знаю. Я ставил 8 и работало на 8.

maincraft
Offline
Зарегистрирован: 22.10.2021

Autowp библиотека умеет читать extended id?
Если да, то что нужно установить для этого?

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

умеют по идее обе либы читать 29бит ID, берите из моей папки они обе читают. А вот отправлять 29 бит немного отличается от 11 бит в обоих либах. Кварц если 8 то везде в библиотеках и ставьте 8 . И попробуйте листенонли убрать. У меня вроде были глюки в этом режиме . 

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

вот как отправлять 29 бит в обоих библиотеках 

maincraft
Offline
Зарегистрирован: 22.10.2021

MaksVV пишет:

умеют по идее обе либы читать 29бит ID, берите из моей папки они обе читают. А вот отправлять 29 бит немного отличается от 11 бит в обоих либах. Кварц если 8 то везде в библиотеках и ставьте 8 . И попробуйте листенонли убрать. У меня вроде были глюки в этом режиме . 

Стандартный пример не работает на установленных 8Mhz,
При этом корректно работает на 16Mhz, при этом кварц 8000

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

значит где то что то не так. Должно работать на 8 мгц. Не забывайте питание пересбрасывать при изменении настроек

maincraft
Offline
Зарегистрирован: 22.10.2021

MaksVV, простите, не нарушая правил можно с вами связаться по Telegram/Skype и тд?  (не бесплатно)
@semenich отпишитесь пжлст

maincraft
Offline
Зарегистрирован: 22.10.2021

Отписал вам на почту

maincraft
Offline
Зарегистрирован: 22.10.2021

Спасибо MaksVVsadman41 за помощь с советами.
----
Собрал на основе 
http://arduino.ru/forum/apparatnye-voprosy/arduino-uno-i-mcp2515-can?page=2
Arduino < CAN > Arduino с передачей массива Extended ID,  завелось без проблем
----
Но при подключении китайского контроллера по USB к Windows и Arduino в разрез его CAN-L, CAN-H - тишина.

 

maincraft
Offline
Зарегистрирован: 22.10.2021

maincraft пишет:

Но при подключении китайского контроллера по USB к Windows и Arduino в разрез его CAN-L, CAN-H - тишина.

К этому стоит добавить, что не просто тишина, а подключение Arduino в разрез USB адаптера (в комплекте с контроллером) с CAN-L, CAN-H к Windows программе - начинает также препятствовать ее (программе) работе!

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

Не в разрез, а параллельно, наверное?