Используйте этот надежный протокол последовательной связи для соединения двух плат Arduino и отправки данных друг другу.

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

Мы расскажем вам, как построить CAN-шину с помощью CAN-модуля MCP2515, используя Arduino и макетную плату. Мы также рассмотрим библиотеку Arduino CAN и продемонстрируем, как отправлять и получать данные по шине CAN.

Что такое CAN-шина?

Шина CAN — это протокол последовательной связи, разработанный Bosch в 1980-х годах. Он широко используется в различных приложениях из-за его высокой надежности и прочности. Он позволяет передавать данные между устройствами на высоких скоростях с минимальной задержкой всего по двум линиям: CAN High и CAN Low.

instagram viewer

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

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

Знакомство с CAN-модулем MCP2515

Модуль контроллера шины CAN MCP2515 — это устройство, обеспечивающее исключительную поддержку широко используемого протокола CAN версии 2.0B. Этот модуль идеально подходит для связи на высоких скоростях передачи данных до 1 Мбит/с.

Микросхема MCP2515 — это независимый CAN-контроллер с интерфейсом SPI, который обеспечивает связь с широким спектром микроконтроллеров. Микросхема TJA1050, с другой стороны, функционирует как интерфейс между микросхемой контроллера CAN MCP2515 и физической шиной CAN.

Для дополнительного удобства имеется перемычка, позволяющая подключить оконечную нагрузку 120 Ом, что еще больше упрощает подключение проводов к CAN_H & МОГУ ЛИ Я винты для связи с другими модулями CAN.

Особенность

Спецификация

Трансивер

TJA1050

Интерфейс микроконтроллера

SPI (позволяет интегрировать шину Multi CAN)

Кварцевый осциллятор

8 МГц

Прекращение

120Ω

Скорость

1 Мбит/с

Потребляемая мощность

Слаботочный режим ожидания

Измерение

40 х 28 мм

Емкость узла

Поддерживает до 112 узлов

Дополнительную информацию вы можете получить в Техническое описание MCP2515 если вам нужен этот модуль для более продвинутого проекта.

Структура сообщения CAN

Структура сообщения CAN состоит из нескольких сегментов, но наиболее важными сегментами для этого проекта являются идентификатор и данные. Идентификатор, также известный как CAN ID или номер группы параметров (PGN), идентифицирует устройства в сети CAN. сети, а длина идентификатора может быть как 11, так и 29 бит, в зависимости от типа CAN-протокола использовал.

Между тем, данные представляют собой фактически передаваемые данные датчика/управления. Данные могут иметь длину от 0 до 8 байтов, а код длины данных (DLC) указывает количество присутствующих байтов данных.

Библиотека CAN-шины Arduino MCP2515

Эта библиотека реализует МОЖЕТ протокол V2.0B, который может работать на скорости до 1 Мбит/с. Он обеспечивает интерфейс SPI, который может работать на скоростях до 10 МГц, поддерживая как стандартные (11-битные), так и расширенные (29-битные) данные. Более того, он поставляется с двумя приемными буферами, которые обеспечивают приоритетное хранение сообщений.

Инициализация CAN-шины

Вот код установки, который вам понадобится для инициализации шины CAN:

#включать
#включать

MCP2515 mcp2515(10); // Установить вывод CS

пустотанастраивать(){
пока (!Серийный);
Серийный.начинать(9600);
СПИ.начинать(); //Начинает SPI-связь

mcp2515.сброс();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

Это инициализирует MCP2515 со скоростью передачи данных CAN 500 Кбит/с и частотой генератора 8 МГц.

MCP2515 CAN Рабочие режимы

Существует три режима работы контроллера шины CAN MCP2515:

  • установитьнормальный режим(): настраивает контроллер на отправку и получение сообщений.
  • установитьLoopbackMode(): настраивает контроллер на отправку и получение сообщений, но сообщения, которые он отправляет, также будут приниматься им самим.
  • setListenOnlyMode(): настраивает контроллер только на получение сообщений.

Это вызовы функций, используемые для установки режима работы контроллера шины CAN MCP2515.

mcp2515.setNormalMode();

mcp2515.setLoopbackMode();

mcp2515.setListenOnlyMode();

Отправка данных по шине CAN

Чтобы отправить сообщение по CAN-шине, используйте отправитьMsgBuf() метод:

неподписанныйуголь данные [] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, данные);

Это отправляет сообщение с идентификатором 0x01 и полезная нагрузка данных {0x01, 0x02, 0x03, 0x04}. Первый параметр — это идентификатор CAN, второй — приоритет сообщения, третий — длина полезной нагрузки данных, а четвертый — сама полезная нагрузка данных.

отправитьMsgBuf() метод возвращает значение, указывающее, было ли сообщение отправлено успешно или нет. Вы можете проверить это значение, вызвав проверитьОшибка() метод:

если (CAN.checkError()) {
Серийный.печать(«Ошибка отправки сообщения».);
}

