Электронный компонент:Шилд CAN-BUS V1.2

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Шилд CAN-BUS V1.2[1]

Шина CAN – это распространенный интерфейс в электротехнике, ставший популярным благодаря большой дальности передачи, средней скорости коммуникации и высокой надежности. Она широко используется в современных инструментах (например, в интерфейсах для диагностики автомобилей).

В шилд CAN-BUS М1.2 встроен CAN-контроллер MCP2515, оснащенный интерфейсом SPI, и CAN-трансивер MCP2551 – вместе эти устройства дают вашей Arduino возможность обмениваться данными через шину CAN. Кроме того, если у вас есть конвертерный кабель OBD-II и импортирована библиотека OBD-II, вы также можете сделать диагностическое устройство или устройство для записи логов.

Версии

Данная статья подходит для следующих версий продукта:

  • Шилд CAN BUS V1.0 – выпущена 14 октября 2012 года (устарела)
  • Шилд CAN BUS V1.1 – выпущена 10 августа 2013 года (устарела)
  • Шилд CAN BUS V1.2 – выпущена 5 января 2015 года
  • Шилд CAN BUS V2.0 – выпущена 1 августа 2017 года

Альтернатива

Если ваш проект ограничен в пространстве, и кроме шины CAN вам ничего не нужно, то вместо целого «шилда» можно воспользоваться более компактным и дешевым Grove-модулем с функционалом шины CAN (совместим с Arduino). Более подробно смотрите на странице продукта.

Подключение к автомобилю

Если вы хотите подключиться к автомобилю, а затем считывать с него данные или даже управлять, можно воспользоваться кабелем OBD/DB9. Например, этим. Этот кабель совместим со всем, что оснащено OBD-коннектором.

Анализатор USB-CAN

Если вам нужен анализатор для диагностики шины CAN, то разработчики рекомендуют вот это устройство.

Функции

  • Шина CAN 2.0B со скоростью до 1 Мбит/сек
  • Интерфейс SPI с частотой до 10 МГц
  • Стандартный (11 бит) и расширенный (29 бит) кадры данных и удаленного запроса
  • Два приемных буфера с приоритетом для хранения сообщений
  • Коннектор DB-9, соответствующий техническому стандарту
  • Светодиодные индикаторы

Примечание: Шилд CAN-BUS совместим с Arduino Uno (ATmega328), Arduino Mega (ATmega1280/ATmega2560) и Arduino Leonardo (ATmega32U4).

Описание компонентов

Внимание: При использовании в одной сети более двух шилдов CAN-BUS нужно принимать во внимание импеданс. Вам нужно либо отрезать из платы ножом P1, либо вынуть R3.

Распиновка

Примечание: Контакты, подписанные «FREE», можно использовать для собственных целей.

Интерфейс DB9 и OBD-II

Контакт CS

На версии V1.2 контакт SPI_CS по умолчанию подключен к D9. Если вы хотите поменять его на D10, следуйте инструкциям ниже:

1. Посмотрите на заднюю сторону печатной платы и найдите элемент, подписанный «CS»

2. Перережьте дорожку между площадкой, подписанной «9», и средней площадкой

3. Спаяйте вместе среднюю площадку и площадку, подписанную «10»

Внимание: Осторожней обращайтесь с канцелярским ножом. Пользуясь им, можно не только повредить плату, но и пораниться самому.

Контакты SPI

По умолчанию контакты SPI (SCK, MISO и MOSI) подключены к контактам ICSP. Но на некоторых платах контакты SPI расположены на контактах D11-D13. Если это так, вам нужно будет немного модифицировать дорожки на печатной плате. Взгляните на обратную сторону шилда – там есть три перемычки под названиями MOSI, MISO и SCK. По умолчанию все они подключены к «A». Их нужно переподключить к «B».

Примечание: Для Arduino Uno, Arduino Leonardo и прочих AVR-плат Arduino подойдут и настройки по умолчанию.

Внимание: Будьте осторожны при переподключении контактов SPI. Есть риск, что в процессе можно не только повредить плату, но и пораниться самому.

С чего начать

Ниже – простой пример, демонстрирующий, как работает шилд CAN-BUS. Для него понадобится два щилда, а также две платы Arduino или Seeeduino.

Примечание: Этот скетч для IDE Arduino версии 1.6.9 и выше.

Шаг 1. Какие компоненты нужны

