Arduino – MAX485 Modul mit Loxone RS485 Extension verbinden

Für ein Projekt benötige ich eine einfach Kommunikation zwischen einem Arduino Board und dem Loxone Miniserver. Ich habe die Schnittstellen beider Seiten verglichen und mich (erstmal) für die Kommunikation über das RS485 Protokoll entschieden.

Vorteil:
– Direkte Verbindung (kein Raspberry Pi oder etwas anderes als “Bridge”)
– Es wird nur ein Aderpaar benötigt
– MAX485 Modul ist klein und günstig
– Reichweite (bis 1000m)
– Busfähig (bis zu 32? Teilnehmer in einem Bus)
– Hohe Geschwindigkeit (Jedenfalls in diesem Versuchsaufbau)
Nachteil:
– Loxone RS485 Extension wird benötigt
– nur Halfduplex (es kann nur einer zur Zeit Senden oder Empfangen – hatte aber keine Probleme in diesem Versuchsaufbau)

Alternativ könnte man natürlich auch eine Verbindung z. B. über Netzwerk (Stichwort: W5100) oder mit einem kleinen Umweg auf der Loxone Seite per Funk (433 Mhz / 2,4 Ghz / Bluetooth / …) aufbauen aber eins nach dem anderen 😉 .

Der Aufbau

Der erste Versuchsaufbau war mit 2 Arduinos (Uno und Pro Micro) wobei der kleine Arduino nur die empfangenen RS485 Daten anzeigt und wieder zurücksendet. Ganz praktisch um zu sehen ob die Kommunikation überhaupt klappt.Erster Versuchsaufbau - RS485 zwischen zwei Arduinos
Kommen wir jetzt aber zum eigentlichen Aufbau. Die Verkabelung des MAX485 Moduls und der Loxone RS485 Extension ist wie im Bild zu sehen relativ schnell erledigt. Die beiden hellblauen Kabel (A+B) gehen Richtung Loxone RS485 Extension. Das RS485 Modul selbst wird mit VCC und GND verbunden und so mit Strom versorgt. PIN3 geht auf die gebrückten DE und RE Eingänge, PIN10 auf RO und PIN 11 auf DI.Zweiter Versuchsaufbau - RS 485 Arduino und Loxone
Als kleine Hilfe hier noch eine Verkabelungsplan. Die Belegung der PINs bzw. die Ausrichtung vom Modul (das im Original etwas anders aussieht) sollte sich (hoffentlich) durch die Legende erklären.

Verkabelung - RS485 Arduino und Loxone
1 = RO / 2 = RE / 3 = DE / 4 = DI / 5 = GND / 6 = A / 7 = B / 8 = VCC

Programmierung

Es gibt aktuell noch eine Einschränkung in meinem Sketch für den Arduino. Es kann nicht mit variablen Werten wie z. B. Temperaturen gearbeitet werden. Es könnten aber vom Arduino Board fest definierte Werte an die Loxone RS485 Extension und umgekehrt auch noch analoge Werte an das Arduino Board geschickt werden.

Wichtig für Übersichtlichkeit ist eine Adressierung damit auf beiden Seiten auch erkennbar ist, von wem und für wen die Informationen sind und was diese tun soll. Ich habe dafür einfach mal eine kleine Tabelle erstellt die für kleine Umgebungen (max. 9 Teilnehmer und max. 9 Ein- sowie Ausgänge) ausreichen sollte. Kurz zur Erklärung von Zeile 1: Arduino 1 (1) sendet an den Loxone Miniserver (9) über den ersten virtuellen I/O Ausgang (1) einen Impuls bzw. einen Wert (1).Tabelle RS485 Adressierung

Arduino Sketch

#include <SoftwareSerial.h> // Serial Library

#define SSerialRX        10  // Serial Receive Pin
#define SSerialTX        11  // Serial Transmit Pin
#define SSerialTxControl 3   // RS485 Direction Control Pin

#define RS485Transmit    HIGH
#define RS485Receive     LOW

#define LEDPin         13 // LED Pin

SoftwareSerial RS485Serial(SSerialRX, SSerialTX);

int byteRead; // Variable

