Skip to content

Mit dem Arduino den RS485 Bus nutzen

by on 18/03/2013

Der RS485 Bus erlaubt es Daten zwischen mehreren Teilnehmern auszutauschen. Eingesetzt wird er besonders dann, wenn die Teilnehmer mehrere hundert Meter voneinander entfernt sind und/oder eine recht hohe Datenübertragungsrate benötigt wird.

Aus diesem Grund wird der RS485 Bus auch oft in der Gebäudetechnik eingesetzt. Bekannte Anwendungen wie der Profibus (von Siemens) oder die DMX Schnittstelle (Verwaltungstechnik für Lichtsteuerungsanlagen) basieren auf der Idee des RS485 Bus.

Besonders geschätzt werden folgende Eigenschaften:

– Länge der Kabel, bis zu 1200 m (bei 1200m eine Übertragungsrate von 100 kbit/s)

– Maximale Datenübertragungsrate von 12Mb/s (wird nur bei recht kurzen Kabellängen erreicht)

– Bis zu 32 Teilnehmer an einem Bus (bei besonderen Konfigurationen und Dimensionierung können auch mehr Teilnehmer verwendet werden)

Wichtig zu beachten ist jedoch, dass es sich bei dem RS485 (auch EIA-485) um eine “Leitungskodierung” handelt, es werden die elektrischen Eigenschaften in der Spezifikation festgelegt. Ein Protokoll oder Steckerbelegung wird nicht festgelegt. Dies hat natürlich den Vorteil, dass man den RS485 für seine eigenen Anwendungen komfortabel nutzen kann, das Protokoll kann “frei” gewählt werden, die Art der Teilnehmer kann stark heterogen sein, o.ä.

Der RS485 Bus kann Vollduplex (zeitgleich Senden und Empfangen) oder Halbduplex (Senden und Empfangen, aber nicht zeitgleich) betrieben werden. Die gängigste Methode ist der Betrieb im Halbduplex, dazu benötigt man 2 Kabel. Für den Vollduplexbetrieb werden 4-Kabel benötigt.

RS-485 Bus, 2 Kabel, Halbduplex!

RS-485 Bus, 2 Kabel, Halbduplex

Im Halbduplexbetrieb findet das Senden und Empfangen über die gleiche Leitung statt. Alle Teilnehmer können miteinander kommunizieren.

Bei besonders langen Kabeln, muss am Anfang und am Ende ein Widerstand von ca. 120 Ω (R1 und R2) angebracht werden. Bei kurzen Kabellängen, kann darauf verzichtet werden.

4kabel

RS-485, 4 Kabel, Vollduplex

Im Vollduplexbetrieb findet das Senden und Empfangen über zwei unterschiedliche Kanäle statt. Problematisch ist hier jedoch, dass Bus-Master und Bus-Slave von vornherein festgelegt sind. Die Bus-Slaves sind nicht in der Lage miteinander zu kommunizieren. Der Bus-Master kann Daten an die Bus-Slaves senden und die Bus-Slaves Daten an den Master.

Auch hier sollte aber auf die Widerstände (R1 = R2 = R3 = R4 = 120 Ω) geachtet werden.

Und nun zur Praxis, den Datenaustausch zwischen zwei Arduino über den RS485 Bus und UART (Universal Asynchrones Receiver/transmitter: Standard der Seriellen Schnittstelle am Computer oder Microcontroller).

Wenn man Daten mit dem Arduino über die Serielle Schnittstelle versendet (Serial.write(), Serial.println(), etc), wird UART (mit TTL-Pegeln) verwendet.

Um nun mit dem Arduino (oder Microcontrollern allgemein) Daten über den RS485 Bus auszutauschen, ist der einfachste Weg, den UART der Arduino zu verwenden und die Pegel mit einem RS485 “Treiber” zu codieren. An der Empfangsseite wird das Signal wieder decodiert.

Ein Schaltbild kann in etwa so aussehen:

ArduinoRS485_Schaltplan

ArduinoRS485_Steckplatine

Als RS485 “Treiber” wird hier das IC MAX485CPA+ verwendet. Dem Schaltplan kann entnommen werden, dass RX und TX der Arduino entsprechend an das IC angeschlossen werden. Auffallend ist jedoch, dass Pin 2 und 3 des ICs an einen Parallelport des Microcontrollers angeschlossen sind. Dies ist notwendig, um dem Bus “Treiber” mitzuteilen, ob er von dem Bus lesen (LOW an Pin 2 und 3 des Treiber ICs) oder auf den Bus schreiben  (HIGH an Pin 2 und 3 des Treiber ICs) soll. Zu beachten ist, dass Pin 2 und 3 nur auf HIGH-Pegel gesetzt werden sollte, wenn wirklich Daten gesendet werden, da sonst der Bus komplett blockiert wird.

Um nun mit dem Arduino auf den Bus zu schreiben, werden (wie beim Benutzen der TTL-Serial-Schnittstelle) wie gewohnt die Befehle Serial.write(), Serial.print() oder Serial.println() (o.ä.) verwendet.

Quellenverzeichnis:

Click to access MAX1487-MAX491.pdf

http://www.rn-wissen.de/index.php/RS485

Johannes Kinzig

Leave a Comment

Leave a comment