Giao tiếp RS485 giữa ESP32 với ESP8266

Giao tiếp RS485 giữa ESP32 với ESP8266

Chuẩn giao tiếp dữ liệu nối tiếp RS485 

Giao tiếp nối tiếp liên quan đến việc truyền dữ liệu theo cách nối tiếp, nghĩa là được gửi và nhận từng bit một. Đây là hình thức truyền dữ liệu cơ bản nhất và là hình thức giao tiếp chính giữa các máy trong các thế hệ máy tính cá nhân đầu tiên.  Việc triển khai giao tiếp nối tiếp trong một hệ thống nhúng yêu cầu các nhà phát triển và kỹ sư tham gia phải hiểu 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 sẽ gặp là các tiêu chuẩn RS232/RS422/RS485. 

Giao thức RS485 là một chuẩn giao tiếp nối tiếp không đồng bộ cho phép bus truyền dữ liệu kết nối đồng thời nhiều thiết bị. Giao tiếp ở chế độ bán song công (half duplex) sử dụng hai dây và nối đất chung. Nó nhanh hơn và sử dụng rộng hơn so với các tiêu chuẩn khác như RS232, v.v. Cho phé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ị. Hơn nữa, nó được ưa thích sử dụng trong môi trường công nghiệp có nhiễu về điện vì it bị nhiễu

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

 Ngoài tất cả các ư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 làm nó trở thành lựa chọn tối ưu để sử dụng trong các ngành công nghiệp. 

Module thu phát tín hiệu RS 485 MAX485

Module thu phát chuẩn RS485 MAX485 được sử dụng khi truyền dữ liệu giữa các bộ vi điều khiển. Module thu phát này bao gồm IC Maxim MAX485 hỗ trợ giao tiếp nối tiếp mạnh mẽ trên khoảng cách dài lên tới 1200m. Module 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.

Ngoài ra, module MAX485 có thể dễ dàng giao tiếp với các bộ vi điều khiển, chẳng hạn như Arduino, ESP32, ES8266, v.v. vì sử dụng các mức logic 5V.

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

  • Tín hiệu vi sai để chống nhiễu tốt hơn

  • Cho phép giao tiếp 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ụ ít điện năng 

Các chân

Module thu phát MAX485 bao gồm 8 chân, mỗi bên 4 chân. Được thể hiện trong hình dưới đây: RS485 Module pin out

Tên Chân

Mô tả

VCC

Đây là chân cấp nguồn. Được kết nối với 5V để cấp nguồn cho module.

A

Đây là đầu vào/ đầu ra tín hiệu không đảo, Được kết nối với chân A trên module khác.

B

Đây là đầu vào/ đầu ra đảo, được kết nối với chân B trên module khác.

GND

Đây là chân GND, được kết nối với chân GND chung.

RO

Đây là chân đầu ra tín hiệu, được kết nối với chân RX của vi điều khiển.

RE

Đây là chân kích hoạt nhận dữ liệu. Để bật, đặt nó ở trạng thái mức logic thấp.

DE

Đây là chân kích hoạt xuất dữ liệu. Để kích hoạt, đặt nó ở trạng thái mức logic cao.

DI

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

Module này có 2 phần là một phần đầu ra.

 A: Đây là chân không đảo theo giao thức RS485, được kết nối với A của module khác.

 B: Đây là chân đảo theo giao thức RS485, được kết nối với B trên module khác. 

Giao tiếp RS485 giữa ESP8266 và ESP32 (Điều khiển độ sáng LED)

Hãy để xem một ví dụ về truyền dữ liệu nối tiếp RS485 giữa một NodeMCU ESP8266 và một bo mạch ESP32 sử dụng module MAX485 chuyển đổi tín hiệu chuẩn TTL sang chuẩn RS-485. Mục đích là gửi các giá trị ADC từ ESP8266 Master được kết nối với một chiết áp thông qua module RS485 đến ESP32 slave. Slave ESP32 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 bởi chiết áp ở thiết bị master.  Ngoài ra, màn hình OLED cũng sẽ in các giá trị PWM tương ứng (0-255). 

Sơ đồ mạch cấu hình thiết bị Slave và Master

