我们知道Arduino有几条用于快速数据传输的内置总线。例如,显示器通常使用SPI总线。通常通过I2C总线连接各种传感器。还有流行的UART,它通常与USB接口一起使用以与计算机交换数据。但所有这些方法都有一个严重的缺点:它们不能在远距离工作。
想象一下我们需要从房屋顶部的传感器收集数据的情况,并且取决于传感器证词,在我们的地下室切换继电器。我们怎样才能成功呢?我们肯定需要一个强大的抗噪声接口 - 可以使用多年的接口。 RS-485模块可以顺利完成这项工作。
在本文中,我们将使用长电缆和RS-485接口连接两个Arduino电路板。
什么是RS-485?
RS-485是一个串行接口,是RS232的前身。这个模块因为在RS232接口上运行的旧计算机的COM端口而声名鹊起。
RS-485模块。
RS-485模块的最大范围是1200米,这意味着我们可以将信号扩展到1.2km。如果线路上有特殊放大器,它可以进一步扩展。这种长导线的传输速度约为60 kb/s,这是传输传感器数据的相对较好的速度。
RS-485电缆使用双绞线。该电缆仍用于以太网线路,使其易于使用。要在距离超过500米的地方传输数据,您需要一根屏蔽双绞线。 32个设备可以连接到一根电缆,但同时只有一个设备可以传输数据。
所需的硬件
2 x Arduino
2 x RS-485模块
面包板
部分电线
所有必需的硬件。
使用RS-485连接两个Arduinos的原理图
为了通过RS-485接口连接两个Arduino板,我们需要一个特殊的模块。通常,此类模块使用流行的MAX485芯片。
项目原理图。
长度为几米的电缆连接。
注意:在上图中,电线A和B是直的。如果距离很小,这就足够了。如果电缆连接长度为几米,则必须使用双绞线!
RS-485的接收器和发送器程序
正如我们已经注意到的,如果有多个设备连接到该线路,则一次只能有一个设备传输数据。我们需要以某种方式通知所有其他设备我们已准备好传输,并且它们必须保持沉默并倾听。这可以在联系人 DE 和 RE 的帮助下完成。
让我们编写两个程序。每隔500毫秒播放一次“ping”文本。另一个将收听广播,并在收到文本“ping”时,闪烁LED#13。
发射器程序
#define SerialTxControl 2 // contact # 2 will switch receiver / transmitter mode
#define RS485Transmit HIGH
#define RS485Receive LOW
void setup (void) {
Serial.begin (9600); // set the serial port to 9600baud speed
pinMode (SerialTxControl, OUTPUT);
digitalWrite (SerialTxControl, RS485Transmit); // put the device into transmitter mode
}
void loop (void) {
Serial.print (“ping”); // send text
delay (500);
}
接收方程序
#define SerialTxControl 2
#define RS485Transmit HIGH
#define RS485Receive LOW
char buffer [100];
byte state = 0;
void setup (void) {
Serial.begin (9600);
pinMode (13, OUTPUT);
pinMode (SerialTxControl, OUTPUT);
digitalWrite (SerialTxControl, RS485Receive); // put the device into receiver mode
}
void loop (void) {
int i = 0;
if (Serial.available ()) {// if any data came to the port
delay (5); // wait a bit for the entire data packet to be accepted by the port
while (Serial.available ()) {
buffer [i ++] = Serial.read (); // read data and write it to the buffer
}
}
if (i》 0) {// if there is something in the buffer
buffer [i ++] = ‘ 0’; // convert the buffer contents to a string by adding a null character
if (strcmp (buffer, “ping”)) {// if the accepted string is equal to the ping text
digitalWrite (13, state); // blink LED
state =! state;
}
}
}
将这两个程序加载到每个Arduino板上。如果一切正确组装并连接到电源,连接到引脚13的LED将在第二块板上开始闪烁。
的 结论
RS-485自90年代后期开始应用于各种工业系统中,这些系统需要在存在电磁干扰的情况下长距离传输数据。通常,RS-485接口与专用协议一起使用,例如ModBus或DMX512。
-
串行通信
+关注
关注
4文章
563浏览量
35258 -
Arduino
+关注
关注
187文章
6461浏览量
186570
发布评论请先 登录
相关推荐
评论