Ankündigung

Einklappen
Keine Ankündigung bisher.

ARDUINO am KNX

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

  • Mag Gyver
    antwortet
    Hallo gkamp,

    in der von dir benützten Library gibt es auch ein Ordner "Examples".
    In diesen o.g. Ordner befindet sich u.a. auch das Beispiel "GroupRead.ino".

    Bezüglich der Anwendung bei einem originalen Arduino Uno R3 gibt es ein paar Dinge zu beachten, die in diesem Beispiel aufgeführt werden.

    Code:
    // File: GroupRead.ino
    // Author: Mag Gyver (Since 2015) 
    // Modified: Thorsten Gehrig (Since 2015)
    
    // Test constellation = ARDUINO UNO <-> 5WG1 117-2AB12
    
    /*
    -> During programming, the BCU may have no connection to the ARDUINO UNO.
    -> After programming for communication with the BCU. Connect the jumpers ICSP1 PIN 5 and ICSP1 PIN 6 together, tested only with ARDUINO UNO revision 3.
    -> For programming the jumper ICSP1 PIN 5 and ICSP1 PIN 6 must be not connected together and the voltage must be taken away for a short time. Then, you can transfer the new "sketch".
    */

    Mit freundlichen Grüßen

    Mag Gyver

    Einen Kommentar schreiben:


  • gkamp
    antwortet
    Ich verwende die Lib von Thorsten Gehrig:

    https://bitbucket.org/thorstengehrig...knx-user-forum

    Habe auch gerade nochmal geschaut, ist die aktuelle Version. PN habe ich geschickt

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    Ich wollte oben nur einen Tippfehler ausschließen.
    Ja, Mini Pro 8Mhz geht einwandfrei. Ca. 300-400 Werte vom Bus pro Tag ohne Fehler.
    Ich denke dann ist deine Lib das Problem. Welche Version verwendest Du ?
    Schick mir per PN eine Mailadresse, dann schicke ich dir meine Lib zu.

    Einen Kommentar schreiben:


  • gkamp
    antwortet
    Könnte es evtl. sonst eine Beschränkung oder ein Filter busseitig sein? Sind aktuell erfolgreich Pro Minis oder Unos im Einsatz, die die Datenpakete empfangen und darauf reagieren?

    Einen Kommentar schreiben:


  • Eugenius
    antwortet
    nur zur Info: serialEvent() ist das gleiche wie

    Code:
    void loop(){
      if (Serial.available()>0){
         ...
      }
    }
    https://github.com/arduino/Arduino/b...o/main.cpp#L47
    https://github.com/arduino/Arduino/b...Serial.cpp#L66

    Einen Kommentar schreiben:


  • gkamp
    antwortet
    Hallo.

    Die Logik im "SerialEvent" hatte ich auch getestet. Habe auch die Bedingung "if (telegram->getCommand() == KNX_COMMAND_READ)" auskommentiert.

    Leider reagiert der Arduino oder die LED darauf nicht. Woran könnte es sonst liegen? Hoffe es gibt noch Ideen!

    Viele Grüße,
    Flo

    Einen Kommentar schreiben:


  • WagoKlemme
    antwortet
    Probiers mal so:
    Code:
    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_READ) { 
     if (target == "6/1/1") {         test = telegram->getBool();         digitalWrite(led, HIGH); ]

    Einen Kommentar schreiben:


  • gkamp
    antwortet
    Hallo zusammen.

    Ich habe es tatsächlich geschafft und habe alle 68 Seiten gelesen. Danach habe ich versucht die Beispiele mit den Arduinos, die ich hier habe, zu testen. Ich habe sowohl mehrere Pro Minis als auch Unos. Das Schreiben auf den Bus läuft absolut problemlos. Ich habe allerdings das Problem, dass die Beispiele zum Empfangen bei mir auf keinem Arduino laufen. Ich habe das Beispiel für den UNO von @MacGyver von Post 685 getestet:

    Code:
    #include <KnxTpUart.h>
    
    KnxTpUart knx(&Serial, "1.0.15");
    
    boolean test;
    int led = 13;
    
    void setup() {
      Serial.begin(19200);
      pinMode(led, OUTPUT);     
      UCSR0C = UCSR0C | B00100000;
      knx.uartReset();
      knx.addListenGroupAddress("6/1/1");
    }
    
    void loop() {
      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_WRITE) {
          if (target == "6/1/1") {
            test = telegram->getBool();
            digitalWrite(led, HIGH); 
          }
        }
      }
    }
    Am Arduino (hier am Uno) hängen "nur" 4 Anschlüsse: GND, VCC, TX und RX vom Siemens Busankoppler. Der USB-Anschluß wird nur für die Programmierung verwendet und danach wieder abgesteckt, Arduino resettet und getestet...

    Leider scheint der Arduino nicht zu reagieren, wenn die GA (hier die "6/1/1") geändert wird (also hier die LED schalten). Wie geschrieben, Schreiben funktioniert. Ich habe unzählige Tests und Änderungen probiert und habe nun keine Idee mehr. Hat jemand von Euch einen Tipp? Ich bin kurz vor dem Verzweifeln.

    Viele Grüße,
    Flo

    Einen Kommentar schreiben:


  • emax
    antwortet
    Zitat von Peterich Beitrag anzeigen
    Busankoppler ist weiterhin der von der Ersten startseite der von Siemens.
    ...
    Herzlichen Dank! Das erspart eine Lesemarathon :-)

    Hätte schon eher geantwortet, hatte aber leider keine Nachricht über Antworten.




    Einen Kommentar schreiben:


  • Peterich
    antwortet
    Zitat von tuxedo Beitrag anzeigen
    Peterich


    Wo hängt's denn? Können wir irgendwo helfen? Bitte dann aber im KONNEKTING Sub-Forum, damit der Thread hier nicht unnötig gekapert wird.
    Werde ich noch tun. Nur hab ich im Moment sowenig Zeit ;D
    Mein erstes Projekt wird wohl mein RFID Leser sein ich hatte auch schon jemand angefragt bezüglich dee konnekting Hardware aber es hängt alles an der zeit ;/ aber danke schonmal das du gefragt hast
    Kommt Zeit. Kommen Beiträge ;D

    Einen Kommentar schreiben:


  • tuxedo
    antwortet
    Peterich

    Ich hab auch angefangen mich etwas in Konnekting einzuarbeiten aber bin nicht so ganz warm geworden wobei es mir besser gefallen würde mit dem Configuieren vom bus aus
    Wo hängt's denn? Können wir irgendwo helfen? Bitte dann aber im KONNEKTING Sub-Forum, damit der Thread hier nicht unnötig gekapert wird.

    Einen Kommentar schreiben:


  • tuxedo
    antwortet
    Eugenius

    Einen Kommentar schreiben:


  • Eugenius
    antwortet
    Noch eine Variante, mit verständlichen Daten
    Code:
    #ifdef __AVR_ATmega32U4__ //Universal Flush Interface, ProMicro, Leonardo
     #define DEBUGSERIAL Serial      //USB #define KNX_SERIAL Serial1      //D0,D1 //#define LED_PIN 13              //UFI STD, Aruino Leonardo //#define LED_PIN 8               //UFI PWM #define LED_PIN LED_BUILTIN_RX  //ProMicro (Attention: LOW = ON, HIGH = OFF) #elif __SAMD21G18A__            //Multi Interface, Arduino Zero #define DEBUGSERIAL SerialUSB   //USB //#define KNX_SERIAL Serial       //Multi Interface  #define KNX_SERIAL Serial1      //D0,D1 //#define LED_PIN A5              //Multi Interface #define LED_PIN LED_BUILTIN     //Zero #endif
    
    #define KNX_TELEGRAM_MAX_SIZE 23
    
    
    long lastMicros = 0;
    bool dataReceived = false;
    byte telegram[KNX_TELEGRAM_MAX_SIZE];
    byte counter = 0;
    
    void setup() {
        KNX_SERIAL.begin(19200,SERIAL_8E1);
        DEBUGSERIAL.begin(115200);
        pinMode(LED_PIN,OUTPUT);
        clearBuffer();
    }
    
    void loop() {
        if(KNX_SERIAL.available()>0){
            lastMicros = (long)micros();
            byte temp = KNX_SERIAL.read();
    //        if(temp<16) DEBUGSERIAL.print("0"); //print 0 for 2 digit HEX
    //        DEBUGSERIAL.print(temp,HEX);
    //        DEBUGSERIAL.print(" ");
            telegram[counter] = temp;
            counter++;
            if(!dataReceived){
                dataReceived = true;
                digitalWrite(LED_PIN,HIGH); //LED is ON is data is received
            }
        }
        if((long)micros() - lastMicros >= 2000 && dataReceived){
            //2000+ µs => end of telegram => new line
    //        DEBUGSERIAL.println("");
            dataReceived = false;
            //print usable array data
            for (byte i = 0; i < counter;i++){
                if(telegram[i]<16) DEBUGSERIAL.print("0"); //print 0 for 2 digit HEX
                DEBUGSERIAL.print(telegram[i],HEX);
                DEBUGSERIAL.print(" ");
            }
            DEBUGSERIAL.println("");
            printData();
            counter = 0;
            clearBuffer();
            digitalWrite(LED_PIN,LOW); //turn LED off
    
        }
    }
    
    void clearBuffer(){
        memset(telegram,0,sizeof(telegram));
    }
    
    void printData(){
      byte temp = telegram[1];
      byte pa1 = telegram[1] >> 4;
      byte pa2 = telegram[1] & B00001111;
      byte ga1 = telegram[3] >> 3;
      byte ga2 = telegram[3] & B00000111;
      byte datalength = telegram[5] & B00001111;
      byte firstDateByte = telegram[7] & B00111111; //use only last 6 bits
      DEBUGSERIAL.print("PA: ");
      DEBUGSERIAL.print(pa1,DEC);
      DEBUGSERIAL.print(".");
      DEBUGSERIAL.print(pa2,DEC);
      DEBUGSERIAL.print(".");
      DEBUGSERIAL.print(telegram[2],DEC);
      DEBUGSERIAL.print(" GA: ");
      DEBUGSERIAL.print(ga1,DEC);
      DEBUGSERIAL.print("/");
      DEBUGSERIAL.print(ga2,DEC);
      DEBUGSERIAL.print("/");
      DEBUGSERIAL.print(telegram[4],DEC);
      DEBUGSERIAL.print(" Data length (bytes): ");
      if(datalength == 1){
          DEBUGSERIAL.print(datalength,DEC); //if 1 then usable data max 6 bits, DPT 1.xxx, DPT 2.xxx, DPT 3.xxx, DPT 23.xxx ...
      }else{
          DEBUGSERIAL.print(datalength-1,DEC); //ignore first byte because data doesn't fit in 6 bits
      }
      DEBUGSERIAL.print(" Data (HEX): ");
      if(datalength == 1){
          if(firstDateByte < 16) DEBUGSERIAL.print("0"); //print 0 for 2 digit HEX
          DEBUGSERIAL.print(firstDateByte,HEX);
          DEBUGSERIAL.print(" ");
      }
      for(byte i = 1;i < datalength;i++){
          if(telegram[7+i]<16) DEBUGSERIAL.print("0"); //print 0 for 2 digit HEX
          DEBUGSERIAL.print(telegram[7+i],HEX);
          DEBUGSERIAL.print(" ");
      }
    
      DEBUGSERIAL.println();
    }
    Ausgabe:
    Code:
    BC 11 DD 3F 02 E3 00 81 14 FD 39
    PA: 1.1.221 GA: 7/7/2 Data length (bytes): 2 Data (HEX): 14 FD
    BC 11 FC 2F FE E1 00 81 1F
    PA: 1.1.252 GA: 5/7/254 Data length (bytes): 1 Data (HEX): 01
    Zuletzt geändert von Eugenius; 09.10.2017, 21:35.

    Einen Kommentar schreiben:


  • Eugenius
    antwortet
    Zitat von Mag Gyver Beitrag anzeigen
    Nun, wie sieht denn deine Art Busmonitor für Daten im RAW-Format nun aus, bist du da schon weitergekommen?
    Die Anregung geistert mir auch schon eine Weile im Kopf herum. Habe diesbezüglich schon mal einen Ansatz unternommen, ist jedoch sehr Alpha. Basiert auf der Library von ThortenGehrig.

    Habe die Library von ThorstenGehrig und die optimierte Version angepasst.

    Danke auch dir Eugenius.

    Hi, du wirst nicht glauben, aber ich habe doch was geschafft, ohne überhaupt eine Lib zu nutzen:
    Code:
    #ifdef __AVR_ATmega32U4__       //Universal Flush Interface, ProMicro, Leonardo
    #define DEBUGSERIAL Serial      //USB
    #define KNX_SERIAL Serial1      //D0,D1
    //#define LED_PIN 13              //UFI STD, Aruino Leonardo
    //#define LED_PIN 8               //UFI PWM
    #define LED_PIN LED_BUILTIN_RX  //ProMicro (Attention: LOW = ON, HIGH = OFF)
    #elif __SAMD21G18A__            //Multi Interface, Arduino Zero
    #define DEBUGSERIAL SerialUSB   //USB
    //#define KNX_SERIAL Serial       //Multi Interface 
    #define KNX_SERIAL Serial1      //D0,D1
    //#define LED_PIN A5              //Multi Interface
    #define LED_PIN LED_BUILTIN     //Zero
    #endif
    
    long lastMicros = 0;
    bool dataReceived = false;
    
    void setup() {
        KNX_SERIAL.begin(19200,SERIAL_8E1);
        DEBUGSERIAL.begin(115200);
        pinMode(LED_PIN,OUTPUT);
    }
    
    void loop() {
        if(KNX_SERIAL.available()>0){
            lastMicros = (long)micros();
            byte temp = KNX_SERIAL.read();
            if(temp<16) DEBUGSERIAL.print("0"); //print 0 for 2 digit HEX
            DEBUGSERIAL.print(temp,HEX);
            DEBUGSERIAL.print(" ");
            if(!dataReceived){
                dataReceived = true;
                digitalWrite(LED_PIN,HIGH); //LED is ON is data is received
            }
        }
        if((long)micros() - lastMicros >= 2000 && dataReceived){
            //2000+ µs => end of telegram => new line
            DEBUGSERIAL.println("");
            dataReceived = false;
            digitalWrite(LED_PIN,LOW); //turn LED off
        }
    }
    Die Ausgabe sieht dann so aus:
    Code:
    BC 11 CA 09 64 E1 00 81 95 
    BC 11 03 0A 64 E1 00 81 5F 
    BC 11 CA 09 64 E1 00 80 94 
    BC 11 03 0A 64 E1 00 80 5E

    Einen Kommentar schreiben:


  • Eugenius
    antwortet
    Allgemein, (ich weiß zwar nicht ob Thorstens Lib schon mit SAMD21 = Arduino Zero gestestet wurde) funktioniert KONNEKTING Hardware auch mit der Thorstens lib.
    Z.B.: Universal UP Schnittstelle oder die von Masifi angesprochene Dev-Boards

    Einen Kommentar schreiben:

Lädt...
X