RS485 Giao tiếp nối tiếp giữa hai bảng Arduino

RS485 Giao tiếp nối tiếp giữa hai bảng Arduino

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách thực hiện giao tiếp nối tiếp RS485 giữa hai bảng Arduino bằng mô-đun 5V MAX485 TTL đến RS485. Giao diện được được sử dụng trong Modbus công nghiệp để giao tiếp với các thiết bị khác nhau. Chúng tôi sẽ làm theo giao thức truyền thông nối tiếp RS485 và trình diễn nó bằng hai bảng Arduino. Một nút sẽ hoạt động như một nút chính RS485 và nút kia sẽ hoạt động như một nút phụ. Chủ sẽ được kết nối với một chiết áp sẽ được sử dụng để thay đổi các giá trị ADC. Nút phụ sẽ nhận dữ liệu ADC này từ chủ qua RS485 và kiểm soát độ sáng của đèn LED và cũng hiển thị giá trị trên OLED. Các giá trị ADC này sẽ được chuyển từ master sang slave thông qua mô-đun RS485.

RS485 Truyền thông nối tiếp

Truyền thông nối tiếp liên quan đến việc truyền dữ liệu theo cách nối tiếp, có nghĩa là nó được gửi và nhận từng bit một. Đây là hình thức truyền dữ liệu điện tử cơ bản nhất và là hình thức giao tiếp chính giữa các máy móc trong các thế hệ máy tính cá nhân đầu tiên. Việc triển khai chức năng giao tiếp nối tiếp trong một hệ thống nhúng đòi hỏi các nhà phát triển và kỹ sư liên quan phải hiểu biết về các giao thức nối tiếp cơ bản được sử dụng trong hình thức truyền dữ liệu này. Các giao thức phổ biến nhất bạn sẽ gặp là các tiêu chuẩn RS232 / RS422 / RS485.

Giao thức RS485 là một dạng giao tiếp nối tiếp không đồng bộ cho phép bus truyền thông kết nối nhiều thiết bị cùng một lúc. Giao tiếp ở một nửa song công bằng cách sử dụng hai dây và mặt bằng chung. Nó nhanh hơn và bao gồm một phạm vi rộng hơn so với các tiêu chuẩn khác như RS232, v.v. Cung cấp chiều dài cáp tối đa là 1200m. Có thể kết nối với tối đa 32 thiết bị không giống như RS232 kết nối với một thiết bị duy nhất. Hơn nữa, nó được ưa thích trong môi trường công nghiệp ồn ào về điện vì nó ít gặp vấn đề về tiếng ồn.

Tín hiệu vi sai được sử dụng trong giao thức này để cung cấp khả năng chống ồn tốt hơn cũng như khôi phục tín hiệu bị mất ở cuối dòng. Nó hoạt động bằng cách đặt tín hiệu trên 1 dây và nghịch đảo của tín hiệu trên dây kia.

Ngoài tất cả những ưu điểm được liệt kê ở trên, giao thức RS485 truyền dữ liệu thành công giữa các thiết bị trên một khoảng cách lớn khiến nó trở thành lựa chọn tối ưu để sử dụng trong các ngành công nghiệp.

Mô-đun thu phát MAX485 RS485

Mô-đun thu phát MAX485 RS485 được sử dụng khi truyền dữ liệu giữa các bảng Arduino. Mô-đun thu phát này bao gồm IC Maxim MAX485 cung cấp giao tiếp nối tiếp mạnh mẽ trên một khoảng cách dài lên đến 1200m. Mô-đun tiết kiệm năng lượng truyền dữ liệu theo cả hai hướng với tốc độ dữ liệu tối đa là 2.5 Mbps.

Hơn nữa, mô-đun 5V MAX485 TTL đến RS485 này có thể dễ dàng được giao tiếp với các bộ vi điều khiển chẳng hạn như Arduino vì nó sử dụng các mức logic 5V.

Một số tính năng chính của Mô-đun RS485 bao gồm:

  • Tín hiệu vi sai cho khả năng chống ồn tốt hơn

  • Bao gồm khoảng cách lên đến 1200 mét

  • Tốc độ dữ liệu tối đa 2,5 Mbps

  • Hỗ trợ tối đa 32 thiết bị trên cùng một bus

  • Đèn LED nguồn màu đỏ

  • Điện áp hoạt động 5V

  • Tiêu thụ điện năng thấp

Mô-đun MAX485 PinOut

