Die serielle Kommunikation ist eine der gebräuchlichsten Möglichkeiten, Daten zwischen elektronischen Geräten auszutauschen. Wenn jedoch die Entfernungen größer werden oder die Umgebung elektromagnetischen Störungen ausgesetzt ist, können Kommunikationssignale fehleranfällig sein. Hier kommt der RS485-Kommunikationsstandard ins Spiel und bietet eine robuste und effektive Alternative. Dank seiner Vielseitigkeit können wir mit Arduino auf relativ einfache Weise die Vorteile dieses Protokolls voll ausschöpfen.
In diesem Artikel werden wir sehen, wie die RS485-Kommunikation zwischen mehreren Arduinos mithilfe von Modulen implementiert werden kann, die auf dem integrierten MAX485 basieren, einem Chip, der TTL-Signale (von Arduino) in RS485 und umgekehrt umwandelt. In diesem Tutorial werden wir sowohl die grundlegenden Konzepte als auch praktische Beispiele behandeln, die es Ihnen ermöglichen, Simplex-, Halbduplex- und Vollduplex-Kommunikation zwischen Arduino-Mikrocontrollern zu implementieren, und erklären, wie Sie dieses Kommunikationssystem erweitern können, um mehrere Geräte in einem einzigen zu verwalten RS485-Bus.
Was ist RS485?
Der RS485 ist ein in der Branche weit verbreiteter Kommunikationsstandard, der für seine bekannt ist Robustheit und seine Widerstandsfähigkeit Fern Übertragung, auch in lauten Industrieumgebungen. Im Gegensatz zu anderen Arten der seriellen Kommunikation, wie z. B. RS232, ermöglicht RS485 den Anschluss mehrerer Geräte an denselben Bus und ist somit ideal für industrielle Automatisierungs- und Steuerungsanwendungen.
Dieses Protokoll ist resistent gegen elektromagnetisches Rauschen, da es a verwendet Differentialsignalisierungssystem, was bedeutet, dass Daten über zwei Drähte A und B gesendet werden, deren Spannung entgegengesetzt ist. Dadurch können in den Kabeln aufgenommene Störungen problemlos unterdrückt werden, wodurch die Signalintegrität gewährleistet wird.
Das ist einer der Hauptvorteile von RS485 unterstützt Entfernungen bis zu 1200 Metern und Geschwindigkeiten von bis zu 35 Mbit/s über kurze Distanzen, was es zu einem idealen Protokoll für Industrie- und Steuerungsanwendungen in Umgebungen macht, in denen lange Verkabelungen erforderlich sind.
RS485-Kommunikationsmodi
Bei der RS485-Kommunikation können wir das System auf drei verschiedene Arten konfigurieren: Simplex, Halbduplex und Vollduplex. Jedes hat seine Besonderheiten und wird entsprechend den Anforderungen des Projekts umgesetzt.
Simplex-Kommunikation
Im Simplex-Modus erfolgt die Kommunikation nur in eine Richtung, d. h. ein Gerät fungiert als Emittent und eine andere wie Rezeptor. Dies ist in Situationen nützlich, in denen Sie einfach nur Daten senden oder empfangen möchten, ohne dass eine Rückmeldung erforderlich ist.
Wir können beispielsweise ein System einrichten, bei dem ein Arduino einen Sensorwert liest und ihn an ein anderes Gerät sendet, das ihn einfach empfängt. Da in diesem Fall die Daten nur in eine Richtung übertragen werden, kann auf bestimmte zusätzliche Steuerelemente verzichtet werden, was das System einfacher und wirtschaftlicher macht.
Halbduplex-Kommunikation
Die meisten RS485-Anwendungen auf Arduino werden im Halbduplex-Modus implementiert, da dies nur erforderlich ist zwei Drähteund ermöglicht das Senden und Empfangen von Daten, allerdings nicht gleichzeitig. Das heißt, wenn ein Gerät Daten sendet, müssen sich die anderen Geräte im Empfangsmodus befinden und umgekehrt.
Um zwischen Sende- und Empfangsmodus zu wechseln, verwenden Sie zusätzliche Stifte (RE/DE) auf dem MAX485-Modul, das Sie über den Code steuern, um zu bestimmen, ob das Gerät zu einem bestimmten Zeitpunkt senden oder empfangen soll.
Dieser Modus ist besonders nützlich, wenn Sie mehrere Geräte am selben Bus haben, die miteinander kommunizieren müssen, jedoch nicht gleichzeitig.
Vollduplex-Kommunikation
Im Vollduplex-Modus können Geräte gleichzeitig Daten senden und empfangen. Um jedoch Vollduplex in RS485 zu implementieren, zwei Paare verdrillter Drähte, was die Kosten und die Komplexität der Verkabelung erhöht. Darüber hinaus benötigen Sie für jedes Gerät zwei MAX485-Module, um die Sende- und Empfangskanäle getrennt zu verwalten.
Erforderliche Komponenten für die RS485-Kommunikation mit Arduino
Um ein RS485-Kommunikationssystem auf Arduino zu implementieren, benötigen Sie folgende Komponenten:
- Ein oder mehrere Arduinos: Jedes Arduino-Modell reicht aus, aber in diesem Tutorial werden wir es verwenden Arduino UNO und Arduino MEGA als Beispiele.
- MAX485-Module: Mit diesen Modulen können Sie TTL-Signale von Arduino nach RS485 und umgekehrt konvertieren. Sie sind sehr günstig und in Geschäften wie AliExpress oder eBay leicht zu finden.
- Abschlusswiderstände: Normalerweise wird an jedem Ende des Busses ein Widerstand zwischen 120 Ohm platziert, um Reflexionen im Signal zu vermeiden. Bei kurzen Distanzen kann auf sie verzichtet werden, bei längeren Installationen sind sie jedoch für die Aufrechterhaltung der Signalintegrität unerlässlich.
- Twisted-Pair-Kabel: Es wird empfohlen, Twisted-Pair-Kabel zu verwenden, um elektromagnetische Störungen zu minimieren, insbesondere in lauten Industrieumgebungen.
Allgemeiner Anschlussplan
Verbinden Sie MAX485-Module zu einem Arduino ist ganz einfach. Die wichtigsten Pins sind A und B, die den RS485-Busleitungen entsprechen. Diese Pins müssen mit allen Geräten am Bus verbunden sein. Darüber hinaus verfügt das Modul über RE- und DE-Pins, die steuern, ob sich das Modul im Empfänger- oder Sendermodus befindet.
Im Allgemeinen erfolgt der Anschluss der Module an den Arduino wie folgt:
- VCC und GND des Moduls werden mit VCC und GND auf dem Arduino verbunden.
- Der DI (Dateneingang) des Moduls wird mit dem TX-Pin des Arduino verbunden, wenn das Modul als Emitter fungieren soll.
- RO (Receiver Output) des Moduls wird mit dem RX-Pin des Arduino verbunden, wenn das Modul als Empfänger fungieren soll.
- DE und RE müssen über einen digitalen Arduino-Pin gesteuert werden, um zwischen Sende- und Empfangsmodus zu wechseln.
Wenn Sie das Modul nur als Sender oder Empfänger benötigen, können Sie RE und DE direkt mit HIGH oder LOW verbinden. Für komplexere Kommunikationen, bei denen das Gerät zwischen Senden und Empfangen umschalten muss, ist es jedoch am besten, diese Pins über die Software zu steuern.
Codebeispiele für die RS485-Kommunikation
Nachfolgend finden Sie einige Beispiele für die verschiedenen Kommunikationskonfigurationen mit RS485 auf Arduino.
Simplex-Kommunikation
Ausstellercode
Für ein einfaches Simplex-System, in dem wir nur einen Sender und einen Empfänger haben, könnte der Code für den Sender so aussehen:
void setup() { Serial.begin(9600); } void loop() { Serial.write(analogRead(0)); delay(500); }
Empfängercode
Der Empfänger liest einfach die über die serielle Schnittstelle eingehenden Daten:
void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Halbduplex-Kommunikation
In diesem Beispiel implementieren wir ein Halbduplex-System, bei dem Geräte abwechselnd Daten senden und empfangen.
Lehrercode
const int reDePin = 2; void setup() { pinMode(reDePin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(reDePin, HIGH); Serial.write('H'); delay(100); digitalWrite(reDePin, LOW); if (Serial.available()) { int data = Serial.read(); Serial.println(data); } }
Slave-Code
const int reDePin = 2; void setup() { pinMode(reDePin, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(reDePin, LOW); if (Serial.available()) { int data = Serial.read(); delay(100); digitalWrite(reDePin, HIGH); Serial.write(data + 1); } }
Vollduplex-Kommunikation
Um eine Vollduplex-Kommunikation zu implementieren, werden zwei MAX485-Module pro Arduino benötigt. Jedes Modulpaar verwaltet eine Datenleitung: eine zum Senden und eine zum Empfangen.
Der Code ähnelt den vorherigen Beispielen, allerdings würden in diesem Fall immer beide Geräte gleichzeitig senden und empfangen.
Erweiterung auf mehrere Geräte in RS485
RS485 bietet die Möglichkeit, bis zu 32 Geräte an einem einzigen Bus anzuschließen, in besonderen Fällen sind auch mehr Geräte möglich. Das macht es zu einer ausgezeichneten Wahl für Projekte mit mehreren Mikrocontrollern oder Geräten. Um jedes einzelne Gerät im Netzwerk zu identifizieren, ist es üblich, für jedes Gerät eine Adresse oder ID zu implementieren.
In diesem Fall sendet der Master eine Nachricht mit der Adresse des Geräts, mit dem er kommunizieren möchte, und nur dieses Gerät ist für die Verarbeitung der Nachricht und die Bereitstellung einer Antwort zuständig.
Hinzu kommt die Möglichkeit der Nutzung komplexere Protokolle wie MODBUS, die den Aufbau hocheffizienter und sicherer Netzwerke in der Industrie ermöglichen.
Für Heimprojekte oder weniger anspruchsvolle Anwendungen können Sie jedem Arduino einfach eine Kennung zuweisen und ihn nur auf für ihn bestimmte Nachrichten reagieren lassen.