Giao tiếp 32 thiết bị Arduino với RS485

0
3892

RS485 LÀ GÌ

Năm 1983, Hiệp hội công nghiệp điện tử (EIA) đã phê duyệt một tiêu chuẩn truyền cân bằng mới gọi là RS-485. Đã được chấp nhận rộng rãi và sử dụng trong công nghiệp, y tế, và dân dụng. Có thể coi chuẩn RS485 là một phát triển của RS232 trong việc truyền dữ liệu nối tiếp. Những bộ  chuyển đổi RS232/RS485 cho phép người dùng giao tiếp với bất kỳ thiết bị  mà sử dụng liên kết nối tiếp RS232 thông qua RS485.  Liên kết  RS485 được hình thành cho việc thu nhận dữ liệu ở khoảng cách xa và điều khiển cho những ứng dụng. Những đặc điểm nổi trội của RS485 là nó có thể hỗ trợ một mạng lên tới 32 trạm thu phát trên cùng một đường truyền, tốc độ baud có thể  lên tới 115.200 cho một  khoảng cách là 4000feet (1200m).

RS485

Với kiểu truyền cân bằng và các dây được xoắn lại với nhau nên khi nhiễu xảy ra  ở dây này thì cũng xảy ra ở dây kia, tức là hai dây cùng nhiễu giống nhau. Điều này làm cho điện áp sai biệt giữa hai dây thay đổi không đáng kể nên tại nơi thu vẫn nhận được tín hiệu đúng nhờ tính năng đặc biệt của bộ thu đã loại bỏ nhiễu. Liên kết RS485 được sử dụng rất rộng rãi trong công nghiệp, nơi mà môi trường nhiễu khá cao và sự  tin tưởng vào tính  ổn định của hệ  thống là điều quan trọng. Bên cạnh đó khả năng truyền thông qua khoảng cách xa ở tốc độ cao cũng rất được quan tâm, đặc biệt là tại những nơi mà có nhiều trạm giao tiếp được trải ra trên diện rộng.

RS-485 communication on multiple Arduino boards - Networking, Protocols, and Devices - Arduino Forum

Module Chuyển Đổi RS-485 to TTL

Module giúp chuyển đổi mức điện áp TTL sang giao tiếp RS-485.

Module được thiết kế nhỏ gọn, tích hợp các linh kiện cần thiết để đảm bảo tốc độ truyền dẫn cao, khoảng cách truyền xa mà vẫn ổn định.

Ứng dụng:

– Truyền thông tín hiệu điều khiển chuẩn RS-485 giữa các vi điều khiển với nhau và với máy tính.

Thông Số Kĩ Thuật:

– Module chuyển đổi TTL sang RS-485 dùng chip Max 485.

– Điện áp hoạt động  5 V (mức TTL)

– Kiểu kết nối hàng rào cắm 4 chân ngõ vào (RO, RE, DE ,DI của chip Max485), 4 chân ngõ ra(VCC, GND, A, B).

– Tốc độ truyền tối đa 2Mbps, khoảng cách tối đa 1Km.

Sơ đồ chân MAX485:

Chức năng MAX485:

  • Max485 là bộ truyền nhận dữ liệu năng lượng thấp dùng cho chuẩn RS485.
  • Tốc độ bit Max= 2,5Mbps
  • Có thể kết nối tối đa 32 thiết bị trên bus 485 .
  • Điện áp hoạt động : -7V ~ 12V.
  • Thường dùng 5V.
  • Bus Max485 truyền dữ liệu Vi sai bằng 2 dây A, B nên khoảng cách truyền lớn, khả năng chống nhiễu tốt.
    -với A-B > 200mV sẽ tạo mức logic 1.
    -với B-A > 200mV sẽ tạo mức logic 0.

 Ứng dụng thực tế:

– Giao tiếp giữa hai thiết bị. Có thể giao tiếp tối đa 32 MAX485 với nhau trên cùng một BUS.
– Để giao tiếp các MAX485 với nhau chúng ta cần kết nối các chân với nhau A nối với A B nối với B

Truyền giữ liệu MAX458.
Để Truyền dữ liệu với Max485 cần thực hiện các bước sau.
-Kết nối chân A với A, B với B giữa 2 IC.
-Cấu hình truyền trên IC1, cho chân DE mức 1.
-Cấu hình nhận trên IC2, cho chân RE mức 0.
-Gửi dữ liệu vào tại chân DI của IC1.
-Đọc Dữ liệu Ra tại chân DO của IC2.

Module Chuyển Đổi RS-485 to TTL

Ví dụ sơ đồ kết nối RS485 giữa 2 Arduino Uno

Giao tiếp RS485 giữa Uno và Nano

Module RS-485 – Arduino UNO (Master):

RS-485 Arduino UNO
DI 1 (TX)
DE RE 8
R0 0 (RX)
VCC 5V
GND GND
A To A of Slave RS-485
B To B of Slave RS-485

Module RS-485 – Arduino Nano (Slave):

RS-485 Arduino UNO
DI D1 (TX)
DE RE D8
R0 D0 (RX)
VCC 5V
GND GND
A To A of Master RS-485
B To B of Master RS-485

Màn hình16x2 LCD kết nối Arduino Nano:

16×2 LCD Arduino Nano
VSS GND
VDD +5V
V0 Nối đến biến trở để điều chỉnh độ tương phản LCD
RS D2
RW GND
E D3
D4 D4
D5 D5
D6 D6
D7 D7
A +5V
K GND

Một 10K biến trở nối vào Pin A0 của Arduino UNO và một LED được kết nối đến pin D10 của Arduino Nano.