Mô-đun thu phát MAX485 bao gồm 8 chân, mỗi bên 4 chân. Chúng được thể hiện trong hình dưới đây:

Mô-đun RS485 pin ra

Tên pin

Mô tả:__________

VCC

Đây là pin cung cấp điện. Nó được kết nối với 5V để cấp nguồn cho mô-đun.

Một

Đây là đầu vào bộ thu không đảo ngược và đầu ra trình điều khiển. Nó được kết nối với A trên mô-đun khác.

B

Đây là đầu vào và đầu ra trình điều khiển của bộ thu đảo ngược. Nó được kết nối với B trên mô-đun khác.

GND ·

Đây là chân GND. Nó được kết nối với mặt bằng chung.

RO

Đây là chân đầu ra của máy thu. Nó được kết nối với chân RX của vi điều khiển.

TÁI

Đây là đầu ra máy thu cho phép pin. Để bật, nó được đặt ở trạng thái THẤP.

DE

Đây là đầu ra trình điều khiển cho phép pin. Để bật, nó được đặt ở trạng thái CAO.

DI

Đây là đầu vào trình điều khiển. Nó được kết nối với chân TX của vi điều khiển.

Mô-đun cũng bao gồm 2 khối đầu cuối trục vít là một phần của phía đầu ra.

A: Đây là đầu vào và đầu ra trình điều khiển đầu thu không đảo ngược. Nó được kết nối với A trên mô-đun khác.

B: Đây là đầu vào bộ thu đảo ngược và đầu ra trình điều khiển. Nó được kết nối với B trên mô-đun khác.

Dự án: Giao tiếp nối tiếp RS485 giữa hai bảng Arduino (Điều khiển độ sáng LED)

Hãy để chúng tôi trình bày một ví dụ về truyền dữ liệu nối tiếp RS485 giữa hai bảng Arduino bằng cách sử dụng mô-đun MAX485 TTL sang RS-485. Mục đích của chúng tôi sẽ là gửi các giá trị ADC từ Arduino chính được kết nối với chiết áp thông qua mô-đun RS485 đến Arduino nô lệ. Arduino nô lệ sẽ được kết nối với đèn LED và màn hình OLED. Độ sáng của đèn LED sẽ thay đổi theo các giá trị ADC được tạo ra bởi chiết áp ở phía chính. Ngoài ra, màn hình OLED cũng sẽ in các giá trị PWM hiện tại (0-255).

Sơ đồ mạch cấu hình chính và phụ

Chúng tôi sẽ yêu cầu các thành phần sau cho dự án này:

Các thành phần bắt buộc

  • 2 bảng Arduino UNO

  • 2 Mô-đun RS485

  • 1 Chiết áp

  • 1 đèn LED

  • 1 Màn hình OLED

  • Dây kết nối

  • Breadboard

Để kết nối đúng cách, tất cả các thiết bị đều tuân thủ thành công các kết nối rất cẩn thận. Thực hiện theo sơ đồ dưới đây:

Mô-đun RS485 với Arduino UNO (Master và Slave)

Mô-đun RS485 với phần cứng Arduino UNO (Master và Slave)

Master Arduino Side

Đầu tiên, chúng tôi sẽ giải thích các kết nối giữa phía Master Arduino. Arduino chính được kết nối với chiết áp và mô-đun RS485. Trong số tám chân của mô-đun RS485, chúng tôi đã kết nối 6 chân với bảng Arduino UNO.

Dưới đây, bạn có thể xem các kết nối giữa bảng Arduino và mô-đun thu phát.

Arduino UNO

Mô-đun RS485

5V

VCC

GND ·

GND ·

chân 0 (RX)

RO

Chân 8

RE & DE

chân 1 (TX)

DI

Kết nối chân VCC của mô-đun RS485 với 5 V từ Arduino. Ngoài ra, kết nối cả hai căn cứ lại với nhau. Chân RO sẽ được kết nối với chân RX nối tiếp của Arduino UNO là chân 0. Tương tự như vậy, chân DI sẽ được kết nối với chân TX nối tiếp của Arduino UNO là chân 1. Các chân RE và DE sẽ được kết nối cùng với bất kỳ chân đầu ra kỹ thuật số nào của bảng Arduino. Chúng tôi đã sử dụng chân kỹ thuật số 8 để kết nối hai chân này.

Phần còn lại của hai chân của mô-đun RS485: B và A được kết nối với các chân B và A khác của mô-đun RS485 tương ứng được kết nối với Arduino phụ.

