Ankündigung

Einklappen
Keine Ankündigung bisher.

Siemens Busankoppler/Microcontroller- Probleme bei Empfang. Senden funktioniert

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Siemens Busankoppler/Microcontroller- Probleme bei Empfang. Senden funktioniert

    Hallo allerseits,

    seit ein paar Tagen ärgere ich mich mit einem Siemens Busankoppler (5WG1117-2AB12) und 2 verschiedenen Microcontrollern herum. Mein Ziel ist es, zur Belüftungssteuerung drei Servomotoren anzusteuern. Gerne auch mit ein paar kleineren Berechnungen im Microcontroller selbst. Dies ist jedoch nicht mein Problem.

    Mein Problem besteht darin, Telegramme zu empfangen. Das Senden funktioniert einwandfrei. Ich verwende dazu das "KnxTpUart" von Throsten Gehrig in der Arudino API unter Linux. Als Microcontroller habe ich zum Testen den Seeeduino Xiao mit Logiklevelconverter (TXS0108E), bzw. einen Arduino Nano Clon von Elegoo ohne Logiklevelconverter. Als Grundlage habe ich mich am Video und an der Beschreibung von Matthias Kleine, bzw. seinem Blog "haus-automatisierung.com" orientiert.

    Letzteren Microcontroller hatte ich eigentlich nur verwendet, um auszuschließen, dass das Problem am Logiklevelconverter liegt. Jedoch funktioniert das Senden ja auf beiden Geräten einwandfrei.

    Folgender Sketch funktioniert auf dem Seeeduino Xiao bzgl Senden:
    Code:
    #include <Arduino.h>
    #include <KnxTpUart.h>
    #include <Servo.h>
    
    #define PHYSICAL_ADDRESS "1.0.61"
    #define INPUT_GROUP_ADDRESS "20/2/0"
    #define SERVOPIN 1
    #define LED_OFF HIGH
    #define LED_ON LOW
    
    KnxTpUart knx(&Serial1, PHYSICAL_ADDRESS);
    Servo myservo;//create servo object to control a servo
    int pos = 90;//variable to store the servo position
    int led = LED_BUILTIN;
    
    void setup() {
      //Serial.begin(115200);
      // Start the hardware serial for USB communication
      Serial1.begin(19200, SERIAL_8E1);
      //while (!Serial);
      while (!Serial1);
      knx.uartReset();
      myservo.attach(SERVOPIN); //attaches the servo on pin 1 to the servo object
      pinMode(led, OUTPUT);
    }
    
    void loop() {
      knx.groupWriteBool("20/2/1", true);
      //myservo.write(90);
      digitalWrite(led, LED_ON);
      //Serial.println("Test");
      delay(3000);
      knx.groupWriteBool("20/2/1", false);  
      //myservo.write(180);
      digitalWrite(led, LED_OFF);
      //Serial.println("Test2");
      delay(3000);
    }​

    Folgendes funktioniert auf dem Arduino Nano Clon im Bereich Senden:
    Code:
    #include <Arduino.h>
    #include <KnxTpUart.h>
    #include <Servo.h>
    
    #define PHYSICAL_ADDRESS "1.0.61"
    #define INPUT_GROUP_ADDRESS "20/2/0"
    #define SERVOPIN 1
    #define LED_OFF HIGH
    #define LED_ON LOW
    
    KnxTpUart knx(&Serial, PHYSICAL_ADDRESS);
    //Servo myservo;//create servo object to control a servo
    int pos = 90;//variable to store the servo position
    int led = LED_BUILTIN;
    
    
    void setup() {
      Serial.begin(19200, SERIAL_8E1);
      //while (!Serial);
      knx.uartReset();
    //  myservo.attach(SERVOPIN); //attaches the servo on pin 1 to the servo object
      pinMode(led, OUTPUT);
    }
    
    void loop() {
      knx.groupWriteBool("20/2/1", true);
      //myservo.write(90);
      digitalWrite(led, LED_ON);
      delay(3000);
      knx.groupWriteBool("20/2/1", false);  
      //myservo.write(180);
      digitalWrite(led, LED_OFF);
      delay(3000);
    }​
    Und das funktioniert nicht was Empfang anbelangt am Xiao:
    Code:
    #include <Arduino.h>
    #include <KnxTpUart.h>
    #include <KnxTelegram.h>
    #include <Servo.h>
    
    #define PHYSICAL_ADDRESS "1.0.61"
    #define INPUT_GROUP_ADDRESS "20/2/0"
    #define OUTPUT_GROUP_ADDRESS "20/2/1"
    #define SERVOPIN 1
    #define LED_OFF HIGH
    #define LED_ON LOW
    #define REFRESH_INTERVAL 10000
    bool SERVOPOSITION = false;
    static unsigned long lastRefreshTime = 0;
    
    KnxTpUart knx(&Serial1, PHYSICAL_ADDRESS);
    Servo myservo; // create servo object to control a servo
    int pos = 90; // variable to store the servo position
    int led = LED_BUILTIN;
    
    void setup() {
      Serial.begin(115200); // USB
      Serial.println("Bla1");  
      Serial1.begin(19200, SERIAL_8E1); // Siemens seriell
      while (!Serial); // Warten auf USB
      Serial.println("Bla2");
      while (!Serial1); // Warten auf Siemens
      Serial.println("Bla3");
      knx.uartReset();
      Serial.println("Bla4");
      knx.addListenGroupAddress(INPUT_GROUP_ADDRESS);
      Serial.println("Bla5");
    //  delay(1000);
      Serial.println("Bla6");
      myservo.attach(SERVOPIN); // attaches the servo on pin 1 to the servo object
      pinMode(led, OUTPUT);
      digitalWrite(led, LED_OFF);
      Serial.println("Setup done");
    }
    
    void maintainKnxSerial() {
      if (Serial1.available() > 0) {  
        KnxTpUartSerialEventType eType = knx.serialEvent();
        if (eType == KNX_TELEGRAM) {
          Serial.println("Telegramm empfangen");
          KnxTelegram* telegram = knx.getReceivedTelegram();
    
          String target =
            String(0 + telegram->getTargetMainGroup()) + "/" +
            String(0 + telegram->getTargetMiddleGroup()) + "/" +
            String(0 + telegram->getTargetSubGroup());
            
          Serial.print("Zieladresse: ");
          Serial.println(target);
    
          if (telegram->getCommand() == KNX_COMMAND_READ) {
            Serial.println("Leseanforderung erhalten");
            // Antwort auf Leseanforderung
            if (target == OUTPUT_GROUP_ADDRESS) {
              knx.groupAnswerBool(OUTPUT_GROUP_ADDRESS, SERVOPOSITION);
            }
          } else if (telegram->getCommand() == KNX_COMMAND_WRITE) {
            Serial.println("Schreibanforderung erhalten");
            // Schreibanforderung
            if (target == INPUT_GROUP_ADDRESS) {
              if (telegram->getBool()) {
                Serial.println("Servo auf Position 90 setzen");
                SERVOPOSITION = true;
                myservo.write(90);
                digitalWrite(led, LED_ON);
              } else {
                Serial.println("Servo auf Position 180 setzen");
                SERVOPOSITION = false;
                myservo.write(180);
                digitalWrite(led, LED_OFF);
              }
            }
          }
        } else {
          Serial.print("Kein KNX-Telegramm, Event-Type: ");
          Serial.println(eType);
        }
      }
    }
    
    
    
    
    
    
    
    void loop() {
      maintainKnxSerial();
    //  serialEvent1();
    
     //Das funktioniert
        if (millis() - lastRefreshTime >= REFRESH_INTERVAL) {
        lastRefreshTime += REFRESH_INTERVAL;
        knx.groupWriteBool(OUTPUT_GROUP_ADDRESS, false);
      }
    
      
    }​
    Und jenes funktioniert nicht am Nano:
    Code:
    #include <Arduino.h>
    #include <KnxTpUart.h>
    
    #define PHYSICAL_ADDRESS "1.0.61"
    
    #define CO2_REFRESH_INTERVAL 10000
    
    #define CO2_PPM_GROUP_ADDRESS "20/5/5" //nur um die if schleife nicht zu verbeulen
    #define LED1_GROUP_ADDRESS "20/2/0"
    
    int LED1 = LED_BUILTIN;
    
    
    
    KnxTpUart knx(&Serial, PHYSICAL_ADDRESS);
    
    void setup() {
    
    
      // LED config
      pinMode(LED1, OUTPUT);
      digitalWrite(LED1, LOW);
    
    
      // KNX config
      Serial.begin(19200, SERIAL_8E1);
      knx.uartReset();
      knx.addListenGroupAddress(LED1_GROUP_ADDRESS);
    }
    
    
    
    void serialEvent() {
      if (Serial.available() > 0) {
        KnxTpUartSerialEventType eType = knx.serialEvent();
        if (eType == KNX_TELEGRAM) {
          KnxTelegram* telegram = knx.getReceivedTelegram();
    
          String target =
            String(0 + telegram->getTargetMainGroup()) + "/" +
            String(0 + telegram->getTargetMiddleGroup()) + "/" +
            String(0 + telegram->getTargetSubGroup());
    
          if (telegram->getCommand() == KNX_COMMAND_READ) {
            // Answer to Read
            if (target == CO2_PPM_GROUP_ADDRESS) {
              //knx.groupAnswer2ByteFloat(CO2_PPM_GROUP_ADDRESS, getCo2SensorPpm());
            }
          } else if (telegram->getCommand() == KNX_COMMAND_WRITE) {
            // Write commands
            if (target == LED1_GROUP_ADDRESS) {
              //digitalWrite(LED1, telegram->getBool() ? HIGH : LOW);
                knx.groupWriteBool("20/2/1", true);
            }
          }
        }
      }
    }
    
    
    
    void loop() {
     // maintainKnxSerial();
    }​
    Wenn ich das richtig ergoogled habe, kann der Xiao mit "void serialEvent()" nichts anfangen, der Nano aber schon. Der Xiao sollte "serial.available()" verwenden. Hätte ich das beim Nano enfernen sollen?

    Mir fehlen komplett die Anhaltspunkte, wo ich starten kann und erhoffe mir hier, dass jemand da schon häufiger mit herumexperimentiert hat und mir bei meinen Startschwierigkeiten helfen kann.

    Vielen Dank und schönen Abend!

    Gruß
    Georg


    EDIT: Ein paar auskommentierte Dinge aus den Code-Schnipseln entfernt, um die Lesbarkeit zu verbessern.
    Zuletzt geändert von FuLgOrE; 23.05.2024, 20:35.

    #2
    Dein Problem ist ziemlich ausgefallen… schon mal über Alternativen nachgedacht? Wäre ein ESP32 was für dich?

    Kommentar


      #3
      In wie fern würde mir der ESP32 helfen? Ich hätte da grundsätzlich nichts gegen, wundere mich nur, dass ich ein identisches Problem auf 2 verschiedenen Typen von Microcontrollern habe und mir der dritte Typ dann helfen könnte. Ich vermute mal, dass ich irgendwo einen Denkfehler habe.
      Gerne würde ich den KNX-Kram ohne zu viel Schnickschnack verwenden. Ich finde es zwar toll, wenn man die Dinge nachher mit der ETS parametrieren kann, das würde mir aber zu viel Einarbeitungszeit abverlangen. Das alleinige Senden von Telegrammen hilft mir natürlich nicht. Ich möchte zumindest Telegramme empfangen und auswerten können.

      Kommentar


        #4
        Hast du den Siemens Koppler mal direkt an den PC (mit Pegelwandler) angeklemmt? Kommen dann Daten an?

        Kommentar


          #5
          So, ich habe jetzt testweise den Siemens Koppler an einen FTDI TTL 232 Chip angeschlossen und mir mit Moserial den Output angesehen. Ja, es kommen Daten an.
          You do not have permission to view this gallery.
          This gallery has 1 photos.

          Kommentar


            #6
            Ich habe eben herausgefunden, dass es von Thorsten Gehrig einen Thread hier im Forum gibt und würde die Mods bitten, meine Themen dort hinein zu verschieben. Ich habe dort nun auch meine neuesten Erkenntnisse gepostet.
            Hier der Thread:
            https://knx-user-forum.de/forum/%C3%...-am-knx/page88

            Kommentar


              #7
              Lösung siehe https://knx-user-forum.de/forum/öffe...82#post1958082

              Kommentar

              Lädt...
              X