选择用于微控制器和外围设备之间通信的通信协议是嵌入式系统的重要组成部分。这很重要,因为任何嵌入式应用程序的整体性能都取决于通信方式,因为它与降低成本,更快的数据传输,远距离覆盖等相关。
在之前的教程中,我们了解了Arduino中的I2C通信协议和SPI通信协议。现在还有另一个称为RS-485的串行通信协议。该协议使用异步串行通信。RS-485的主要优点是两个设备之间的长距离数据传输。它们最常用于嘈杂的工业环境。
在本教程中,我们将学习两个Arduino之间的RS-485串行通信,然后通过通过RS-485模块发送ADC值来控制从Master Arduino连接到Slave Arduino的LED的亮度来进行演示。一个10k的电位器用于改变Arduino主机上的ADC值。
让我们从了解RS-485串行通信的工作开始。
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速度更快。
Arduino中的RS-485
为了在Arduino中使用RS-485,需要一个基于Maxim MAX485 IC的名为5V MAX485 TTL到RS485的模块,因为它允许1200米长距离的串行通信,并且是双向的。在半双工模式下,其数据传输速率为2。5Mbps。
5V MAX485 TTL至RS485模块需要5V电压并使用5V逻辑电平,因此可以与Arduino等微控制器的硬件串行端口接口。
具有以下特点:
- 工作电压:5V
- 板载MAX485芯片
- RS485通信的低功耗
- 摆率受限收发器
- 5.08mm间距2P端子
- 便捷的RS-485通讯接线
- 芯片的所有引脚都可以通过微控制器进行控制
- 板子尺寸:44 x 14mm
RS-485的引脚:
引脚名称 |
采用 |
VCC |
5伏 |
一种 |
同相接收器输入 同相驱动器输出 |
乙 |
反相接收器输入 反相驱动器输出 |
地线 |
地(0V) |
00 |
接收器输出(RX引脚) |
回覆 |
接收器输出(低使能) |
德 |
驱动器输出(高启用) |
DI |
驱动器输入(TX引脚) |
该RS-485模块可轻松与Arduino接口。让我们使用Arduino 0(RX)和1(TX)的硬件串行端口(在UNO,NANO中)。编程也很简单,只需使用Serial.print()写入RS-485并使用Serial.Read()从RS-485读取即可。
稍后将详细说明编程部分,但首先让我们检查所需的组件和电路图。
所需组件
- Arduino UNO或Arduino NANO(2)
- MAX485 TTL转RS485转换器模块-(2)
- 10K电位器
- 16x2 LCD显示屏
- LED
- 面包板
- 连接线
在本教程中,Arduino Uno被用作Master,而Arduino Nano被用作Slave。这里使用了两个Arduino开发板,因此需要两个RS-485模块。
电路原理图
第一个RS-485和Arduino UNO(Master)之间的电路连接:
RS-485 |
Arduino UNO |
DI |
1(TX) |
德 回覆 |
8 |
00 |
0(接收) |
VCC |
5伏 |
地线 |
地线 |
一种 |
到从站RS-485的A |
乙 |
到从站B-RS-485 |
第二个RS-485与Arduino Nano(从站)之间的连接:
RS-485 |
Arduino UNO |
DI |
D1(TX) |
德 回覆 |
D8 |
00 |
D0(接收) |
VCC |
5伏 |
地线 |
地线 |
一种 |
至主RS-485 |
乙 |
到主站RS-485的B |
16x2 LCD和Arduino Nano之间的电路连接:
16x2 LCD |
Arduino纳米 |
VSS |
地线 |
VDD |
+5伏 |
V0 |
电位器中心引脚,用于LCD对比度控制 |
RS |
D2 |
读写器 |
地线 |
Ë |
D3 |
D4 |
D4 |
D5 |
D5 |
D6 |
D6 |
D7 |
D7 |
一种 |
+5伏 |
ķ |
地线 |
一个10K电位器连接到Arduino UNO的模拟引脚A0,以提供模拟输入,一个LED连接到Arduino Nano的引脚D10。
编程Arduino UNO和Arduino Nano进行RS485串行通信
为了进行编程,都使用了Arduino IDE。但是,请确保已从“工具”->“端口和板”中从“工具”->“板”中选择了相应的端口。
本教程末尾提供了带有演示视频的完整代码。在这里,我们解释了代码的重要部分。本教程中有两个程序,一个用于Arduino UNO(Master),另一个用于Arduino Nano(Slave)。
主机的代码说明:Arduino UNO
在主侧上,只是简单地采取在销A0模拟输入,通过改变电位,然后 SerialWrite 这些值到RS-485总线通过Arduino的UNO的硬件串行端口(0,1)。
要在硬件串行引脚(0,1)上开始串行通信,请使用:
Serial.begin(9600);
要在Arduino UNO的A0引脚上读取模拟值并将其存储在可变 potval中,请 使用:
int potval = AnalogRead(pushval);
在将 有效值 写入串行端口之前,RS-485的DE和RE引脚应为HIGH,该引脚连接至Arduino UNO的引脚8,从而使引脚8为HIGH:
digitalWrite(enablePin,HIGH);
接下来将这些值放入与RS-485模块连接的串行端口中,使用以下语句
Serial.println(potval);
从站的代码说明:Arduino NANO
在从设备侧,从Master RS-485接收到一个整数值,该值在Arduino Nano的硬件串行端口(引脚-0,1)上可用。只需读取这些值并将其存储在变量中即可。值的形式为(0 -1023)。因此,由于使用PWM技术控制LED亮度,它被转换为(0-255)。
然后用 AnalogWrite将 这些转换后的值写入LED引脚D10(这是PWM引脚)。因此,根据PWM值,LED的亮度会发生变化,并在16x2 LCD显示屏中显示这些值。
为了使Slave Arduino的RS-485从主机接收值,只需将RS-485的DE和RE引脚设为LOW即可。因此,Arduino NANO的D8引脚(使能引脚)被置为低电平。
digitalWrite(enablePin,LOW);
并读取串行端口上可用的整数数据并将其存储在变量中
int pwmval = Serial.parseInt();
接下来将值从(0-1023转换为0-255)并将其存储在变量中:
int convert = map(pwmval,0,1023,0,255);
接下来,将模拟值(PWM)写入连接LED阳极的引脚D10:
AnalogWrite(ledpin,convert);
要在16x2 LCD显示屏上打印这些PWM值,请使用
lcd.setCursor(0,0); lcd.print(“ PWM FROM MASTER”); lcd.setCursor(0,1); lcd.print(转换);
通过串行通信RS485控制LED亮度
使用电位计将PWM值设置为0时,LED熄灭。
当使用电位计将PWM值设置为251时:LED会以全亮度点亮,如下图所示:
这就是RS485在Arduino中用于串行通信的方式。