Интернет-магазин «Неглупый Дом»
Два модуля MCP2515, соединённые CAN-H/CAN-L, передают короткие кадры между платами.
CAN — дифференциальная шина: данные передаются разницей напряжений между CAN-H и CAN-L, что делает её устойчивой к помехам — поэтому её используют в автомобилях. MCP2515 — отдельный контроллер CAN-протокола, Arduino общается с ним через SPI, как с SD-картой или RFID-модулем.
Идентификатор кадра (`0x100`) в реальных сетях — это приоритет: при одновременной передаче узел с меньшим ID автоматически получает приоритет без коллизии, это встроено в протокол.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, что указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, я языковая
// модель, а не специализированный кодер, могу что-то упустить.
#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: Электронные модули.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.