Название Функция Количество Ссылка
Шилд BUS-CAN Коммуникация через шину CAN 2 Ссылка
Плата Seeeduino V4.2 Контроллер 2 Ссылка
Провода-перемычки Соединение контактов 2 Ссылка

Шаг 2. Подключаем компоненты

Вставьте шилды в Seeeduino V4.2 и подключите шилды друг к другу при помощи проводов-перемычек. Подробнее смотрите на картинке ниже:

Примечание: CAN_H к CAN_H, CAN_L к CAN_L.

Шаг 3. Установка ПО

Во-первых, вам нужно установить на ПК библиотеку «CAN_BUS_Shield». Скачать ее можно из этого GitHub-репозитория. О том, как устанавливать в IDE Arduino дополнительные библиотеки, читайте тут.

Один из узлов (под «узлом» подразумевается пара «шилд + Seeeduino») будет действовать в качестве ведущего, а другой – в качестве ведомого. Ведущий узел будет постоянно отправлять данные на ведомый узел.

Примечание: Перед загрузкой кода каждый узел ведет себя как ведущий.

Сначала кликните в IDE Arduino на Файл > Примеры > CAN_BUS_Shield-master > send (File > Examples > CAN_BUS_Shield-master > send) и загрузите этот скетч на ведущий узел.

Затем кликните в IDE Arduino на Файл > Примеры > CAN_BUS_Shield-master > receive_check (File > Examples > CAN_BUS_Shield-master > receive_check) и загрузите этот скетч на ведомый узел.

Шаг 4. Смотрим результат

Откройте в IDE Arduino монитор порта для ведомого узла. Вы увидите в нем данные, которые присылает ведущий узел.

API

Скорость передачи данных

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

#define CAN_5KBPS    1
#define CAN_10KBPS   2
#define CAN_20KBPS   3
#define CAN_25KBPS   4
#define CAN_31K25BPS 5
#define CAN_33KBPS   6
#define CAN_40KBPS   7
#define CAN_50KBPS   8
#define CAN_80KBPS   9
#define CAN_83K3BPS  10
#define CAN_95KBPS   11
#define CAN_100KBPS  12
#define CAN_125KBPS  13
#define CAN_200KBPS  14
#define CAN_250KBPS  15
#define CAN_500KBPS  16
#define CAN_666kbps  17
#define CAN_1000KBPS 18

Приемные маски и фильтры

Чип-контроллер оснащен 2 регистрами приемных масок и 5 регистрами приемных фильтров – они обеспечивают получение данных от целевого устройства. Они особенно полезны при использовании в сетях, состоящих из большого количества узлов.

Для использования этих регистров в библиотеке «CAN_BUS_Shield» есть две функции.

Для маски:

init_Mask(unsigned char num, unsigned char ext, unsigned char ulData);

Для фильтра:

init_Filt(unsigned char num, unsigned char ext, unsigned char ulData);

Аргументы значат следующее:

  • num – какой регистр использовать. Для регистра маски доступны значения «0» и «1», а для регистра фильтра – от «0» до «5»
  • ext – статус кадра. Значение «0» будет означать, что это маска или фильтр для стандартного кадра, а «1» – для расширенного кадра.
  • ulData – содержание маски или фильтра

Проверка получения данных

Чип MCP2515 может либо использовать дополнительные контакты, чтобы сообщить о том, что передача или получение кадра прошли успешно, либо работать в режиме опроса, в котором ПО проверяет, не пришел ли какой-нибудь кадр.

Для режима опроса воспользуйтесь следующей функцией:

INT8U MCP_CAN::checkReceive(void);

Если кадр получен, функция вернет «1», а если ничего не пришло, то «0».

Считывание CAN-идентификатора

Получив данные, вы можете прочесть CAN-идентификатор «отправляющего» узла. Для этого воспользуйтесь следующей функцией:

INT32U MCP_CAN::getCanId(void)

Отправка данных

Чтобы отправить данные на шину CAN, воспользуйтесь следующей функцией:

CAN.sendMsgBuf(INT8U id, INT8U ext, INT8U len, data_buf);

Ее аргументы означают следующее:

  • id – откуда пришли данные
  • ext – статус кадра. Значение «0» – для стандартного кадра, «1» – для расширенного кадра
  • len – размер кадра
  • data_buf – содержимое сообщения

