- Въведение в CAN
- Сравнение на CAN с SPI и I2C
- Приложения за CAN протокол
- Как да използвам CAN протокола в Arduino
- Необходими компоненти
- Електрическа схема
- Връзка между два MCP2515 CAN модула
- Програмиране на Arduino за CAN комуникация
- Обяснение на страничния код на предавателя CAN (Arduino Nano)
- Обяснение на страничния код на приемника CAN (Arduino UNO)
- Работа на CAN комуникация в Arduino
Днес всеки средностатистически автомобил се състои от около 60 до 100 сензорни блока в него за засичане и обмен на информация. С автомобилните производители, които непрекъснато правят колата си по-интелигентна с функции като автономно шофиране, система въздушни възглавници, мониторинг на налягането в гумите, система за круиз контрол и т.н., този брой се очаква само да нарасне. За разлика от други сензори, тези сензори обработват критична информация и следователно данните от тези сензори трябва да се предават чрез стандартни автомобилни комуникационни протоколи. Например данните от системата за круиз контрол като скорост, положение на дросела и т.н. са жизненоважни стойности, които се изпращат до електронното управление (ECU)за да се реши нивото на ускорение на автомобила, неправилна комуникация или загуба на данни тук може да доведе до критични повреди. Следователно за разлика от стандартните комуникационни протоколи като UART, SPI или I2C, дизайнерите използват много надеждни автомобилни комуникационни протоколи като LIN, CAN, FlexRay и т.н.
От всички налични протоколи CAN е по-предимно използван и популярен. Вече обсъдихме какво е CAN и как работи CAN. И така, в тази статия ще разгледаме отново основите и накрая ще обменяме данни и между два Arduinos, използвайки CAN комуникация. Звучи интересно нали! И така, нека започнем.
Въведение в CAN
CAN aka Controller Area Network е серийна комуникационна шина, предназначена за индустриални и автомобилни приложения. Това е протокол, базиран на съобщения, използван за комуникация между множество устройства. Когато множество CAN устройства са свързани заедно, както е показано по-долу, връзката образува мрежа, действаща като нашата централна нервна система, позволяваща на всяко устройство да говори с друго устройство в възела.
А CAN мрежа ще се състои от само две жици CAN високи и могат Ниските за двупосочно предаване на данни, както е показано по-горе. Обикновено скоростта на комуникация за CAN варира от 50 Kbps до 1Mbps и разстоянието може да варира от 40 метра при 1Mbps до 1000 метра при 50kpbs.
Формат на CAN съобщение:
В CAN комуникацията данните се предават в мрежата като определен формат на съобщението. Този формат на съобщението съдържа много сегменти, но два основни сегмента са идентификаторът и данните, които помагат за изпращане и отговор на съобщения в CAN шина.
Идентификатор или CAN ID: Идентификаторът е известен също като CAN ID или също като PGN (Номер на групата параметри). Използва се за идентифициране на CAN устройства, присъстващи в CAN мрежа. Дължината на идентификатора е или 11 или 29 бита в зависимост от типа на използвания CAN протокол.
Стандартен CAN: 0-2047 (11-битов)
Разширено CAN: 0-2 29 -1 (29-битово)
Данни: Това са действителните данни от сензора / контрола, които трябва да бъдат изпратени от едно устройство на друго. Данните за размера могат да бъдат от 0 до 8 байта.
Код за дължина на данните (DLC): 0 до 8 за броя на наличните байтове данни.
Проводници, използвани в CAN:
CAN протоколът се състои от два проводника, а именно CAN_H и CAN_L за изпращане и получаване на информация. И двата проводника действат като диференциална линия, което означава, че CAN сигналът (0 или 1) е представен от потенциалната разлика между CAN_L и CAN_H. Ако разликата е положителна и по-голяма от определено минимално напрежение, тогава тя е 1, а ако разликата е отрицателна, е 0.
Обикновено кабел с усукана двойка се използва за CAN комуникация. Обикновено се използва един резистор от 120 ома в двата края на мрежата CAN, както е показано на изображението, това е така, защото линията трябва да бъде балансирана и свързана към същия потенциал.
Сравнение на CAN с SPI и I2C
Тъй като вече сме се научили как да използваме SPI с Arduino и IIC с Arduino, нека сравним характеристиките на SPI и I2C с CAN
Параметър | SPI | I2C | МОГА |
Скорост | 3Mbps до 10Mbps | Стандартно: 100Kbps | 10KBps до 1MBps Също така зависи от дължината на използвания проводник |
Бързо: 400 Kbps | |||
Висока скорост: 3.4Mbps | |||
Тип | Синхронно | Синхронно | Асинхронен |
Брой проводници | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 проводника (SDA, SCL) | 2 проводника (CAN_H, CAN_L) |
Дуплекс | Пълен дуплекс | Полудуплекс | Полудуплекс |
Приложения за CAN протокол
- Поради стабилността и надеждността на CAN протокола, те се използват в индустрии като автомобилна индустрия, индустриални машини, селско стопанство, медицинско оборудване и др.
- Тъй като сложността на окабеляването намалява в CAN, те се използват главно в автомобилни приложения като автомобили.
- Ниска цена за внедряване, а също и цена на хардуерни компоненти също е по-ниска
- Лесно е да добавяте и премахвате устройства с шина CAN.
Как да използвам CAN протокола в Arduino
Тъй като Arduino не съдържа вграден CAN порт, се използва CAN модул, наречен MCP2515. Този CAN модул е свързан с Arduino чрез SPI комуникация. Нека да видим повече за MCP2515 в детайли и как той е свързан с Arduino.
MCP2515 CAN модул:
Модулът MCP2515 има CAN контролер MCP2515, който е високоскоростен CAN трансивър. Връзката между MCP2515 и MCU е чрез SPI. Така че е лесно да се взаимодейства с всеки микроконтролер, който има SPI интерфейс.
За начинаещи, които искат да научат CAN Bus, този модул ще действа като добро начало. Тази платка CAN SPI е идеална за индустриална автоматизация, автоматизация на дома и други проекти за вграждане в автомобили.
Характеристики и спецификация на MCP2515:
- Използва високоскоростен CAN трансивър TJA1050
- Размери: 40 × 28 мм
- SPI контрол за разширяване на интерфейса на шината Multi CAN
- 8MHZ кристален осцилатор
- 120Ω терминално съпротивление
- Има независим бутон, LED индикатор, индикатор на захранването
- Поддържа 1 Mb / s CAN операция
- Ниска текуща работа в режим на готовност
- Могат да бъдат свързани до 112 възли
Разпределяне на MCP2515 CAN модул:
Име на ПИН |
ИЗПОЛЗВАЙТЕ |
VCC |
5V захранващ щифт |
GND |
Заземен щифт |
CS |
SPI SLAVE изберете щифт (Активен нисък) |
ТАКА |
SPI главен входен подчинен изход |
SI |
SPI master output slave slave input input |
SCLK |
SPI часовник щифт |
INT |
MCP2515 прекъсващ щифт |
В този урок нека видим как да изпращаме данни от сензора за влажност и температура (DHT11) от Arduino Nano до Arduino Uno чрез модула за шина CAN MCP2515.
Необходими компоненти
- Arduino UNO
- Arduino NANO
- DHT11
- 16x2 LCD дисплей
- MCP2515 CAN модул - 2
- 10k потенциометър
- Макет
- Свързване на проводници
Електрическа схема
Връзка от страна на CAN трансмитер:
Компонент - ПИН |
Arduino Nano |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
D10 (SPI_SS) |
MPC2515 - ТАКА |
D12 (SPI_MISO) |
MPC2515 - SI |
D11 (SPI_MOSI) |
MPC2515 - SCK |
D13 (SPI_SCK) |
MPC2515 - INT |
D2 |
DHT11 - VCC |
+ 5V |
DHT11 - GND |
GND |
DHT11 - ВЪН |
A0 |
Верижни връзки от страна на приемника CAN:
Компонент - ПИН |
Arduino UNO |
MPC2515 - VCC |
+ 5V |
MPC2515 - GND |
GND |
MPC2515 - CS |
10 (SPI_SS) |
MPC2515 - ТАКА |
12 (SPI_MISO) |
MPC2515 - SI |
11 (SPI_MOSI) |
MPC2515 - SCK |
13 (SPI_SCK) |
MPC2515 - INT |
2 |
LCD - VSS |
GND |
LCD - VDD |
+ 5V |
LCD - V0 |
Към централния ПИН на 10K потенциометър |
LCD - RS |
3 |
LCD - RW |
GND |
LCD - E |
4 |
LCD - D4 |
5 |
LCD - D5 |
6 |
LCD - D6 |
7 |
LCD - D7 |
8 |
LCD - A |
+ 5V |
LCD - K |
GND |
Връзка между два MCP2515 CAN модула
H - CAN Високо
L - CAN Ниско
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
З. |
З. |
L |
L |
След като всички връзки бяха направени, хардуерът ми изглеждаше така по-долу
Програмиране на Arduino за CAN комуникация
Първо трябва да инсталираме библиотека за CAN в Arduino IDE. Връзката с модула CCP на MCP2515 с Arduino става по-лесна, като се използва следната библиотека.
- Изтеглете ZIP файла на библиотеката Arduino CAN MCP2515.
- От IDE на Arduino: Скица -> Включване на библиотека -> Добавяне на.ZIP библиотека
В този урок кодирането е разделено на две части, една като CAN код на предавателя (Arduino Nano) и друга като код на CAN приемник (Arduino UNO), и двете от които можете да намерите в долната част на тази страница. Обяснението за същото е следното.
Преди да напишете програма за изпращане и получаване на данни, уверете се, че сте инсталирали библиотеката, следвайки горните стъпки и CAN модулът MCP2515 е инициализиран във вашата програма, както следва.
Инициализирайте MCP2515 CAN модул:
За да създадете връзка с MCP2515, следвайте стъпките:
1. Задайте номера на пина, където е свързан SPI CS (10 по подразбиране)
MCP2515 mcp2515 (10);
2. Задайте скорост на предаване и честота на осцилатора
mcp2515.setBitrate (CAN_125KBPS, MCP_8MHZ);
Налични скорости на предаване:
CAN_5KBPS, CAN_10KBPS, CAN_20KBPS, CAN_31K25BPS, CAN_33KBPS, CAN_40KBPS, CAN_50KBPS, CAN_80KBPS, CAN_83K3BPS, CAN_95KBPS, CAN_100KBPS, CAN_125KBPS CAN_125KBPS_1
Налични скорости на часовника:
MCP_20MHZ, MCP_16MHZ, MCP_8MHZ
3. Задайте режими.
mcp2515.setNormalMode (); mcp2515.setLoopbackMode (); mcp2515.setListenOnlyMode ();
Обяснение на страничния код на предавателя CAN (Arduino Nano)
В секцията на предавателя Arduino Nano взаимодейства с модула MCP2515 CAN чрез щифтове SPI и DHT11 изпраща данни за температура и влажност към CAN шина.
Първо са включени необходимите библиотеки, SPI библиотека за използване на SPI комуникация, MCP2515 библиотека за използване на CAN комуникация и DHT библиотека за използване на DHT сензор с Arduino . Преди това сме свързали DHT11 с Arduino.
#include
Сега е дефинирано името на пина на DHT11 (OUT pin), което е свързано с A0 на Arduino Nano
#define DHTPIN A0
И също така, DHTTYPE се дефинира като DHT11.
#define DHTTYPE DHT11
А canMsg структура тип данни за съхраняване формат може послание.
struct can_frame canMsg;
Задайте номера на пина, където е свързан SPI CS (10 по подразбиране)
MCP2515 mcp2515 (10);
Освен това обектът dht за клас DHT с DHT щифт с Arduino Nano и тип DHT като DHT11 е инициализиран.
DHT dht (DHTPIN, DHTTYPE);
Следва в void setup ():
Започнете SPI комуникацията, като използвате следното изявление
SPI.begin ();
И след това използвайте инструкцията по-долу, за да започнете да получавате стойности за температура и влажност от сензора DHT11.
dht.begin ();
След това MCP2515 се възстановява с помощта на следната команда
mcp2515.reset ();
Сега MCP2515 е зададена скорост от 500KBPS и 8MHZ като часовник
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
И MCP2525 е настроен в нормален режим
mcp2515.setNormalMode ();
В цикъла void ():
Следното изявление получава стойността на влажността и температурата и съхранява в цяло число променлива h и t.
int h = dht.readHuminity (); int t = dht.readTemperature ();
След това CAN ID се дава като 0x036 (по избор) и DLC като 8 и ние даваме h и t данните на данните и данните и почистваме всички данни с 0.
canMsg.can_id = 0x036; canMsg.can_dlc = 8; canMsg.data = h; // Актуализиране на стойността на влажността в canMsg.data = t; // Актуализиране на стойността на температурата в canMsg.data = 0x00; // Почивайте всички с 0 canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00; canMsg.data = 0x00;
В крайна сметка, за да изпратим съобщението до CAN BUS, използваме следното твърдение.
mcp2515.sendMessage (& canMsg);
Така че сега данните за температурата и влажността се изпращат като съобщение към CAN шината.
Обяснение на страничния код на приемника CAN (Arduino UNO)
В секцията за приемници Arduino UNO се свързва с MCP2515 и 16x2 LCD дисплей. Тук Arduino UNO получава температурата и влажността от CAN шината и показва данните, получени в LCD.
Първо са включени необходимите библиотеки, SPI библиотека за използване на SPI комуникация, MCP2515 библиотека за използване на CAN комуникация и LiquidCrsytal библиотека за използване на 16x2 LCD с Arduino .
#include
След това се дефинират LCD щифтовете, които се използват при свързване с Arduino UNO.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
А структура тип данни е обявен за съхранение формат може съобщение.
struct can_frame canMsg;
Задайте номера на пина, където е свързан SPI CS (10 по подразбиране)
MCP2515 mcp2515 (10);
При настройка за невалидност ():
Първо LCD е настроен на режим 16x2 и се показва приветствено съобщение.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("CIRCUIT DIGEST"); lcd.setCursor (0,1); lcd.print ("CAN ARDUINO"); забавяне (3000); lcd.clear ();
Започнете SPI комуникацията, като използвате следното изявление.
SPI.begin ();
След това MCP2515 се възстановява с помощта на следната команда.
mcp2515.reset ();
Сега MCP2515 е зададена скорост от 500KBPS и 8MHZ като часовник.
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
И MCP2525 е настроен на нормален режим.
mcp2515.setNormalMode ();
Следващ цикъл void ():
Следващото изявление се използва за получаване на съобщението от CAN шината. Ако съобщението е получено, то влиза в условието if .
ако (mcp2515.readMessage (& canMsg) == MCP2515:: ERROR_OK)
В условието if данните се получават и съхраняват в c anMsg , данните, които имат стойност на влажност и данни, които имат стойност на температурата. И двете стойности се съхраняват в цяло число x и y.
int x = canMsg.data; int y = canMsg.data;
След получаване на стойностите, стойностите на температурата и влажността се показват на LCD дисплей 16x2, като се използва следното изявление.
lcd.setCursor (0,0); lcd.print ("Влажност:"); lcd.print (x); lcd.setCursor (0,1); lcd.print ("Temp:"); lcd.print (y); забавяне (1000); lcd.clear ();
Работа на CAN комуникация в Arduino
След като хардуерът е готов, качете програмата за CAN предавател и CAN приемник (пълните програми са дадени по-долу) в съответните Arduino платки. При захранване трябва да забележите, че температурата, отчетена от DHT11, ще бъде изпратена до друг Arduino чрез CAN комуникация и ще бъде показана на LCD на 2- ри Arduino, както можете да видите на изображението по-долу. Използвал съм и дистанционното за променлив ток, за да проверя дали температурата на дисплея е близка до действителната стайна температура.
Пълната работа може да бъде намерена на видеото, свързано по-долу. Ако имате някакви въпроси, оставете ги в раздела за коментари или използвайте форумите ни за други технически въпроси.