25 C
Hanoi
Chủ Nhật, Tháng Chín 25, 2022

THIẾT KẾ PHẦN CỨNG - NHẬN THIẾT KẾ ĐIỆN TỬ CHO SẢN PHẨM PHẦN CỨNG SỐ, IOT, CÔNG NGHIỆP,...

Home LẬP TRÌNH VI ĐIỀU KHIỂN ARDUINO Giao tiếp RS485 giữa hai Arduino

Giao tiếp RS485 giữa hai Arduino

MAX485 Mạch Chuyển Đổi TTL To RS485

MAX485 là một mạch chuyển đổi TTL To RS485 chuyển đổi tín hiệu TTL sang RS485 cho phạm vi xa, tốc độ dữ liệu cao, dễ xảy ra lỗi giao tiếp. Các mạng truyền thông kỹ thuật số thực hiện tiêu chuẩn EIA-485 có thể được sử dụng hiệu quả trong khoảng cách xa và trong môi trường nhiễu điện.

Bộ chuyển đổi này cho phép bạn gửi và nhận dữ liệu bằng mạng RS485 từ Arduino / vi điều khiển của bạn. Tương tự như giao diện Serial TTL và RS232, RS485 cho phép bạn truyền dữ liệu giữa các bộ vi điều khiển và thiết bị nhưng với các tính năng bổ sung. RS485 là một giao thức tiêu chuẩn công nghiệp để truyền dữ liệu và cung cấp nhiều ưu điểm.

Nó cho phép bạn truyền dữ liệu giữa tối đa 32 thiết bị, thông qua cùng một đường truyền dữ liệu qua chiều dài cáp lên đến 1.2km (4000ft) với tốc độ dữ liệu tối đa là 10Mbit / s. Bộ chuyển đổi này được thiết kế cho các ứng dụng văn phòng và công nghiệp (không bị cô lập) và cung cấp các đặc điểm / tính năng ưu việt thường chỉ có trên các thiết bị đắt tiền hơn.

Thông số kỹ thuật:

  • Mạch giao tiếp TTL – RS485 được dùng để chuyển đổi tín hiệu nối tiếp (Serial) UART sang giao tiếp RS485 sử dụng IC MAX485.
  • Điện áp hoạt động: 5 VDC.
  • Kích thước: 44 X 14mm.
  • Tiêu thụ điện năng thấp cho giao tiếp RS-485
  • Trên bo mạch có thiết bị đầu cuối 2P cao 5,08 (mm) để tạo thuận lợi cho việc đấu dây giao tiếp RS-485.

Module giao tiếp MAX485 / Module chuyển đổi 485 / Module 485 - G2H16 | Công  ty cổ phần Linh Kiện Việt Nam

Các chân của module gồm có:

– DI- DATA IN (Dữ liệu vào) PIN 1

– RO – RECEIVE OUT (Tín hiệu nhận đầu ra) PIN 0

– DE- DATA ENABLE; RE RECEIVE ENABLE (Cho phép dữ liệu vào và cho phép được nhận) 2 chân này thường để nối liền với nhau và kết nối với Pin 2

– VCC nối với +5V

– GND nối với GND, GND của 2 arduino có thể dùng cáp để nối hoặc cần được nối đất tại chỗ

– A nối với A; B nối với B thông qua cặp cáp xoắn

Ví dụ về giao tiếp RS485 giữa hai Arduino

Arduino Uno sẽ là master (bộ thu), nó sẽ nhận kết quả đo nhiệt độ và hiển thị trên màn hình LCD 20 x 4 I2C.

Arduino Nano sẽ là slave (bộ phát), nó sẽ đọc cảm biến DS18B20 và gửi giá trị đo được thông qua mô-đun RS485.

Figure 6 - Physical assembly of the circuit on the protoboard.

Code chương trình bên truyền/phát:

#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define TX_485 8 // Pin DI 
#define RX_485 7 // Pin RO 
#define RS485_control 3 
SoftwareSerial RS485_serial (RX_485, TX_485);

byte TX [4];
#define RS485transmit HIGH
#define RS485receive LOW

const int pino_sensor = 5;
OneWire bus (pino_sensor);
DallasTemperature sensors (&bus);
DeviceAddress sensor;

unsigned int tempo=0;

float temp;
int t=0;

void setup()
{
// init
sensors.begin();
Serial.begin(9600);
RS485_serial.begin(9600);
pinMode(RS485_control,OUTPUT);
Serial.println(” Monitoramento de temperatura com sensor DS18B20 “);
if(!sensors.getAddress(sensor,0))
{
Serial.println(” Sensor DS18B20 nao encontrado”);
}

}
void loop()
{
if((millis()-tempo)>200)
{
tempo=millis();
sensors.requestTemperatures();
temp=sensors.getTempC(sensor);
digitalWrite(RS485_control, RS485transmit);
t = temp * 100;
TX[0] = t/ 255;
TX[1] = t % 255;
for (int i=0; i<4; i++)
{
RS485_serial.write(TX[i]);
}
Serial.print(“Temperatura: “);
Serial.print(temp);
Serial.println(” oC”);
}
}

