- Послідовний зв’язок RS-485
- Підключення RS-485 до Arduino
- Модуль перетворювача USB в RS-485
- Просто Modbus Master Software
- Потрібні інструменти
- Кругова діаграма
- Програмування Arduino UNO для підлеглого RS-485 MODBUS
- Тестування Arduino UNO як Rs485 Modbus Slave
Modbus - це протокол послідовного зв'язку, який був виявлений Modicon в 1979 році, і він використовується для передачі даних по послідовних лініях між промисловими електронними пристроями. RS-485 Modbus використовує RS-485 для ліній електропередачі. Слід зазначити, що Modbus є програмним, а не апаратним протоколом. Він розділений на дві частини, такі як Modbus Master і Modbus Slave. У мережі RS-485 Modbus є один ведучий і 127 ведених, кожен з унікальною адресою від 1 до 127. У цьому проекті MAX485 Arduino ми будемо використовувати Arduino Uno як веденого для послідовного зв'язку.
Modbus в основному використовується в ПЛК (програмовані логічні контролери). Окрім цього, Modbus також використовується в охороні здоров’я, транспорті, домашній автоматизації тощо. Modbus має 255 функціональних кодів, і в основному є три популярні версії Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
У чому різниця між Modbus ASCII та Modbus RTU?
Modbus RTU та Modbus ASCII розмовляють за одним протоколом. Єдина відмінність полягає в тому, що байти, що передаються по дроту, представлені у вигляді двійкових файлів з RTU і як читабельні ASCII з Modbus RTU. У цьому посібнику буде використано Modbus RTU.
Цей посібник стосується використання зв'язку RS-485 Modbus з Arduino UNO в якості підлеглого. Тут ми встановлюємо програмне забезпечення Просто Modbus Master на ПК та управляємо двома світлодіодами та сервомотором, використовуючи RS-485 як лінію передачі. Ці світлодіоди та сервомотор підключені до підпорядкованого Arduino і управляються передачею значень за допомогою програмного забезпечення Master Modbus. Оскільки в цьому посібнику використовується RS-485, рекомендується спочатку пройти послідовний зв’язок RS485 між Arduino Uno та Arduino Nano. RS485 також може використовуватися з іншими контролерами для послідовного зв'язку:
- Послідовний зв’язок RS-485 між Raspberry Pi та Arduino UNO
- Послідовний зв’язок між STM32F103C8 та Arduino UNO за допомогою RS-485
Почнемо з вивчення деяких довідкових даних про RS-485 та Modbus. Також тут дізнайтеся більше про різні протоколи послідовного зв’язку.
Послідовний зв’язок RS-485
RS-485 - це асинхронний послідовний протокол зв'язку, який не потребує годинника. Він використовує техніку, яка називається диференціальним сигналом для передачі двійкових даних з одного пристрою на інший.
Отже, що це за метод диференціальної передачі сигналу ??
Метод диференціального сигналу працює шляхом створення диференціальної напруги за допомогою позитивних і негативних 5В. Це забезпечує напівдуплексний зв’язок при використанні двох проводів, а для повного дуплексу потрібні 4 чотири дроти.
За допомогою цього методу:
- RS-485 підтримує більш високу швидкість передачі даних максимум 30 Мбіт / с.
- Він також забезпечує максимальну відстань передачі даних у порівнянні з протоколом RS-232. Він передає дані максимум до 1200 метрів.
- Головною перевагою RS-485 перед RS-232 є кілька ведених з одним ведучим, тоді як RS-232 підтримує лише одного веденого.
- Може мати максимум 32 пристрої, підключені до протоколу RS-485.
- Ще однією перевагою RS-485 є захист від шуму, оскільки для передачі вони використовують метод диференціального сигналу.
- RS-485 швидший у порівнянні з протоколом I2C.
Підключення RS-485 до Arduino
Модуль RS-485 можна підключити до будь-якого мікроконтролера, що має послідовний порт. Для використання модуля RS-485 з мікроконтролерами необхідний модуль під назвою 5V MAX485 TTL - RS485, який базується на Maxim MAX485 IC, оскільки він дозволяє здійснювати послідовний зв’язок на далекій відстані 1200 метрів. Він є двонаправленим і напівдуплексним і має швидкість передачі даних 2,5 Мбіт / с. Цей модуль вимагає напруги 5В.
Пін-аут RS-485:
Ім'я PIN-коду |
Опис штифта |
VCC |
5 В |
A |
Вхід неінвертуючого приймача Неінвертуючий вихід драйвера |
B |
Інвертування вхідного сигналу приймача Інвертування вихідних даних драйвера |
GND |
GND (0 В) |
R0 |
Вихід приймача (RX-штифт) |
RE |
Вихід приймача (LOW-Enable) |
DE |
Вихід драйвера (HIGH-Enable) |
DI |
Вхід драйвера (штекер TX) |
Модуль перетворювача USB в RS-485
Це модуль перетворювача USB в RS485, який підтримує WIN7, XP, Vista, Linux, Mac OS і забезпечує простий у використанні інтерфейс RS485 за допомогою COM-порту в комп'ютері . Цей модуль є пристроєм plug-and-play . Немає командних структур, все, що надсилається на віртуальний COM-порт, автоматично перетворюється на RS485 і навпаки. Модуль повністю харчується від шини USB. Отже, не потрібно зовнішнього джерела живлення для роботи.
Він відображається як послідовний / COM-порт і доступний із додатків або гіпертерміналу. Цей перетворювач забезпечує напівдуплексний зв’язок RS-485. Діапазон швидкості передачі даних становить від 75 до 115200 біт / с, максимум до 6 Мбіт / с.
Для використання цього пристрою в Інтернеті доступне різноманітне програмне забезпечення Modbus. У цьому навчальному посібнику використовується програмне забезпечення під назвою Simply Modbus Software.
Просто Modbus Master Software
Програмне забезпечення Modbus Master необхідне для передачі даних на підлеглий пристрій Modbus RS-485 Arduino через COM.
Просто Modbus Master - це програмне забезпечення для тестування даних. Ви можете завантажити Simply Modbus Master за вказаним посиланням і дізнатися більше про нього, звернувшись до Посібника з програмного забезпечення.
Перед використанням програмного забезпечення важливо ознайомитися з наведеною нижче термінологією.
Ідентифікатор раба:
Кожному веденому в мережі присвоюється унікальна адреса одиниці від 1 до 127. Коли ведучий запитує дані, першим байтом, який він відправляє, є адреса підлеглого. Таким чином кожен підлеглий знає після першого байта, ігнорувати повідомлення чи ні.
Код функції:
Другим байтом, надісланим ведучим, є код функції. Це число повідомляє підлеглому, до якої таблиці отримати доступ та чи слід з неї читати чи писати.
Підтримувані коди функцій реєстру:
Код функції |
Дія |
Назва таблиці |
04 (04 шістнадцяткова) |
Читайте |
Регістри аналогових входів |
03 (03 шістнадцяткова) |
Читайте |
Реєстри зберігання аналогових виходів |
06 (06 шістнадцяткова) |
Пишіть поодинці |
Реєстр проведення аналогових вихідних даних |
16 (10 шістнадцяткових) |
Запишіть кілька |
Реєстри зберігання аналогових виходів |
Підтримувані коди функцій котушки:
Код функції |
Дія |
Назва таблиці |
02 (02 шістнадцяткова) |
Читайте |
Дискретні вхідні контакти |
01 (01 шістнадцяткова) |
Читайте |
Дискретні вихідні котушки |
05 (05 шістнадцяткова) |
Пишіть поодинці |
Дискретна вихідна котушка |
15 (0F шістнадцятковий) |
Запишіть кілька |
Дискретні вихідні котушки |
CRC:
CRC розшифровується як перевірка циклічного резервування. Це два байти, додані в кінець кожного повідомлення Modbus для виявлення помилок.
Потрібні інструменти
Апаратне забезпечення
- Arduino UNO
- Модуль перетворювача MAX-485 TTL в RS-485
- Модуль перетворювача USB в RS-485
- Світлодіодні (2)
- 1k-резистор (2)
- РК-дисплей 16x2
- 10k потенціометр
- Сервомотор SG-90
Програмне забезпечення
- Просто Modbus Master
Кругова діаграма
Схема з'єднання між модулем перетворювача MAX-485 TTL та RS-485 та Arduino UNO:
Arduino UNO |
Модуль перетворювача MAX-485 TTL в RS-485 |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5В |
VCC |
GND |
GND |
Схема підключення між модулем MAX-485 TTL до RS-485 та перетворювачем USB до RS-485:
MAX-485 TTL - RS-485 Модуль перетворювача |
Модуль USB до RS-485 Підключено до ПК |
A |
A |
B |
B |
Схема з'єднання між Arduino UNO та РК-дисплеєм 16x2:
РК-дисплей 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5В |
V0 |
Для управління штифтом потенціометра для контролю контрастності / яскравості РК-дисплея 16x2 |
RS |
8 |
RW |
GND |
Е |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5В |
К |
GND |
Схема з'єднання між 2 світлодіодами, сервомотором і Arduino UNO:
Arduino UNO |
LED1 |
Світлодіод2 |
Серводвигун |
2 |
Анод через резистор 1к |
- |
- |
5 |
- |
Анод через резистор 1к |
- |
6 |
- |
- |
ШІМ-шпилька (помаранчевий) |
+ 5В |
- |
- |
+ 5 В (ЧЕРВОНИЙ) |
GND |
Катод GND |
Катод GND |
GND (коричневий) |
Програмування Arduino UNO для підлеглого RS-485 MODBUS
Arduino UNO налаштований як Modbus Slave. Також Arduino UNO оснащений двома світлодіодами та одним сервомотором. Отже, підпорядкованим Arduino управляється за допомогою головного програмного забезпечення Modbus. Зв'язок між Arduino UNO та програмним забезпеченням Modbus Master здійснюється за допомогою модуля RS-485. Для підключення його до ПК використовується модуль перетворювача USB в RS-485. А в Arduino UNO з модулем перетворювача MAX-485 TTL в RS-485 вся установка виглядатиме так:
Для використання Modbus в Arduino UNO, бібліотеці
Спочатку включіть необхідну бібліотеку. Бібліотека ModbusRTU призначена для використання зв’язку Modbus RS-485, а рідкокристалічна бібліотека - для використання РК-дисплея з Arduino UNO, а бібліотека сервоприводів - для використання серводвигуна з Arduino UNO.
#включати
Тепер анодні висновки світлодіодів, які з'єднані з виводами 2 і 5 Arduino, визначаються як LED1 і LED2.
#define led1 2 #define led2 5
Далі об’єкт для доступу до класу рідких кристалів оголошується за допомогою РК-штифтів (RS, E, D4, D5, D6, D7), які пов’язані з Arduino UNO.
Рідкий кристал LiquidCrystal (8,9,10,11,12,13);
Коли LCD завершено, ініціалізуйте об’єкт сервоприводу для класу Серво. Також ініціалізуйте об’єкт шини для класу Modbus.
Серво серво; Шина Modbus;
Далі для зберігання значень для зв'язку Modbus оголошується масив із трьома значеннями, ініціалізованими нулем.
uint16_t modbus_array = {0,0,0};
У функції налаштування спочатку РК-дисплей встановлюється в режим 16x2, а привітальне повідомлення відображається та очищається.
lcd.begin (16,2); // РК- дисплей встановлений у режимі 16x2 lcd.print ("RS-485 Modbus"); // Привітальне повідомлення lcd.setCursor (0,1); lcd.print ("Arduino Slave"); затримка (5000); lcd.clear ();
Після цього виводи LED1 та LED2 встановлюються як вихідні виводи.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Сервоімпульсний штифт, підключений до ШІМ-штифта 6 Arduino, прикріплений.
servo.attach (6);
Тепер для зв'язку Modbus встановлюються такі параметри. Перший '1' представляє підлеглий ідентифікатор, другий '1' означає, що він використовує RS-485 для передачі даних, а '4' представляє RS-485 DE&RE штифт, підключений до Arduino UNO.
шина = Modbus (1,1,4);
Ведений Modbus встановлює швидкість передачі даних 9600 бод.
Цикл починається з визначення опитування шини, а bus.poll () використовується для запису та отримання значення від головного Modbus.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Цей метод використовується для перевірки наявності даних послідовного порту.
Якщо на послідовному порту є доступні дані, бібліотека Modbus RTU перевірить повідомлення (перевірить адресу пристрою, довжину даних та CRC) та виконає необхідну дію.
Наприклад, щоб записати або прочитати будь-яке значення з ведучого, ModbusRTU повинен отримати беззнаковий 16-розрядний цілочисельний масив та його довжину від головного Modbus. Цей масив несе дані, записані з ведучого.
У цьому посібнику є три масиви для LED1, LED2 та кута сервомотора.
Спочатку для ввімкнення або вимкнення використовується LED1 modbus_array.
if (modbus_array == 0) // Залежить від значення в modubus_array, написаному Master Modbus { digitalWrite (led1, LOW); // Світлодіод вимкнений, якщо 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // Світлодіод увімкнено, якщо значення відмінне від 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Далі для увімкнення або вимкнення використовується LED2 modbus_array.
if (modbus_array == 0) // Залежить від значення в modbus_array, написаного Master Modbus { digitalWrite (led2, LOW); // Світлодіод вимкнений, якщо 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // Світлодіод увімкнено, якщо значення відмінне від 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Далі для встановлення кута нахилу серводвигуна на РК-дисплеї 16x2 друкується використаний modbus_array та значення.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Серво кут:"); lcd.print (pwm); затримка (200); lcd.clear ();
На цьому програмування Arduino UNO завершено для роботи як MODBUS Slave. Наступним кроком буде тестування його як Modbus Slave.
Тестування Arduino UNO як Rs485 Modbus Slave
Після завершення мережевих з'єднань і завантаження коду в Arduino UNO настає час підключити USB до RS-485 модуля до ПК, де встановлено програмне забезпечення Simple Modbus Master.
Відкрийте диспетчер пристроїв і перевірте COM-порт відповідно до вашого ПК, де підключений модуль USB до RS-485, а після цього відкрийте програмне забезпечення Simply Modbus Master 8.1.1.
1. Після відкриття Просто Modbus Software відкрийте опцію Write.
2. Після того, як відкрито Просто записування Modbus Master Write. Встановіть параметри
Режим в RTU, COM-порт відповідно до вашого ПК (моїм був COM6), швидкість передачі даних 9600, біти даних 8, стоп-біт 1, парність відсутня та ідентифікатор веденого пристрою як 1.
3. Після цього встановіть перший регістр як 40001, а значення для запису - 3, а код функції - 16 (Реєстр збереження запису).
Після цього напишіть від 1 до 40001 (для світлодіодів1 увімкнено) та від 1 до 40002 (для світлодіодів2 увімкнено) та від 90 до 40003 (для кута сервомотора), а потім натисніть кнопку НАДІСЛАТИ.
Ви можете бачити як світлодіодний статус горить, так і кут сервоприводу на 90 градусів.
4. Після цього введіть 40001 як 1 та 40002 як 0 та 40003 як 180 та натисніть кнопку НАДІСЛАТИ.
5. Тепер записуємо від 135 до 40003 та 40001 як 0 та 40002 як 1.
Ось як RS-485 Modbus може бути використаний у послідовному зв'язку з Arduino UNO як ведений. У наступному навчальному посібнику ми будемо використовувати Arduino Uno як майстер комбінації MODBUS.
Знайдіть повний код та демонстраційне відео нижче.