我们在小型项目中使用Arduino,Raspberry Pi,NodeMCU,ESP8266,MSP430等微控制器开发板已有很长时间了,在大多数情况下,传感器与开发板之间的距离最大不超过几厘米,在这些距离下,可以轻松地通过简单的跳线完成不同传感器模块,继电器,执行器和控制器之间的通信,而无需担心介质中的信号失真和电噪声蔓延到其中。但是,如果要使用这些开发板在大于10到15米的距离内构建控制系统, 则应考虑噪声和信号功率,因为如果您希望系统可靠地工作,那么您将无法承受损失。传输中的数据。
有许多不同类型的串行通信协议,例如I2C和SPI,可以使用Arduino轻松实现。今天,我们将研究另一个最常用的协议,称为RS485,该协议在高噪声工业环境中非常常用,可以通过长距离。在本教程中,我们将学习RS485通信协议,以及如何通过我们拥有的两个Arduino Nano来实现它,以及如何使用 MAX485 RS485到UART转换 模块。以前,我们还执行过与Arduino的MAX485通信,以及与Raspberry pi的MAX485通信,如果您有兴趣的话,也可以检查一下。
UART和RS485通信之间的区别
市场上大多数通常与Arduino,Raspberry Pi一起使用的低成本传感器和其他模块(例如GPS,蓝牙,RFID,ESP8266等)使用 基于UART TTL的通信, 因为它仅需要2线TX(Transmitter)和RX (接收者)。它不是标准的通信协议,但它是一个物理电路,您可以使用该物理电路与其他外围设备发送和接收串行数据。它只能串行发送/接收数据,因此它首先将并行数据转换为串行数据,然后发送数据。
UART是 异步传输设备, 因此没有时钟信号在两个设备之间同步数据,而是在每个数据包的开始和结尾分别使用开始和停止位来标记正在传输的数据的末端。 UART传输的数据被组织成数据包。每个数据包包含1个起始位,5至9个数据位(取决于UART),一个可选的奇偶校验位以及1个或2个停止位。它有充分的文档记录并被广泛使用,并且还具有奇偶校验位以允许进行错误检查。但是它有一些限制,因为它 不能支持多个从属和多个主控 最大数据帧限制为9位。为了进行数据传输,主机和从机的波特率必须在彼此的10%之间。下面显示的是一个字符如何通过UART数据线发送的示例。信号高电平和低电平根据GND电平进行测量,因此,改变GND电平将对数据传输造成灾难性影响。
另一方面,RS485是一种基于行业的通信,是针对多个设备的网络而开发的,它们 可以在远距离和更高速度下使用 。它采用 差分信令 测量方法,而不是通过GND引脚进行电压测量。RS485信号是浮动的,每个信号都通过Sig +线和Sig-线传输。
RS485接收器比较两条线之间的电压差,而不是信号线上的绝对电压电平。这样效果很好,并防止了接地回路(通信问题的常见根源)的存在。如果Sig +和Sig-线被扭曲,则可以达到最佳效果,因为扭曲可以 消除 电缆中感应的电磁噪声的影响,并且可以更好地抵抗噪声,从而使RS485可以传输 1200m的数据。双绞线还可以使传输速度远高于直电缆。在短距离传输时,尽管传输速度会随距离而降低,但RS485可以实现高达35Mbps的速度。在1200m的传输速度下,您只能使用100kbps的传输速度。您需要专用的以太网电缆来实现此通信协议。我们可以使用多种类别的以太网电缆,例如CAT-4,CAT-5,CAT-5E,CAT-6,CAT-6A等。在我们的教程中,我们将使用 CAT-6E电缆 它具有4条24AWG双绞线,可支持高达600MHz的频率。它的两端由RJ45连接器端接。来自线路驱动器的典型线路电压电平最低为±1.5 V,最高约为±6V。接收器输入灵敏度为±200 mV。由于共模噪声消除,±200 mV范围内的噪声基本上被阻止。如何通过RS485通信的两行传输字节(0x3E)的示例。
所需组件
- 2×MAX485转换器模块
- 2×Arduino纳米
- 2×16 * 2字母数字液晶显示器
- 2×10k雨刮器电位器
- Cat-6E以太网电缆
- 面包板
- 跳线
长距离有线通信的电路图
下图显示了Arduino的 远程有线通信的发射器和接收器电路图。请注意,发射器和接收器电路看起来都相同,唯一不同的是其中写入的代码。同样在演示中,我们将一块板用作发送器,将一块板用作接收器,但是我们可以轻松地对这些板进行编程,使其以相同的设置既可以用作发送器又可以用作接收器
上述电路的连接图也在下面给出。
如您在上面所看到的,有两对几乎相同的电路对,每对都有一个Arduino nano,16 * 2字母数字LCD和 MAX485 UART到RS485转换器IC ,它们通过RJ45连接器连接到以太网Cat-6E电缆的两端。我在本教程中使用的电缆长25m。我们将通过Nano的电缆从发射机端发送一些数据,该数据会通过在主模式下工作的MAX RS485模块转换为RS485信号。
在接收端,MAX485转换器模块作为从站工作,再次监听主站的传输,将其接收的RS485数据转换为标准的5V TTL UART信号,以供接收Nano读取并显示在16 *上。 2连接了字母数字LCD。
MAX485 UART-RS485转换器模块
该UART-RS485转换器模块具有板载MAX485芯片,该芯片是用于RS-485通信的低功耗,摆率限制收发器。它采用+ 5V单电源供电,额定电流为300μA。它在半双工通信上工作,以实现将TTL电平转换为RS-485电平的功能,这意味着它可以在任何时间发送或接收,而不能同时发送和接收,它可以达到2.5Mbps的最大传输速率。当驱动器被禁用时,MAX485收发器在空载或满载条件下消耗的电源电流在120μA至500μA之间。驱动器的短路电流受到限制,驱动器的输出可通过热关断电路置于高阻抗状态。接收器输入具有故障安全功能,如果输入开路,则可保证逻辑高输出。另外,它具有很强的抗干扰性能。它还具有板载LED来显示芯片的当前状态,即芯片是否通电或其发送或接收数据,从而使其更易于调试和使用。
上面给出的电路图说明了板载MAX485 IC如何连接至各种组件,并提供了0.1英寸标准间距插头,可根据需要与面包板配合使用。
以太网CAT-6E电缆
当我们想到长距离数据传输时,我们会立即考虑通过以太网电缆连接到Internet。如今,我们主要使用Wi-Fi进行Internet连接,但更早之前,我们使用以太网电缆连接到每台个人计算机以将其连接到Internet。在普通电线上使用这些以太网电缆的主要原因是,它们提供了更好的保护,可防止噪声在远距离蔓延和信号失真。它们在绝缘层上有屏蔽护套,可防止电磁干扰,并且每对电线都绞在一起以防止形成任何电流回路,从而更好地防止了噪声。它们通常通过两端的8针RJ45连接器端接。我们可以使用多种类别的以太网电缆,例如CAT-4,CAT-5,CAT-5E,CAT-6,CAT-6A等。在我们的教程中,我们将使用CAT-6E电缆,该电缆具有4对24AWG双绞线,并可以支持高达600MHz的频率。
该图显示了在CAT-6E电缆的绝缘层内如何绞合一对电线
CAT-6E以太网电缆的RJ-45连接器装置
Arduino代码说明
在本项目中,我们使用两个Arduino Nano,一个作为发送器,一个作为接收器,每个驱动一个16 * 2的字母数字LCD来显示结果。因此,在Arduino代码中,我们将专注于发送数据并在LCD屏幕上显示发送或接收的数据。
对于发射器侧:
我们首先包括用于驱动LCD的标准库,然后将Arduino Nano的D8引脚声明为输出引脚,稍后再将其用于声明MAX485模块为发送器或接收器。
int enablePin = 8; int potval = 0; #包括
现在进入设置部分。我们将拉高使能引脚以将MAX485模块置于发送器模式。由于它是半双工IC,因此无法同时发送和接收。我们还将在此处初始化LCD并打印欢迎信息。
Serial.begin(9600); //以波特率9600初始化串行:pinMode(enablePin,OUTPUT); lcd.begin(16,2); lcd.print(“电路图摘要”); lcd.setCursor(0,1); lcd.print(“ Transmitter Nano”); 延迟(3000); lcd.clear();
现在在循环中,我们在串行线上写一个不断增加的整数值,然后将其传输到另一个nano。此值也会打印在LCD上以进行显示和调试。
Serial.print(“ Sent Value =”); Serial.println(potval); //向RS-485总线lcd.setCursor(0,0)的串行写入POTval; lcd.print(“发送值”); lcd.setCursor(0,1); lcd.print(potval); 延迟(1000); lcd.clear(); potval + = 1;
接收方:
再次在这里,我们从包含用于驱动LCD的标准库开始,并将Arduino Nano的D8引脚声明为输出引脚,稍后将用于将MAX485模块声明为发送器或接收器。
int enablePin = 8; #包括
现在进入设置部分。我们将拉高使能引脚以将MAX485模块置于接收器模式。由于它是半双工IC,因此不能同时发送和接收。我们还将在此处初始化LCD并打印欢迎信息。
Serial.begin(9600); //以波特率9600初始化串行:pinMode(enablePin,OUTPUT); lcd.begin(16,2); lcd.print(“电路图摘要”); lcd.setCursor(0,1); lcd.print(“ Receiver Nano”); 延迟(3000); digitalWrite(enablePin,LOW); //(引脚8始终为低电平以从主设备接收值)
现在,在循环中,我们检查串行端口上是否有任何可用的内容,然后读取数据,并且由于传入的数据是整数,因此我们对其进行解析并在连接的LCD上显示。
int pwmval = Serial.parseInt(); //从主站通过RS-485 Serial.print接收INTEGER值(“我有值”);Serial.println(pwmval); lcd.setCursor(0,0); lcd.print(“接收值”); lcd.setCursor(0,1); lcd.print(pwmval); 延迟(1000); lcd.clear();
结论
我们可以在下面找到用于该项目的测试设置。
可以在下面的视频中找到该项目的完整工作。此方法是一种简单且易于实现的方法,可以远距离传输数据。在此项目中,我们仅使用了9600的波特率,该速率远低于我们使用MAX-485模块可以达到的最大传输速度,但是该速度适合那里的大多数传感器模块,因此我们并不需要除非您将电缆用作以太网连接,并且需要您可以获得的所有带宽和传输速度,否则在与Arduino和其他开发板一起工作时,所有最大速度都是如此。请自己尝试传输速度,并尝试使用其他类型的以太网电缆。如果您有任何疑问,请将其留在下面的评论部分或使用我们的论坛,我会尽力解答。到那时,阿迪奥斯!