void setup()
{
  Serial.begin(9600);
 
  pinMode(LEDPin, OUTPUT);   
  pinMode(SSerialTxControl, OUTPUT);    
  
  digitalWrite(SSerialTxControl, RS485Receive);
  RS485Serial.begin(9600);   // Set RS485 baud rate 
}

void loop()
{
  digitalWrite(LEDPin, HIGH); // Info LED
  if (Serial.available()) // Arduino Serial Console Input
  {
    byteRead = Serial.parseInt(); // Parse Integer
    digitalWrite(SSerialTxControl, RS485Transmit);  // Enable RS485 Transmit

    if(byteRead==1) RS485Serial.write("1911");
    
    if(byteRead==2) RS485Serial.write("1921");

    digitalWrite(LEDPin, LOW);  // Show activity    
    delay(10);
    digitalWrite(SSerialTxControl, RS485Receive);  // Disable RS485 Transmit
  }
  
  if (RS485Serial.available())  //Look for data
   {
    digitalWrite(LEDPin, HIGH);  // Show activity
    byteRead = RS485Serial.parseInt();    // Read received byte
    
    if(byteRead==9111)
    {
      Serial.println("Arduino - Eingang 1 - Licht - An");
    }
    
    if(byteRead==9110)
    {
      Serial.println("Arduino - Eingang 1 - Licht - Aus");
    }
    
    delay(10);
    digitalWrite(LEDPin, LOW);  // Show activity
   }  
}

Loxone Config

In der Loxone Config werden dann wie folgt passende RS485 Sensoren und Aktoren erstellt. Generell sehr hilfreich, nicht nur zur Erstellung der Sensoren, ist auch der Loxone RS232/RS485 Monitor. Loxone Config RS 485 Eingang und Ausgang
Wenn alles passt sollte jetzt eine Kommunikation möglich sein. Hierzu einfach eine 1 oder 2 (durch “parseInt” in der Programmierung gibt es eine kleine Verzögerung, deshalb am besten einen Buchstaben anhängen, dann geht es schneller) in den Serial Monitor der Arduino IDE Software eintippen und auf der Loxone Seite sollte die entsprechende Adresse auftauchen. Genauso sollte der Loxone RS485 Aktor im Serial Monitor eine Arduino – Eingang 1 – Licht – An bzw. Aus Meldung bringen.

Mit dem kleinen Arduino Pro Micro auf dem ersten Bild unten rechts (Größe: 3,3cm x 1,8 cm) geht es demnächst weiter. Ich will damit einen kleinen IR Sender und Empfänger für die Unterputzdose bauen. Mal schauen ob das funktioniert …