Các thành phần sau cho dự án này: 

  • 1 bo mạch NodeMCU ESP8266

  • 1 bảng mạch phát triển ESP32

  • 2 Module RS485

  • 1 Chiết áp

  • 1 đèn LED

  • 1 màn hình OLED

  • Kết nối dây

  • Bánh mì

 Để kết nối thành công tất cả các thiết bị, hãy hực hiện theo sơ đồ dưới đây: Sơ đồ kết nối giữa module RS485, ESP8266 (Master) và ESP32 (SlaveSơ đồ kết nối giữa module RS485, ESP8266 (Master) và ESP32 (Slave) 

RS485 Module with ESP board (Master and Slave) hardware

Kết nối NodeMCU ESP8266 (Master) 

ESP8266 chính được kết nối với chiết áp và module RS485. Trong số tám chân của module RS485, đã kết nối 6 chân với bảng mạch ESP8266.

 Bên dưới thể hiện các kết nối giữa NodeMCU và module RS485.

ESP8266

Module RS485 

Vin

VCC

GND

GND

RX

RO

D2 (GPIO4)

RE & DE

TX

DI

Kết nối chân VCC của module RS485 với chân Vin của ESP8266. Ngoài ra kết nối cả hai chân GND với nhau. Chân RO sẽ được kết nối với chân RX của ESP8266.  Tương tự, chân DI sẽ được kết nối với chân TX của ESP8266. Các chân RE và DE sẽ được kết nối với nhau bằng bất kỳ chân GPIO nào của bo mạch. Chúng tôi đã sử dụng GPIO4 để kết nối hai chân này.

Hai chân còn lại của module RS485: B và A được kết nối tương ứng với các chân B và A của module RS485 còn lại.

Kết nối chiết áp với chân Analog A0 của bảng mạch ESP8266. Một đầu ra tín hiệu của chiết áp được cấp ở chân Vin (màu đỏ), chân ở giữa được kết nối với A0 và chân cuối cùng được nối đất (màu đen). RS485 Module with ESP8266 (Master)Kết nối RS485 Module và ESP8266 (Master)

Kết nối ESP32 (Slave) 

Các kết nối của bo mạch ESP32 với module RS485 cũng giống như NodeMCU.  Chỉ cần đảm bảo kết nối đúng chân B và A của module RS485 (phía Slave) với các chân B và A của module RS485 (phía Master).

 Tiếp theo, OLED có bốn chân kết nối với bảng ESP32. Kết nối đầu VCC của màn hình OLED với Vin, chân GND với bảng ESP32. Chân SCL của màn hình sẽ được kết nối với chân SCL mặc định của bo mạch ESP32 là GPIO22. Chân SDA của màn hình sẽ được kết nối với SDA mặc định của bo mạch ESP32 là GPIO21.  Ngoài ra, các chân nối đất sẽ được kết nối chung.

Arduino UNO

OLED

GND

GND

Vin

VCC

GPIO22

SCL

GPIO21

SDA

Ngoài ra, chúng tôi đã kết nối cực dương của đèn LED với GPIO15 (đã bật PWM) và chân GND nối chung. Có thể sử dụng bất kỳ chân PWM nào khác của bảng mạch ESP32 để kết nối với đèn LED. RS485 Module with ESP32 (Slave)Kết nối module RS485 và ESP32 (Slave)

Cài đặt thư viện hỗ trợ lập trình OLED vào Arduino IDE

Để sử dụng màn hình OLED trong dự án, phải cài đặt thư viện Adafruit SSD 1306 và thư viện Adafruit GFX trong Arduino IDE. Thực hiện theo các bước dưới đây để cài đặt 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 OLED SSD1306.

Install OLED SSD1306 Library Arduino IDE

Cài đặt thư viện Adafruit GFX . Nhập ‘Adafruit GFX’ trong tab tìm kiếm và cài đặt nó. 

Lập trình cho ESP8266 Master

Mở Arduino IDE và vào File > New. Một tập tin mới sẽ mở ra. Sao chép code dưới đây trong tệp đó và lưu nó.

Code này dành cho ESP8266 Master. Nó sẽ chuyển các giá trị ADC được truyền qua module RS485 đến Slave.

int Enable_pin = 4;  

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);

}

Giải thích code

