- Вступ до CAN
- Порівняння CAN з SPI та I2C
- Програми CAN Protocol
- Як використовувати протокол CAN в Arduino
- Потрібні компоненти
- Кругова діаграма
- Зв'язок між двома модулями CAN MCP2515
- Програмування Arduino для CAN-зв'язку
- Пояснення бокового коду передавача CAN (Arduino Nano)
- Пояснення коду сторони приймача CAN (Arduino UNO)
- Working of CAN communication in Arduino
Сьогодні будь-яка середньостатистична машина складається приблизно з 60 до 100 датчиків для зондування та обміну інформацією. Оскільки автомобільні виробники постійно роблять свій автомобіль розумнішим завдяки таким функціям, як автономне водіння, система подушок безпеки, контроль тиску в шинах, система круїз-контролю тощо, ця кількість, як очікується, буде лише високою. На відміну від інших датчиків, ці датчики обробляють важливу інформацію, а отже, дані від них повинні передаватися за допомогою стандартних автомобільних протоколів зв'язку. Наприклад, дані системи круїз-контролю, такі як швидкість, положення дросельної заслінки тощо, є життєво важливими значеннями, які надсилаються в електронний блок управління (ЕБУ)щоб вирішити рівень прискорення автомобіля, неправильне спілкування або втрата даних тут може призвести до критичних несправностей. Тому на відміну від стандартних протоколів зв'язку, таких як UART, SPI або I2C, дизайнери використовують набагато надійніші автомобільні протоколи зв'язку, такі як LIN, CAN, FlexRay тощо.
З усіх доступних протоколів CAN є більш переважно використовуваним і популярним. Ми вже обговорювали, що таке CAN і як працює CAN. Отже, у цій статті ми знову розглянемо основи, а потім, нарешті, ми також обмінятимемось даними між двома Arduinos за допомогою CAN-зв'язку. Звучить цікаво правильно! Отже, давайте почнемо.
Вступ до CAN
CAN aka Controller Area Network - це послідовна комунікаційна шина, призначена для промислових та автомобільних застосувань. Це протокол на основі повідомлень, який використовується для зв'язку між кількома пристроями. Коли кілька пристроїв CAN з'єднані разом, як показано нижче, з'єднання утворює мережу, що діє як наша центральна нервова система, дозволяючи будь-якому пристрою розмовляти з будь-яким іншим пристроєм у вузлі.
CAN - мережа буде складатися тільки з двох проводів CAN висока і може Низьких для двобічної передачі даних, як показано вище. Зазвичай швидкість зв'язку для CAN коливається від 50 Кбіт / с до 1 Мбіт / с, а відстань може коливатися від 40 метрів на 1 Мбіт / с до 1000 метрів на 50 кбіт / с.
Формат повідомлення CAN:
У зв'язку CAN дані передаються в мережі як певний формат повідомлення. Цей формат повідомлень містить багато сегментів, але двома основними сегментами є ідентифікатор та дані, які допомагають надсилати та відповідати на повідомлення в шині CAN.
Ідентифікатор або ідентифікатор CAN: ідентифікатор також відомий як ідентифікатор CAN або 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 використовується кабель із витою парою. Як правило, на двох кінцях мережі CAN використовується один резистор 120 Ом, як показано на малюнку, це пов’язано з тим, що лінія повинна бути збалансована і прив’язана до однакового потенціалу.
Порівняння CAN з SPI та I2C
Оскільки ми вже навчились використовувати SPI з Arduino та IIC з Arduino, давайте порівняємо функції SPI та I2C з CAN
Параметр | SPI | I2C | МОЖЕ |
Швидкість | Від 3 Мбіт / с до 10 Мбіт / с | Стандарт: 100 Кбіт / с | 10KBps до 1MBps Також залежить від довжини використовуваного дроту |
Швидко: 400 Кбіт / с | |||
Швидкість: 3,4 Мбіт / с | |||
Тип | Синхронний | Синхронний | Асинхронний |
Кількість проводів | 3+ (MISO, MOSI, SCK, SS1, SS2… SS (n)) | 2 дроти (SDA, SCL) | 2 дроти (CAN_H, CAN_L) |
Дуплекс | Повний дуплекс | Напівдуплекс | Напівдуплекс |
Програми CAN Protocol
- Завдяки надійності та надійності протоколу CAN вони використовуються в таких галузях, як автомобільна промисловість, промислові машини, сільське господарство, медичне обладнання тощо.
- Оскільки в CAN складність проводки зменшується, вони в основному використовуються в автомобільних додатках, таких як автомобіль.
- Невисока вартість впровадження, а також вартість апаратних компонентів також менша.
- Легко додавати та видаляти пристрої шини CAN.
Як використовувати протокол CAN в Arduino
Оскільки Arduino не містить вбудованого порту CAN, використовується модуль CAN під назвою MCP2515. Цей модуль CAN взаємодіє з Arduino за допомогою зв'язку SPI. Давайте подивимося докладніше про MCP2515 та про те, як він взаємодіє з Arduino.
Модуль CAN MCP2515:
Модуль MCP2515 має контролер CAN MCP2515, який є високошвидкісним приймачем CAN. Зв'язок між MCP2515 та MCU здійснюється через SPI. Отже, легко взаємодіяти з будь-яким мікроконтролером, що має інтерфейс SPI.
Для початківців, які хочуть вивчити шину CAN, цей модуль стане гарним початком. Ця плата CAN SPI ідеально підходить для промислової автоматизації, автоматизації будинків та інших проектів, що вбудовуються в автомобіль.
Особливості та специфікація MCP2515:
- Використовує високошвидкісний трансивер CAN TJA1050
- Розмір: 40 × 28 мм
- Контроль SPI для розширення інтерфейсу шини Multi CAN
- Кристалічний генератор 8 МГц
- Опір клем 120 Ом
- Має незалежну клавішу, світлодіодний індикатор, індикатор живлення
- Підтримує 1 Мб / с операцію CAN
- Низький струм роботи в режимі очікування
- Можна підключити до 112 вузлів
Розтискання модуля CAN MCP2515:
Ім'я PIN-коду |
ВИКОРИСТАННЯ |
VCC |
5В вхідний штифт |
GND |
Штифт заземлення |
CS |
Вибір шпильки SPI SLAVE (активний низький) |
ТАК |
Ведучий вхід SPI ведучого виводу |
SI |
Ведучий вихід SPI ведучого введення |
SCLK |
Шпилька годинника SPI |
INT |
Штифт переривання MCP2515 |
У цьому посібнику давайте подивимося, як надсилати дані датчика вологості та температури (DHT11) з Arduino Nano на Arduino Uno через модуль шини CAN MCP2515.
Потрібні компоненти
- Arduino UNO
- Arduino NANO
- DHT11
- РК-дисплей 16x2
- Модуль CAN MCP2515 - 2
- 10k потенціометр
- Макет
- Підключення проводів
Кругова діаграма
Підключення на стороні передавача CAN:
Компонент - Pin |
Arduino Nano |
MPC2515 - VCC |
+ 5В |
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 |
+ 5В |
DHT11 - GND |
GND |
DHT11 - ВИХІД |
A0 |
Підключення ланцюга на стороні приймача CAN:
Компонент - Pin |
Arduino UNO |
MPC2515 - VCC |
+ 5В |
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 |
РК - VSS |
GND |
РК - VDD |
+ 5В |
РК - V0 |
До центрального PIN-коду потенціометра 10K |
РК - RS |
3 |
РК - RW |
GND |
РК - E |
4 |
РК - D4 |
5 |
РК - D5 |
6 |
РК - D6 |
7 |
РК - D7 |
8 |
РК - A |
+ 5В |
РК - K |
GND |
Зв'язок між двома модулями CAN MCP2515
H - CAN Високий
L - CAN Низький
MCP2515 (Arduino Nano) |
MCP2515 (Arduino UNO) |
H |
H |
L |
L |
Як тільки всі підключення були встановлені, моє обладнання виглядало так, як показано нижче
Програмування Arduino для CAN-зв'язку
Спочатку ми повинні встановити бібліотеку для CAN в Arduino IDE. Взаємодія модуля MCP2515 CAN з Arduino стає простішим, використовуючи наступну бібліотеку.
- Завантажте ZIP-файл бібліотеки Arduino CAN MCP2515.
- З IDE Arduino: Ескіз -> Включити бібліотеку -> Додати бібліотеку.ZIP
У цьому навчальному посібнику кодування розділено на дві частини, одну як код передавача CAN (Arduino Nano), а іншу як код приймача CAN (Arduino UNO), обидві з яких можна знайти внизу цієї сторінки. Пояснення цього полягає в наступному.
Перш ніж писати програму для надсилання та отримання даних, переконайтеся, що ви встановили бібліотеку, дотримуючись наведених вище кроків, і модуль CAN MCP2515 ініціалізується у вашій програмі наступним чином.
Ініціалізуйте модуль CAN MCP2515:
Для того, щоб створити з'єднання з 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 CAN_125KBPS_CAN_125KBPS_CAN_125KBPS_CAN_125KBPS_CAN_125KBPS_CAN_125KBPS_CAN_125KBPS_CAN_125KBPS_CAN_125KB_CAN_125KB_2
Доступні швидкості годин:
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.
#включати
Тепер визначено ім'я контакту DHT11 (вихідний штифт), який пов'язаний з A0 Arduino Nano
#define DHTPIN A0
А також, DHTTYPE визначається як DHT11.
#define DHTTYPE DHT11
А canMsg структури типу даних для зберігання формату CAN повідомлень.
структура 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 встановлено швидкість 500 кбіт / с та 8 МГц як тактову частоту
mcp2515.setBitrate (CAN_500KBPS, MCP_8MHZ);
І MCP2525 встановлений у звичайному режимі
mcp2515.setNormalMode ();
У циклі void ():
Наступне твердження отримує значення вологості та температури та зберігає у цілочисельних змінних h та t.
int h = dht.readHumidity (); int t = dht.readTemperature ();
Далі ідентифікатор CAN дається як 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)
In the receiver section, Arduino UNO interfaced with the MCP2515 and 16x2 LCD display. Here the Arduino UNO receives the Temperature and Humidity from CAN bus and display the data received in LCD.
First the required libraries are included, SPI Library for using SPI Communication, MCP2515 Library for using CAN Communication and LiquidCrsytal Library for using 16x2 LCD with Arduino.
#include
Next the LCD pins that are used in connecting with the Arduino UNO are defined.
const int rs = 3, en = 4, d4 = 5, d5 = 6, d6 = 7, d7 = 8; LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
A struct data type is declared for storing CAN message format.
struct can_frame canMsg;
Set the pin number where SPI CS is connected (10 by default)
MCP2515 mcp2515(10);
In void setup ():
First the LCD is set at 16x2 mode and a welcome message is displayed.
lcd.begin(16,2); lcd.setCursor(0,0); lcd.print("CIRCUIT DIGEST"); lcd.setCursor(0,1); lcd.print("CAN ARDUINO"); delay(3000); lcd.clear();
Begin the SPI communication by using following statement.
SPI.begin();
Next the MCP2515 is being RESET using the following command.
mcp2515.reset();
Now the MCP2515 is set speed of 500KBPS and 8MHZ as clock.
mcp2515.setBitrate(CAN_500KBPS,MCP_8MHZ);
And the MCP2525 is set at normal mode.
mcp2515.setNormalMode();
Next in void loop():
The following statement is used to receive the message from the CAN bus. If message is received it gets into the if condition.
if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK)
In the if condition the data is received and stored in c anMsg , the data that has humidity value and data that has temperature value. Both values are stored in an integer x and y.
int x = canMsg.data; int y = canMsg.data;
After receiving the values, the temperature and humidity values are displayed in 16x2 LCD display using following statement.
lcd.setCursor(0,0); lcd.print("Humidity: "); lcd.print(x); lcd.setCursor(0,1); lcd.print("Temp: "); lcd.print(y); delay(1000); lcd.clear();
Working of CAN communication in Arduino
Once the hardware is ready upload the program for CAN transmitter and CAN receiver (complete programs are given below) in the respective Arduino boards. When powered you should notice the temperature value read by DHT11 will be sent to another Arduino through CAN communication and displayed on the LCD of the 2nd Arduino as you can see in the below image. I have also used my AC remote to check if the temperature displayed on the LCD is close to actual room temperature.
The complete working can be found at the video linked below. If you have any questions leave them in the comment section or use our forums for other technical questions.