К примеру, в скетче-примере «send» эта функция выглядит следующим образом:

unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7};
CAN.sendMsgBuf(0x00, 0, 8, stmp);

Считывание данных

Эта функция используется для получения данных «принимающим» узлом:

CAN.readMsgBuf(unsigned char len, unsigned char buf);

Получение данных осуществляется в условиях, заданных в масках и фильтрах. Другими словами, эта функция считывает только те кадры, что соответствуют требованиям масок и фильтров.

  • len – размер данных
  • buf – куда будут сохранены данные

Генерация новой скорости передачи данных

Разработчики библиотеки «CAN_BUS_Shield» предоставили несколько вариантов для скорости передачи данных:

#define CAN_5KBPS    1
#define CAN_10KBPS   2
#define CAN_20KBPS   3
#define CAN_25KBPS   4
#define CAN_31KBPS   5
#define CAN_33KBPS   6
#define CAN_40KBPS   7
#define CAN_50KBPS   8
#define CAN_80KBPS   9
#define CAN_83KBPS   10
#define CAN_95KBPS   11
#define CAN_100KBPS  12
#define CAN_125KBPS  13
#define CAN_200KBPS  14
#define CAN_250KBPS  15
#define CAN_500KBPS  16
#define CAN_666KBPS  17
#define CAN_1000KBPS 18

Но среди этих вариантов может не оказаться скорости, которая нужна лично вам.

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

Примечание: Эта программу поддерживает только Windows. Если у вас не получается ее запустить, обратитесь за помощью на loovee@seeed.cc. Откройте программу. Сначала задайте нужную скорость передачи данных, затем выставьте остальные настройки (см. картинку выше) и кликните на «Рассчитать».

В результате будут рассчитаны определенные данные, включая «cfg1», «cfg2» и «cfg3».

Теперь нужно немного модифицировать библиотеку.

Откройте файл «mcp_can_dfs.h», прокрутите примерно до 272 строчки, а затем вставьте туда код ниже:

#define MCP_16MHz_xxxkBPS_CFG1 (cfg1)  //  «xxx» - это нужная 
                                       //          вам скорость
#define MCP_16MHz_xxxkBPS_CFG2 (cfg2)
#define MCP_16MHz_xxxkBPS_CFG3 (cfg2)

Затем прокрутите примерно до 390 строчки и добавьте туда следующий код:

#define CAN_xxxKBPS NUM  //  «xxx» - это нужная вам скорость 
                         //  передачи данных, а «NUM» – это номер,
                         //  который должен отличаться от остальных

Все! Теперь вы можете использовать сгенерированную скорость. Кроме того, разработчики библиотеки просят, чтобы вы, сгенерировав новую скорость, сделали им pull-запрос (т.е. запрос на внесение изменений) на GitHub – чтобы они добавили эту скорость в библиотеку, тем самым упростив работу другим пользователям.

Проекты

Вот несколько интересных проектов, которые можно сделать при помощи шилда CAN-BUS:

Приборная панель для автомобильного симулятора

Когда-нибудь хотели поиграть в автомобильный симулятор с приборной панелью из настоящего автомобиля? Я тоже! В проекте используется панель из VW Polo 6R, через шину CAN подключенная к узлу из Arduino и шилда Seeed CAN BUS.

О том, как собрать проект, читайте тут.

Взлом автомобиля

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

Все электронные функции автомобиля подключены к TIPM (от «Totally Integrated Power Module», что можно перевести как «полностью интегрированный блок питания»). Среди них, к примеру, реле для закрытия дверей, маленькие моторы для проветривания окон и т.д.

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

О том, как собрать этот проект, читайте тут.

FAQ

Вопрос 1: Я не могу получить данные от другого CAN-устройства. Как быть?

  • Проверьте правильность подключений
  • Проверьте правильность настроек для скорости коммуникации

Вопрос 2: Монитор порта пишет об ошибке инициализации. В чем дело?

  • Проверьте, соответствуют ли настройки контакта CS тому, что написано в коде. На версиях шилда V1.1 и V1.2 контакт CS подключен к D9, а на других – к D10

Вопрос 3: Где мне найти техническую поддержку, если у меня возникнут другие проблемы?

  • Можно задать вопрос на форуме Seeed или отправить его на почтовый ящик techsupport@seeed.cc

Полезные ссылки

См.также

Внешние ссылки