Trước tiên, xác định chân GPIO của ESP8266 đã kết nối với các chân DE và RE của module. Chúng tôi đã gắn nhãn nó là 'Enable_pin' và đặt giá trị 4 cho nó. Đây là chân GPIO ESP8266 đang sử dụng. 

int Enable_pin = 4;

Thứ hai, xác định thêm hai biến. Một biến sẽ nhận giá trị ADC ở chân A0 đã 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, đã đặt giá trị thành 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(),sẽ khai báo tốc độ truyền là 115200. Sau đó, sẽ cấu hình chân kích hoạt chân đầu ra và chân đầu vào Analog được kết nối với chiết áp.  Khai báo bằng cách sử dụng hàm pinMode() và truyền chân tương ứng làm tham số đầu tiên và INPUT/OUTPUT làm tham số thứ hai.

 Và đặt trạng thái Enable_pin lên mức logic cao. Điều này sẽ đảm bảo rằng cả hai chân DE và RE đều được đặt ở mức logic cao để kích hoạt module RS485. 

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(), sẽ đọc giá trị ADC theo điện áp thay đổi bằng cách sử dụng analogRead() sau mỗi 0,1 giây. Chuyển giá trị nhận được từ chân ADC được kết nối với chiết áp làm đối số. Giá trị này sẽ được lưu trữ trong biến số nguyên mà đã xác định trước đó là ‘ADC_value.’ Giá trị này sẽ được gửi tuần tự đến bus RS-485. 

void loop()

{

  int ADC_Value = analogRead(Analog_pin);

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

  delay(100);

}

Lập trình cho thiết bị Slave ESP32

Mở Arduino IDE và vào File > New. Một tập tin mới sẽ mở ra. Sao chép code được dưới đây trong tệp đó và lưu nó.

 Code này dành cho thiết bị Slave ESP32. Nó sẽ nhận các giá trị ADC thông qua module RS485 từ master ESP8266 và điều khiển độ sáng đèn LED và màn hình OLED tương ứng. 

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

 

int Enable_pin = 4;

int led_pin = 15;

 

const int frequency = 5000;

const int led_channel = 0;

const int resolution = 8;

 

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();           

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

    Serial.println(duty_cycle);

 

 

    ledcSetup(led_channel, frequency, resolution);

    ledcAttachPin(led_pin, led_channel);

    ledcWrite(led_channel, duty_cycle);

 

    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);

 

  }

}

Giải thích code

Đầu tiên, sẽ có các thư viện OLED đã cài đặt trước đó để màn hình OLED hoạt động đúng chức năng. 

#include <Adafruit_GFX.h>

#include <Adafruit_SSD1306.h>

Sau đó, sẽ tạo một biến số nguyên cho chân GPIO của ESP32 đã kết nối với các chân DE và RE của module. Gán tên là 'Enable_pin' và đặt giá trị 4 cho nó.

int Enable_pin = 4;

Xác định chân PWM ESP32 đã kết nối với cực dương của đèn LED. 

int led_pin = 15;

Tiếp theo sẽ xác định các thông số PWM cho ESP32. Để làm trước tiên sẽ xác định tần số của tín hiệu. Đặt nó ở 5000 Hz. Tiếp theo, xác định kênh PWM. Có tổng cộng mười sáu kênh PWM trong ESP32. Có thể sử dụng bất kỳ kênh nào từ 0-15.  Chúng tôi đã đặt kênh PWM là 0. Ngoài ra, đặt độ phân giải PWM là 8 bit vì đây là độ phân giải tối ưu để có được tần số tối đa. Mặc dù có thể sử dụng độ phân giải trong khoảng 1-16 bit. Vì chúng tôi đang sử dụng độ phân giải 8 bit, do đó, chu kỳ giá trị sẽ thay đổi trong khoảng 0-255. Chu kì giá trị (duty cycle) xác định độ rộng của tín hiệu hoặc thời gian ở mức cao của tín hiệu. 

const int frequency = 5000;

const int led_channel = 0;

const int resolution = 8;

Bây giờ, sẽ tạo một biến đối tượng có tên là display sẽ xử lý màn hình OLED và chỉ định chiều rộng, chiều cao, giáo thức I2C và -1 làm tham số bên trong nó.' -1′ chỉ định rằng màn hình OLED đang sử dụng không có chân RESET. Nếu đang sử dụng chân RESET thì hãy chỉ định GPIO tương ứng đang kết nối với bảng mạch. 

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

