怎样在两个或更多Arduino板之间创建长距离串行通信

电子说

1.2w人已加入

描述

我们知道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。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分