Използвайте този стабилен сериен комуникационен протокол, за да свържете две платки Arduino заедно и да изпращате данни един към друг.
Шината на контролерната мрежа (CAN) е стабилен и надежден комуникационен протокол, който се използва широко в различни индустриални, автомобилни и космически приложения. Предназначен е за предаване на данни между микроконтролери и устройства по CAN bus мрежа. Може би все още не знаете това, но това е нещото зад онези луди модификации на таблото на колата, които виждате в социалните медии.
Ще ви преведем как да изградите CAN шина с CAN модула MCP2515 с помощта на Arduino и макет. Ще разгледаме и CAN библиотеката на Arduino и ще демонстрираме как да изпращаме и получаваме данни през CAN шината.
Какво е CAN шина?
CAN шината е сериен комуникационен протокол, разработен от Bosch през 80-те години. Той се използва широко в различни приложения поради високата си надеждност и здравина. Той позволява предаване на данни между устройства с висока скорост с минимално забавяне само по две линии: CAN High и CAN Low.
През 1994 г. CAN шината става международен стандарт (ISO 11898), който е проектиран специално за бърз сериен обмен на данни между електронни контролери в автомобилни приложения. Вижте нашето изчерпателно ръководство за какво е CAN шина и каква роля играе в автомобилните системи за повече подробности.
Една от причините CAN шината да е толкова популярна е поради нейните функции за откриване и коригиране на грешки. Протоколът може да открива и коригира грешки при предаването на данни. Това го прави идеален за приложения, където целостта на данните е критична, като например в индустриалната автоматизация.
Познаване на CAN модула MCP2515
Модулът MCP2515 CAN Bus Controller е устройство, което осигурява изключителна поддръжка за широко използвания CAN протокол версия 2.0B. Този модул е идеален за комуникация при високи скорости на данни до 1Mbps.
MCP2515 IC е независим CAN контролер със SPI интерфейс, който позволява комуникация с широк набор от микроконтролери. TJA1050 IC, от друга страна, функционира като интерфейс между IC CAN контролера MCP2515 и физическата CAN шина.
За допълнително удобство има джъмпер, който ви позволява да прикачите 120 ома терминатор, което прави още по-лесно свързването на вашите кабели към CAN_H & CAN_L винтове за комуникация с други CAN модули.
Особеност |
Спецификация |
---|---|
Трансивър |
TJA1050 |
Интерфейс на микроконтролера |
SPI (позволява интегриране на Multi CAN шина) |
Кристален осцилатор |
8MHz |
Прекратяване на договора |
120Ω |
Скорост |
1Mbps |
Консумация на енергия |
Слаботокова работа в режим на готовност |
Измерение |
40 х 28 мм |
Капацитет на възела |
Поддържа до 112 възли |
Допълнителна информация можете да получите от MCP2515 лист с данни в случай, че имате нужда от този модул за по-напреднал проект.
CAN структура на съобщението
Структурата на CAN съобщението се състои от множество сегменти, но най-критичните сегменти за този проект са идентификаторът и данните. Идентификаторът, известен също като CAN ID или номер на група параметри (PGN), идентифицира устройствата в CAN мрежа, а дължината на идентификатора може да бъде 11 или 29 бита, в зависимост от вида на CAN протокола използвани.
Междувременно данните представляват действителните данни от сензора/контрола, които се предават. Данните могат да бъдат с дължина от 0 до 8 байта, а кодът за дължина на данните (DLC) показва броя на наличните байтове данни.
Библиотеката на Arduino MCP2515 CAN Bus
Тази библиотека реализира CAN V2.0B протокол, който може да работи със скорост до 1Mbps. Той осигурява SPI интерфейс, който може да работи със скорости до 10MHz, като същевременно поддържа стандартни (11-битови) и разширени (29-битови) данни. Нещо повече, той идва с два буфера за получаване, които позволяват приоритетно съхранение на съобщения.
Инициализиране на CAN шината
Ето кода за настройка, който ще ви е необходим, за да инициализирате CAN шината:
#включват
#включватMCP2515 mcp2515(10); // Задаване на CS пин
невалиденнастройвам(){
докато (!Сериен);
Сериен.започвам(9600);
SPI.започвам(); //Започва SPI комуникация
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}
Това инициализира MCP2515 с CAN битрейт от 500Kbps и честота на осцилатор от 8MHz.
Режими на работа на MCP2515 CAN
Има три работни режима, използвани с MCP2515 CAN bus контролер:
- setNormalMode(): настройва контролера да изпраща и получава съобщения.
- setLoopbackMode(): настройва контролера да изпраща и получава съобщения, но съобщенията, които изпраща, също ще бъдат получени от самия него.
- setListenOnlyMode(): настройва контролера да получава само съобщения.
Това са извиквания на функции, използвани за задаване на работния режим на контролера на CAN шината MCP2515.
mcp2515.setNormalMode();
mcp2515.setLoopbackMode();
mcp2515.setListenOnlyMode();
Изпращане на данни през CAN шината
За да изпратите съобщение по CAN шината, използвайте sendMsgBuf() метод:
неподписанвъглен данни[] = {0x01, 0x02, 0x03, 0x04};
CAN.sendMsgBuf(0x01, 0, 4, данни);
Това изпраща съобщение с ID 0x01 и полезен товар от данни {0x01, 0x02, 0x03, 0x04}. Първият параметър е CAN ID, вторият е приоритетът на съобщението, третият е дължината на полезния товар на данните, а четвъртият е самият полезен товар на данните.
The sendMsgBuf() метод връща стойност, показваща дали съобщението е изпратено успешно или не. Можете да проверите тази стойност, като се обадите на checkError() метод:
ако (CAN.checkError()) {
Сериен.println(„Грешка при изпращане на съобщение.“);
}
Това проверява дали е възникнала грешка по време на предаването на съобщението и отпечатва съобщение за грешка, ако е необходимо.
Получаване на данни от CAN шината
За да получите съобщение по CAN шината, можете да използвате readMsgBuf() метод:
неподписанвъглен len = 0;
неподписанвъглен баф [8];
неподписанвъглен canID = 0;
ако (CAN.checkReceive()) {
CAN.readMsgBuf(&len, buf);
canID = CAN.getCanId();
}
Това проверява дали има съобщение на CAN шината и след това чете съобщението в буф масив. Дължината на съобщението се съхранява в len променлива, а идентификаторът на съобщението се съхранява в canID променлива.
След като получите съобщение, можете да обработите полезна информация според нуждите. Например, можете да отпечатате полезния товар на данните на серийния монитор:
Сериен.печат(„Получено съобщение с ID“);
Сериен.печат(canID, HEX);
Сериен.печат(" и данни: ");за (вътр аз = 0; i < len; i++) {
Сериен.печат(buf[i], HEX);
Сериен.печат(" ");
}
Сериен.println();
Това отпечатва идентификатора на полученото съобщение и полезния товар на данните на серийния монитор.
Как да свържете трансивър на CAN шина към макетна платка
За да изградите CAN шина за свързване на две устройства в този примерен проект, ще ви трябва:
- Два микроконтролера (две Arduino Nano платки за този пример)
- Два CAN модула MCP2515
- Брекетборд
- Джъмперни проводници
- I2C 16x2 LCD екранен модул
- Ултразвуков сензор HC-SR04
За този пример за проект в скицата на Arduino се използват четири библиотеки. Ето го NewPing библиотека, която предоставя лесен за използване интерфейс за ултразвуковия сензор, както и за SPI библиотека, което улеснява комуникацията между платката Arduino и MCP2515 CAN bus контролера. The Течен кристал_I2C библиотеката се използва за дисплейния модул.
И накрая, има библиотека mcp2515 за интерфейс с чипа MCP2515, което ни позволява лесно да предаваме данни през мрежата CAN bus.
Хардуерна настройка (пример HC-SR04)
В този проект, използвайки сензор HC-SR04 и LCD, една платка Arduino Nano ще действа като приемник, докато другата Arduino ще действа като изпращач. Свържете компонентите на изпращача според електрическата схема по-долу:
Ето диаграмата на веригата на приемника:
Накрая свържете двата възела заедно с помощта на CAN_H и CAN_L линии, както е показано:
Когато свързвате модулите, е важно да се уверите, че захранващото напрежение е в определения диапазон и че МОЖЕ З и МОЖЕ ЛИ Л щифтовете са правилно свързани към шината.
Програмиране на MCP2515 CAN Bus модул
Имайте предвид, че когато програмирате модула MCP2515, е важно да използвате правилния битрейт, за да осигурите успешна комуникация с други CAN устройства в мрежата.
Код на изпращача:
#включват
#включват
#включватMCP2515 mcp2515(10);
констбайт trigPin = 3;
констбайт echoPin = 4;
NewPing сонар(trigPin, echoPin, 200);структураcan_framecanMsg;
невалиденнастройвам(){
Сериен.започвам(9600);
mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
}невалиденцикъл(){
неподписанвътр разстояние = sonar.ping_cm();
canMsg.can_id = 0x036; // CAN id като 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 lcd(0x27,16,2);
структураcan_framecanMsg;невалиденнастройвам(){
Сериен.започвам(9600);mcp2515.reset();
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
mcp2515.setNormalMode();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.печат(„УРОК MUO CAN“);
забавяне(3000);
lcd.ясно();
}
невалиденцикъл(){
ако (mcp2515.прочетено съобщение(&canMsg) == MCP2515::ERROR_OK) // За получаване на данни
{
вътр разстояние = canMsg.data[0];
lcd.setCursor(0,0);
lcd.печат(„Разстояние:“);
lcd.печат(разстояние);
lcd.печат("см ");
}
}
Изведете вашите Arduino проекти на следващото ниво
Комбинацията от CAN шината и Arduino осигурява мощна платформа за изграждане или обучение на сложни комуникационни мрежи, използвани в различни приложения. Въпреки че може да изглежда като стръмна крива на учене, наличието на ваша собствена настройка на макет е доста удобен начин да научите въжетата на използването на CAN шинна мрежа в сложни DIY проекти.