Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

  • dreamy1
    antwortet
    Den Pro Mini direkt am Busankoppler ohne externe Spannungsversorgung?

    Dann liegts definitiv am Code.

    Einen Kommentar schreiben:


  • pio007
    antwortet
    auch noch mit einem Pro Mini probiert! Das gibts doch nicht, das ich nix empfangen kann....

    Einen Kommentar schreiben:


  • pio007
    antwortet
    Der Mega2560 sollte das Problem eigentlich nicht haben, da der verwendete Port nicht doppelt belegt ist. Das liegt ziemlich sicher am Code oder dem nachfolgenden aber:
    So, getestet mit dem originalen Mega 2506: gleiches Problem: funken geht, empfangen nicht.... zum k....

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Zitat von pio007 Beitrag anzeigen
    Hab hier noch einige Pro MICRO rumliegen. Hab die das Problem auch, weißt Du das zufällig?
    Da gibts wieder die Unterscheidung ob Original oder Nachbau, also genaues Schaltbild...wenn es das Original mit dem 32U4 ist, sollte der RX/TX Port nicht blockiert sein.

    Einen Kommentar schreiben:


  • pio007
    antwortet
    Habe ich doch oben erläutert.​
    Sorry überlesen...
    Werde mal alle Varianten probieren: Mega, auslöten und pro Mini.
    Hab hier noch einige Pro MICRO rumliegen. Hab die das Problem auch, weißt Du das zufällig?
    Danke und Grüße
    Marc

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Zitat von pio007 Beitrag anzeigen
    Was wäre der "Hardwareeingriff"
    Habe ich doch oben erläutert.

    Der Mega2560 sollte das Problem eigentlich nicht haben, da der verwendete Port nicht doppelt belegt ist. Das liegt ziemlich sicher am Code oder dem nachfolgenden aber:

    ABER:
    Ihr denkt hoffentlich daran, dass da eine galvanische Trennung der seriellen Schnittstelle zum Busankoppler notwendig ist, wenn das Arduino-Board extern mit Energie versorgt wird (was beim Nano und Mega notwendig sein dürfte)? Ansonsten zieht Ihr den ganzen KNX-Bus einseitig auf das GND-Potential der USB-Schnittstelle bzw. des Netzteils, was a) nicht zulässig ist und b) schöne Effekte mit Masseschleifen gibt, die ebenfalls die Kommunikation beeinträchtigen kann.
    Suchwort: ADUM1201

    Einen Kommentar schreiben:


  • pio007
    antwortet
    Mit dem nano hatte ich auch gelesen. Hatte vorher Nachbau, deswegen extra einen Originalen gekauft....
    Wie sieht es beim Mega 2506 aus?
    Was wäre der "Hardwareeingriff"? Habe mir bereits eine Platine erstellt, welche auf den Nano ausgelegt ist...
    Vielen Dank und Grüße Marc

    Einen Kommentar schreiben:


  • dreamy1
    antwortet
    Zitat von pio007 Beitrag anzeigen
    Bin auch ratlos.... Original Arduino nano
    Das Problem ist der Nano. Da sind intern die RX/TX-Pins des Atmega mit dem FTDI verbunden. Senden über KNX geht weil der FTDI nur lauscht, Empfangen nur mit Hardwareeingriff*, da der FTDI den RX am Atmega blockt.

    Wenn Du statt dem Nano einen Pro Mini (mit externem FTDI zum Programmieren) verwendest, wird es funktionieren.

    *) Wenn Du den Widerstand RP1A (1k) entfernst, ist das Blockieren aufgehoben, allerdings auch keine Programmierung mehr möglich.
    Zuletzt geändert von dreamy1; 06.12.2023, 23:36.

    Einen Kommentar schreiben:


  • Flole
    antwortet
    Hast du mal ein paar mehr Ausgaben eingefügt um zu schauen wo es hängt?
    Zuletzt geändert von Flole; 07.12.2023, 16:50.

    Einen Kommentar schreiben:


  • pio007
    antwortet
    Ich schalte mich mal hier mit ein. Bei mir gleiches Problem. Habe ein Skript laufen, welches problemlos vom Arduino Daten auf den Bus schreibt. Also Kommunikation klappt einwandfrei.
    Möchte aber auch das ganze umgekehrt.#
    Habe das Beispielskript etwas angepasst (siehe unten) aber bekomme einfach keine Verbindung vom Bus /ETS zum Arduino. Es sollte eigentlich bei Adress 3/4/152 die eingebaute LED angehen, aber nix....
    Bin auch ratlos.... Original Arduino nano


    Code:
    include <KnxTpUart.h>
    KnxTpUart knx(&Serial, "1.1.38");
    
    int target_3_4_152;
    int target_3_4_151;
    void setup() {
    pinMode(LED_BUILTIN, OUTPUT);
    Serial.begin(19200, SERIAL_8E1);
    knx.uartReset();
    knx.addListenGroupAddress("3/4/152");
    knx.addListenGroupAddress("3/4/151");
    
    delay(1000);
    
    knx.groupRead("3/4/152");
    knx.groupRead("3/4/151");
    }
    void loop() {
    }
    void serialEvent() {
    
    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_ANSWER) {
    
    if (target == "3/4/152") {
    target_3_4_152 = telegram->getBool();
    
    if (target_3_4_152) {
    digitalWrite(LED_BUILTIN, HIGH);
    }
    else {
    digitalWrite(LED_BUILTIN,LOW);
    }
    
    }
    else if (target == "3/4/151") {
    target_3_4_151 = telegram->get1ByteIntValue();
    }}}}​​

    Einen Kommentar schreiben:


  • Flole
    antwortet
    Vergiss was ich zu dem Strings gesagt hab, ich war gedanklich bei einer anderen Art von Strings. Nicht besonders performant ist das ganze so dennoch, daher bietet es sich an die Werte als Zahlen zu vergleichen, also im Prinzip sowas wie
    HTML-Code:
    if(getTargetMainGroup() == NITRAT_MAINGROUP && getTarget.....
    ​​​​​Wenn du dir den Speicherverbrauch der beiden Versionen anschaust und mal vergleichst siehst du was ich meine Bei einem Mega vielleicht nicht unbedingt ein Problem, aber lieber gleich richtig lernen als später überall die riesen Arduino Mega verbauen zu müssen weil der Code so riesig wird. Die library ist da zugegeben etwas blöd geschrieben, die Version die ich nutze habe ich mal so verändert, dass sie gar keine Strings mehr nutzt.

    Bist du dir sicher, dass die group address oben beim define mit Punkten getrennt werden muss? Versuch es doch mal mit Schrägstrichen.

    Einen Kommentar schreiben:


  • seba1997
    antwortet
    Danke schonmal für deine Antwort Flole.

    Was genau meinst du damit, dass ich Strings auf eine Art und Weise vergleiche, wie man es nicht kann?
    Den Teil mit den Strings (Main/Middle/Sub Group) braucht man angeblich immer genau so für das Auslesen von Telegrammen. So steht es in der Bibliothek und ich habe es auch bei zahlreichen anderen Usern im Internet genau so 1:1 gesehen.

    Ich hatte schon mehrere Serial.prints zum debuggen eingebaut, jedoch ist generell nie etwas angekommen. Ich hatte z.B. folgende Zeile eingebaut:

    Code:
    void maintainKnxSerial() {
      if (Serial1.available() > 0) {
        Serial.print("Serial available");
    // Rest des Codes​
    Ich habe trotzdem in der IDE nichts zurück bekommen, wenn ich im KNX System einen Wert auf der besagten Gruppenadresse geschrieben habe. Daher schien es mir eher ein grundlegendes Problem bei der Kommunikation zu sein, weshalb ich mich an euch hier im Forum gewendet habe....

    Einen Kommentar schreiben:


  • Flole
    antwortet
    Zum einen vergleichst du Strings auf eine Art und Weise wie man keine Strings vergleichen kann, und zum anderen kannst du mit mehr Ausgaben den Fehler auch selber finden, du schaust dadurch einfach wie weit du im Code kommst. Also kommt was an der seriellen Schnittstelle an? Ist es das erwartete Telegram/Command? Wenn nicht, was ist es dann?

    Noch ein Tipp aus der Praxis: Versuch auf Strings zu verzichten wo es geht. Insbesondere wenn du eigentlich Zahlen vergleichen willst.

    Einen Kommentar schreiben:


  • seba1997
    antwortet
    Hallo zusammen,

    Ich versuche mich gerade daran, einen Arduino (Mega) in ein KNX System zu integrieren.
    Daten vom Arduino ins KNX System zu senden habe ich bereits hinbekommen, die Hardware Verbindung scheint also in Ordnung zu sein.
    Probleme macht mir aktuell nur das Empfangen/Auswerten/Weiterverarbeiten von Daten vom KNX System auf dem Arduino.

    Ich würde gerne Daten von bestimmten Gruppenadressen auf dem Arduino als Variablen abspeichern bzw. diese für weitere Logiken nutzen. Eigentlich habe ich den Code für das Empfangen/Weiterverarbeiten der Daten aus der verwendeten Bibliothek (gefühlt) korrekt implementiert, da diverse andere User im Internet es genauso gemacht haben, allerdings bekomme ich die Daten trotzdem nicht mit dem Arduino ausgelesen.
    Das ganze soll später noch deutlich komplexer werden, da ich aktuell aber das Empfangen/Weiterverarbeiten noch nicht korrekt hinbekomme, hier erstmal mein aktueller einfacher Beispielcode:

    Code:
    #include <KnxTpUart.h>
    #define Physical_Adress "1.1.25"
    #define Nitrat_Group_Adress "1.1.21"
    
    KnxTpUart knx(&Serial1, Physical_Adress);
    void setup() {
    Serial.begin(9600);
    Serial1.begin(19200, SERIAL_8E1);
    knx.uartReset();
    knx.addListenGroupAddress(Nitrat_Group_Adress); // Nitrat Gruppenadresse
    }
    float Nitrat_Value = 0;
    
    void Nitrat_Value_Evaluation () {
    if (Nitrat_Value > 0) Serial.print("Wert Empfangen");
    }
    void loop() {
    maintainKnxSerial();
    Nitrat_Value_Evaluation();
    }
    void maintainKnxSerial() {
    if (Serial1.available() > 0) {
    KnxTpUartSerialEventType eType = knx.serialEvent();
    if (eType == KNX_TELEGRAM) {
    KnxTelegram* telegram = knx.getReceivedTelegram();
    // Create the KNX String Address in the "0/0/0" format
    String target =
    String(0 + telegram->getTargetMainGroup()) + "/" +
    String(0 + telegram->getTargetMiddleGroup()) + "/" +
    String(0 + telegram->getTargetSubGroup());
    // Check what has been sent on KNX and write it into variables/arrays
    if (telegram->getCommand() == KNX_COMMAND_WRITE) {
    if (target == Nitrat_Group_Adress) {
    Nitrat_Value = telegram->get2ByteFloatValue();
    }
    }
    }
    }
    }​

    Wenn ich dann im KNX System einen Wert auf der Gruppenadresse für den Nitrat-Wert schreibe, tut sich jedoch nichts und ich bin ratlos, wo der Fehler liegt.

    Über jede Hilfe wäre ich sehr dankbar!

    Grüße, Sebastian
    Zuletzt geändert von seba1997; 06.12.2023, 12:46.

    Einen Kommentar schreiben:


  • Flole
    antwortet
    Was für einen Arduino nutzt du? Hast du die Optimierung schon auf höchste Geschwindigkeit gestellt?

    Eventuell kann man mit Interrupts das ganze noch verbessern.

    Einen Kommentar schreiben:

Lädt...
X