Chúng tôi đã kết nối chiết áp với chân Analog A0 của bảng Arduino của chúng tôi. Một cực của chiết áp được cấp nguồn bằng 5V (màu đỏ), đầu cuối trung tâm được kết nối với A0 và cực cuối cùng được nối đất (màu đen).

Mô-đun RS485 với Arduino UNO (mặt chính)

 

Arduino Side phụ

Tiếp theo, chúng tôi sẽ giải thích các kết nối của Slave Arduino với mô-đun RS-485, đèn LED và màn hình OLED. Các kết nối của Arduino với mô-đun RS485 là như nhau. Chỉ cần đảm bảo kết nối B và A của mô-đun RS485 (phía phụ) với các chân B và A của mô-đun RS485 (phía chính) một cách chính xác.

Tiếp theo, OLED có bốn chân mà chúng ta sẽ kết nối với Arduino. Chúng tôi sẽ kết nối thiết bị đầu cuối VCC của màn hình OLED với 5V, điểm chung với bảng Arduino. SCL của màn hình sẽ được kết nối với chân SCL mặc định của bảng Arduino là A5. SDA của màn hình sẽ được kết nối với SDA mặc định của Arduino là A4. Ngoài ra, các chân nối đất sẽ được kết nối chung.

Arduino UNO

Công nghệ OLED

GND ·

GND ·

5V

VCC

A5 ·

SCL

A4 ·

SDA

Hơn nữa, chúng tôi đã kết nối cực dương của đèn LED với chân kỹ thuật số 10 và cực âm với mặt bằng chung. Bạn cũng có thể sử dụng bất kỳ chân PWM nào khác của bảng Arduino để kết nối với đèn LED.

Mô-đun RS485 với Arduino UNO (phía Slave)

Cài đặt thư viện OLED trong Arduino IDE

Để sử dụng màn hình OLED trong dự án của mình, chúng ta phải cài đặt thư viện Adafruit SSD 1306 và thư viện Adafruit GFX trong Arduino IDE. Làm theo các bước dưới đây để cài đặt chúng thành công.

Mở Arduino IDE và nhấp vào Sketch > Library > Manage Libraries. Nhập 'SSD1306' vào tab tìm kiếm và cài đặt thư viện Adafruit SSD1306 OLED.

Cài đặt Thư viện OLED SSD1306 Arduino IDE

Chúng tôi cũng sẽ yêu cầu thư viện Adafruit GFX là một phụ thuộc cho SSD1306. Nhập 'Adafruit GFX' vào tab tìm kiếm và cài đặt nó.

Cài đặt thư viện GFX Adafruit

Arduino Sketch dành cho Master

Mở Arduino IDE của bạn và đi tới Tệp > Mới. Một tệp mới sẽ mở ra. Sao chép mã được cung cấp bên dưới trong tệp đó và lưu nó.

Bản phác thảo này dành cho Arduino đóng vai trò là bậc thầy. Nó sẽ chuyển các giá trị ADC thông qua mô-đun RS485 sang Slave Arduino.

 

int Enable_pin = 8;

int Analog_pin = A0;

int ADC_Value = 0 ;

 

void setup()

{

  Serial.begin(115200);

  pinMode(Enable_pin, OUTPUT);

  pinMode(Analog_pin, INPUT);

  delay(10);

  digitalWrite(Enable_pin, HIGH);

}

void loop()

{

  int ADC_Value = analogRead(Analog_pin);

  Serial.println(ADC_Value);          //Serial Write ADC_Value to RS-485 Bus

  delay(100);

}

Mã hoạt động như thế nào?

Trước tiên, chúng tôi sẽ xác định chân kỹ thuật số Arduino mà chúng tôi đã kết nối với các chân DE và RE của mô-đun. Chúng tôi đã gắn nhãn nó là 'Enable_pin' và đặt giá trị 8 cho nó. Đây là chân kỹ thuật số Arduino mà chúng tôi đang sử dụng.

int Enable_pin = 8;

Thứ hai, chúng ta sẽ định nghĩa thêm hai biến nữa. Người ta sẽ giữ chân ADC A0 mà chúng ta sẽ kết nối với chiết áp. Cái thứ hai sẽ được gọi là 'ADC_value' và sẽ lưu các giá trị ADC. Ban đầu chúng ta đã đặt giá trị về không. Các giá trị sẽ thay đổi từ 0-1023.

int Analog_pin = A0;

int ADC_Value = 0 ;

