Ankündigung

Einklappen
Keine Ankündigung bisher.

Arduino Pro Micro und KNX geht nicht.. Nano geht, mini geht, aber Pro Micro nicht..?

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

    Arduino Pro Micro und KNX geht nicht.. Nano geht, mini geht, aber Pro Micro nicht..?

    ---------- Lösung im Post 5 ----------

    Hallo Zusammen

    Ich habe schon einige KNX-Arduino Projekte hinter mir aber ich krieg nur Arduino Nano und Mini sauber zum laufen. Pro Micro schaffe ich einfach nicht. Kommt nix an. Serial1.begin habe ich gemacht (statt serial.beg..)

    Trotzdem kein Erfolg.

    Ich benutze die Lib von Thorsten und habe seine Examples sowie meine eigenen scripts verwendet die einwandfrei funktionieren auf Mini/Nano.. Ich benutze den Siemens Bus Koppler.

    Hat jemand einen Tipp für mich?
    Ich habe Pro Micro clones. Verschiedene, aber keiner geht.

    Vielen Dank
    Raphael
    Zuletzt geändert von raphaelhuber; 15.01.2022, 10:57.

    #2
    Hallo

    Was hast du denn für einen ProMicro? Hast vielleicht mal einen Link dazu? Und als nächste Frage, was geht denn nicht?
    Vielleicht kannst du genaueres schreiben bzw. auch mal ein Teil Quelltext anhängen.

    Ich hatte bei den ersten ProMicro das Problem, dass sie sich nicht beschreiben lassen und vom PC nicht erkannt wurden. Diese gingen sofort wieder zurück.
    Die neue Sorte läuft unter Leonardo am Rechner wunderbar. Und alles andere funktionierte vom/zum KNX-Bus wie angegeben.
    Ich weiß ja nicht wo es bei dir genau hängt?

    Grüße

    Kommentar


      #3
      Hi Charls
      Vielen herzlichen Dank für Deine geduldige Antwort. Ich hätte wirklich mehr Infos liefern sollen.

      Ich habe verschiedene ProMicro Clones getestet, nur keinen originalen Sparkfun. Die einen haben den Prozessor diagonal, die anderen rechtwinklig auf das board, bei allen ist es gleich. Ich weiss nicht wie viele Clones es gibt, aber es sind halt so die, die man auf Amazon, AliExpress, Ebay kriegt. z.b. bei Makershop oder Eckstein.

      Das was nicht geht ist tatsächlich alles. Also nicht mal boolwrite Lampe ein aus, und schon gar nicht Empfang von Telegrammen.

      Heute habe ich noch mal den ganzen Tag rumprobiert und gegoogelt und schlussendlich kriegte ich schon mal den Versand von Telegrammen zum laufen, während der gleiche Sketch auf dem Mini auch empfängt.

      Was ich gemacht habe ist einen neuen Bootloader auf die ProMicros gebrannt. Ich verstehe nicht, warum dies nötig war, bzw. andere ProMicros einfach so verwenden konnten, aber naja.

      Ich habe den Bootloader mit dieser Anleitung gebrannt:
      https://schou.dk/linux/arduino/isp/
      Dazu musste ich aber ein Windowsgerät verwenden. Mit dem Mac, den ich sonst für alles verwende ging das Schreiben des Bootloaders nicht. Das schreiben der Sketches aber schon.

      Kommentar


        #4
        Genau wegen des Bootloaders gingen die anderen alle wieder zurück. Ich hab keine Lust das Teil erst umständlich zum laufen zu bekommen.

        Aber beschreiben lässt sich das Teil mit einem Programm? Was für ein Chip ist denn drauf, ein ATmega32u4 wie auf dem Bild?
        Hier mal ein Stück Code zum initialisieren...
        Der ProMicro hat ja zwei serielle Schnittstellen, einmal die USB und dann RX/TX als Pins. Also immer aufpassen bei "Serial" und "Serial1". Die "1" ist für den Siemens Busankoppler.

        Code:
        #include <KnxTpUart.h>
        
        KnxTpUart knx(&Serial1, "15.15.20");
        
        int LED = 9;
        
        void setup() {
        pinMode(LED, OUTPUT);
        digitalWrite(LED, LOW);
        
        Serial.begin(9600);
        Serial.println("TP-UART Test");
        
        Serial1.begin(19200, SERIAL_8E1);
        
        Serial.print("UCSR1A: ");
        Serial.println(UCSR1A, BIN);
        
        Serial.print("UCSR1B: ");
        Serial.println(UCSR1B, BIN);
        
        Serial.print("UCSR1C: ");
        Serial.println(UCSR1C, BIN);
        
        knx.uartReset();

        Kommentar


          #5
          So, ich melde mich noch mal zurück mit der Lösung für alles, falls irgendwer mal die gleichen Probleme hat.

          Also
          Arduino Pro Mini und Pro Micro gehen beide aber nicht mit den gleichen Programmen.

          Arduino Pro Mini kann man einfach kaufen und entsprechend verwenden.

          Pro Micros brauchen möglicherweise den normalen Bootloader für Leonardos, falls man nicht die SparkFun, sondern irgendeinen Klon hat. Den Bootloader konnte ich sehr einfach von einem WindowsPC aus via einem ArduinoUno brennen. Das geht, inklusive Verdrahtung des Unos nur ein paar Minuten. Hier die Anleitung dazu.
          https://schou.dk/linux/arduino/isp/
          Andere Anleitungen und Videos findet man mit den Stichworten: Arduino as ISP, burn bootloader. Mit meinem Mac habe ich es aber nicht geschafft.

          Im folgenden ein Testprogramm für das Senden UND Empfangen von KNX Telegrammen mit Micro / Mini. Am Anfang kann man zwei (Bool: ein/aus) Adressen definieren zum Empfangen und Senden. Zum Beispiel ein Licht und ein Lichtschalter.

          Einerseits wird das Licht zu blinken beginnen, andererseits kann man mit einem Lichtschalter die LED am Mini/Micro ein und ausschalten. So kann man sehr schnell testen, ob KNX Empfang und Senden funktioniert.

          Bezüglich Micro/Mini: Einfach am Anfang des scripts "IsMicro" auf "1" setzen, dann wird der script so hochgeladen, dass er für Micro stimmt. Und umgekehrt. Im script sieht man auch welche Teile des ganzen unterschiedlich sein müssen.

          Code:
          // Author: Daniel Kleine-Albers (Since 2012)
          // Modified: Thorsten Gehrig (Since 2014)
          // Modified: Mag Gyver (Since 2016)
          // Modified: Raphael Huber (2022)
          
          // Using the Siemans 5WG1 117-2AB12
          
          // This KNX send and receive example works for both Arduino Pro Micro and Pro Mini.
          // Since they use different microprocessors (ATmega32u4 / ATmega328),
          // and the mini has only one serial port they need to be treated differently.
          // This code will probably work with all other Arduinos in one way or the other.
          // The micro code will work with all Arduinos which have two serials,
          // but the LEDpin will certainly have to be changed.
          
          
          #define WriteAddress "1/1/32"
          #define ListenAddress "1/1/33"
          #define IsMicro 1  //set to 0 for Arduino pro Mini, 1 for Arduino pro Micro
          
          #include <KnxTpUart.h>
          
          // Initialize the KNX TP-UART library on the Serial1 port of ARDUINO MEGA
          // and with KNX physical address 15.15.20
          #if IsMicro == 1
          KnxTpUart knx(&Serial1, "5.0.36");
          #define LEDpin 17
          #endif
          
          #if IsMicro == 0
          KnxTpUart knx(&Serial, "5.0.36");
          #define LEDpin LED_BUILTIN
          #endif
          
          
          byte BoolListen = 0;
          byte LastBoolListen = 0;
          unsigned long delayer = 0;
          const unsigned long Blinkdelay = 3000;
          byte SendState = LOW;
          
          
          
          void setup() {
          pinMode(LEDpin, OUTPUT);
          digitalWrite(LEDpin, LOW);
          
          #if IsMicro == 1
          Serial.begin(9600);
          Serial.println("TP-UART Test");
          
          Serial1.begin(19200, SERIAL_8E1);
          
          Serial.print("UCSR1A: ");
          Serial.println(UCSR1A, BIN);
          
          Serial.print("UCSR1B: ");
          Serial.println(UCSR1B, BIN);
          
          Serial.print("UCSR1C: ");
          Serial.println(UCSR1C, BIN);
          #endif
          
          #if IsMicro == 0
          Serial.begin(19200, SERIAL_8E1);
          #endif
          
          
          knx.uartReset();
          
          knx.addListenGroupAddress(ListenAddress);
          
          }
          void loop() {
          //maintainKnxSerial();
          
          unsigned long currentMillis = millis();
          
          if (currentMillis - delayer >= Blinkdelay) {
          delayer = currentMillis;
          // if the Light is off turn it on and vice-versa:
          if (SendState == LOW) {
          SendState = HIGH;
          } else {
          SendState = LOW;
          }
          knx.groupWriteBool(WriteAddress, SendState);
          // digitalWrite(LEDpin, SendState);
          
          }
          
          if (LastBoolListen != BoolListen) {
          digitalWrite(LEDpin, BoolListen);
          LastBoolListen = BoolListen;
          
          }
          }
          
          #if IsMicro == 1
          void serialEvent1() {
          //if (Serial1.available() > 0) {
          KnxTpUartSerialEventType eType = knx.serialEvent();
          if (eType == TPUART_RESET_INDICATION) {
          Serial.println("Event TPUART_RESET_INDICATION");
          }
          else if (eType == UNKNOWN) {
          Serial.println("Event UNKNOWN");
          }
          else if (eType == KNX_TELEGRAM) {
          Serial.println("Event KNX_TELEGRAM");
          KnxTelegram* telegram = knx.getReceivedTelegram();
          // Telegrammauswertung auf KNX (bei Empfang immer notwendig)
          String target =
          String(0 + telegram->getTargetMainGroup()) + "/" +
          String(0 + telegram->getTargetMiddleGroup()) + "/" +
          String(0 + telegram->getTargetSubGroup());
          
          // Here you have the telegram and can do whatever you want
          if (telegram->getCommand() == KNX_COMMAND_WRITE) {
          // Auswertung des empfangenen KNX-Telegrammes mit Schreibbefehl (Flag) -> Aktion
          if (target == ListenAddress) {
          BoolListen = telegram->getBool();
          Serial.print("Empfangener wert");
          Serial.println(BoolListen);
          
          }
          }
          }
          //}
          }
          #endif
          
          #if IsMicro == 0
          void serialEvent() {
          //if (Serial.available() > 0) {
          KnxTpUartSerialEventType eType = knx.serialEvent();
          if (eType == KNX_TELEGRAM) {
          KnxTelegram* telegram = knx.getReceivedTelegram();
          // Telegrammauswertung auf KNX (bei Empfang immer notwendig)
          String target =
          String(0 + telegram->getTargetMainGroup()) + "/" +
          String(0 + telegram->getTargetMiddleGroup()) + "/" +
          String(0 + telegram->getTargetSubGroup());
          
          // Here you have the telegram and can do whatever you want
          if (telegram->getCommand() == KNX_COMMAND_WRITE) {
          // Auswertung des empfangenen KNX-Telegrammes mit Schreibbefehl (Flag) -> Aktion
          if (target == ListenAddress) {
          BoolListen = telegram->getBool();
          
          }
          }
          }
          //}
          }
          #endif

          Kommentar


            #6
            Hallo, da muss ich nochmal einhaken. Diese ganze "UCSR" Geschichte hab ich sowieso nicht richtig verstanden. Wie hier:

            Zitat von raphaelhuber Beitrag anzeigen
            #if IsMicro == 1 Serial.begin(9600);
            Serial.println("TP-UART Test");
            Serial1.begin(19200, SERIAL_8E1);
            Serial.print("UCSR1A: ");
            Serial.println(UCSR1A, BIN);
            Serial.print("UCSR1B: ");
            Serial.println(UCSR1B, BIN);
            Serial.print("UCSR1C: ");
            Serial.println(UCSR1C, BIN);
            #endif
            Die braucht man beim Pro Micro auch nicht. Bei mir ging es auch ohne. Hab es nur später mit rein genommen und fand das auch bei Beispielen vom Arduino-Mega wieder.

            Wichtig ist nur, das man sich bewust ist, man hat 2 serielle Ports:
            Zitat von raphaelhuber Beitrag anzeigen
            Serial.begin(9600);
            für die Übertragung per USB zum Rechner
            Zitat von raphaelhuber Beitrag anzeigen
            Serial1.begin(19200, SERIAL_8E1);
            für die Übertragung Pin RX/TX zum KNX-Bus

            Die 1 nach Serial ist dafür ausschlaggebend.

            Wer aber zu den Befehlen oben noch mehr weiß, darf das gern mitteilen. Ich hatte auch in einem anderen Post schonmal danach gefragt.

            Aber schön das es jetzt klappt.

            Kommentar


              #7
              Ja, ich denke auch diese SerialPrints sind für nix. Hätte ich eigentlich rauslöschen können
              Genau, die beiden SerialPorts sind wichtig. Aber auch wie man die KNX Sachen ausliest. Die Unterfunktion dafür geht so wie sie beim Micro geht beim Mini nicht. Beim Micro gehts automatisch mit "SerialEvent" und beim Mini ist es eine Funktion, die man danach auch aufrufen muss.
              Praktisch beim Micro: Einfacher zum programmieren, serial monitor zum debuggen.
              Praktisch beim Mini: Mehr Programmspeicher, weniger Stromverbrauch.

              Kommentar

              Lädt...
              X