我們知道Arduino有幾條用于快速數(shù)據(jù)傳輸?shù)膬?nèi)置總線。例如,顯示器通常使用SPI總線。通常通過(guò)I2C總線連接各種傳感器。還有流行的UART,它通常與USB接口一起使用以與計(jì)算機(jī)交換數(shù)據(jù)。但所有這些方法都有一個(gè)嚴(yán)重的缺點(diǎn):它們不能在遠(yuǎn)距離工作。
想象一下我們需要從房屋頂部的傳感器收集數(shù)據(jù)的情況,并且取決于傳感器證詞,在我們的地下室切換繼電器。我們?cè)鯓硬拍艹晒δ??我們肯定需要一個(gè)強(qiáng)大的抗噪聲接口 - 可以使用多年的接口。 RS-485模塊可以順利完成這項(xiàng)工作。
在本文中,我們將使用長(zhǎng)電纜和RS-485接口連接兩個(gè)Arduino電路板。
什么是RS-485?
RS-485是一個(gè)串行接口,是RS232的前身。這個(gè)模塊因?yàn)樵赗S232接口上運(yùn)行的舊計(jì)算機(jī)的COM端口而聲名鵲起。
RS-485模塊。
RS-485模塊的最大范圍是1200米,這意味著我們可以將信號(hào)擴(kuò)展到1.2km。如果線路上有特殊放大器,它可以進(jìn)一步擴(kuò)展。這種長(zhǎng)導(dǎo)線的傳輸速度約為60 kb/s,這是傳輸傳感器數(shù)據(jù)的相對(duì)較好的速度。
RS-485電纜使用雙絞線。該電纜仍用于以太網(wǎng)線路,使其易于使用。要在距離超過(guò)500米的地方傳輸數(shù)據(jù),您需要一根屏蔽雙絞線。 32個(gè)設(shè)備可以連接到一根電纜,但同時(shí)只有一個(gè)設(shè)備可以傳輸數(shù)據(jù)。
所需的硬件
2 x Arduino
2 x RS-485模塊
面包板
部分電線
所有必需的硬件。
使用RS-485連接兩個(gè)Arduinos的原理圖
為了通過(guò)RS-485接口連接兩個(gè)Arduino板,我們需要一個(gè)特殊的模塊。通常,此類模塊使用流行的MAX485芯片。
項(xiàng)目原理圖。
長(zhǎng)度為幾米的電纜連接。
注意:在上圖中,電線A和B是直的。如果距離很小,這就足夠了。如果電纜連接長(zhǎng)度為幾米,則必須使用雙絞線!
RS-485的接收器和發(fā)送器程序
正如我們已經(jīng)注意到的,如果有多個(gè)設(shè)備連接到該線路,則一次只能有一個(gè)設(shè)備傳輸數(shù)據(jù)。我們需要以某種方式通知所有其他設(shè)備我們已準(zhǔn)備好傳輸,并且它們必須保持沉默并傾聽(tīng)。這可以在聯(lián)系人 DE 和 RE 的幫助下完成。
讓我們編寫兩個(gè)程序。每隔500毫秒播放一次“ping”文本。另一個(gè)將收聽(tīng)廣播,并在收到文本“ping”時(shí),閃爍LED#13。
發(fā)射器程序
#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;
}
}
}
將這兩個(gè)程序加載到每個(gè)Arduino板上。如果一切正確組裝并連接到電源,連接到引腳13的LED將在第二塊板上開(kāi)始閃爍。
的 結(jié)論
RS-485自90年代后期開(kāi)始應(yīng)用于各種工業(yè)系統(tǒng)中,這些系統(tǒng)需要在存在電磁干擾的情況下長(zhǎng)距離傳輸數(shù)據(jù)。通常,RS-485接口與專用協(xié)議一起使用,例如ModBus或DMX512。
-
串行通信
+關(guān)注
關(guān)注
4文章
555瀏覽量
35165 -
Arduino
+關(guān)注
關(guān)注
187文章
6453瀏覽量
185937
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論