Code chương trình:

Master (Arduino UNO):

//Master code (Arduino UNO)
//Serial Communication Between Arduino using RS-485

int enablePin = 8;
int pushval = A0;
int potval =0 ;

void setup()
{
Serial.begin(9600);            // initialize serial at baudrate 9600:
pinMode(enablePin, OUTPUT);
pinMode(pushval,INPUT);
delay(10);
digitalWrite(enablePin, HIGH);  //  (always high as Master Writes data to Slave)
}
void loop()
{
int potval = analogRead(pushval);
Serial.println(potval);          //Serial Write POTval to RS-485 Bus
delay(100);
}

SLAVE CODE: (Arduino NANO):

//Slave code (Arduino NANO)
//Serial Communication Between Two Arduinos using RS-485
//Circuit Digest

#include <LiquidCrystal.h>          //Include LCD library for using LCD display functions

int enablePin = 8;
int ledpin = 10;

LiquidCrystal lcd(2,3,4,5,6,7);       // Define LCD display pins RS,E,D4,D5,D6,D7

void setup()
{
lcd.begin(16,2);
lcd.print(“CIRCUIT DIGEST”);
lcd.setCursor(0,1);
lcd.print(“RS485 ARDUINO”);
delay(3000);
lcd.clear();
Serial.begin(9600);                   // initialize serial at baudrate 9600:
pinMode(ledpin,OUTPUT);
pinMode(enablePin, OUTPUT);
delay(10);
digitalWrite(enablePin, LOW);        //  (Pin 8 always LOW to receive value from Master)

}

void loop()

{
while (Serial.available())                   //While have data at Serial port this loop executes
{
lcd.clear();
int pwmval = Serial.parseInt();            //Receive INTEGER value from Master throught RS-485
int convert = map(pwmval,0,1023,0,255);    //Map those value from (0-1023) to (0-255)
analogWrite(ledpin,convert);               //PWM write to LED
lcd.setCursor(0,0);
lcd.print(“PWM FROM MASTER”);
lcd.setCursor(0,1);
lcd.print(convert);                        //Displays the PWM value
delay(100);
}
}

Testing RS485 Serial Communication between Arduino Uno and Arduino Nano

Code chương trình giao tiếp RS485 nhiều Arduino

Code cho thiết bị Master:

#include <LiquidCrystal_I2C.h> //Khai báo thư viện I2C LCD 16x2
LiquidCrystal_I2C lcd(0x27,16,2);  // Cấu hình địa chỉ I2C cho LCD 16x2 là 0x27

int value1 = 0, value2 = 0;

const int LED =  13;   
const int Enable =  2;

void setup() 
{ 
  Serial.begin(9600);
  Serial.setTimeout(250);

  pinMode(LED, OUTPUT);
  pinMode(Enable, OUTPUT);
  
  digitalWrite(LED, LOW); 
  
  digitalWrite(Enable, HIGH);

  lcd.init();      
  lcd.backlight();
}
 
void loop() 
{ 
  
  Serial.print("I");
  Serial.print("1");
  Serial.print("L");
  Serial.print("F");
  Serial.flush();
  
  digitalWrite(Enable, LOW);
  
  if(Serial.find("i"))
  {   
      int slave1 = Serial.parseInt();
      value1 = Serial.parseInt();
      
      if(Serial.read() == 'f' && slave1 == 1)
      {
        lcd.setCursor(0,0);
        lcd.print("Escravo 1:      ");
        lcd.setCursor(11,0);
        lcd.print(value1);
      }
 }
      digitalWrite(Enable, HIGH);

  Serial.print("I");
  Serial.print("2");
  Serial.print("L");
  Serial.print("F");
  Serial.flush();
  
  digitalWrite(Enable, LOW);
  
  if(Serial.find("i"))
  {   
      int slave2 = Serial.parseInt();
      value2 = Serial.parseInt();
      
      if(Serial.read() == 'f' && slave2 == 2)
      {
        lcd.setCursor(0,1);
        lcd.print("Escravo 2:      ");
        lcd.setCursor(11,1);
        lcd.print(value2);
      }
  }
      digitalWrite(Enable, HIGH);
}

Code chương trình cho các Slave:

Slave 1:

const int Enable =  2; 
const int SlaveNumber = 1;

void setup() 
{ 
  Serial.begin(9600);  
  Serial.setTimeout(250);
  pinMode(Enable, OUTPUT);
  digitalWrite(Enable, LOW);
  pinMode(13, OUTPUT);
  pinMode(A0, INPUT);
} 

void loop() 
{ 
  if(Serial.available())
  {
    if(Serial.read()=='I')
    {   
        int Slave = Serial.parseInt();
        if(Slave == SlaveNumber)
        {   
            char command = Serial.read();       
             
             if(command == 'L')
             {
                if(Serial.read()=='F')
                 {
                   int AnalogValue = analogRead(0);
                        
                   digitalWrite(Enable, HIGH);
                   
                   Serial.print("i");
                   Serial.print(SlaveNumber);   
                   Serial.print(AnalogValue);
                   Serial.print("f");
                   Serial.flush();
                   
                   digitalWrite(Enable, LOW);           
                 }
             }
             
        }
    }
  }
  delay(10);
}

Tương tự cho Slave 2, 3, 4…32 chúng ta chỉ cần thay

const int SlaveNumber = 2;

bằng các giá trị thay đổi tương ứng.

Tham khảo:
https://www.hackster.io
https://circuitdigest.com/

LEAVE A REPLY

Please enter your comment!
Please enter your name here