Если вы любите технологии и часто экспериментируете с Arduino, эта статья вас заинтересует. Сегодня мы увидим, как настроить собственную сеть CAN с помощью модуля MCP2515 и Arduino. Вы узнаете, как эффективно и надежно обмениваться данными между различными устройствами в сети CAN. Этот тип сети широко используется в автомобилях и других промышленных приложениях.
Независимо от того, занимаетесь ли вы автомобильным проектом или нуждаетесь в связи между несколькими микроконтроллерами, шина CAN идеально подходит для приложений, где надежность и производительность имеют важное значение. А с помощью модуля MCP2515 очень легко интегрировать Arduino в эту сеть. Итак, будьте готовы подробно изучить протокол CAN, конфигурацию оборудования и необходимое программирование.
Что такое CAN-шина?
CAN-шина (Сеть контроллеров) — это протокол последовательной связи, который позволяет различным устройствам взаимодействовать друг с другом. Он был разработан компанией Bosch в 1986 году и предназначен специально для автомобильной промышленности, хотя его использование распространилось и на другие отрасли, например промышленную автоматизацию. В сети этого типа подключенные устройства отправляют и получают сообщения без необходимости использования центрального хоста или контроллера, что делает его очень эффективным протоколом для сред, где связь и надежность являются ключевыми факторами.
Современный автомобиль содержит более 70 устройств управления, известных как ЭБУ (электронные блоки управления), подключенных друг к другу через шину CAN. Благодаря этому протоколу ЭБУ обмениваются ключевой информацией для работы автомобиля, такой как данные о скорости автомобиля или положении акселератора.
Топология и сигналы CAN-шины
Топология системы CAN имеет тип мультимастерЭто означает, что любое устройство, подключенное к сети, может взять на себя управление шиной для отправки сообщений. Все узлы прослушивают эти сообщения и решают, отвечать на них или игнорировать.
С физической точки зрения связь осуществляется по двум кабелям: CAN_H y МОГУ ЛИ Я. Эти кабели имеют оплетку для минимизации электромагнитных помех. Кроме того, концы сети должны быть оконцованы резисторами сопротивлением 120 Ом, чтобы избежать отражений в сигнале.
CAN-сигнализация
Система CAN использует два логических состояния для связи: доминирующий y рецессивный. В доминирующем состоянии CAN_H имеет напряжение 3.5 В, а CAN_L — 1.5 В. В этом состоянии передается логический «0». С другой стороны, в рецессивном состоянии оба провода имеют напряжение 2.5 В, что указывает на то, что шина свободна и может передаваться логическая «1». Именно это изменение напряжения между двумя кабелями обеспечивает передачу данных по сети.
Модуль MCP2515
El Модуль MCP2515 Это идеальное решение для добавления CAN-подключения к вашему Arduino. Он состоит из контроллера CAN (MCP2515, который соответствует спецификации CAN 2.0B) и приемопередатчика CAN (TJA1050, который обеспечивает физическую связь). Эти два чипа работают вместе, поэтому вы можете отправлять и получать сообщения CAN с помощью Arduino через интерфейс SPI.
MCP2515 поддерживает как стандартные (11-битные), так и расширенные (29-битные) сообщения и имеет возможность отфильтровывать нежелательные сообщения с помощью масок и фильтров, что разгружает работу микроконтроллера. Это отличный вариант для проектов, требующих надежной связи, будь то в шумной обстановке или на больших расстояниях.
Компоненты модуля MCP2515
Модуль MCP2515 включает в себя следующие части:
- CAN-контроллер MCP2515: отвечает за выполнение всех функций протокола CAN, таких как передача и получение сообщений.
- CAN-трансивер TJA1050: Отвечает за преобразование данных от контроллера CAN в сигналы для физической шины CAN и наоборот.
- Контакты связи SPI: Используя контакты SCK, MOSI, MISO и CS, MCP2515 связывается с Arduino через интерфейс SPI.
- Клеммы CAN-шины: Эта небольшая винтовая клеммная колодка имеет маркировку «H» и «L». CAN_H и CAN_L должны быть подключены к сетевым кабелям CAN.
Как настроить сеть CAN с помощью Arduino
С модулем MCP2515 настройка сети CAN относительно проста. Ниже я объясню, как подключить модуль к плате Arduino и как настроить программное обеспечение.
Соединения модуля MCP2515
Для начала подключите контакты SPI вашего Arduino следующим образом:
- МИСО (выход модуля) к контакту D12 Arduino
- MOSI (вход модуля) к контакту D11 Arduino
- SCK (Часы) к контакту D13 Arduino.
- CS (Выбор микросхемы) к контакту D10 Arduino
Вам также необходимо будет подключить вывод INT MCP2515 к цифровому выводу Arduino, например D2, поскольку этот вывод используется для обработки прерываний при получении действительного сообщения.
Не забудьте включить питание вашего модуля. Вывод VCC должен быть подключен к 5 В, а вывод GND — к земле.
Что касается клемм шины CAN, подключите CAN_H к CAN_H и CAN_L к CAN_L между различными узлами, которые вы хотите соединить. Помните, что шина CAN должна быть оконцована с обоих концов резистором сопротивлением 120 Ом.
Программирование Arduino
После того, как вы подключили узлы, пришло время запрограммировать Arduino для связи с шиной CAN через модуль MCP2515. Лучший способ сделать это — использовать подходящую библиотеку, например библиотеку 'mcp2515'.
Во-первых, вам нужно установить эту библиотеку. Если вы используете Arduino IDE, выберите «Скетч» > «Включить библиотеку» > «Управление библиотеками». Найдите «mcp2515» и выберите вариант установки.
Установив библиотеку, вы можете приступить к написанию кода для узла передатчика и узла приемника. Ниже я покажу вам основные примеры для обоих.
Пример кода для узла передатчика
Этот код отправляет сообщение «Hello World» по шине CAN каждую секунду.
#include void setup() { Serial.begin(9600); while (!Serial); Serial.println("Nodo transmisor CAN"); if (!CAN.begin(500E3)) { Serial.println("Error al iniciar CAN"); while (1); }}void loop() { Serial.print("Enviando mensaje... "); CAN.beginPacket(0x12); CAN.write('H'); CAN.write('o'); CAN.write('l'); CAN.write('a'); CAN.write(' '); CAN.write('M'); CAN.write('u'); CAN.write('n'); CAN.write('d'); CAN.write('o'); CAN.endPacket(); Serial.println("Mensaje enviado correctamente"); delay(1000);}
Пример кода для принимающего узла
Этот код получает сообщения от CAN-шины и отображает их на последовательном мониторе.
#include void setup() { Serial.begin(9600); while (!Serial); Serial.println("Nodo receptor CAN"); if (!CAN.begin(500E3)) { Serial.println("Error al iniciar CAN"); while (1); } CAN.onReceive(onReceive);}void loop() {}void onReceive(int packetSize) { Serial.print("Mensaje recibido con ID: 0x"); Serial.print(CAN.packetId(), HEX); Serial.print(" | Tamaño: "); Serial.print(packetSize); Serial.print(" | Datos: "); while (CAN.available()) { Serial.print((char)CAN.read()); } Serial.println();}
Скорости и расстояния в сети CAN
CAN-шина обеспечивает связь на различных скоростях. Максимальная скорость, поддерживаемая MCP2515, составляет 1 Мбит/с, но длина шины ограничивает скорость передачи. Например, при скорости 1 Мбит/с максимальная длина шины составляет примерно 40 метров. Однако если вам нужно преодолеть большие расстояния, вы можете снизить скорость. При скорости 125 кбит/с длина шины может достигать 500 метров.
Важно хорошо спланировать сеть и использовать скорость, соответствующую длине шины и среде, в которой она будет использоваться, поскольку шумная среда может повлиять на качество связи.
Также не забудьте использовать витую пару для кабелей CAN_H и CAN_L, поскольку это помогает уменьшить электромагнитные помехи и повысить надежность сети.
CAN-сеть с несколькими узлами
Если вы хотите сформировать сеть из нескольких узлов, процесс очень похож. Единственное, что вам нужно сделать, это убедиться, что все узлы подключены параллельно к линиям CAN_H и CAN_L. Также не забудьте размещать согласующие резисторы только на концах основной линии, а не в промежуточных узлах.
В более сложной сети у вас может быть несколько узлов, которые действуют как передатчики и приемники. Каждый узел добавляет минимальную нагрузку на шину, позволяя подключить до 112 узлов к сети CAN без существенного влияния на производительность.
Независимо от того, используете ли вы шину CAN в автомобиле для считывания данных двигателя или в промышленном проекте для связи с несколькими датчиками, модуль MCP2515 позволяет легко и эффективно добавить эту функциональность. Этот тип сети идеально подходит для приложений, где важна низкая задержка и надежность передачи данных.