Frage wegen Servosteuerung

Hallo Arduinogemeinde
ich möchte in meinem Modellhaus eine 2-Flüglige Stalltüre öffnen und schliessen. den Taster zum starten werde ich später mit einem nano simulieren als Input-Signal, müsste doch gehen. Die Türen sollen in 2 Stufen und Geschwindigkeiten öffnen und schliessen. leider bleibt mir der Code immer in Zeile 97 hängen. Bin noch Anfänger und hab schon alles mögliche versucht. Sicher nur eine kleinigkeit.
Kann mir jemand einen Tipp geben oder weiterhelfen?
Hier das Programm auf einem Due:.

#include <Servo.h>
const int SERVO1_PIN = 6;
const int BUTTON_PIN = 8;
const int SERVO2_PIN = 7;

//=============================================================================
//ÖFFNEN
//=============================================================================


//  20 Grad langsam Öffnen Rechts

Servo SRV1_servo1;
int SRV1_pos;
boolean SRV1_moveFoward;
long SRV1_nextWakeUp;

//  170 Grad langsam Öffnen Links

Servo SRV2_servo2;
int SRV2_pos;
boolean SRV2_moveBaward;
long SRV2_nextWakeUp;

//  170 Grad schnell Öffnsn rechts

Servo SRV1_servo1; 
int SRV1_pos;
boolean SRV1_moveFoward;
long SRV1_nextWakeUp;

//  170 Grad schnell Öffnen links

Servo SRV2_servo2;
int SRV2_pos;
boolean SRV2_moveBaward;
long SRV2_nextWakeUp;

void setup() {
 // pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
// init the compontent’s states
SRV1_servo1.attach(SERVO_PIN);
SRV1_pos = 20;
SRV1_moveFoward = true;
SRV1_nextWakeUp = millis();

SRV2_servo2.attach(SERVO_PIN);
SRV2_pos = 170;
SRV2_moveBaward = true;
SRV2_nextWakeUp = millis();

SRV1_servo1.attach(SERVO_PIN);
SRV1_pos = 170;
SRV1_moveFoward = true;
SRV1_nextWakeUp = millis();

SRV2_servo2.attach(SERVO_PIN);
SRV2_pos = 10;
SRV2_moveBaward = true;
SRV2_nextWakeUp = millis();



}


//===========================================================
// Schliessen
//===========================================================



//  170 Grad schnell schliessen links

Servo SRV2_servo2;
int SRV2_pos;
boolean SRV2_moveFoward;
long SRV2_nextWakeUp;

//  20 Grad schnell schliessen rechts

Servo SRV1_servo1;
int SRV1_pos;
boolean SRV1_moveBaward;
long SRV1_nextWakeUp;

//  180 Grad langsam schliessen links

Servo SRV2_servo2;
int SRV2_pos;
boolean SRV2_moveFoward;
long SRV2_nextWakeUp;

//  0 Grad langsam schliessen rechts

Servo SRV1_servo1;
int SRV1_pos;
boolean SRV1_moveBaward;
long SRV1_nextWakeUp;


// Schliessen

//void setup() {
 // pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
// init the compontent’s states

//  170 Grad schnell schliessen links

SRV2_servo2.attach(SERVO2_PIN);
SRV2_pos = 170;
SRV2_moveFoward = true;
SRV2_nextWakeUp = millis();

//  20 Grad schnell schliessen rechts

SRV1_servo1.attach(SERVO1_PIN);
SRV1_pos = 20;
SRV1_moveBaward = true;
SRV1_nextWakeUp = millis();

// 180 Grad langsam schliessen links

SRV2_servo2.attach(SERVO2_PIN);
SRV2_pos = 180;
SRV2_moveFoward = true;
SRV2_nextWakeUp = millis();

//  0 Grad langsam schliessen rechts

SRV1_servo1.attach(SERVO1_PIN);
SRV1_pos = 0;
SRV1_moveBaward = true;
SRV1_nextWakeUp = millis();

}


