- Giao tiếp nối tiếp RS-485
- Thành phần bắt buộc
- Sơ đồ mạch
- Lập trình STM32F103C8 & Arduino UNO cho giao tiếp nối tiếp RS485
- Kiểm tra giao tiếp RS485 giữa STM32F103C8 và Arduino UNO:
Các giao thức truyền thông là một phần không thể thiếu của hệ thống nhúng và điện tử kỹ thuật số. Bất cứ nơi nào có sự giao tiếp của nhiều bộ vi điều khiển và thiết bị ngoại vi, giao thức truyền thông phải được sử dụng để trao đổi nhóm dữ liệu. Có nhiều loại giao thức truyền thông nối tiếp có sẵn. RS485 là một trong những giao thức truyền thông nối tiếp và được sử dụng trong các dự án công nghiệp và máy móc hạng nặng.
Chúng ta đã tìm hiểu về Giao tiếp nối tiếp RS485 giữa Arduino Uno và Arduino Nano trong hướng dẫn trước . Hướng dẫn này là về cách sử dụng giao tiếp nối tiếp RS-485 trong Vi điều khiển STM32F103C8. Nếu bạn chưa quen với Vi điều khiển STM32 thì hãy bắt đầu với Bắt đầu với STM32 bằng Arduino IDE: Đèn LED nhấp nháy và kiểm tra tất cả các dự án STM32 tại đây.
Trong hướng dẫn này, Master STM32F103C8 có ba nút nhấn được sử dụng để điều khiển trạng thái của ba đèn LED hiện diện trên Slave Arduino Uno bằng cách sử dụng giao tiếp nối tiếp RS-485.
Hãy bắt đầu bằng cách tìm hiểu hoạt động của giao tiếp nối tiếp RS-485.
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 pháp 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à giao tiếp Full-Duplex khi sử dụng 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.
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 vi điều khiển, cần có mô-đun có tên 5V MAX485 TTL đến 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 và nó là hai chiều và bán song công có tốc độ truyền dữ liệu là 2,5 Mb / giây. Mô-đun này yêu cầu điện áp là 5V.
Mô tả chân RS-485:
Tên ghim |
Sự miêu 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 RS485 có các tính năng sau:
- Điện áp hoạt động: 5V
- Chip MAX485 trên bo mạch
- Tiêu thụ điện năng thấp cho giao tiếp RS485
- Bộ thu phát giới hạn tốc độ quay
- Thiết bị đầu cuối 2P cao 5,08mm
- Hệ thống dây giao tiếp RS-485 thuận tiện
- Tất cả các chân của chip đã được dẫn đến có thể được điều khiển thông qua vi điều khiển
- Kích thước bảng: 44 x 14mm
Sử dụng mô-đun này với STM32F103C8 và Arduino UNO rất dễ dàng. Các cổng nối tiếp phần cứng của bộ vi điều khiển được sử dụng. Các chân nối tiếp phần cứng trong STM32 và arduino UNO được đưa ra bên dưới.
- Trong STM32F103C8: Chân PA9 (TX) & PA10 (RX)
- Trong Arduino Uno: Pin 0 (RX) & 1 (TX)
Lập trình cũng rất đơn giản chỉ cần sử dụng Serial.print () để viết thư cho RS-485 và Serial.Read () để đọc từ RS-485 và các chân DE & RE RS-485 được làm bằng LOW để nhận dữ liệu và thực hiện CAO tới ghi dữ liệu vào RS-485 bus.
Thành phần bắt buộc
- STM32F103C8
- Arduino UNO
- Mô-đun chuyển đổi MAX485 TTL sang RS485 - (2)
- Chiết áp 10K
- Nút ấn - 3
- LED - 3
- Điện trở
- Breadboard
- Kết nối dây
Sơ đồ mạch
Trong hướng dẫn này, STM32F103C8 được sử dụng làm Master với một mô-đun RS-485 và Arduino UNO được sử dụng làm Slave với một mô-đun RS-485 khác.
Kết nối mạch giữa RS-485 và STM32F103C8 (Master):
RS-485 |
STM32F103C8 |
DI |
PA9 (TX1) |
DE RE |
PA3 |
R0 |
PA10 (RX1) |
VCC |
5V |
GND |
GND |
A |
To A of Slave RS-485 |
B |
Tới B của Slave RS-485 |
STM32F103C8 với ba nút nhấn:
Ba nút Đẩy với ba điện trở kéo xuống 10k được kết nối với các chân PA0, PA1, PA2 của STM32F103C8.
Kết nối mạch giữa RS-485 và Arduino UNO (Slave):
RS-485 |
Arduino UNO |
DI |
1 (TX) |
DE RE |
2 |
R0 |
0 (RX) |
VCC |
5V |
GND |
GND |
A |
Tới A của Master RS-485 |
B |
Tới B của Master RS-485 |
Ba đèn LED được sử dụng trong đó Cực dương của đèn LED có điện trở 330 ohms được kết nối với chân 4, 7, 8 của Arduino UNO và Cathode của đèn LED được kết nối với GND.
Lập trình STM32F103C8 & Arduino UNO cho giao tiếp nối tiếp RS485
Arduino IDE được sử dụng để phát triển và lập trình cho cả hai bo mạch tức là STM32 và Arduino UNO. Nhưng hãy đảm bảo rằng bạn đã chọn CỔNG tương ứng từ Công cụ-> Cổng và Bảng từ Công cụ-> Bảng. Nếu bạn thấy bất kỳ khó khăn hoặc nghi ngờ nào thì chỉ cần tham khảo Lập trình STM32 của bạn trong ARDUINO IDE. Lập trình cho hướng dẫn này bao gồm Hai phần một dành cho STM32F103C8 (Master) và phần khác dành cho Arduino UNO (Slave). Cả hai mã sẽ được giải thích từng cái một bên dưới.
STM32F103C8 làm MasterỞ phía Master, trạng thái của Nút nhấn được đọc và sau đó ghi nối tiếp các giá trị đó vào bus RS-485 thông qua Cổng nối tiếp phần cứng 1 (PA9, PA10) của STM32F103C8. Ngoài ra, không có thư viện bên ngoài cần thiết như bây giờ. Arduino có tất cả các thư viện cần thiết để giao tiếp nối tiếp.
Bắt đầu giao tiếp nối tiếp bằng cách sử dụng Chân nối tiếp phần cứng (PA9, PA10) ở tốc độ 9600.
Serial1.begin (9600);
Đọc trạng thái của nút nhấn tại các chân PA0, PA1, PA2 của STM32F103C8 và lưu trữ chúng trong một button1val, button2val, button3val có thể thay đổi. Giá trị là CAO nếu nút được nhấn và THẤP khi không nhấn.
int button1val = digitalRead (button1); int button2val = digitalRead (button2); int button3val = digitalRead (button3);
Trước khi gửi các giá trị nút đến cổng nối tiếp, chân DE & RE của RS-485 phải ở mức CAO được kết nối với chân PA3 của STM32F103C8 (Để đặt chân PA3 ở mức CAO):
digitalWrite (enablePin, HIGH);
Tiếp theo để đưa các giá trị đó vào Cổng nối tiếp và gửi các giá trị tùy thuộc vào nút nhấn nào được nhấn, sử dụng câu lệnh if else và gửi giá trị tương ứng khi nhấn nút.
Nếu nút đầu tiên được nhấn thì điều kiện khớp và giá trị '1' được gửi đến cổng nối tiếp nơi Arduino UNO được kết nối.
if (button1val == HIGH) { int num1 = 1; Serial1.println (num1); }
Tương tự, khi nhấn nút 2, giá trị 2 được gửi qua cổng nối tiếp và khi nhấn nút 3, giá trị 3 được gửi qua cổng nối tiếp.
else if (button2val == HIGH) { int num2 = 2; Serial1.println (num2); } else if (button3val == HIGH) { int num3 = 3; Serial1.println (num3); }
Và khi không có nút nào được nhấn, giá trị 0 được gửi đến Arduino Uno.
else { int num = 0; Serial1.println (num); }
Điều này kết thúc lập trình để cấu hình STM32 làm Master.
Arduino UNO dưới dạng SlaveỞ phía Slave, Arduino UNO nhận một giá trị số nguyên được gửi từ Master STM32F103C8 có sẵn tại cổng Nối tiếp phần cứng của Arduino UNO (P0, 1) nơi mô-đun RS-485 được kết nối.
Đơn giản chỉ cần đọc giá trị và lưu trữ trong một biến. Tùy thuộc vào giá trị nhận được, đèn LED tương ứng được BẬT hoặc TẮT được kết nối với Arduino GPIO.
Để nhận các giá trị từ Master chỉ cần làm cho các chân DE & RE của mô-đun RS-485 THẤP. Vì vậy chân-2 (enablePin) của Arduino UNO được đặt ở mức THẤP.
digitalWrite (enablePin, LOW);
Bây giờ chỉ cần đọc dữ liệu số nguyên có sẵn tại Cổng nối tiếp và lưu trữ chúng trong một biến.
int nhận = Serial.parseInt ();
Tùy thuộc vào giá trị (0, 1, 2, 3) nhận được, một trong ba đèn LED tương ứng được BẬT.
if (nhận == 1) // Tùy thuộc vào giá trị Đã nhận, đèn LED tương ứng được BẬT hoặc TẮT { digitalWrite (ledpin1, HIGH); } else if (nhận == 2) { digitalWrite (ledpin2, HIGH); } else if (nhận == 3) { digitalWrite (ledpin3, HIGH); } else { digitalWrite (ledpin1, LOW); digitalWrite (ledpin2, LOW); digitalWrite (ledpin3, LOW); }
Điều này kết thúc lập trình và cấu hình Arduino UNO làm Slave. Ngoài ra, điều này hoàn thành các cấu hình hoàn chỉnh cho Arduino UNO và STM32. Video làm việc và tất cả các mã được đính kèm ở cuối hướng dẫn này.
Kiểm tra giao tiếp RS485 giữa STM32F103C8 và Arduino UNO:
1. Khi nhấn nút Nhấn-1, được kết nối với Master STM32, đèn LED 1 BẬT được kết nối với Slave Arduino.
2. Khi nhấn nút Nhấn-2, kết nối với Master STM32, đèn LED 2 BẬT được kết nối với Slave Arduino.
3. Tương tự khi nhấn nút Nhấn-3, đèn LED 3 BẬT được kết nối với Slave Arduino.
Điều này kết thúc giao tiếp nối tiếp RS485 giữa STM32F103C8 và Arduino UNO. Bo mạch Arduino UNO và STM32 là những bo mạch được sử dụng rộng rãi để tạo mẫu nhanh và chúng tôi đã thực hiện nhiều dự án hữu ích về những bo mạch này. Nếu bạn thấy bất kỳ nghi ngờ hoặc có bất kỳ đề xuất nào cho chúng tôi thì hãy viết và bình luận bên dưới.