- RS-485串行通讯
- 将RS-485与Arduino连接
- USB转RS-485转换器模块
- Simply Modbus主软件
- 所需工具
- 电路原理图
- 为RS-485 MODBUS从站编程Arduino UNO
- 将Arduino UNO测试为Rs485 Modbus从站
Modbus是一种串行通信协议,由Modicon于1979年发现,用于在工业电子设备之间通过串行线路传输数据。RS-485 Modbus将RS-485用于传输线。应该注意的是,Modbus是软件协议,而不是硬件协议。它分为两部分,例如Modbus主站和Modbus从站。在RS-485 Modbus网络中,有一个主站和127个从站,每个从站的唯一地址从1到127。在此MAX485 Arduino 项目中,我们将Arduino Uno用作从站进行串行通信。
Modbus主要用于PLC(可编程逻辑控制器)中。除此之外,Modbus还用于医疗保健,运输,家庭自动化等。Modbus具有255个功能代码,主要有三种流行的Modbus版本:
- MODBUS RTU
- MODBUS ASCII码
- MODBUS / TCP
Modbus ASCII和Modbus RTU有什么区别?
Modbus RTU和Modbus ASCII使用相同的协议。唯一的区别是,通过电线传输的字节在RTU中显示为二进制,在Modbus RTU中显示为可读的ASCII。本教程将使用Modbus RTU。
本教程是关于将RS-485 Modbus通信与Arduino UNO作为从设备一起使用。在这里,我们在PC上安装Simply Modbus Master软件,并通过使用RS-485作为传输线来控制两个LED和伺服电机。这些LED和伺服电机与Slave Arduino连接,并通过使用Master Modbus软件发送值进行控制。由于本教程使用RS-485,因此建议首先通过Arduino Uno和Arduino Nano之间进行RS485串行通信。RS485也可以与其他控制器进行串行通信:
- Raspberry Pi与Arduino UNO之间的RS-485串行通信
- STM32F103C8与Arduino UNO之间使用RS-485进行串行通信
让我们从探索有关RS-485和Modbus的一些背景开始。也可以在此处了解有关各种串行通信协议的更多信息。
RS-485串行通讯
RS-485是一种异步串行通信协议,不需要时钟。它使用一种称为差分信号的技术将二进制数据从一个设备传输到另一个设备。
那么,这种差分信号传输方法是什么呢?
差分信号方法通过使用正负5V产生差分电压来工作。 当使用两根电线时,它提供 半双工通信, 而 全双工 需要 四根四线通信。
通过使用此方法:
- RS-485支持最高30Mbps的更高数据传输速率。
- 与RS-232协议相比,它还提供了最大的数据传输距离。它最多可传输1200米的数据。
- 与RS-232相比,RS-485的主要优点是具有单个主设备的多个从设备,而RS-232仅支持单个从设备。
- 最多可以将32个设备连接到RS-485协议。
- RS-485的另一个优点是不受噪声影响,因为它们使用差分信号方法进行传输。
- 与I2C协议相比,RS-485速度更快。
将RS-485与Arduino连接
RS-485模块可以连接到任何具有串行端口的微控制器。为了将RS-485模块与微控制器一起使用,需要一个基于Maxim MAX485 IC的名为5V MAX485 TTL到RS485的模块,因为它允许1200米长距离的串行通信。它是双向半双工的,数据传输速率为2.5 Mbps。该模块需要5V的电压。
RS-485的引脚:
引脚名称 |
引脚说明 |
VCC |
5伏 |
一种 |
同相接收器输入 同相驱动器输出 |
乙 |
反相接收器输入 反相驱动器输出 |
地线 |
地(0V) |
00 |
接收器输出(RX引脚) |
回覆 |
接收器输出(低使能) |
德 |
驱动器输出(高启用) |
DI |
驱动器输入(TX引脚) |
USB转RS-485转换器模块
这是一个USB到RS485转换器适配器模块,它支持WIN7,XP,Vista,Linux,Mac OS,并通过使用计算机中的COM端口提供易于使用的RS485接口。该模块是即插即用设备。没有命令结构,发送到虚拟COM端口的任何内容都会自动转换为RS485,反之亦然。该模块完全由USB总线自供电。 因此,无需外部电源即可操作。
它显示为串行/ COM端口,可从应用程序或超级终端访问。 该转换器提供半双工RS-485通信。波特率范围为75 bps至115200 bps,最高可达6 Mbps。
要使用此设备,互联网上提供了各种Modbus软件。在本教程中,使用了名为Simply Modbus软件的软件。
Simply Modbus主软件
需要Modbus Master Software应用程序才能通过COM将数据发送到从Modbus RS-485 Arduino设备。
Simply Modbus Master是一款数据通信测试软件。您可以从给定的链接下载Simply Modbus Master,并通过参考软件手册来了解更多信息。
在使用该软件之前,熟悉以下术语非常重要。
从站ID:
网络中的每个从站都被分配一个从1到127的唯一单元地址。当主站请求数据时,它发送的第一个字节是从站地址。这样,每个从站都会在第一个字节之后知道是否忽略该消息。
功能码:
主机发送的第二个字节是功能代码。该数字告诉从站要访问哪个表以及是从表中读取还是向表中写入。
支持的寄存器功能代码:
功能码 |
行动 |
表名 |
04(十六进制) |
读 |
模拟输入寄存器 |
03(十六进制03) |
读 |
模拟输出保持寄存器 |
06(十六进制) |
写单 |
模拟输出保持寄存器 |
16(十六进制) |
写多个 |
模拟输出保持寄存器 |
支持的线圈功能代码:
功能码 |
行动 |
表名 |
02(十六进制) |
读 |
离散输入触点 |
01(十六进制01) |
读 |
离散输出线圈 |
05(05十六进制) |
写单 |
离散输出线圈 |
15(十六进制0F) |
写多个 |
离散输出线圈 |
CRC:
CRC代表循环冗余校验。在每个Modbus消息的末尾添加了两个字节,用于错误检测。
所需工具
硬件
- Arduino UNO
- MAX-485 TTL转RS-485转换器模块
- USB转RS-485转换器模块
- LED灯(2)
- 1k电阻器(2)
- 16x2 LCD显示屏
- 10k电位器
- 伺服马达SG-90
软件
- 只需Modbus Master
电路原理图
MAX-485 TTL至RS-485转换器模块与Arduino UNO之间的电路连接:
Arduino UNO |
MAX-485 TTL转RS-485转换器模块 |
0(接收) |
反渗透 |
1(TX) |
DI |
4 |
DE&RE |
+5伏 |
VCC |
地线 |
地线 |
MAX-485 TTL至RS-485模块与USB至RS-485转换器之间的电路连接:
MAX-485 TTL至RS-485 转换模块 |
USB转RS-485模块 与电脑连接 |
一种 |
一种 |
乙 |
乙 |
Arduino UNO和16x2 LCD显示器之间的电路连接:
16x2 LCD |
Arduino UNO |
VSS |
地线 |
VDD |
+5伏 |
V0 |
控制电位器的引脚以控制16x2 LCD的对比度/亮度 |
RS |
8 |
读写器 |
地线 |
Ë |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
一种 |
+5伏 |
ķ |
地线 |
2个LED,伺服电机和Arduino UNO之间的电路连接:
Arduino UNO |
发光二极管1 |
发光二极管2 |
伺服马达 |
2 |
阳极通过1k电阻 |
-- |
-- |
5 |
-- |
阳极通过1k电阻 |
-- |
6 |
-- |
-- |
PWM引脚(橙色) |
+5伏 |
-- |
-- |
+ 5V(红色) |
地线 |
阴极GND |
阴极GND |
GND(棕色) |
为RS-485 MODBUS从站编程Arduino UNO
Arduino UNO被配置为Modbus从站。另外,Arduino UNO配有两个LED和一个伺服电机。因此,从Arduino由主Modbus软件控制。Arduino UNO和Modbus Master软件之间的通信是通过使用RS-485模块完成的。为了与PC连接,使用USB到RS-485转换器模块。以及带有MAX-485 TTL到RS-485转换器模块的Arduino UNO ,整个设置如下所示:
对于在Arduino UNO中使用Modbus的库
最初,包括所需的库。ModbusRTU库用于使用RS-485 Modbus通讯,液晶库用于在Arduino UNO上使用LCD,伺服库用于在Arduino UNO上使用伺服电机。
#包括
现在,与Arduino引脚2和5连接的LED阳极引脚定义为LED1和LED2。
#define led1 2 #define led2 5
接下来,使用与Arduino UNO连接的LCD引脚(RS,E,D4,D5,D6,D7)声明用于访问液晶类的对象。
液晶液晶(8,9,10,11,12,13);
LCD完成后,初始化Servo类的伺服对象。还要初始化Modbus类的总线对象。
伺服伺服 Modbus总线;
接下来,用于存储Modbus通信的值的数组将声明为三个用零初始化的值。
uint16_t modbus_array = {0,0,0};
在 设置 功能中,首先将LCD设置为16x2模式,并显示并清除欢迎消息。
lcd.begin(16,2); //将LCD设置为16x2模式 lcd.print(“ RS-485 Modbus”); //欢迎消息 lcd.setCursor(0,1); lcd.print(“ Arduino Slave”); 延迟(5000); lcd.clear();
此后,将LED1和LED2引脚设置为输出引脚。
pinMode(led1,OUTPUT); pinMode(led2,OUTPUT);
连接到Arduino的PWM引脚6的伺服脉冲引脚。
伺服附件(6);
现在,对于Modbus通信,将设置以下参数。第一个“ 1”代表从设备ID,第二个“ 1”代表它使用RS-485传输数据,而“ 4”代表连接到Arduino UNO的RS-485 DE&RE引脚。
总线= Modbus(1,1,4);
Modbus从站设置为9600波特率。
循环从定义总线轮询开始, bus.poll() 用于写入和接收来自主Modbus的值。
bus.poll(modbus_array,sizeof(modbus_array)/ sizeof(modbus_array));
此方法用于检查串行端口上是否有可用数据。
如果串行端口上有任何可用数据,Modbus RTU库将检查消息(检查设备地址,数据长度和CRC)并执行所需的操作。
例如,要从主机写入或读取任何值,ModbusRTU必须从主机Modbus接收一个无符号的16位整数数组及其长度。该数组承载从主服务器写入的数据。
在本教程中,LED1,LED2和伺服电动机角度有三个阵列。
首先打开或关闭LED1 modbus_array。
if(modbus_array == 0)//取决于主Modbus编写的modubus_array中的值 { digitalWrite(led1,LOW); //如果0 lcd.setCursor(0,0); lcd.print(“ L1:OFF”); } else { digitalWrite(led1,HIGH); //如果值不是0 lcd.setCursor(0,0); 则LED亮 lcd.print(“ L1:ON”); }
接下来打开或关闭LED2 modbus_array。
if(modbus_array == 0)//取决于主Modbus编写的modbus_array中的值 { digitalWrite(led2,LOW); //如果0 lcd.setCursor(8,0); 则LED熄灭 lcd.print(“ L2:OFF”); } else { digitalWrite(led2,HIGH); //如果值不是0 lcd.setCursor(9,0); // LED亮 lcd.print(“ L2:ON”); }
接下来,设置伺服电机的角度,使用的modbus_array和值将打印在16x2 LCD显示屏上。
int pwm = modbus_array; 伺服写入(pwm); lcd.setCursor(0,1); lcd.print(“伺服角度:”); lcd.print(pwm); 延迟(200); lcd.clear();
这样就完成了将Arduino UNO用作MODBUS Slave的编程。下一步将测试它为Modbus从站。
将Arduino UNO测试为Rs485 Modbus从站
电路连接完成并将代码上传到Arduino UNO之后,就可以将USB连接到RS-485模块和安装了Simple Modbus Master软件的PC了。
打开设备管理器,并根据连接USB到RS-485模块的PC来检查COM端口,然后打开Simply Modbus Master 8.1.1软件。
1.打开 Simply Modbus软件 后,现在打开“写入”选项。
2.打开 Simply Modbus主 写入后。设定参数
RTU中的模式,根据您的PC设置的COM端口(默认为COM6),波特率为9600,数据位8,停止位1,奇偶校验无,从站ID为1。
3.之后,将第一个寄存器设置为40001,要写入的值为3,将功能代码设置为16(写保持寄存器)。
之后,将1写入40001(对于LED1亮)和1到40002(对于LED2亮)和90到40003(对于伺服电机角度),然后单击SEND按钮。
您可以看到LED状态都为ON,伺服角度为90度。
4.之后,将40001输入为1,将40002输入为0,将40003输入为180,然后单击SEND按钮。
5.现在将135写为40003和40001为0,将40002写为1。
这就是RS-485 Modbus如何与Arduino UNO作为从设备进行串行通信的方式。在下一个教程中,我们将使用Arduino Uno作为MODBUS通讯的主设备。
在下面找到完整的代码和演示视频。