🛒
0 товар.
0 руб.
Логотип

Интернет-магазин «Неглупый Дом»

☰
ИИ-консультант Wildberries OZON Яндекс Маркет
Поиск по сайту
Гугл таблица с ассортиментом

🚌 Проект: обмен данными между двумя Arduino по шине CAN

Два модуля MCP2515

Два модуля MCP2515, соединённые CAN-H/CAN-L, передают короткие кадры между платами.

Как это работает

CAN — дифференциальная шина: данные передаются разницей напряжений между CAN-H и CAN-L, что делает её устойчивой к помехам — поэтому её используют в автомобилях. MCP2515 — отдельный контроллер CAN-протокола, Arduino общается с ним через SPI, как с SD-картой или RFID-модулем.

Идентификатор кадра (`0x100`) в реальных сетях — это приоритет: при одновременной передаче узел с меньшим ID автоматически получает приоритет без коллизии, это встроено в протокол.

Пошаговая сборка

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

  1. MCP2515 (SPI): CS → D10, SCK → D13, MOSI → D11, MISO → D12, VCC → 5V, GND → GND (на обеих платах).
  2. CAN-H и CAN-L соединяют оба модуля напрямую, не перепутав полярность.
  3. Резистор 120 Ом на каждом конце — если у модулей уже есть встроенный терминатор, третий не нужен.
  4. `MCP_8MHZ` в коде должен совпадать с реальной частотой кварца на модуле (бывает 16 МГц — тогда `MCP_16MHZ`).

Скетч (отправитель)

// ВНИМАНИЕ: рекомендую отладить код через монитор порта, я языковая
// модель, а не специализированный кодер, могу что-то упустить.

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

MCP_CAN CAN(10);

void setup() {
  Serial.begin(9600);
  while (CAN.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) != CAN_OK) {
    Serial.println("Ошибка инициализации MCP2515, повтор...");
    delay(500);
  }
  CAN.setMode(MCP_NORMAL);
  Serial.println("CAN готов к отправке");
}

void loop() {
  byte data[1] = {42};
  CAN.sendMsgBuf(0x100, 0, 1, data);
  Serial.println("Отправлено: 42");
  delay(1000);
}
                

На второй плате: `CAN.readMsgBuf(&len, buf)` внутри `if (CAN.checkReceive() == CAN_MSGAVAIL)` — `buf[0]` будет равен 42.

Частые проблемы

Как улучшить проект

Товары по теме

Ещё модули для Arduino: Электронные модули.

← 📝 логгер температуры в энергонез…🔗 обмен данными между Arduino на… →

Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.

Корзина

Поиск


Пример: понижающий или DC-DC или mini360 или aw-023 или арт. OZ/WB/YA