void loop() {
long currentTime = millis();
long nextWakeUpSRV1 = SRV1_doStep(currentTime);
long nextWakeUpSRV2 = SRV2_doStep(currentTime);
long nextWakeUpSRV1 = SRV1_doStep(currentTime);
long nextWakeUpSRV2 = SRV2_doStep(currentTime);
long nextWakeUpSRV2 = SRV2_doStep(currentTime);
long nextWakeUpSRV1 = SRV1_doStep(currentTime);
long nextWakeUpSRV2 = SRV2_doStep(currentTime);
long nextWakeUpSRV1 = SRV1_doStep(currentTime);

//long nextMinWakeUp = (nextWakeUpSRV1 < nextWakeUpSRV2 < nextWakeUpSRV1 < nextWakeUpSRV2 < nextWakeUpSRV2 < nextWakeUpSRV1 < nextWakeUpSRV2 < nextWakeUpSRV1 ) ? nextWakeUpSRV1 : nextWakeUpSRV2 : nextWakeUpSRV1 : nextWakeUpSRV2 : nextWakeUpSRV2 : nextWakeUpSRV1 : nextWakeUpSRV2 : nextWakeUpSRV1;
//delay(nextMinWakeUp – currentTime);
}

//==================================================
// Oeffnen
//==================================================

/* ** SERVO1 ** */

long SRV1_doStep(long currentMillis) 
{ if(currentMillis>SRV1_nextWakeUp) 
{ if(SRV1_moveFoward) 
{ SRV1_pos += SRV1_getIncrement(1);
if(SRV1_pos>0) 
{ SRV1_moveFoward = false;
SRV1_pos = 20;
}} 
else }
SRV1_servo.write(SRV1_pos);
SRV1_nextWakeUp = currentMillis + 100;}
return SRV2_nextWakeUp;}
int SRV1_getIncrement() 

/* ** SERVO2 ** */

long SRV2_doStep(long currentMillis) 
{ if(currentMillis>SRV2_nextWakeUp) 
{ if(SRV2_moveBaward) 
{ SRV2_pos -= SRV2_getIncrement(-1);
if(SRV2_pos>180) 
{ SRV2_moveFoward = false;
SRV2_pos = 170;
}} 
else }
SRV2_servo.write(SRV1_pos);
SRV2_nextWakeUp = currentMillis + 100;}
return SRV1_nextWakeUp;}
int SRV2_getIncrement() 

/* ** SERVO1 ** */

long SRV1_doStep(long currentMillis) 
{ if(currentMillis>SRV1_nextWakeUp) 
{ if(SRV1_moveFoward) 
{ SRV1_pos += SRV1_getIncrement(5);
if(SRV1_pos>20) 
{ SRV1_moveFoward = false;
SRV1_pos = 170;
}} 
else }
SRV1_servo.write(SRV1_pos);
SRV1_nextWakeUp = currentMillis + 100;}
return SRV1_nextWakeUp;}
int SRV1_getIncrement() 

/* ** SERVO2 ** */

long SRV2_doStep(long currentMillis) 
{ if(currentMillis>SRV2_nextWakeUp) 
{ if(SRV2_moveBaward) 
{ SRV2_pos -= SRV2_getIncrement(-5);
if(SRV2_pos>170) 
{ SRV2_moveBaward = false;
SRV2_pos = 10;
}} 
else }
SRV2_servo.write(SRV1_pos);
SRV2_nextWakeUp = currentMillis + 100;}
return SRV2_nextWakeUp;}
int SRV2_getIncrement() }




pinMode(BUTTON_PIN, INPUT);

//===============================================
// Schliessen
//===============================================


/* ** SERVO2 ** */

long SRV2_doStep(long currentMillis) 
{ if(currentMillis>SRV2_nextWakeUp) 
{ if(SRV2_moveFoward) 
{ SRV2_pos += SRV2_getIncrement(5);
if(SRV2_pos>10) 
{ SRV2_moveFoward = false;
SRV2_pos = 170;
}} 
else }
SRV2_servo.write(SRV2_pos);
SRV2_nextWakeUp = currentMillis + 100;}
return SRV2_nextWakeUp;}
int SRV2_getIncrement() 