Cần dùng 3 thư viện: Serial Software, Dallas Temperature, và One Wire.

Software Serial giúp cấu hình bất cứ chân nào của Arduino thành chân giao tiếp UART.

Thư viện Dallas Temperature và One Wire có các chức năng cần thiết để đọc cảm biến nhiệt độ DS18B20.

#include <SoftwareSerial.h>
//bibliotecas para leitura do sensor DS18B20

#include <OneWire.h>
#include <DallasTemperature.h>

Mapeamento de hardware da ligação dos pinos do módulo RS 485 ao Arduino
#define TX_485 8 // Pino DI do módulo RS 485
#define RX_485 7 // Pino RO do módulo RS 485
#define RS485_control 3 // Habilita ou não a transmissão e recepção de dados
Cria o objeto RS485_serial com os pinos de RX e TX

SoftwareSerial RS485_serial (RX_485, TX_485); //Variável que irá armazenar o valor lido de temperatura para ser transmitida via serial.

byte TX [4]; //Constantes definidas para habilitar ou não a transmissão e recepção de dados via serial/RS485.

#define RS485transmit HIGH
#define RS485receive LOW

//Pino onde está conectado o sensor

const int pino_sensor = 5;

//Pino onde o sensor está conectado
OneWire bus (pino_sensor);

//Armazena o endereço do sensor
DallasTemperature sensors (&bus);
DeviceAddress sensor;
unsigned int tempo=0; Armazena o tempo corrente

//variavel para armazenar a temperatura
float temp;
int t=0;

Trong hàm void setup(), chúng tôi bắt đầu giao tiếp với cảm biến, thiết lập tốc độ truyền thông nối tiếp và RS485.

Kiểm tra xem giao tiếp với cảm biến có thành công hay không.

Định cấu hình chân điều khiển giao tiếp RS485 làm đầu ra bằng lệnh: pinMode (RS485_control, OUTPUT).

void setup()
{

//inicia a biblioteca
sensors.begin();

//velocidade comunicaçao serial
Serial.begin(9600);

RS485_serial.begin(9600);
pinMode(RS485_control,OUTPUT);

Serial.println(” Monitoramento de temperatura com sensor DS18B20 “);

if(!sensors.getAddress(sensor,0))
{
Serial.println(” Sensor DS18B20 nao encontrado”);
}

}

Trong hàm loop(), cảm biến được đọc mỗi 200 ms bằng cách sử dụng hàm millis () và đóng gói để truyền giá trị đo được.

if((millis()-tempo) > 200)
{

tempo=millis();

sensors.requestTemperatures(); método que requisita a temperatura
temp=sensors.getTempC(sensor); reaaliza a leitura da temperatura do sensor

digitalWrite(RS485_control, RS485transmit); habilita o modo de transmissão
t = temp * 100; Transforma o valor lido de temperatura para um valor inteiro.

TX[0] = t/ 255; Armazena na posição 0 o valor da divisão da temperatura por 255 ( 1 byte).
TX[1] = t % 255; Armazena na posição 1 o valor do resto da divisão de temperatura por 255.

Thao tác này được thực hiện để chúng ta có thể chia giá trị nhiệt độ thành hai byte, vì không thể truyền trực tiếp giá trị float bằng cách sử dụng giao tiếp nối tiếp.

Truyền giá trị đã đọc qua giao tiếp nối tiếp RS485.

for (int i=0; i<4; i++)
{
RS485_serial.write(TX[i]);
}

Chỉ in giá trị trên cổng nối tiếp của máy tính để gỡ lỗi.

Serial.print(“Temperatura: “);
Serial.print(temp);
Serial.println(” oC”);
}
}

Code chương trình cho bên nhận

#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Addr,En, Rw,Rs,d4,d5,d6,d7, backlight, polarity
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);
#define TX_485 8 // Pino DI do módulo RS 485
#define RX_485 7 // Pino RO do módulo RS 485
#define RS485_control 3 // Habilita ou não a transmissão e recepção de dados

SoftwareSerial RS485_serial (RX_485, TX_485);
byte RX[4];

#define RS485transmit HIGH
#define RS485receive LOW

// variavel para armazenar a temperatura
float temp;
unsigned long tempo =0;

void setup()
{
// velocidade comunicaçao serial
lcd.begin(20,4);
Serial.begin(9600);
RS485_serial.begin(9600);
pinMode(RS485_control,OUTPUT);
Serial.println(” Comunicacao RS485 “);
lcd.setBacklight(HIGH);
lcd.setCursor(0,0);
lcd.print(” COMUNICACAO RS485 “);
}