setup()

Bên trong hàm setup(), sẽ khai báo tốc độ baud là 115200. Sau đó, sẽ cấu hình cả chân kích hoạt và chân LED là chân đầu ra. Thực hiện bằng cách sử dụng hàm pinMode() và truyền chân tương ứng làm tham số đầu tiên và INPUT/OUTPUT làm tham số thứ hai.

Đặt trạng thái Enable_pin về mức logic thấp. Điều này sẽ đảm bảo rằng cả hai chân DE và RE đều được đặt ở mức logic thấp để kích hoạt nhận dữ liệu. 

  Serial.begin(115200);

  pinMode(led_pin, OUTPUT);

  pinMode(Enable_pin, OUTPUT);

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

Khởi tạo màn hình OLED bằng cách sử dụng display.begin(). Hãy chắc chắn rằng bạn chỉ định đúng địa chỉ của màn hình. Trong trường hợp này, nó là 0X3C.

 Sau đó, xóa bộ đệm bằng cách sử dụng ClearDisplay() của biến object Adafruit_SSD1306. Ngoài ra, đặt màu của chữ là màu trắng. 

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  display.display();

  delay(100);

  display.clearDisplay();

  display.display();

  display.setTextColor(WHITE);

loop()

Bên trong hàm loop(), kiểm tra xem có dữ liệu có ở cổng truyền nối tiếp hay không. Nếu có, trước tiên sẽ xóa bộ đệm của màn hình. Sau đó, chuyển các giá trị ADC nhận được từ ESP8266 từ 0-1023 thành các giá trị từ 0-255. Giá trị này sẽ được lưu trữ trong biến số nguyên ‘Duty_cycle.’ Giá trị này cũng sẽ được in trên màn hình serial của phần mềm. 

  while (Serial.available())

  {

    display.clearDisplay();

    int PWM_master = Serial.parseInt();           

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

    Serial.println(duty_cycle);

    

Sử dụng các chức năng sau để định cấu hình PWM trong ESP32. Đầu tiên sử dụng hàm ledcSetup() để khởi tạo các tham số PWM. Hàm này có ba tham số. Số kênh, tần số và độ phân giải của kênh PWM. Thứ hai, sử dụng hàm ledcAttach() để gán chân đèn led tương ứng. Cuối cùng, sử dụng hàm ledcWrite(),sẽ tạo bộ PWM với chu kì xử lý giá trị (duty cycle). Giá trị này có thể thay đổi trong khoảng từ 0 đến 255, có nghĩa là khi bằng 0, đèn LED sẽ hoàn toàn không phát sáng và tương tự khi là 255, đèn LED sẽ phát sáng với độ sáng tối đa.

 

  ledcSetup(led_channel, frequency, resolution);

  ledcAttachPin(led_pin, led_channel);

  ledcWrite(led_channel, duty_cycle);

Phần code sau đây hiển thị giá trị PWM được gửi từ Master đã đượ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);

 

Thực hiện chạy chương trình

Để test dự án này, hãy tải code của Master và Slave lên các bảng mạch ESP tương ứng. Tuy nhiên, trước khi tải code lên, hãy chọn Arduino bằng cách nhấp vào Tools > Board đồng thời chọn đúng cổng COM mà bảng được kết nối ở Tools > Port. 

Ở ESP8266:

select ESP8266 NodeMCU boardChọn loại Board mạch

ESP8266 COM PortChọn Port kết nối

Ở ESP32:

select esp32 board

Chọn board mạch

Selecting COM PORT ESP32

Chọn port kết nối

Sau khi code được tải lên bảng mạch tương ứng, hãy xoay núm chiết áp và độ sáng của đèn LED sẽ thay đổi. Tăng giá trị đầu vào từ chiết áp giống như tăng chu kỳ giá trị (duty cycle) do đó độ sáng của đèn LED tăng lên. OLED cũng sẽ hiển thị các giá trị PWM trong phạm vi 0-255 thu được từ bo mạch chủ ESP8266. RS485 Module with ESP8266 master ESP32 slave demo

 

>>> 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