Это проверяет, произошла ли ошибка во время передачи сообщения, и печатает сообщение об ошибке, если это необходимо.

Получение данных с CAN-шины

Для получения сообщения по CAN-шине можно использовать читатьMsgBuf() метод:

неподписанныйуголь Лен = 0;
неподписанныйуголь баф[8];
неподписанныйуголь canID = 0;

если (CAN.checkReceive()) {
CAN.readMsgBuf(&len, buf);
canID = CAN.getCanId();
}

Это проверяет, доступно ли сообщение на шине CAN, а затем считывает сообщение в буф множество. Длина сообщения хранится в Лен переменная, а идентификатор сообщения хранится в canID переменная.

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

Серийный.Распечатать("Получено сообщение с идентификатором");
Серийный.Распечатать(canID, HEX);
Серийный.Распечатать(" и данные: ");

для (инт я = 0; я < лен; я++) {
Серийный.Распечатать(buf[i], HEX);
Серийный.Распечатать(" ");
}

Серийный.печать();

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

Как подключить приемопередатчик шины CAN к макетной плате

Чтобы построить CAN-шину для соединения двух устройств в этом примерном проекте, вам понадобятся:

  • Два микроконтроллера (две платы Arduino Nano для этого примера)
  • Два CAN-модуля MCP2515
  • Макет
  • Перемычки
  • Модуль ЖК-экрана I2C 16x2.
  • Ультразвуковой датчик HC-SR04

Для этого примера проекта в скетче Arduino используются четыре библиотеки. Есть НовыйPing библиотека, которая обеспечивает простой в использовании интерфейс для ультразвукового датчика, а также SPI-библиотека, который облегчает связь между платой Arduino и контроллером шины CAN MCP2515. Жидкий Кристалл_I2C библиотека используется для модуля дисплея.

Наконец, есть библиотека mcp2515 для взаимодействия с микросхемой MCP2515, что позволяет нам легко передавать данные по сети шины CAN.

Настройка оборудования (пример HC-SR04)

В этом проекте с использованием датчика HC-SR04 и ЖК-дисплея одна плата Arduino Nano будет выступать в роли приемника, а другая — в качестве отправителя. Подключите компоненты передатчика в соответствии с приведенной ниже схемой подключения:

Вот схема цепи приемника:

Наконец, соедините два узла вместе, используя CAN_H и МОГУ ЛИ Я линии, как показано:

При подключении модулей важно убедиться, что напряжение питания находится в пределах указанного диапазона и что МОЖЕТ Н и МОГУ ЛИ Я контакты правильно подключены к шине.

Программирование модуля шины CAN MCP2515

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

Код отправителя:

#включать
#включать
#включать

MCP2515 mcp2515(10);
константабайт триггер = 3;
константабайт эхоПин = 4;
НовыйPing сонар(тригпин, эхопин, 200);

структураcan_framecanMsg;

пустотанастраивать(){
Серийный.начинать(9600);
mcp2515.сброс();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}

пустотапетля(){
неподписанныйинт расстояние = sonar.ping_cm();
canMsg.can_id = 0x036; //Идентификатор CAN как 0x036
canMsg.can_dlc = 8; //Длина данных CAN равна 8
canMsg.data[0] = расстояние; // Обновить значение влажности в [0]
canMsg.data[1] = 0x00; // Остальное все с 0
canMsg.data[2] = 0x00;
canMsg.data[3] = 0x00;
canMsg.data[4] = 0x00;
canMsg.data[5] = 0x00;
canMsg.data[6] = 0x00;
canMsg.data[7] = 0x00;

mcp2515.sendMessage(&canMsg);//Отправляет сообщение CAN
задерживать(100);
}

Код получателя:

#включать
#включать
#включать

MCP2515 mcp2515(10);
Жидкий Кристалл_I2C ЖК(0x27,16,2);
структураcan_framecanMsg;

пустотанастраивать(){
Серийный.начинать(9600);

mcp2515.сброс();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
ЖК-подсветка();
ЖК.установитькурсор(0, 0);
ЖК.Распечатать("МУО КАН ТУТОРИАЛ");
задерживать(3000);
ЖК.прозрачный();
}

пустотапетля(){
если (mcp2515.читать сообщение(&canMsg) == MCP2515::ERROR_OK) // Для получения данных
{
инт расстояние = canMsg.data[0];
ЖК.установитькурсор(0,0);
ЖК.Распечатать(«Расстояние:»);
ЖК.Распечатать(расстояние);
ЖК.Распечатать("см ");
}
}

Поднимите свои проекты Arduino на новый уровень

Комбинация шины CAN и Arduino обеспечивает мощную платформу для создания или изучения сложных коммуникационных сетей, используемых в различных приложениях. Хотя это может показаться крутым процессом обучения, наличие собственной настройки на макетной плате — довольно удобный способ изучить основы использования сети CAN-шины в сложных проектах «сделай сам».