/* ** SERVO1 ** */

long SRV1_doStep(long currentMillis) 
{ if(currentMillis>SRV1_nextWakeUp) 
{ if(SRV1_moveBaward) 
{ SRV1_pos -= SRV1_getIncrement(-5);
if(SRV1_pos>170) 
{ SRV1_moveBaward = false;
SRV1_pos = 20;
}} 
else }
SRV1_servo.write(SRV1_pos);
SRV1_nextWakeUp = currentMillis + 100;}
return SRV1_nextWakeUp;}
int SRV1_getIncrement() 

/* ** SERVO2 ** */

long SRV2_doStep(long currentMillis) 
{ if(currentMillis>SRV2_nextWakeUp) 
{ if(SRV2_moveFoward) 
{ SRV2_pos += SRV2_getIncrement(1);
if(SRV2_pos>170) 
{ SRV2_moveFoward = false;
SRV2_pos = 180;
}} 
else }
SRV2_servo.write(SRV2_pos);
SRV2_nextWakeUp = currentMillis + 100;}
return SRV2_nextWakeUp;}
int SRV2_getIncrement() 

/* ** SERVO1 ** */

long SRV1_doStep(long currentMillis) 
{ if(currentMillis>SRV1_nextWakeUp) 
{ if(SRV1_moveBaward) 
{ SRV1_pos -= SRV1_getIncrement(-1);
if(SRV1_pos>20) 
{ SRV1_moveBaward = false;
SRV1_pos = 0;
}} 
else }
SRV1_servo.write(SRV1_pos);
SRV1_nextWakeUp = currentMillis + 100;}
return SRV1_nextWakeUp;}
int SRV1_getIncrement() 
return 1

gerryswiss:
leider bleibt mir der Code immer in Zeile 97 hängen.

Der Code nicht, aber der Compiler wird wohl mekern.
Und das nicht nur da sondern mindestens auch noch an hunderten anderen Stellen.

Im IDE-Menu unter Werkzeuge - Automatisch formatieren.

