Kann mir jemand helfen bin blutiger Anfänger.



  • Hallo, ich bin hier Neuling und hoffe, ich mache mit diesem Post alles richtig.
    Ich wollte einen Roboterarm bauen und mit Servos versehen, welche ich dann mit einem Arduino steuern kann.
    Ich habe auch im Internet einen passenden Sketch gefunden und diesen so bearbeitet, dass er zu meinem Projekt passt.
    Nun wollte ich noch die Fälle bearbeiten, wenn ich es allerdings anfange zu bearbeiten kommen nur Fehler.
    Außerdem möchte ich, nachdem er dann die gespeicherten Werte durchlaufen hat noch eine Pause von 10 Sekunden einbauen ehe das Gespeicherte wieder von vorne Beginnt.
    Meine Frage wäre jetzt, was muss ich alles ändern, worauf muss ich achten?
    Kann mir jemand von euch helfen?

    Hier ist der komplette Sketch:

    #include <Servo.h>
    
    Servo servo1; //Servos
    Servo servo2;
    Servo servo3;
    Servo servo4;
    Servo servo5;
    
    const int LED1 = 2; //LEDs
    const int LED2 = 3;
    const int LED3 = 4;
    const int LED4 = 7;
    const int LED5 = 8;
    
    const int button1 = 12; //Buttons
    const int button2 = 13;
    
    int button1Presses = 0; //Button values
    boolean button2Pressed = false;
    
    const int pot1 = A0; //Potentimeters
    const int pot2 = A1; 
    const int pot3 = A2;
    const int pot4 = A3;
    const int pot5 = A4;
    
    int pot1Val; //Potentimeter values
    int pot2Val;
    int pot3Val;
    int pot4Val;
    int pot5Val;
    int pot1Angle;
    int pot2Angle;
    int pot3Angle;
    int pot4Angle;
    int pot5Angle;
    
    int servo1PosSaves[] = {1,1,1,1,1,1}; //position saves
    int servo2PosSaves[] = {1,1,1,1,1,1};
    int servo3PosSaves[] = {1,1,1,1,1,1};
    int servo4PosSaves[] = {1,1,1,1,1,1};
    int servo5PosSaves[] = {1,1,1,1,1,1};
    
    void setup() {
      servo1.attach(5); // Set up everything and will run once; attach servos and define the pin modes
      servo2.attach(6);
      servo3.attach(9);
      servo4.attach(10);
      servo5.attach(11);
      
      pinMode(LED1, OUTPUT);
      pinMode(LED2, OUTPUT);
      pinMode(LED3, OUTPUT);
      pinMode(LED4, OUTPUT);
      pinMode(LED5, OUTPUT);
      pinMode(button1, INPUT);
      pinMode(button2, INPUT);
    
      Serial.begin(9600);
    }
    
    void loop() {
      // put your main code here, to run repeatedly: 
      pot1Val = analogRead(pot1); // This will read the values from the potentimeters and store it...
      pot1Angle = map(pot1Val, 0, 1023, 0, 179); // ... and this will map the values from the potentiometers to values the servos can use and store it for later use
      pot2Val = analogRead(pot2); 
      pot2Angle = map(pot2Val, 0, 1023, 0, 179);
      pot3Val = analogRead(pot3);
      pot3Angle = map(pot3Val, 0, 1023, 0, 179);
      pot4Val = analogRead(pot4);
      pot4Angle = map(pot4Val, 0, 1023, 0, 179);
      pot5Val = analogRead(pot5);
      pot5Angle = map(pot5Val, 0, 1023, 0, 179);
      
      servo1.write(pot1Angle); // These will make the servos move to the mapped angles
      servo2.write(pot2Angle);
      servo3.write(pot3Angle);
      servo4.write(pot4Angle);
      servo5.write(pot5Angle);
      
      if(digitalRead(button1) == HIGH){ // This will check how many times button1 is pressed and save the positions to an array depending on how many times it is pressed; switch/case works like a if statement
        button1Presses++;
        switch(button1Presses){
          case 1:
            servo1PosSaves[0] = pot1Angle;
            servo2PosSaves[0] = pot2Angle;
            servo3PosSaves[0] = pot3Angle;
            servo4PosSaves[0] = pot4Angle;
            servo5PosSaves[0] = pot5Angle;
            digitalWrite(LED1, HIGH);
            Serial.println("Pos 1 Saved");
            break;
          case 2:
             servo1PosSaves[1] = pot1Angle;
             servo2PosSaves[1] = pot2Angle;
             servo3PosSaves[1] = pot3Angle;
             servo4PosSaves[1] = pot4Angle;
             servo5PosSaves[0] = pot5Angle;
             digitalWrite(LED2, HIGH);
             Serial.println("Pos 2 Saved");
             break;
          case 3:
             servo1PosSaves[2] = pot1Angle;
             servo2PosSaves[2] = pot2Angle;
             servo3PosSaves[2] = pot3Angle;
             servo4PosSaves[2] = pot4Angle;
             servo5PosSaves[0] = pot5Angle;
             digitalWrite(LED3, HIGH);
             Serial.println("Pos 3 Saved");
             break;
           case 4:
             servo1PosSaves[3] = pot1Angle;
             servo2PosSaves[3] = pot2Angle;
             servo3PosSaves[3] = pot3Angle;
             servo4PosSaves[3] = pot4Angle;
             servo5PosSaves[0] = pot5Angle;
             digitalWrite(LED4, HIGH);
             Serial.println("Pos 4 Saved");
             break;
           case 5:
             servo1PosSaves[4] = pot1Angle;
             servo2PosSaves[4] = pot2Angle;
             servo3PosSaves[4] = pot3Angle;
             servo4PosSaves[4] = pot4Angle;
             servo5PosSaves[0] = pot5Angle;
             digitalWrite(LED5, HIGH);
             Serial.println("Pos 5 Saved");
             break;
             case 6:
             servo1PosSaves[5] = pot1Angle;
             servo2PosSaves[5] = pot2Angle;
             servo3PosSaves[5] = pot3Angle;
             servo4PosSaves[5] = pot4Angle;
             servo5PosSaves[0] = pot5Angle;
             digitalWrite(LED5, HIGH);
             Serial.println("Pos 6 Saved");
             break;
        }
      }
    
      if(digitalRead(button2) == HIGH){ // Pretty self-explnatory here
        button2Pressed = true;   
      }
      
      if(button2Pressed){ // if the boolean button2Press is true, then the servos will run though all their saved positions
        for(int i = 0; i < 5; i++){
            servo1.write(servo1PosSaves[i]);
            servo2.write(servo2PosSaves[i]);
            servo3.write(servo3PosSaves[i]);
            servo4.write(servo4PosSaves[i]);
            servo5.write(servo5PosSaves[i]);
            Serial.println(" potentimeter Angles: ");
            Serial.println(servo1PosSaves[i]);
            Serial.println(servo2PosSaves[i]);
            Serial.println(servo3PosSaves[i]);
            Serial.println(servo4PosSaves[i]);
            Serial.println(servo5PosSaves[i]);
            delay(1050);
          }
      }
      delay(300);
    }
    


  • Du kannst den Code auch formatieren.

    Dazu markierst du den Code mit der Maus und drückst auf das </> Symbol über dem Editorfenster.

    Das kannst du auch nachträglich tun. Dazu klickst du auf die drei senkrechten Punkte unten rechts von deinem Beitrag (neben Antworten Zitieren)

    @OpenMInd sagte in Kann mir jemand helfen bin blutiger Anfänger.:

    Nun wollte ich noch die Fälle bearbeiten, wenn ich es allerdings anfange zu bearbeiten kommen nur Fehler.

    Was hast du ergänzt?
    Wie lautet die exakte Fehlermeldung?

    Außerdem möchte ich, nachdem er dann die gespeicherten Werte durchlaufen hat noch eine Pause von 10 Sekunden einbauen ehe das Gespeicherte wieder von vorne Beginnt.

    Zum warten ist delay() da. - da wird aber nur gewartet und sonst nichts anderes getan.
    Wo genau, schau ich mir im unformatierten Code aber nicht an.

    Du hast auch nur 5 Speicherpositionen und nicht 6.

    Wenn man Bezeichner wie servoX (mit X als Zahl) hat, deutet das meist darauf hin, dass man dafür ein Array nimmt.



  • @OpenMInd sagte in Kann mir jemand helfen bin blutiger Anfänger.:

    Nun wollte ich noch die Fälle bearbeiten, wenn ich es allerdings anfange zu bearbeiten kommen nur Fehler.

    Welche Änderungen und welche Fehlermeldung bekommst du dabei genau?



  • Hallo, Danke für eure Antworten.
    Ich habe bereits die Anzahl der Servos von 3 auf 5 erweitert, zudem habe ich auch die Potentiometer auf 5 erweitert und ich habe auch bei den Fällen von vorher 5 auf 6 erweitert.
    Ich bekomme zwar keine Fehlermeldung direkt, aber es funktioniert dennoch nicht.



  • @OpenMInd sagte in Kann mir jemand helfen bin blutiger Anfänger.:

    Ich bekomme zwar keine Fehlermeldung direkt,

    Das hörte sich anders an. Bekommst du Warnungen vom Compiler? Die muss man evtl. vorher aktivieren.

    aber es funktioniert dennoch nicht.

    Das ist die schlechteste Fehlerbeschreibung die es gibt.

    Wenn ich das richtig interpretiere, dann möchtest du per Hand Positionen anfahren, dann auf Taster1 drücken um diese Positionen zu speichern.

    Beim Druck auf Taster2 sollen dann diese gespeicherten Positionen der Reihe nach angefahren werden.

    Was davon geht nicht?



  • Danke für die Hilfe.
    Das anfahren und das abspeichern geht nicht.



  • @OpenMInd sagte in Kann mir jemand helfen bin blutiger Anfänger.:

    Das anfahren und das abspeichern geht nicht.

    Es wäre schon ganz hilfreich zu wissen, welche Ausgaben auf dem Terminal erscheinen.

    Aber was Grundsätzliches:

    Ein Taster prellt. D.h. bevor er den endgültigen Kontakt hat, wechselt er ein paarmal den Zustand.

    Dein Programm ist schnell. Auch wenn du den Taster nur kurz drückst, läuft dein Programm ein paarmal durch die Schleife.
    Es werden dann mehrere Zustande gespeichert.

    Selbst wenn du es schaffst nur so kurz zu drücken, dass nur einmal button1Presses++; ausgeführt wird, bleibt dieser Zustand.
    Es wird dann immer wieder der case dazu ausgeführt.

    Einmal Taster2 gedrückt, läuft die Wiederholung dauerhaft.

    Die obigen paarmal können - je nach Programm oder Hardware - auch in die tausende gehen.
    Ein delay() ist die schlechte Lösung dieses Problems - die Gute arbeitet mit Interrupts.


Anmelden zum Antworten