Bên trong hàm setup(), chúng ta sẽ mở giao tiếp nối tiếp với tốc độ truyền là 115200. Sau đó, chúng tôi sẽ định cấu hình chân bật làm chân đầu ra và chân Analog được kết nối với chiết áp làm chân đầu vào. Điều này sẽ đạt được bằng cách sử dụng hàm pinMode() và chuyển chân làm tham số đầu tiên và INPUT/OUTPUT làm tham số thứ hai.

Hơn nữa, chúng tôi sẽ đặt trạng thái Enable_pin thành CAO. Điều này sẽ đảm bảo rằng các chân DE và RE đều được đặt thành CAO để kích hoạt trình điều khiển.

void setup()

{

  Serial.begin(115200);

  pinMode(Enable_pin, OUTPUT);

  pinMode(Analog_pin, INPUT);

  delay(10);

  digitalWrite(Enable_pin, HIGH);

}

Bên trong hàm loop(), chúng ta sẽ tìm ra giá trị ADC theo điện áp thay đổi bằng cách sử dụng analogRead () sau mỗi 0,1 giây. Chúng ta sẽ chuyển chân ADC được kết nối với chiết áp như một đối số bên trong nó. Điều này sẽ được lưu trữ trong biến số nguyên mà chúng ta đã định nghĩa trước đó 'ADC_value.' Điều này sẽ được gửi đến RS-485 xe buýt nối tiếp.

void loop()

{

  int ADC_Value = analogRead(Analog_pin);

  Serial.println(ADC_Value);          //Serial Write ADC_Value to RS-485 Bus

  delay(100);

}

Arduino Sketch cho phụ

Mở Arduino IDE của bạn và đi tới Tệp > Mới. Một tệp mới sẽ mở ra. Sao chép mã được cung cấp bên dưới trong tệp đó và lưu nó.

Bản phác thảo này dành cho Arduino đóng vai trò là phụ. Nó sẽ nhận được các giá trị ADC thông qua mô-đun RS485 nối tiếp từ Master Arduino và điều khiển độ sáng LED và màn hình OLED cho phù hợp.

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

 

int Enable_pin = 8;

int LED_pin = 10;

 

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire, -1);

 

void setup()

{

  Serial.begin(115200);

  pinMode(LED_pin, OUTPUT);

  pinMode(Enable_pin, OUTPUT);

  digitalWrite(Enable_pin, LOW);        //  (LOW to receive value from Master)

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  display.display();

  delay(100);

  display.clearDisplay();

  display.display();

  display.setTextColor(WHITE);

 

}

 

void loop()

 

{

  while (Serial.available())

  {

 

    display.clearDisplay();

    int PWM_master = Serial.parseInt();            //Receive INT value from Master throught RS-485

    int duty_cycle = map(PWM_master, 0, 1023, 0, 255); //Map that value 

    Serial.println(duty_cycle);

    

    analogWrite(LED_pin, duty_cycle);              //PWM_master write to LED

    

    display.setCursor(0, 0);

    display.setTextSize(2);

    display.print("MASTER PWM");

 

    display.setCursor(50, 30);

    display.setTextSize(4);

    display.print(duty_cycle);

 

    display.display();

    delay(100);

 

  }

}

Mã hoạt động như thế nào?

Đầu tiên, chúng tôi sẽ bao gồm các thư viện OLED mà chúng tôi đã cài đặt trước đó để có chức năng phù hợp của màn hình OLED.

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

Sau đó, chúng tôi sẽ tạo một biến số nguyên cho chân kỹ thuật số Arduino mà chúng tôi đã kết nối với các chân DE và RE của mô-đun. Chúng tôi đã gắn nhãn nó là 'Enable_pin' và đặt giá trị 8 cho nó. Đây là chân kỹ thuật số Arduino mà chúng tôi đang sử dụng.

int Enable_pin = 8;

Chúng tôi sẽ xác định chân Arduino PWM mà chúng tôi đã kết nối với cực dương của đèn LED.

int LED_pin = 10;

Bây giờ, chúng ta sẽ tạo một đối tượng có tên là màn hình sẽ xử lý màn hình OLED và chỉ định chiều rộng, chiều cao, phiên bản I2C (&Dây) và -1 làm tham số bên trong nó.' -1 ′ chỉ định rằng màn hình OLED mà chúng ta đang sử dụng không có chân RESET. Nếu bạn đang sử dụng mã pin RESET thì hãy chỉ định GPIO mà qua đó bạn đang kết nối nó với bảng phát triển của mình.

 

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire, -1);