11 Gedanken zu „Arduino – MAX485 Modul mit Loxone RS485 Extension verbinden“

  1. vielen Dank für der Beitrag.
    Ich versuche auch ein Kommunikation zwischen meine Arduino Mega und Nano mit max RS485 zu bauen, aber für die ähnliche Beispiel (der Nano Arduino nur die empfangenen RS485 Daten anzeigt und wieder zurücksendet) mit verschiedene Libaries, z.B. mit RS485-Arduino-Library, ModbusMaster und simple-modbus und etc. Aber habe ich leider nicht geschaft.
    Können Sie bitte sagen, welche Library/Code haben Sie für das erste Versuch im dieser Beitrag genutzt?

    Vielen Dank vorab

    1. Hallo Mahdi,

      ich habe die in der Arduino IDE mitgelieferte SoftwareSerial.h Library genutzt, denn das RS485 Modul wie ein serielles Gerät angesteuert. Der Unterschied ist, dass nur während Daten gesendet werden sollen, der Serial TX Control Pin auf HIGH gesetzt werden muss bzw. darf. Daher auch nochmal die Verkabelung prüfen sonst sendet das Modul nichts. Ich habe den Beitrag neu strukturiert und den Sketch (lag vorher im Downloadbereich) direkt in den Beitrag eingebaut. Dieser lässt sich eigentlich einfach auf einen Sender und Empfänger umbauen.

      Probiere einfach nochmal aus und melde dich wenn es nicht klappt.

      Viele Grüße
      Stefan

  2. Hi Nikolaus,

    Vielen Dank für deine Antwort. Ich hate auch Software Serial probiert, aber wüsste “Serial TX Control Pin auf HIGH” nicht. Ich werde das auch probiren. Meinst du die Hardware Serial TX (z.B. Pin 1 oder TX0 im Arduino Mega), oder das neu Software Serial Pin, dass ich definiert werden?

    Viele Grüße
    Mahdi

    1. Hallo Mahdi,

      ja, du benötigst nur die SoftwareSerial.h Library. Die Verkabelung sieht, egal ob Sender oder Empfänger, wenn du mein Beispiel nutzt wie folgt aus

      Pin 10 (Arduino Software Serial RX) auf RO (RS485 Modul TX)
      Pin 11 (Arduino Software Serial TX) auf DI (RS485 Modul RX)
      Pin 3 auf DE und RE

      Du könntest natürlich auch andere Pins nehmen, musst dann aber die Variablen im Beispiel anpassen. Der Sketch ist bis void loop() für Sender und Empfänger identisch.

      Viele Grüße
      Stefan

  3. Hallo,
    Vielen Dank für das gute Beispiel! Was mir bisher noch fehlt, ist eine ack Funktion, die sicher stellt, dass das datenpaket auch korrekt und komplett empfangen wurde.
    Hast du dazu eine Lösung? Also könnte man Loxone dazu bringen, das Paket einfach komplett wieder zurück zu senden? Dann könnte man mit dem Arduino prüfen, ob versendetes und empfangenes Paket identisch sind.
    Vielen Dank für deine Hilfe,

    Kduino

    1. Hallo “Kduino”,

      im Loxone Miniserver gibt es scheinbar eine Möglichkeit für eine Ack Funktion. Ich habe damit aber noch nicht gearbeitet.

      Wenn du auf die RS485 Extension klickst, kannst du dort für jeden empfangenen Block eine positive oder negative Bestätigung senden. Was das genau bedeutet ist leider nicht dokumentiert.

      Ich hoffe ich konnte dir mit den Infos ein wenig weiterhelfen?!

      Viele Grüße
      Stefan

  4. Hallo,
    Ich bin schon seit einiger Zeit am Probieren eine Verbindung zwischen einem Arduino Mega und meiner Loxone aufzubauen. Leider funkt das nicht! Ich sehe weder am RS485 Monitor in der Config etwas, noch schaffe ich es am Arduino etwas zu empfangen. Muss man in der Config noch etwas spezielles einstellen? Ich habe ein Oszilloskop an der Verbindung angeschlossen und sehe, dass der Arduino bzw. die Loxone Extension etwas ausgeben aber…
    Ev. könnten Sie mir die Einstellungen mailen?

    MfG
    Georg

    1. Hallo Georg,

      eigentlich sollte das mit der Standard Einstellung 9600/8/N/1 im Loxone Miniserver und mit dem Sketch ohne Probleme funktionieren. Bist du dir ganz sicher, dass du keinen Fehler in der Verkabelung hast? Sind A an A und B an B angeschlossen? Das Arduino Modul identisch zu dem im Beitrag und auch richtig verkabelt? Hast du die Möglichkeit das Ganze mit zwei Arduinos zu testen?

      Viele Grüße
      Stefan

  5. Hallo,

    Funktioniert es mittlerweile Temperatur und feuchte Daten zu senden? Könnten man I2C Module einbinden?

    Vielen Dank.

    1. Hallo Daniel,

      du könntest über RS485 auch Daten von einem Sensor mit I2C versenden oder einen Aktor mit I2C darüber steuern, dafür hatte ich mich ursprünglich sogar mit dem Thema beschäftigt. Ich bin dann aber auf das I2C WLAN Modul (https://www.nikolaus-lueneburg.de/2018/10/i2c-wlan-modul-finale-version) umgestiegen.

      Für Analogwerte gibt es viele Möglichkeiten, eine relativ einfache Lösung ist, dass du bei Temperaturen (Beispiel Temperatur -12,4 °C) den Wert + 100 * 10 rechnen kannst und dann auf der “anderen Seite” wieder den Wert 876 / 10 – 100 wieder zurückrechnest, schon hast du die -12,4 wieder. Das sollte auf jedem System klappen, es darf halt nur eine Nachkommastelle geben oder es muss der Faktor entsprechend angepasst werden. Es gibt noch viele andere Möglichkeiten, hier werden aber einfach nur Integer Werte verwendet.

      Viele Grüße
      Stefan

Schreibe einen Kommentar

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