Zu jeder sich öffnenenden { muss auch eine schliessende gehören.
Keine mehr und keine weniger.
Alles was dazwischen steht, gehört zusammen.

Wenn Du dann alles durchformatiert hast, dann wird Dir auffallen, das da mindestens noch was übrig ist und irgendwo rein gehört.

gerryswiss:
Sicher nur eine kleinigkeit.

Leider nein, denn das, was Du hier als Programm zeigst, ist syntaktisch sehr phantasievoll.

Ich habe Strg+t in der IDE gedrückt. Fehlermeldungen für den UNO:

[sup]Test_Forum:27:7: error: redefinition of 'Servo SRV1_servo1'
 Servo SRV1_servo1;
       ^~~~~~~~~~~
Test_Forum.ino:13:7: note: 'Servo SRV1_servo1' previously declared here
 Servo SRV1_servo1;
       ^~~~~~~~~~~
Test_Forum:28:5: error: redefinition of 'int SRV1_pos'
 int SRV1_pos;
     ^~~~~~~~
Test_Forum.ino:14:5: note: 'int SRV1_pos' previously declared here
 int SRV1_pos;
     ^~~~~~~~
Test_Forum:29:9: error: redefinition of 'boolean SRV1_moveFoward'
 boolean SRV1_moveFoward;
         ^~~~~~~~~~~~~~~
Test_Forum.ino:15:9: note: 'boolean SRV1_moveFoward' previously declared here
 boolean SRV1_moveFoward;
         ^~~~~~~~~~~~~~~
Test_Forum:30:6: error: redefinition of 'long int SRV1_nextWakeUp'
 long SRV1_nextWakeUp;
      ^~~~~~~~~~~~~~~
Test_Forum.ino:16:6: note: 'long int SRV1_nextWakeUp' previously declared here
 long SRV1_nextWakeUp;
      ^~~~~~~~~~~~~~~
Test_Forum:34:7: error: redefinition of 'Servo SRV2_servo2'
 Servo SRV2_servo2;
       ^~~~~~~~~~~
Test_Forum.ino:20:7: note: 'Servo SRV2_servo2' previously declared here
 Servo SRV2_servo2;
       ^~~~~~~~~~~
Test_Forum:35:5: error: redefinition of 'int SRV2_pos'
 int SRV2_pos;
     ^~~~~~~~
Test_Forum.ino:21:5: note: 'int SRV2_pos' previously declared here
 int SRV2_pos;
     ^~~~~~~~
Test_Forum:36:9: error: redefinition of 'boolean SRV2_moveBaward'
 boolean SRV2_moveBaward;
         ^~~~~~~~~~~~~~~
Test_Forum.ino:22:9: note: 'boolean SRV2_moveBaward' previously declared here
 boolean SRV2_moveBaward;
         ^~~~~~~~~~~~~~~
Test_Forum:37:6: error: redefinition of 'long int SRV2_nextWakeUp'
 long SRV2_nextWakeUp;
      ^~~~~~~~~~~~~~~
Test_Forum.ino:23:6: note: 'long int SRV2_nextWakeUp' previously declared here
 long SRV2_nextWakeUp;
      ^~~~~~~~~~~~~~~
Test_Forum.ino: In function 'void setup()':
Test_Forum:43:22: error: 'SERVO_PIN' was not declared in this scope
   SRV1_servo1.attach(SERVO_PIN);
                      ^~~~~~~~~
Test_Forum.ino:43:22: note: suggested alternative: 'SERVO2_PIN'
   SRV1_servo1.attach(SERVO_PIN);
                      ^~~~~~~~~
                      SERVO2_PIN
Test_Forum.ino: At global scope:
Test_Forum:76:7: error: redefinition of 'Servo SRV2_servo2'
 Servo SRV2_servo2;
       ^~~~~~~~~~~
Test_Forum.ino:20:7: note: 'Servo SRV2_servo2' previously declared here
 Servo SRV2_servo2;
       ^~~~~~~~~~~
Test_Forum:77:5: error: redefinition of 'int SRV2_pos'
 int SRV2_pos;
     ^~~~~~~~
Test_Forum.ino:21:5: note: 'int SRV2_pos' previously declared here
 int SRV2_pos;
     ^~~~~~~~
Test_Forum:79:6: error: redefinition of 'long int SRV2_nextWakeUp'
 long SRV2_nextWakeUp;
      ^~~~~~~~~~~~~~~
Test_Forum.ino:23:6: note: 'long int SRV2_nextWakeUp' previously declared here
 long SRV2_nextWakeUp;
      ^~~~~~~~~~~~~~~
Test_Forum:83:7: error: redefinition of 'Servo SRV1_servo1'
 Servo SRV1_servo1;
       ^~~~~~~~~~~
Test_Forum.ino:13:7: note: 'Servo SRV1_servo1' previously declared here
 Servo SRV1_servo1;
       ^~~~~~~~~~~
Test_Forum:84:5: error: redefinition of 'int SRV1_pos'
 int SRV1_pos;
     ^~~~~~~~
Test_Forum.ino:14:5: note: 'int SRV1_pos' previously declared here
 int SRV1_pos;
     ^~~~~~~~
Test_Forum:86:6: error: redefinition of 'long int SRV1_nextWakeUp'
 long SRV1_nextWakeUp;
      ^~~~~~~~~~~~~~~
Test_Forum.ino:16:6: note: 'long int SRV1_nextWakeUp' previously declared here
 long SRV1_nextWakeUp;
      ^~~~~~~~~~~~~~~
Test_Forum:90:7: error: redefinition of 'Servo SRV2_servo2'
 Servo SRV2_servo2;
       ^~~~~~~~~~~
Test_Forum.ino:20:7: note: 'Servo SRV2_servo2' previously declared here
 Servo SRV2_servo2;
       ^~~~~~~~~~~
Test_Forum:91:5: error: redefinition of 'int SRV2_pos'
 int SRV2_pos;
     ^~~~~~~~
Test_Forum.ino:21:5: note: 'int SRV2_pos' previously declared here
 int SRV2_pos;
     ^~~~~~~~
Test_Forum:92:9: error: redefinition of 'boolean SRV2_moveFoward'
 boolean SRV2_moveFoward;
         ^~~~~~~~~~~~~~~
Test_Forum.ino:78:9: note: 'boolean SRV2_moveFoward' previously declared here
 boolean SRV2_moveFoward;
         ^~~~~~~~~~~~~~~
Test_Forum:93:6: error: redefinition of 'long int SRV2_nextWakeUp'
 long SRV2_nextWakeUp;
      ^~~~~~~~~~~~~~~
Test_Forum.ino:23:6: note: 'long int SRV2_nextWakeUp' previously declared here
 long SRV2_nextWakeUp;
      ^~~~~~~~~~~~~~~
Test_Forum:97:7: error: redefinition of 'Servo SRV1_servo1'
 Servo SRV1_servo1;  // Fehler
       ^~~~~~~~~~~
Test_Forum.ino:13:7: note: 'Servo SRV1_servo1' previously declared here
 Servo SRV1_servo1;
       ^~~~~~~~~~~
Test_Forum:98:5: error: redefinition of 'int SRV1_pos'
 int SRV1_pos;
     ^~~~~~~~
Test_Forum.ino:14:5: note: 'int SRV1_pos' previously declared here
 int SRV1_pos;
     ^~~~~~~~
Test_Forum:99:9: error: redefinition of 'boolean SRV1_moveBaward'
 boolean SRV1_moveBaward;
         ^~~~~~~~~~~~~~~
Test_Forum.ino:85:9: note: 'boolean SRV1_moveBaward' previously declared here
 boolean SRV1_moveBaward;
         ^~~~~~~~~~~~~~~
Test_Forum:100:6: error: redefinition of 'long int SRV1_nextWakeUp'
 long SRV1_nextWakeUp;
      ^~~~~~~~~~~~~~~
Test_Forum.ino:16:6: note: 'long int SRV1_nextWakeUp' previously declared here
 long SRV1_nextWakeUp;
      ^~~~~~~~~~~~~~~
Test_Forum:107:8: error: expected constructor, destructor, or type conversion before '(' token
 pinMode(BUTTON_PIN, INPUT);
        ^
Test_Forum:112:1: error: 'SRV2_servo2' does not name a type
 SRV2_servo2.attach(SERVO2_PIN);
 ^~~~~~~~~~~
Test_Forum:113:1: error: 'SRV2_pos' does not name a type
 SRV2_pos = 170;
 ^~~~~~~~
Test_Forum:114:1: error: 'SRV2_moveFoward' does not name a type
 SRV2_moveFoward = true;
 ^~~~~~~~~~~~~~~
Test_Forum:115:1: error: 'SRV2_nextWakeUp' does not name a type
 SRV2_nextWakeUp = millis();
 ^~~~~~~~~~~~~~~
Test_Forum:119:1: error: 'SRV1_servo1' does not name a type
 SRV1_servo1.attach(SERVO1_PIN);
 ^~~~~~~~~~~
Test_Forum:120:1: error: 'SRV1_pos' does not name a type
 SRV1_pos = 20;
 ^~~~~~~~
Test_Forum:121:1: error: 'SRV1_moveBaward' does not name a type
 SRV1_moveBaward = true;
 ^~~~~~~~~~~~~~~
Test_Forum:122:1: error: 'SRV1_nextWakeUp' does not name a type
 SRV1_nextWakeUp = millis();
 ^~~~~~~~~~~~~~~
Test_Forum:126:1: error: 'SRV2_servo2' does not name a type
 SRV2_servo2.attach(SERVO2_PIN);
 ^~~~~~~~~~~
Test_Forum:127:1: error: 'SRV2_pos' does not name a type
 SRV2_pos = 180;
 ^~~~~~~~
Test_Forum:128:1: error: 'SRV2_moveFoward' does not name a type
 SRV2_moveFoward = true;
 ^~~~~~~~~~~~~~~
Test_Forum:129:1: error: 'SRV2_nextWakeUp' does not name a type
 SRV2_nextWakeUp = millis();
 ^~~~~~~~~~~~~~~
Test_Forum:133:1: error: 'SRV1_servo1' does not name a type
 SRV1_servo1.attach(SERVO1_PIN);
 ^~~~~~~~~~~
Test_Forum:134:1: error: 'SRV1_pos' does not name a type
 SRV1_pos = 0;
 ^~~~~~~~
Test_Forum:135:1: error: 'SRV1_moveBaward' does not name a type
 SRV1_moveBaward = true;
 ^~~~~~~~~~~~~~~
Test_Forum:136:1: error: 'SRV1_nextWakeUp' does not name a type
 SRV1_nextWakeUp = millis();
 ^~~~~~~~~~~~~~~
Test_Forum:138:1: error: expected declaration before '}' token
 }
 ^
