我們知道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文章
579瀏覽量
35614 -
Arduino
+關注
關注
188文章
6477瀏覽量
188052
發布評論請先 登錄
相關推薦
評論