Ако обичате технологиите и често правите експерименти с Arduino, тази статия ще ви очарова. Днес ще видим как да настроите своя собствена CAN мрежа с помощта на модула MCP2515 и Arduino. Ще откриете как да комуникирате между различни устройства в CAN мрежа ефективно и надеждно. Този тип мрежа се използва широко в автомобилите и други индустриални приложения.
Независимо дали правите автомобилен проект или се нуждаете от комуникация между множество микроконтролери, CAN шината е идеална за приложения, където надеждността и производителността са от съществено значение. И с модула MCP2515 е много лесно да интегрирате Arduino в тази мрежа. Така че, пригответе се да научите в дълбочина CAN протокола, хардуерната конфигурация и необходимото програмиране.
Какво е CAN bus?
CAN шината (Controller Area Network) е сериен комуникационен протокол, който позволява на различни устройства да комуникират помежду си. Той е разработен през 1986 г. от Bosch и е проектиран специално за автомобилни приложения, въпреки че употребата му се е разпространила и в други сектори, като индустриална автоматизация. В този тип мрежа свързаните устройства изпращат и получават съобщения без нужда от централен хост или контролер, което го прави много ефективен протокол за среди, където комуникацията и надеждността са ключови.
Модерният автомобил съдържа повече от 70 контролни устройства, известни като ECU (електронни контролни блокове), свързани помежду си чрез CAN шината. Благодарение на този протокол ECU-тата обменят ключова информация за работата на автомобила, като данни за скоростта на автомобила или позицията на педала на газта.
Топология и сигнали на CAN шината
Топологията на CAN системата е типова мултимастър, което означава, че всяко устройство, свързано към мрежата, може да поеме контрола над шината, за да изпраща съобщения. Всички възли слушат тези съобщения и решават дали да отговорят или да ги игнорират.
От физическа гледна точка комуникацията се осъществява чрез два кабела: CAN_H y CAN_L. Тези кабели са сплетени, за да се сведат до минимум електромагнитните смущения. Освен това краищата на мрежата трябва да бъдат терминирани с резистори от 120 ома, за да се избегнат отражения в сигнала.
CAN сигнализация
CAN системата използва две логически състояния за комуникация: доминиращ y рецесивен. В доминиращо състояние CAN_H има напрежение от 3.5 V, а CAN_L има напрежение от 1.5 V. В това състояние се предава логическа '0'. От друга страна, в рецесивно състояние и двата проводника имат напрежение от 2.5 V, което показва, че шината е свободна и може да се предаде логическа '1'. Именно тази промяна в напрежението между двата кабела позволява предаване на данни в мрежата.
Модул MCP2515
El MCP2515 модул Това е идеално решение за добавяне на CAN свързаност към вашия Arduino. Състои се от CAN контролер (MCP2515, който следва спецификацията CAN 2.0B) и CAN трансивър (TJA1050, който управлява физическа комуникация). Тези два чипа работят заедно, така че можете да изпращате и получавате CAN съобщения с вашия Arduino чрез SPI интерфейса.
MCP2515 поддържа както стандартни (11-битови), така и разширени (29-битови) съобщения и има способността да филтрира нежеланите съобщения чрез използването на маски и филтри, което разтоварва работата от микроконтролера. Това е отличен вариант за проекти, които изискват надеждна комуникация, независимо дали в шумна среда или на дълги разстояния.
Компоненти на модул MCP2515
Модулът MCP2515 включва следните части:
- MCP2515 CAN контролер: Отговаря за изпълнението на всички функции на CAN протокола, като предаване и получаване на съобщения.
- TJA1050 CAN трансивър: Отговаря за преобразуването на данни от 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
- МОСИ (модулен вход) към пин D11 на Arduino
- SCK (Часовник) към Arduino щифт D13
- CS (Избор на чип) към пин D10 на Arduino
Ще трябва също да свържете INT щифта на MCP2515 към цифров щифт на Arduino, например D2, тъй като този щифт се използва за обработка на прекъсвания, когато се получи валидно съобщение.
Не забравяйте да захранвате вашия модул. Щифтът VCC трябва да бъде свързан към 5V, а щифтът GND към маса.
Що се отнася до клемите на CAN шината, свържете CAN_H към CAN_H и CAN_L към CAN_L между различните възли, които искате да свържете. Не забравяйте, че CAN шината трябва да бъде терминирана в двата края с резистор от 120 ома.
Програмиране на Arduino
След като свържете възлите, е време да програмирате вашия Arduino да комуникира с CAN шината чрез модула MCP2515. Най-добрият начин да направите това е като използвате подходяща библиотека, като библиотеката 'mcp2515'.
Първо, трябва да инсталирате тази библиотека. Ако използвате Arduino IDE, отидете на Sketch > Include Library > Manage Libraries. Потърсете „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 Mbit/s, но дължината на шината ограничава скоростта на предаване. Например при 1 Mbit/s максималната дължина на шината е приблизително 40 метра. Въпреки това, ако трябва да пътувате на по-големи разстояния, можете да намалите скоростта си. При 125 kbit/s дължината на шината може да достигне 500 метра.
Важно е да планирате добре мрежата и да използвате подходящата скорост за дължината на шината и средата, в която ще се използва, тъй като шумната среда може да повлияе на качеството на комуникацията.
Също така не забравяйте да използвате усукана двойка за CAN_H и CAN_L кабели, тъй като това помага за намаляване на електромагнитните смущения и подобрява надеждността на мрежата.
CAN мрежа с множество възли
Ако искате да формирате мрежа с няколко възела, процесът е много подобен. Единственото нещо, което трябва да направите, е да свържете всички възли паралелно към линиите CAN_H и CAN_L. Също така не забравяйте да поставите крайни резистори само в краищата на главната линия, а не в междинните възли.
В по-сложна мрежа може да имате множество възли, които действат като предаватели и приемници. Всеки възел добавя минимално натоварване към шината, позволявайки до 112 възела да бъдат свързани в CAN мрежа, без това да повлияе значително на производителността.
Независимо дали използвате CAN шина в автомобил за четене на данни на двигателя или в индустриален проект за комуникация на множество сензори, модулът MCP2515 прави лесно и ефективно добавянето на тази функционалност. Този тип мрежа е идеална за приложения, където ниската латентност и надеждността при предаване на данни са от съществено значение.