exit status 1
redefinition of 'Servo SRV1_servo1'
[/sup]

Da weiß ich nicht, wo ich anfangen soll.

agmue:
Da weiß ich nicht, wo ich anfangen soll.

Och ich schon...
Ne Handvoll examples gibts doch zu den servobibs bestimmt.

Kannst Du mal codetags nehm..

Wenn Du Code postest, dann setze den bitte in Code-Tags ( der Button </> links oben ). Alternativ kannst Du in der IDE auch Rechtsklicken in das Code-Fenster und im Pop-Up Menü ‘Für Forum kopieren’ auswählen. Dann sind die Code-Tags schon dabei.

Wie schon angemerkt wurde, bleibt nicht der Code hängen, sondern der Compiler findet Fehler. Nicht nur den in Zeile 97, das ist nur der erste den er anzeigt.
Wo hast Du den Code her? Mit scheint da einiges zusammenkopiert zu sein, ohne dass man weis, was man da tut. Und warum verwendest Du einen Due? Der ist - zumindest hier im deutschen Forum kaum verbreitet. Und für die ganze Aufgabe reicht ein Nano locker aus - der langweilt sich da noch.
Da kannst Du dann auch meine MobaTools verwenden, die sind für solche Aufgaben gemacht :wink: . Es sind auch Beispiele dabei, wie man Servos langsam bewegt.