void loop()
{
if((millis()-tempo)>500)
{
lcd.clear();
tempo=millis();
digitalWrite(RS485_control,RS485receive);
if(RS485_serial.available () >0)
{
for (int i =0; i<4; i ++)
{
RX[i] = RS485_serial.read();
}
temp = ((RX[0] * 255) + RX[1]) /100;
Serial.print(” Temperatura : “);
Serial.print( temp );
Serial.println(” *C “);
}
lcd.setBacklight(HIGH);
lcd.setCursor(0,0);
lcd.print(” COMUNICACAO RS485 “);
lcd.setCursor(0,1);
lcd.print(” SENSOR DS18B20 “);
lcd.setCursor(0,2);
lcd.print(” TEMP “);
lcd.setCursor(7,2);
lcd.print( temp);
lcd.setCursor(11,2);
lcd.print(” *C “);
}
}

Ở đây chúng ta cần có 3 thư viện Software Serial, Wire, and LiquidCrystal_I2C.

Software Serial giúp cấu hình bất cứ chân nào của Arduino thành chân giao tiếp UART.

Thư viện Wire và LiquidCrystal_I2C giao tiếp I2C với các ngoại vi và giao tiếp I2C với màn hình LCD I2C.

#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

Địa chỉ I2C cho màn hình LCD ở đây là 0x27,

// Addr,En, Rw,Rs,d4,d5,d6,d7, backlight, polarity
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);

Khai báo phần cứng với các chân trên mô-đun RS485 được kết nối với Arduino Nano.

#define TX_485 8 // Pino DI do módulo RS 485
#define RX_485 7 // Pino RO do módulo RS 485
#define RS485_control 3 //Habilita ou não a transmissão e recepção de dados
SoftwareSerial RS485_serial (RX_485, TX_485); //Pinos de comunicação serial RS485.
byte RX[4]; //Variavel que irá receber o valor de temperatura através da comunicação serial RS485.

//Constantes que habilitam ou não a transmissão e recepção de dados.
#define RS485transmit HIGH
#define RS485receive LOW

// variavel para armazenar a temperatura
float temp;
//Variável para armazenar o tempo
unsigned long tempo =0 ;

Trong hàm setup, khởi tạo giao tiếp với màn hình LCD, cài đặt cấu hình như một chân đầu ra cho phép hoặc không nhận dữ liệu thông qua giao tiếp RS485. Hiển thị dữ liệu lên màn hình LCD.

void setup()
{
lcd.begin(20,4);

Serial.begin(9600);
RS485_serial.begin(9600);

pinMode(RS485_control,OUTPUT);

Serial.println(” Comunicacao RS485 “);

lcd.setBacklight(HIGH);
lcd.setCursor(0,0);
lcd.print(” COMUNICACAO RS485 “);
}

Trong hàm loop giá trị nhiệt độ được đọc mỗi 500 ms.

void loop()
{

if((millis()-tempo)>500) Verifica se já passou 500 ms
{
lcd.clear();
tempo=millis(); Armazena o tempo atual
digitalWrite(RS485_control,RS485receive); habilita o modo de recepção de dados

if(RS485_serial.available () >0) Verifica se tem algum dado disponível na comunicação RS485
{
for (int i =0; i<4; i ++)
{
RX[i] = RS485_serial.read(); Leitura da serial RS485 e armazena os valores no vetor RX até a posição 4
}

Lấy byte 0 của RX nhân với 255 và cộng với byte 1 của RX và chia cho 100 để thu được giá trị nhiệt độ.

temp = ((RX[0] * 255) + RX[1]) /100; Conversão de temperatura
Serial.print(” Temperatura : “);
Serial.print( temp );
Serial.println(” *C “);
}
lcd.setBacklight(HIGH); //Liga o blacklight
lcd.setCursor(0,0); //Posiciona o cursor na linha 0 e coluna 0
lcd.print(” COMUNICACAO RS485 “); //Escreve a mensagem
lcd.setCursor(0,1); //Coluna 0 linha 1
lcd.print(” SENSOR DS18B20 “); //Escreve mensagem
lcd.setCursor(0,2); //Coluna 0 linha 2
lcd.print(” TEMP “); //Escreve a string Temp
lcd.setCursor(7,2); //Coluna 7 linha 2
lcd.print( temp); //Escreve o valor de temperatura
lcd.setCursor(11,2);
lcd.print(” *C “);
}
}

Kết quả

Figure 8 - System operation.

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

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Chia sẻ PCB KIT ESP32

Mạch nguyên lý schemaic: Download toàn bộ project phần mềm Altium: DOWNLOAD Một vài hình ảnh thiết kế trên Altium:

Chia sẻ PCB Ethernet Gigabit Switch 5 Port

Mạch nguyên lý Schematic: DOWNLOAD ALTIUM PROJECT Một số hình ảnh 3D và 2D của mạch: Lớp TOP: Lớp 2: Lớp 3:Lớp Bottom:

Chia sẻ PCB mạch Hub USB2.0 dùng FE1.1S

DOWNLOAD PROJECT (ALTIUM) Mạch thiết kế trên phần mềm Altium, 2 lớp, dùng cho mục đích thử nghiệm.

Chia sẻ PCB nguồn công nghiệp VRB2405YMD-20WR3

Công suất đầu ra 20 Vin (VDC) 18~36 Vout (VDC) 5 Số đầu ra 1 Điện áp cách ly 1500     DOWNLOAD  

Recent Comments