Code ändern bei gleicher funktionalität



  • Hallo Leute,
    Ich brauche Hilfe:

    Ich habe diesen ursprünglichen funktionierenden Arduino Code:
    Funktion von Code:
    Die Potis bei dem ersten Arduino steuern die Servos bei den zweiten Arduino.
    Der zweite Arduino empfängt Signale von den ersten Arduino via RS232,beim zweiten Arduino werden die Signale in zahlen konvertiert und einen bestimmten Digitalen Ausgang zugeordnet.
    An den Ausgängen sind Servos angeschlossen.

    Erklärung:
    Es kommen werte in den zweiten Arduino über Rs232 Schnittstelle rein wie:
    1500a
    2000b
    Anhand der Buchstaben ordnet der Code die Zahl einen bestimmten Digitalen Ausgang zu. Die Zahl wird dann als PWM-Signal an die Servos raus gehauen.

    Ich möchte den Code ein wenig umändern.

    Der ursprüngliche Code:

    //zoomkat 11-22-12 simple delimited ',' string parse 
    //from serial port input (via serial monitor)
    //and print result out serial port
    //multi servos added 
    // Powering a servo from the arduino usually *DOES NOT WORK*.
    
    String readString;
    #include <Servo.h> 
    Servo myservoa, myservob, myservoc, myservod;  // create servo object to control a servo 
    
    void setup() {
      Serial.begin(9600);
    
      //myservoa.writeMicroseconds(1500); //set initial servo position if desired
    
      myservoa.attach(6);  //the pin for the servoa control
      myservob.attach(7);  //the pin for the servob control
      myservoc.attach(8);  //the pin for the servoc control
      myservod.attach(9);  //the pin for the servod control 
      Serial.println("multi-servo-delimit-test-dual-input-11-22-12"); // so I can keep track of what is loaded
    }
    
    void loop() {
    
      //expect single strings like 700a, or 1500c, or 2000d,
      //or like 30c, or 90a, or 180d,
      //or combined like 30c,180b,70a,120d,
    
      if (Serial.available())  {
        char c = Serial.read();  //gets one byte from serial buffer
        if (c == ',') {
          if (readString.length() >1) {
            Serial.println(readString); //prints string to serial port out
    
            int n = readString.toInt();  //convert readString into a number
    
            // auto select appropriate value, copied from someone elses code.
            if(n >= 500)
            {
              Serial.print("writing Microseconds: ");
              Serial.println(n);
              if(readString.indexOf('a') >0) myservoa.writeMicroseconds(n);
              if(readString.indexOf('b') >0) myservob.writeMicroseconds(n);
              if(readString.indexOf('c') >0) myservoc.writeMicroseconds(n);
              if(readString.indexOf('d') >0) myservod.writeMicroseconds(n);
            }
            else
            {   
              Serial.print("writing Angle: ");
              Serial.println(n);
              if(readString.indexOf('a') >0) myservoa.write(n);
              if(readString.indexOf('b') >0) myservob.write(n);
              if(readString.indexOf('c') >0) myservoc.write(n);
              if(readString.indexOf('d') >0) myservod.write(n);
            }
             readString=""; //clears variable for new input
          }
        }  
        else {     
          readString += c; //makes the string readString
        }
      }
    }
    

    Der geänderte Code:

    //zoomkat 11-22-12 simple delimited ',' string parse 
    //from serial port input (via serial monitor)
    //and print result out serial port
    //multi servos added 
    // Powering a servo from the arduino usually *DOES NOT WORK*.
    
    String readString;
    #include <Servo.h> 
    Servo myservoa, myservob, myservoc, myservod;  // create servo object to control a servo 
    
    void setup() {
      Serial.begin(9600);
    
      //myservoa.writeMicroseconds(1500); //set initial servo position if desired
    
      myservoa.attach(6);  //the pin for the servoa control
      myservob.attach(7);  //the pin for the servob control
      myservoc.attach(8);  //the pin for the servoc control
      myservod.attach(9);  //the pin for the servod control 
      Serial.println("multi-servo-delimit-test-dual-input-11-22-12"); // so I can keep track of what is loaded
    }
    
    void loop() {
    
      //expect single strings like 700a, or 1500c, or 2000d,
      //or like 30c, or 90a, or 180d,
      //or combined like 30c,180b,70a,120d,
    
      if (Serial.available())  {
        char c = Serial.read();  //gets one byte from serial buffer
        if (c == ',') {
          if (readString.length() >1) {
            Serial.println(readString); //prints string to serial port out
    
            int n = readString.toInt();  //convert readString into a number
    
            // auto select appropriate value, copied from someone elses code.
            if(n >= 500)
            {
              Serial.print("writing Microseconds: ");
              Serial.println(n);
    
              if(readString.indexOf('a') >0)   
              {
               n = map(n, 0, 1023, 0, 180); 
               myservoa.write(n);
              }
    /*
     Ein Werte kommt in Arduino rein, zb.889a, dieser Wert soll dementsprechend zugeordnet werden, dann soll die Lineare Rechnung folgen:
     "(n, 0, 1023, 0, 180)", als letztes soll der Signal rausgehen :  myservoa.write(n);
    
    Was mache ich falsch?
    
    */
    
              if(readString.indexOf('b') >0) myservob.writeMicroseconds(n);
              {
               n = map(n, 0, 1023, 0, 180);
               myservoa.write(n);
              }
    
              if(readString.indexOf('c') >0) myservoc.writeMicroseconds(n);
              {
               n = map(n, 0, 1023, 0, 180);
               myservoa.write(n);
              }
    
              if(readString.indexOf('d') >0) myservod.writeMicroseconds(n);
              {
               n = map(n, 0, 1023, 0, 180);
               myservoa.write(n);
              }
            }
    
             readString=""; //clears variable for new input
          }
        }  
        else {     
          readString += c; //makes the string readString
        }
      }
    }
    

    Für jede Hilfe bin ich dankbar 🙂



  • Ohne Arduino zu kennen, das hier ist merkwürdig, vermutlich sitzt die { zu weit unten.

    if(readString.indexOf('b') >0) myservob.writeMicroseconds(n);
    {
      n = map(n, 0, 1023, 0, 180);
      myservoa.write(n);
    }
    

    heisst: wenn indexOf('b')>0 dann führe writeµs aus. Der Block danach wird IMMER ausgeführt.



  • Was Du falsch machst, ist die Codeformatierung, und per Copy und paste progerammieren.

    if(readString.indexOf('b') >0) myservob.writeMicroseconds(n);
              {
               n = map(n, 0, 1023, 0, 180);
               myservoa.write(n);
              }
    
              if(readString.indexOf('c') >0) myservoc.writeMicroseconds(n);
              {
               n = map(n, 0, 1023, 0, 180);
               myservoa.write(n);
              }
    
              if(readString.indexOf('d') >0) myservod.writeMicroseconds(n);
              {
               n = map(n, 0, 1023, 0, 180);
               myservoa.write(n);
              }
    

    Das ist jawohl Quark.

    Ansonsten: bist Du sicher das Du das Protokoll richtig verstanden hast?
    Das Protokoll erwartet immer ein Komma hintendran und unterscheidet zusätzlich noch zwischen Werten >=500 und allen anderen.
    Das ist alles recht halbgar. 😞
    Überleg, ob Du nicht ein wenig Grips investierst und das Protokoll verbesserst.



  • Hierbei zeigt der IDE von Arduino keine Fehler an:
    (Die werte habe ich dementsprechend geändert, sodass Werte ab 1 bearbeitet werden können)

    if(readString.indexOf('b') >0) 
    {
      n = map(n, 1, 1023, 1, 180);
      myservoa.write(n);
    }
    

    oder

    if(readString.indexOf('b') >0) n = map(n, 1, 1023, 1, 180),myservoa.write(n);
    

    Mein Code funktioniert trotzdem nicht. (Der Ursprüngliche Code funktioniert nicht Optimal)
    Kann sein, das dass beide dasselbe ist, nur unterschiedlich geschrieben // bin c-neuling
    Jedenfalls bedanke ich mich eure Antworten.

    Wahrscheinlich werde ich einen "Auftragsarbeit" anfertigen, falls jemand lust hat, bei meinen "Projekt" zu helfen
    so kann er Augen offen halten und bei Projekte nachschauen. Leckerlis gibt es als Belohnung.
    🙂



  • if(readString.indexOf('b') >0) n = map(n, 1, 1023, 1, 180),myservoa.write(n);
    

    Das ist gültiges C?


Anmelden zum Antworten