Hast du jeden deiner zahlreichen Versuche im Code belassen? Denn er ist voller redundanter Zeilen.
Wenn man aus dem Code nur den fehlerhaften Unsinn löscht, bleibt etwa ein fünftel übrig welches zwar compiliert, aber nichts sinnvolles tut.
Fang am besten von vorne an. Mit nur einem Servo. In kleinen Schritten.
gruß lorenz

MicroBahner:
Es sind auch Beispiele dabei, wie man Servos langsam bewegt.

Ich ergänze ein Beispiel für die MobaTools:

#include <MobaTools.h>
const byte TUER_1_PIN = 6;
const byte TASTER_PIN = 8;
const byte MINWINKEL =  10;
const byte MAXWINKEL = 170;
const byte DELTAWINKEL = 20;
const byte MINGESCHW = 10;
const byte MAXGESCHW = 30;

MoToServo tuer1Servo;

void setup() {
  pinMode(TASTER_PIN, INPUT_PULLUP); // Die Taster müssen so angeschlossen sein, dass der Eingang bei gedrücktem Taster auf LOW (=0) geht.
  tuer1Servo.attach(TUER_1_PIN);
}

void loop() {
  byte tuer1pos = tuer1Servo.read();
  if ( (tuer1pos < (MINWINKEL + DELTAWINKEL)) || (tuer1pos > (MAXWINKEL - DELTAWINKEL)) ) {
    tuer1Servo.setSpeed( MINGESCHW );    // Verfahrgeschwindigkeit einstellen
  } else {
    tuer1Servo.setSpeed( MAXGESCHW );    // Verfahrgeschwindigkeit einstellen
  }
  if (digitalRead(TASTER_PIN)) {
    tuer1Servo.write(MINWINKEL);
  } else {
    tuer1Servo.write(MAXWINKEL);
  }
}

Mit den richtigen Werkzeugen gelangt man einfacher ans Ziel :slight_smile:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.