Bên trong hàm setup(), chúng ta sẽ mở giao tiếp nối tiếp với tốc độ truyền là 115200. Sau đó, chúng tôi sẽ định cấu hình cả chân bật và chân LED được xác định trước đó là chân đầu ra. Điều này sẽ đạt được bằng cách sử dụng hàm pinMode() và chuyển chân làm tham số đầu tiên và INPUT/OUTPUT làm tham số thứ hai.

Hơn nữa, chúng tôi sẽ đặt trạng thái Enable_pin thành THẤP. Điều này sẽ đảm bảo rằng các chân DE và RE đều được đặt thành THẤP để bật bộ thu.

  Serial.begin(115200);

  pinMode(LED_pin, OUTPUT);

  pinMode(Enable_pin, OUTPUT);

  digitalWrite(Enable_pin, LOW);        //  (LOW to receive value from Master)

Chúng tôi sẽ khởi tạo màn hình OLED bằng cách sử dụng display.begin(). Đảm bảo bạn chỉ định địa chỉ chính xác của màn hình. Trong trường hợp của chúng tôi, nó là 0X3C.

Sau đó, chúng ta sẽ xóa buffer bằng cách sử dụng clearDisplay() trên đối tượng Adafruit_SSD1306. Ngoài ra, chúng tôi sẽ đặt màu của văn bản là màu trắng.

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  display.display();

  delay(100);

  display.clearDisplay();

  display.display();

  display.setTextColor(WHITE);

vòng lặp()

Bên trong hàm loop(), chúng ta sẽ kiểm tra xem có bất kỳ dữ liệu nào có sẵn tại cổng nối tiếp hay không. Trong khi dữ liệu có sẵn, trước tiên chúng tôi sẽ xóa bộ đệm của màn hình. Sau đó, chúng tôi sẽ ánh xạ các giá trị ADC nhận được từ Arduino chính từ 0-1023 đến các giá trị từ 0-255. Điều này sẽ được lưu trữ trong biến số nguyên 'duty_cycle.' Giá trị cũng sẽ được in trên màn hình nối tiếp của chúng tôi.

  while (Serial.available())

  {

    display.clearDisplay();

    int PWM_master = Serial.parseInt();           

    int duty_cycle = map(PWM_master, 0, 1023, 0, 255); 

    Serial.println(duty_cycle);

    

Hàm analogWrite() sẽ được gọi là sẽ tạo ra tín hiệu PWM tương ứng với giá trị chu kỳ nhiệm vụ. Giá trị của chu kỳ nhiệm vụ có thể thay đổi từ 0 đến 255. Điều đó có nghĩa là, khi giá trị chu kỳ nhiệm vụ là 0, đèn LED sẽ hoàn toàn không phát sáng và tương tự khi nó là 255, đèn LED sẽ phát sáng với độ sáng đầy đủ.

analogWrite(LED_pin, duty_cycle);  

Phần mã sau đây hiển thị giá trị PWM này được gửi bởi chủ đã được chuyển đổi thành 0-255, trên màn hình OLED.

 

    display.setCursor(0, 0);

    display.setTextSize(2);

    display.print("MASTER PWM");

 

    display.setCursor(50, 30);

    display.setTextSize(4);

    display.print(duty_cycle);

 

    display.display();

    delay(100);

 

Demonstration

Để xem trình diễn của dự án này, hãy tải mã chủ và mã phụ lên các bảng Arduino tương ứng. Tuy nhiên, trước khi tải mã lên, hãy đảm bảo chọn Arduino từ Bảng > Công cụ và cũng chọn đúng cổng COM mà bảng Arduino được kết nối từ Công cụ > Cổng.

chọn Arduino uno

Sau khi mã được tải lên Arduino, hãy xoay núm của chiết áp và độ sáng của đèn LED sẽ khác nhau. Tăng giá trị đầu vào từ chiết áp hoạt động như tăng chu kỳ làm việc do đó độ sáng của đèn LED tăng lên. OLED cũng sẽ hiển thị các giá trị PWM hiện tại trong phạm vi 0-255 có được từ bảng Arduino chính.

Mô-đun RS485 với bản demo Arduino UNO (Master và Slave)

>>> 100+ Mã Sản Phẩm Dây Rút: https://mecsu.vn/san-pham/day-rut-nhua.5op

>>> 1000+ Mã Sản Phẩm Đầu Cosse: https://mecsu.vn/san-pham/dau-cosse.Q1j

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn