- Giao tiếp nối tiếp RS-485
- Kết nối RS-485 với Arduino
- Mô-đun chuyển đổi USB sang RS-485
- Đơn giản là Phần mềm Modbus Master
- Công cụ yêu cầu
- Sơ đồ mạch
- Lập trình Arduino UNO cho RS-485 MODBUS Slave
- Kiểm tra Arduino UNO dưới dạng Rs485 Modbus Slave
Modbus là một giao thức Truyền thông nối tiếp được phát hiện bởi Modicon vào năm 1979 và nó được sử dụng để truyền dữ liệu qua các đường nối tiếp giữa các thiết bị điện tử công nghiệp. RS-485 Modbus sử dụng RS-485 cho đường truyền. Cần lưu ý rằng Modbus là một giao thức phần mềm và không phải là một giao thức phần cứng. Nó được chia thành hai phần như Modbus Master và Modbus Slave. Trong mạng RS-485 Modbus có một Master và 127 Slave, mỗi Master và 127 Slave có địa chỉ duy nhất từ 1 đến 127. Trong dự án Arduino MAX485 này, chúng tôi sẽ sử dụng Arduino Uno làm Slave cho giao tiếp nối tiếp.
Modbus chủ yếu được sử dụng trong PLC (Bộ điều khiển logic khả trình). Và ngoài điều này, Modbus cũng được sử dụng trong Y tế, Giao thông vận tải, Tự động hóa gia đình, v.v. Modbus có 255 mã chức năng và chủ yếu có ba phiên bản phổ biến của Modbus:
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Sự khác biệt giữa Modbus ASCII và Modbus RTU là gì?
Modbus RTU và Modbus ASCII nói cùng một giao thức. Sự khác biệt duy nhất là các byte được truyền qua dây được trình bày dưới dạng nhị phân với RTU và ASCII có thể đọc được với Modbus RTU. Modbus RTU sẽ được sử dụng trong hướng dẫn này.
Hướng dẫn này là về cách sử dụng giao tiếp Modbus RS-485 với Arduino UNO dưới dạng Slave. Ở đây chúng tôi cài đặt Phần mềm Simply Modbus Master trong PC và điều khiển hai đèn LED và Động cơ Servo bằng cách sử dụng RS-485 làm đường truyền. Các đèn LED và động cơ servo này được kết nối với Slave Arduino và được điều khiển bằng cách gửi các giá trị bằng Phần mềm Master Modbus. Vì hướng dẫn này sử dụng RS-485, trước tiên bạn nên đi qua Giao tiếp nối tiếp RS485 giữa Arduino Uno và Arduino Nano. RS485 cũng có thể được sử dụng với các bộ điều khiển khác để giao tiếp nối tiếp:
- Giao tiếp nối tiếp RS-485 giữa Raspberry Pi và Arduino UNO
- Giao tiếp nối tiếp giữa STM32F103C8 và Arduino UNO sử dụng RS-485
Hãy bắt đầu bằng cách khám phá một số thông tin cơ bản về RS-485 và Modbus. Cũng tìm hiểu thêm về các giao thức Giao tiếp nối tiếp khác nhau tại đây.
Giao tiếp nối tiếp RS-485
RS-485 là một giao thức truyền thông nối tiếp không đồng bộ không yêu cầu đồng hồ. Nó sử dụng một kỹ thuật gọi là tín hiệu vi phân để truyền dữ liệu nhị phân từ thiết bị này sang thiết bị khác.
Vậy phương thức truyền tín hiệu vi sai này là gì ??
Phương pháp tín hiệu vi sai hoạt động bằng cách tạo ra một điện áp vi sai bằng cách sử dụng 5V dương và âm. Nó cung cấp giao tiếp Half-Duplex khi sử dụng hai dây và Full-Duplex yêu cầu 4 bốn dây.
Bằng cách sử dụng phương pháp này:
- RS-485 hỗ trợ tốc độ truyền dữ liệu cao hơn, tối đa 30Mbps.
- Nó cũng cung cấp khoảng cách truyền dữ liệu tối đa so với giao thức RS-232. Nó truyền dữ liệu lên đến tối đa 1200 mét.
- Ưu điểm chính của RS-485 so với RS-232 là nhiều phụ kiện với một Master duy nhất trong khi RS-232 chỉ hỗ trợ một phụ kiện duy nhất.
- Có thể có tối đa 32 thiết bị được kết nối với giao thức RS-485.
- Một ưu điểm khác của RS-485 là không bị nhiễu vì chúng sử dụng phương pháp tín hiệu vi sai để truyền.
- RS-485 nhanh hơn so với giao thức I2C.
Kết nối RS-485 với Arduino
Mô-đun RS-485 có thể được kết nối với bất kỳ bộ vi điều khiển nào có cổng nối tiếp. Để sử dụng mô-đun RS-485 với bộ vi điều khiển, cần mô-đun có tên 5V MAX485 TTL to RS485 dựa trên IC Maxim MAX485 vì nó cho phép giao tiếp nối tiếp trên khoảng cách dài 1200 mét. Nó là hai chiều và bán song công và có tốc độ truyền dữ liệu 2,5 Mbps. Mô-đun này yêu cầu điện áp là 5V.
Pin-Out của RS-485:
Tên ghim |
Ghim Mô tả |
VCC |
5V |
A |
Đầu vào máy thu không đảo Đầu ra trình điều khiển không đảo ngược |
B |
Đầu vào máy thu đảo ngược Đảo ngược đầu ra trình điều khiển |
GND |
GND (0V) |
R0 |
Đầu ra máy thu (chân RX) |
RE |
Đầu ra máy thu (LOW-Enable) |
DE |
Đầu ra trình điều khiển (Bật cao) |
DI |
Đầu vào trình điều khiển (chân TX) |
Mô-đun chuyển đổi USB sang RS-485
Đây là mô-đun Bộ chuyển đổi USB sang RS485 hỗ trợ WIN7, XP, Vista, Linux, Mac OS và cung cấp giao diện RS485 dễ sử dụng bằng cách sử dụng cổng COM trong máy tính . Mô-đun này là thiết bị plug-and-play . Không có cấu trúc lệnh nào, bất cứ thứ gì được gửi đến Cổng COM ảo sẽ được tự động chuyển đổi thành RS485 và ngược lại. Mô-đun hoàn toàn tự cấp nguồn từ bus USB. Vì vậy, không cần cung cấp điện bên ngoài để hoạt động.
Nó hiển thị như một cổng Serial / COM và có thể truy cập được từ các ứng dụng hoặc siêu thiết bị đầu cuối. Bộ chuyển đổi này cung cấp giao tiếp RS-485 bán song công. Phạm vi tốc độ Baud là 75 bps đến 115200 bps, tối đa lên đến 6 Mbps.
Để sử dụng thiết bị này, có nhiều Phần mềm Modbus khác nhau trên internet. Trong hướng dẫn này, một phần mềm có tên Simply Modbus Software được sử dụng.
Đơn giản là Phần mềm Modbus Master
Ứng dụng Modbus Master Software là cần thiết để gửi dữ liệu đến thiết bị Arduino Modbus RS-485 nô lệ qua COM.
Đơn giản Modbus Master là một phần mềm kiểm tra giao tiếp dữ liệu. Bạn có thể tải xuống Simply Modbus Master từ liên kết đã cho và tìm hiểu thêm về nó bằng cách tham khảo Hướng dẫn sử dụng phần mềm.
Trước khi sử dụng phần mềm, điều quan trọng là phải làm quen với các thuật ngữ sau.
ID nô lệ:
Mỗi slave trong mạng được gán một địa chỉ đơn vị duy nhất từ 1 đến 127. Khi master yêu cầu dữ liệu, byte đầu tiên nó gửi là địa chỉ Slave. Bằng cách này, mỗi nô lệ sẽ biết sau byte đầu tiên có bỏ qua thông báo hay không.
Mã chức năng:
Byte thứ hai được gửi bởi Master là mã Chức năng. Con số này cho nô lệ biết bảng nào cần truy cập và đọc từ hay ghi vào bảng.
Mã chức năng đăng ký được hỗ trợ:
Mã chức năng |
Hoạt động |
Tên bảng |
04 (04 hex) |
Đọc |
Thanh ghi đầu vào tương tự |
03 (03 hex) |
Đọc |
Thanh ghi giữ đầu ra tương tự |
06 (06 hex) |
Viết đơn |
Đăng ký giữ đầu ra tương tự |
16 (10 hex) |
Viết nhiều |
Thanh ghi giữ đầu ra tương tự |
Mã chức năng cuộn được hỗ trợ:
Mã chức năng |
Hoạt động |
Tên bảng |
02 (02 hex) |
Đọc |
Liên hệ đầu vào rời rạc |
01 (01 hex) |
Đọc |
Cuộn dây đầu ra rời rạc |
05 (05 hex) |
Viết đơn |
Cuộn dây đầu ra rời rạc |
15 (hệ thập lục phân 0F) |
Viết nhiều |
Cuộn dây đầu ra rời rạc |
CRC:
CRC là viết tắt của Kiểm tra dự phòng theo chu kỳ. Nó là hai byte được thêm vào cuối mỗi thông báo Modbus để phát hiện lỗi.
Công cụ yêu cầu
Phần cứng
- Arduino UNO
- Mô-đun chuyển đổi MAX-485 TTL sang RS-485
- Mô-đun chuyển đổi USB sang RS-485
- LED (2)
- 1k-Điện trở (2)
- Màn hình LCD 16x2
- Chiết áp 10k
- Động cơ Servo SG-90
Phần mềm
- Đơn giản là Modbus Master
Sơ đồ mạch
Kết nối mạch giữa mô-đun chuyển đổi MAX-485 TTL sang RS-485 và Arduino UNO:
Arduino UNO |
Mô-đun chuyển đổi MAX-485 TTL sang RS-485 |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
Kết nối mạch giữa Mô-đun MAX-485 TTL sang RS-485 và bộ chuyển đổi USB sang RS-485:
MAX-485 TTL đến RS-485 Mô-đun chuyển đổi |
Mô-đun USB sang RS-485 Đã kết nối với PC |
A |
A |
B |
B |
Kết nối mạch giữa Arduino UNO và màn hình LCD 16x2:
LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Để điều khiển chân chiết áp để điều khiển độ tương phản / độ sáng của màn hình LCD 16x2 |
RS |
số 8 |
RW |
GND |
E |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
A |
+ 5V |
K |
GND |
Kết nối mạch giữa 2 đèn LED, Động cơ Servo và Arduino UNO:
Arduino UNO |
LED1 |
LED2 |
Động cơ Servo |
2 |
Cực dương qua điện trở 1k |
- |
- |
5 |
- |
Cực dương qua điện trở 1k |
- |
6 |
- |
- |
Chân PWM (Cam) |
+ 5V |
- |
- |
+ 5V (ĐỎ) |
GND |
Cathode GND |
Cathode GND |
GND (Nâu) |
Lập trình Arduino UNO cho RS-485 MODBUS Slave
Arduino UNO được định cấu hình là Modbus Slave. Ngoài ra, Arduino UNO được gắn với hai đèn LED và một động cơ Servo. Vì vậy, Arduino nô lệ được điều khiển từ Phần mềm Master Modbus. Giao tiếp giữa Arduino UNO và Phần mềm Modbus Master được thực hiện bằng cách sử dụng mô-đun RS-485. Để kết nối nó với PC, mô-đun chuyển đổi USB sang RS-485 được sử dụng. Và Arduino UNO với mô-đun chuyển đổi MAX-485 TTL sang RS-485, toàn bộ thiết lập sẽ có dạng như sau:
Để sử dụng Modbus trong Arduino UNO, một thư viện
Ban đầu, hãy bao gồm thư viện bắt buộc. Thư viện ModbusRTU để sử dụng giao tiếp Modbus RS-485 và thư viện tinh thể lỏng để sử dụng LCD với Arduino UNO và thư viện servo để sử dụng động cơ Servo với Arduino UNO.
#include
Bây giờ các chân cực dương của LED được kết nối với chân 2 và 5 của Arduino được xác định là LED1 và LED2.
#define led1 2 #define led2 5
Tiếp theo, đối tượng để truy cập lớp Liquid Crystal được khai báo với các chân LCD (RS, E, D4, D5, D6, D7) được kết nối với Arduino UNO.
Màn hình LCD LiquidCrystal (8,9,10,11,12,13);
Khi LCD hoàn tất, Khởi tạo đối tượng servo cho lớp Servo. Đồng thời Khởi tạo đối tượng xe buýt cho lớp Modbus.
Servo servo; Xe buýt Modbus;
Tiếp theo để lưu trữ các giá trị cho giao tiếp Modbus, một mảng được khai báo với ba giá trị được khởi tạo bằng 0.
uint16_t modbus_array = {0,0,0};
Trong chức năng cài đặt , trước tiên, màn hình LCD được đặt ở chế độ 16x2 và thông báo chào mừng được hiển thị và xóa.
lcd.begin (16,2); // Bộ LCD ở chế độ 16x2 lcd.print ("RS-485 Modbus"); // Thông báo Chào mừng lcd.setCursor (0,1); lcd.print ("Arduino Slave"); chậm trễ (5000); lcd.clear ();
Sau đó, chân LED1 và LED2 được đặt làm chân đầu ra.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Chân xung servo kết nối với chân PWM 6 của Arduino được gắn vào.
servo.attach (6);
Bây giờ đối với giao tiếp Modbus, các thông số sau được thiết lập. Đầu tiên '1' đại diện cho Slave ID, '1' thứ hai đại diện cho nó sử dụng RS-485 để truyền dữ liệu và '4' đại diện cho chân RS-485 DE&RE được kết nối với Arduino UNO.
bus = Modbus (1,1,4);
Modbus slave được đặt ở 9600 baudrate.
Vòng lặp bắt đầu với định nghĩa của bus thăm dò và bus.poll () được sử dụng để ghi và nhận giá trị từ Modbus chính.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
Phương pháp này được sử dụng để kiểm tra xem có bất kỳ dữ liệu nào có sẵn ở cổng nối tiếp hay không.
Nếu có bất kỳ dữ liệu nào có sẵn tại cổng nối tiếp, thư viện Modbus RTU sẽ kiểm tra thông báo (kiểm tra địa chỉ thiết bị, độ dài dữ liệu và CRC) và thực hiện hành động cần thiết.
Ví dụ: để ghi hoặc đọc bất kỳ giá trị nào từ Master Modbus, ModbusRTU phải nhận một mảng số nguyên 16 bit không dấu và độ dài của nó từ Master Modbus. Mảng này mang dữ liệu được ghi từ cái chính.
Trong hướng dẫn này, có ba mảng cho LED1, LED2 và góc động cơ Servo.
Đầu tiên để BẬT hoặc TẮT LED1 modbus_array được sử dụng.
if (modbus_array == 0) // Phụ thuộc vào giá trị trong modubus_array được viết bởi Master Modbus { digitalWrite (led1, LOW); // LED TẮT nếu 0 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // LED ON nếu giá trị khác 0 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
Tiếp theo để BẬT hoặc TẮT LED2 modbus_array được sử dụng.
if (modbus_array == 0) // Phụ thuộc vào giá trị trong modbus_array được viết bởi Master Modbus { digitalWrite (led2, LOW); // LED TẮT nếu 0 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // LED ON nếu giá trị khác 0 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
Tiếp theo để đặt góc của động cơ Servo, modbus_array được sử dụng và giá trị được in trên màn hình LCD 16x2.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("Góc Servo:"); lcd.print (pwm); chậm trễ (200); lcd.clear ();
Điều này kết thúc lập trình Arduino UNO để nó hoạt động như MODBUS Slave. Bước tiếp theo sẽ là kiểm tra nó với tên gọi Modbus Slave.
Kiểm tra Arduino UNO dưới dạng Rs485 Modbus Slave
Sau khi kết nối mạch hoàn tất và mã được tải lên Arduino UNO, đã đến lúc kết nối USB với mô-đun RS-485 với PC có cài đặt phần mềm Simple Modbus Master.
Mở trình quản lý thiết bị và kiểm tra cổng COM theo PC của bạn nơi mô-đun USB sang RS-485 được kết nối và sau đó mở phần mềm Simply Modbus Master 8.1.1.
1. Sau khi Phần mềm Simply Modbus được mở, hãy mở tùy chọn Viết.
2. Sau khi Simply Modbus Master Write được mở. Đặt các thông số
Chế độ trong RTU, cổng COM theo PC của bạn (của tôi là COM6), Baud ở 9600, Data Bits 8, Stop bit 1, Parity Không có và Slave ID là 1.
3. Sau đó đặt thanh ghi đầu tiên là 40001 và các giá trị cần ghi là 3 và mã hàm là 16 (Ghi giữ thanh ghi).
Sau đó, ghi 1 đến 40001 (Đối với LED1 bật) và 1 đến 40002 (Đối với LED2 bật) và 90 đến 40003 (Đối với Góc động cơ Servo) và sau đó nhấp vào nút GỬI.
Bạn có thể thấy cả trạng thái đèn LED là BẬT và góc servo ở 90 độ.
4. Sau đó, nhập 40001 là 1 và 40002 là 0 và 40003 là 180 và nhấp vào nút GỬI.
5. Bây giờ viết 135 thành 40003 và 40001 là 0 và 40002 là 1.
Đây là cách Modbus RS-485 có thể được sử dụng trong giao tiếp nối tiếp với Arduino UNO dưới dạng Slave. Trong hướng dẫn tiếp theo, chúng tôi sẽ sử dụng Arduino Uno làm bậc thầy trong việc kết hợp MODBUS.
Tìm mã hoàn chỉnh và video minh họa bên dưới.