RS485 Modul mit Auto Direction Control

In diesem Beitrag geht es um das RS485 Modul mit Auto Direction Control (Affiliate-Link) welches ich bei AliExpress gefunden habe. Zuerst bin ich davon ausgegangen, dass ich es genauso ansteuern kann wie das “Standard” MAX485 Modul nur ohne die DE (Driver Output Enable) und RE (Receiver Output Enable) Pins zu benutzen. Wie ich aber feststellen musste, kann man den Sketch nicht einfach auf das RS485 Modul mit Auto Direction Control umschreiben. Wie ich dann doch noch eine Kommunikation aufbauen konnte, möchte ich gerne mit euch teilen.RS485 Modul mit Auto Direction ControlSo richtig zufrieden bin ich wie gesagt nicht. Immerhin habe ich eine Übertragung zwischen zwei RS485 Modulen mit Auto Direction Control realisieren können. Zwischen den unterschiedlichen RS485 Modulen hat es nur eingeschränkt geklappt, in einer Richtung habe ich immer nur Nullen oder einen leeren Wert in der seriellen Konsole bekommen. Mit der Loxone RS485 Extension habe ich daher gar nicht erst getestet.

Versuchsaufbau und Verkabelung vom RS485 Modul

Wie man auf dem Foto gut sehen kann, werden für das RS485 Modul nicht viele Kabel benötigt. Am RS485 Modul habe ich Tx an Pin 2 und Rx an Pin 3 vom Arduino Uno angeschlossen. Da ich die Software Serial Library verwendet habe, sind auch andere Pins möglich. VCC und GND habe ich mit 5 Volt vom Arduino Uno verbunden.

Auf der Seite mit der Anschlussklemme (5,08 mm) habe ich die Datenleitungen A und B jeweils 1:1 mit dem anderen RS485 Modul verbunden. Für längere Strecken kann auf der Platine durch setzen der Lötbrücke R0 ein 120 Ohm als Abschlusswiderstand aktiviert werden.
RS485 Modul mit Auto Direction Control - Testaufbau

Sender

Jede Sekunde wird der Wert “1234Example Text” gesendet. Der Empfänger sollte daraufhin mit einem Acknowledge antworten. Das Acknowledge wird auf der Seite des Senders nicht weiter verarbeitet und dient nur der Kontrolle.
RS485 Modul mit Auto Direction Control - Serial Monitor - Transmit Sketch

Sketch

/******************************* Libraries *******************************/
#include <SoftwareSerial.h> // Software Serial Library (RS485)

/****************** RS485 ******************/
#define SSerialTX        2  // Serial Transmit Pin
#define SSerialRX        3  // Serial Receive Pin

SoftwareSerial RS485Serial(SSerialRX, SSerialTX);

/****************** Variables ******************/
String inputString = "";         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete

String command;
String value;

char *text;

/******************************* Begin setup *******************************/
void setup()
{
  Serial.begin(9600); // only for debug

  RS485Serial.begin(9600);   // Set RS485 baud rate

  inputString.reserve(100);
}

/******************************* Begin loop *******************************/
void loop()
{
RS485Transmit();

RS485receive();

  if (stringComplete) // Write command and value to serial monitor
  {
    // Serial.println(inputString);
    command = inputString.substring(0,4);
    // command = command.toInt();

    Serial.print("Command: ");
    Serial.print(command);
    Serial.print(" - ");
    value = inputString.substring(4);
    Serial.print("Value: ");    
    Serial.println(value);

    inputString = ""; // Clear inputString
    stringComplete = false;
  }
  delay(1000);
}

/******************************* Function RS485 Test *******************************/
void RS485Transmit()
{
  text = "1234Example Text";
  RS485Serial.write(text);

  RS485Serial.write("\n"); // Send end of transmission

  Serial.println("RS485 Transmit Test");  
}

/******************************* Function RS485 Receive *******************************/
void RS485receive() {
   while (RS485Serial.available()) {
     char inChar = (char)RS485Serial.read(); // Get the next byte

     if (inChar == '\n') // If the incoming character is a newline break while loop
     {
       stringComplete = true;
       break;
     }

     inputString += inChar; // Add value to inputstring

    if (inputString.length() > 100) // If inputString is too long break while loop
    {
      Serial.println("ERROR");
      break;
    }
  }
}

Empfänger

Der Empfänger zerlegt die ankommenden Daten aus dem Beispiel in Command “1234” und Value “Example Text” und gibt diese über Serial wieder aus. Als Bestätigung wird dem Sender mit einem Acknowledge geantwortet.
RS485 Modul mit Auto Direction Control - Serial Monitor - Receive Sketch

Sketch

/******************************* Libraries *******************************/
#include <SoftwareSerial.h> // Software Serial Library (RS485)

  /****************** RS485 ******************/
#define SSerialTX        2  // Serial Transmit Pin
#define SSerialRX        3  // Serial Receive Pin

SoftwareSerial RS485Serial(SSerialRX, SSerialTX);

/****************** Variables ******************/
String inputString = "";         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete

String command;
String value;

char *text;

/******************************* Begin setup *******************************/
void setup()
{
  Serial.begin(9600); // only for debug

  RS485Serial.begin(9600);   // Set RS485 baud rate
  
  inputString.reserve(100);
}

/******************************* Begin loop *******************************/
void loop()
{
  RS485receive();

  if (stringComplete) // Write command and value to serial monitor
  {
    // Serial.println(inputString);
    command = inputString.substring(0,4);
    // command = command.toInt();

    Serial.print("Command: ");
    Serial.print(command);
    Serial.print(" - ");
    value = inputString.substring(4);
    Serial.print("Value: ");    
    Serial.println(value);

    if (command == "1234")  // Send Acknowledge if value = 1234
    {
      Acknowledge();
    }
    
    inputString = ""; // Clear inputString
    stringComplete = false;
  }
}

/******************************* Function RS485 Acknowledge *******************************/
void Acknowledge()
{
  text = "9999Acknowledge";

  RS485Serial.write(text);

  RS485Serial.write("\n"); // Send end of transmission
  }

/******************************* Function RS485 Receive *******************************/
void RS485receive() {
   while (RS485Serial.available()) {

     char inChar = (char)RS485Serial.read(); // Get the next byte

     if (inChar == '\n') // If the incoming character is a newline break while loop
     {
       stringComplete = true;
       break;
     }

     inputString += inChar; // Add value to inputstring

    if (inputString.length() > 100) // If inputString is too long break while loop
    {
      Serial.println("ERROR");
      break;
    }
  }
}

2 Gedanken zu „RS485 Modul mit Auto Direction Control“

  1. Hallo,
    versuche auch grad meine Lüftungsanlage von Helios über ein python programm anzusteuern/auszulesen. Habe ein Skipt im Netz gefunden, das ich aber nur in der Kommandozeile ausführen kann, leider hab ich es nicht geschafft das aus meinem Python Programm heraus bspw. als Modul einzubinden/aufzurufen.
    (Das Python Skrpt habe ich von https://knx-user-forum.de/forum/%C3%B6ffentlicher-bereich/knx-eib-forum/25743-helios-kwl-anbindung-%C3%BCber-rs485/page2)

    Wie würdest du das Lösen oder hast du eine Idee wie ich den Code in mein bestehendes einbinden kann?
    Wie hast du das gelöst?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert