Servos steuern-Code Frage

Ich verbringe nun meinen ersten Tag als "arduino"
-und gleich stellen sich die Probleme ein... XD
Explizit: Es geht darum, mehrere Servos gleichzeitig laufen zu lassen, eigentlich ein altdurchgelutschtes Thema wenn man googelt; aber ich habe mich für eine eigne Code-Variante entschieden und verzichte (erstmal hoffentlich :slight_smile: ) auf millis, potentiometer oder dergleichen.
Hier ist ein Ausschnitt aus meinem Code:

Das ganze Blabbla am Anfang und im loop:

for ( pos2= 90; pos2 = 45; pos2 -= 1){ //Leg1
pos1 += 1;
pos3 -= 1;
s1.write(pos1);
s2.write(pos2);
s3.write(pos3);
delay(15);}
for ( pos2= 45; pos2 = 90; pos2 += 1){
pos1 += 1;
pos3 += 1;
s1.write(pos1);
s2.write(pos2);
s3.write(pos3);
delay(15);}

Was passiert ist folgendes: Erstmal scheint alles ganz prima zu laufen; dann fangen die Servos an zu spinnen und ruckeln vor sich hin; und schließlich sitzten sie einfach nur still da... :frowning:

Eigentlich müsste der Code funktionieren (lässt sich auch prima auf den arduino uploaden...),
und die Variablenwerte gehen ja wieder auf den Anfangswert zurück.
Hat jemand eine Lösung, bei der ich nicht viel umscripten müsste?
Danke schon im Vorraus!

Ich tippe darauf daß die Servos zuviel Strom ziehen und darum die Versorgungsspannung einbricht. Wie versorgst Du die Servos mit Strom? aus dem Arduino über USB?
Grüße Uwe

Intrepit:
Das ganze Blabbla am Anfang und im loop:

for ( pos2= 90; pos2 = 45; pos2 -= 1)

Wenn das mal nicht stattdessen hätte heißen sollen:

Intrepit:
Das ganze Blabbla am Anfang und im loop:

for ( pos2= 90; pos2 > 45; pos2 -= 1)

oder

Intrepit:
Das ganze Blabbla am Anfang und im loop:

for ( pos2= 90; pos2 == 45; pos2--)

Jedenfalls mit einem Vergleich als Abbruchbedingung und nicht mit einer Variablenzuweisung als Testbedingung für den Schleifenabbruch.

Intrepit:
Eigentlich müsste der Code funktionieren (lässt sich auch prima auf den arduino uploaden...),

Wieso, der Code funktioniert doch?
(Allerdings nicht so, wie Du denkst, dass er funktionieren sollte, sondern vermutlich genau so, wie Du ihn tatsächlich programmiert hast.)

ups, die creative Verwendung der FOR-Schleife hab ich glatt übersehen.
Grüße Uwe

ups, das heisst also ich muss das = Zeichen gegen 2 dergleichen ersetzten, ok..., das probier ich aus. :.
@uwefed: Ich steuere zu Testzwecken die Servos mit der Pc Spannung über UsB an.

der Code funktioniert doch?
(Allerdings nicht so, wie Du denkst, dass er funktionieren sollte, sondern vermutlich genau so, wie Du ihn tatsächlich programmiert hast.)

vermutlich, ja... :smiley:

Danke für die schnellen posts übrigens :slight_smile:

So,das hab ich jetzt getestet-und alles funktioniert eigentlich in etwa so, wie ich es mir gedacht hab. :grin:
Aber: Einige Servos rasen jetzt von 0 bis 180 Grad über die mechanische Sperre und zerstören sich fast selbst, uiuiui :~

for ( pos2= 90; pos2 == 45; pos2 -= 1){ //Leg1
pos1 += 1;
pos3 -= 1;
s1.write(pos1);
s2.write(pos2);
s3.write(pos3);
delay(50);}
for ( pos2= 45; pos2 == 90; pos2 += 1){
pos1 += 1;
pos3 += 1;
s1.write(pos1);
s2.write(pos2);
s3.write(pos3);
delay(50);}

Grüße intrepit

Auch wenns funktionier ist es keine gute Idee die Servos Durch die USB-Spannung zu versorgen.
Servos bruchen zeitweilig ziemlich viel Strom.
Grüße Uwe

Also ich bezweifle, das folgende Schleife überhaupt durchlaufen wird:

for ( pos2= 90; pos2 == 45; pos2 -= 1)

Der zweite Eintrag im Schleifenkopf ist eine Abbruch-Bedingung. Die Schleife wird solange durchlaufen, bis diese Bedingung "false" liefert. Mit "pos2=45" ist "pos2==90" IMMER false.
Poste mal bitte den kompletten Sketch. Ich vermute mal, es werden irgendwo die Endpunkte der Servos außerhalb der Schleife gesetzt und damit fahren die halt an die passene Position, auch ohne die Schleifen.
Weiterhin fällt auf, das zwar in den beiden Schleifen "pos1" und "pos3" verändert werden, aber nie auf einen definierten Startwert gesetzt werden.
Da wir den kompletten Code nicht kennen, kann ich nur vermuten, aber zumindest pos1 wird in beiden Schleifen immer weiter hochgezählt und damit wird der Servo wohl irgendwann an den Anschlag fahren.
Mario.

Vielleicht stehe ich auf dem Schlauch, aber warum ist das dann immer false?
Ich dachte, die Schleife bricht ab, sobald die Abbruchbedingung true ist... :frowning:
wenn dem so wäre, würde die Schleife von pos=90 bis zur abbruchbedingung pos=45 gehen...und der code danach einfach weiterlaufen...
Hier ist aber mal der komplette Sketch:

#include <Servo.h> 

Servo s1; //1Longditude;
Servo s2; //1Altitude;
Servo s3; //1Footup;
Servo s4; //1Footdown;

Servo s5; //2Longditude;
Servo s6; //2Altitude;
Servo s7; //2Footup;
Servo s8; //2Footdown;

Servo s9; //3Longditude;
Servo s10; //3Altitude;
Servo s11; //3Footup;
Servo s12; //3Footdown;

Servo s13; //4Longditude;
Servo s14; //4Altitude;
Servo s15; //4Footup;
Servo s16; //4Footdown;

Servo s17; //5Longditude;
Servo s18; //5Altitude;
Servo s19; //5Footup;
Servo s20; //5Footdown;

Servo s21; //6Longditude;
Servo s22; //6Altitude;
Servo s23; //6Footup;
Servo s24; //6Footdown;

int pos1 = 45; //Leg1
int pos2 = 90;
int pos3 = 90;
int pos4 = 90;
int pos5 = 135; //Leg2
int pos6 = 90;
int pos7 = 90;
int pos8 = 90;
int pos9 = 45; //Leg3
int pos10= 90;
int pos11= 90;
int pos12= 90;
int pos13= 135; //Leg4
int pos14= 90;
int pos15= 90;
int pos16= 90;
int pos17= 45; //Leg5
int pos18= 90;
int pos19= 90;
int pos20= 90;
int pos21= 135; //Leg6
int pos22= 90;
int pos23= 90;
int pos24= 90;


void setup() 
{ 
  s1.attach(1); //Leg1
  s2.attach(2);
  s3.attach(3);
  s4.attach(4);
  s5.attach(5); //Leg2
  s6.attach(6);
  s7.attach(7);
  s8.attach(8);
  s9.attach(9); //Leg3
  s10.attach(10);
  s11.attach(11);
  s12.attach(12);
  s13.attach(13); //Leg4
  s14.attach(14);
  s15.attach(15);
  s16.attach(16);
  s17.attach(17); //Leg5
  s18.attach(18);
  s19.attach(19);
  s20.attach(20);
  s21.attach(21); //Leg6
  s22.attach(22);
  s23.attach(23);
  s24.attach(24);
}
void loop() {

 s1.write(pos1); //Leg1
 s2.write(pos2);
 s3.write(pos3);
 s4.write(pos4);
 s5.write(pos5); //Leg2
 s6.write(pos6);
 s7.write(pos7);
 s8.write(pos8);
 s9.write(pos9); //Leg3
 s10.write(pos10);
 s11.write(pos11);
 s12.write(pos12);
 s13.write(pos13); //Leg4
 s14.write(pos14);
 s15.write(pos15);
 s16.write(pos16);
 s17.write(pos17); //Leg5
 s18.write(pos18);
 s19.write(pos19);
 s20.write(pos20);
 s21.write(pos21); //Leg6
 s22.write(pos22);
 s23.write(pos23);
 s24.write(pos24);
 delay(50);
 
Instructor:
int upsidedown = 1;                          //für Forum: nicht wundern, ist noch nicht fertig, :)

Modus1:          //Vorwärts
if (upsidedown =1){
  
 for ( pos2= 90; pos2 == 45; pos2 -= 1){ //Leg1
  pos1 += 1;
  pos3 -= 1;
  s1.write(pos1);
  s2.write(pos2);
  s3.write(pos3);
  delay(50);}
 for ( pos2= 45; pos2 == 90; pos2 += 1){
  pos1 += 1;
  pos3 += 1;
  s1.write(pos1);
  s2.write(pos2);
  s3.write(pos3);
  delay(50);}

  
 for ( pos6= 90; pos6 == 135; pos6 += 1){ //Leg2
  pos5 -= 1;
  pos7 += 1;
  s5.write(pos5);
  s6.write(pos6);
  s7.write(pos7);
  delay(50);}
 for ( pos6= 135; pos6 == 90; pos6 -= 1){
  pos5 -= 1;
  pos7 -= 1;
  s5.write(pos5);
  s6.write(pos6);
  s7.write(pos7);
  delay(50);}
  
  
 for ( pos10= 90; pos10 == 45; pos10 -= 1){ //Leg3
  pos9 += 1;
  pos11 -= 1;
  s9.write(pos9);
  s10.write(pos10);
  s11.write(pos11);
  delay(50);}
 for ( pos10= 45; pos10 == 90; pos10 += 1){
  pos9 += 1;
  pos11 += 1;
  s9.write(pos9);
  s10.write(pos10);
  s11.write(pos11);
  delay(50);}
  
  
 for ( pos14= 90; pos14 == 135; pos14 += 1){ //Leg4
  pos13 -= 1;
  pos15 += 1;
  s13.write(pos13);
  s14.write(pos14);
  s15.write(pos15);
  delay(50);}
 for ( pos14= 135; pos14 == 90; pos14 -= 1){
  pos13 -= 1;
  pos15 -= 1;
  s13.write(pos13);
  s14.write(pos14);
  s15.write(pos15);
  delay(50);}
  
  
 for ( pos18= 90; pos18 == 45; pos18 -= 1){ //Leg5
  pos17 += 1;
  pos19 -= 1;
  s17.write(pos17);
  s18.write(pos18);
  s19.write(pos19);
  delay(50);}
 for ( pos18= 45; pos18 == 90; pos18 += 1){
  pos17 += 1;
  pos19 += 1;
  s17.write(pos17);
  s18.write(pos18);
  s19.write(pos19);
  delay(50);}
  
  
 for ( pos22= 90; pos22 == 135; pos22 += 1){ //Leg6
  pos21 -= 1;
  pos23 += 1;
  s21.write(pos21);
  s22.write(pos22);
  s23.write(pos23);
  delay(50);}
 for ( pos22= 135; pos22 == 90; pos22 -= 1){
  pos21 -= 1;
  pos23 -= 1;
  s21.write(pos21);
  s22.write(pos22);
  s23.write(pos23);
  delay(50);}
  
  int pos1 = 135;
  int pos5 = 45;
  int pos9 = 135;
  int pos13 = 45;
  int pos17 = 135;
  int pos21 = 45;

 for ( pos22= 90; pos1 == 135; pos22 += 0){ //Movement
  pos1  += 1;
  pos5  -= 1;
  pos9  += 1;
  pos13 -= 1;
  pos17 += 1;
  pos21 -= 1;
  s1.write(pos1);
  s5.write(pos5);
  s9.write(pos9);
  s13.write(pos13);
  s17.write(pos17);
  s21.write(pos21);  
  delay(50);}


{ goto Instructor; }}
else{
  
 for ( pos2= 90; pos2 == 135; pos2 += 1){ //Leg1
  pos1 += 1;
  pos4 -= 1;
  s1.write(pos1);
  s2.write(pos2);
  s4.write(pos4);
  delay(50);}
 for ( pos2= 45; pos2 == 90; pos2 -= 1){
  pos1 += 1;
  pos4 += 1;
  s1.write(pos1);
  s2.write(pos2);
  s4.write(pos4);
  delay(50);}
  
  
 for ( pos6= 90; pos6 == 45; pos6 -= 1){ //Leg2
  pos5 -= 1;
  pos8 += 1;
  s5.write(pos5);
  s6.write(pos6);
  s8.write(pos8);
  delay(50);}
 for ( pos6= 135; pos6 == 90; pos6 += 1){
  pos5 -= 1;
  pos8 -= 1;
  s5.write(pos5);
  s6.write(pos6);
  s8.write(pos8);
  delay(50);}
  
  
 for ( pos10= 90; pos10 == 135; pos10 += 1){ //Leg3
  pos9 += 1;
  pos12 -= 1;
  s9.write(pos9);
  s10.write(pos10);
  s12.write(pos12);
  delay(50);}
 for ( pos10= 45; pos10 == 90; pos10 -= 1){
  pos9 += 1;
  pos12 += 1;
  s9.write(pos9);
  s10.write(pos10);
  s12.write(pos12);
  delay(50);}
  
  
 for ( pos14= 90; pos14 == 45; pos14 -= 1){ //Leg4
  pos13 -= 1;
  pos16 += 1;
  s13.write(pos13);
  s14.write(pos14);
  s16.write(pos16);
  delay(50);}
 for ( pos14= 135; pos14 == 90; pos14 += 1){
  pos13 -= 1;
  pos16 -= 1;
  s13.write(pos13);
  s14.write(pos14);
  s16.write(pos16);
  delay(50);}
  
  
 for ( pos18= 90; pos18 == 135; pos18 += 1){ //Leg5
  pos17 += 1;
  pos20 -= 1;
  s17.write(pos17);
  s18.write(pos18);
  s20.write(pos20);
  delay(50);}
 for ( pos18= 45; pos18 == 90; pos18 -= 1){
  pos17 += 1;
  pos20 += 1;
  s17.write(pos17);
  s18.write(pos18);
  s20.write(pos20);
  delay(50);}
  
  
 for ( pos22= 90; pos22 == 45; pos22 -= 1){ //Leg6
  pos21 -= 1;
  pos24 += 1;
  s21.write(pos21);
  s22.write(pos22);
  s24.write(pos24);
  delay(50);}
 for ( pos22= 135; pos22 == 90; pos22 -= 1){
  pos21 -= 1;
  pos24 -= 1;
  s21.write(pos21);
  s22.write(pos22);
  s24.write(pos24);
  delay(50);}

  int pos1 = 135;
  int pos5 = 45;
  int pos9 = 135;
  int pos13 = 45;
  int pos17 = 135;
  int pos21 = 45;

 for ( pos22= 135; pos1 == 135; pos22 += 0){ //Movement
  pos1  += 1;
  pos5  -= 1;
  pos9  += 1;
  pos13 -= 1;
  pos17 += 1;
  pos21 -= 1;
  s1.write(pos1);
  s5.write(pos5);
  s9.write(pos9);
  s13.write(pos13);
  s17.write(pos17);
  s21.write(pos21);  
  delay(50);}


{ goto Instructor; }}

Modus2:          //Rückwärts
Modus3:          //Vorwärtslinks
Modus4:          //Vorwärtsrechts
Modus5:          //Rückwärtsrechts
Modus6:          //Rückwärtslinks
Modus7:          //Schwimmenvorwärts
Modus8:          //Schwimmenrückwärts
Modus9:          //Schwimmenlinks
Modus10:          //Schwimmenrechts
Modus11:          //Schwimmenup
Modus12:          //Schwimmendown
Modus13:          //Wandeckeinnenvorwärts
Modus14:          //Wandeckeaussenvorwärts
Modus15:          //Wandeckeinnenrückwärts
Modus16:          //Wandeckeaussenrückwärts
;}

Gruß Intrepit

Edit:
Nachtrag: Hab mich verlesen, die 2Bedingung muss tatsächlich false sein, ich werde alle == also durch != ersetzten..
Danke für den Hinweis, Mario! :slight_smile:

Roboter.ino (6.85 KB)

Sry für den doppelpost, aber ich hab das Problem mit dem Anschlag jetzt gefunden. 8)
Allerdings hab ich noch eine ganz andere Frage: Was würdet ihr denn für die Stromversorgung empfehlen, wenn ich 24 +1 - Servos+ Arduino betreiben muss?

Ich hatte da an 2 oder 3 parallel geschaltete:

http://www.conrad.de/ce/de/product/650601/?hk=WW4&insert=V0&WT.mc_id=Froog&utm_source=google&utm_medium=deeplink&utm_content=dl_article&utm_campaign=g_shopping
gedacht...

Also, um sicher zu gehen, das Deine Schleife immer sinnvoll verlassen wird, würde ich immer folgendes verwenden:

//achtung schleife wird 11 Mal von 0 bis 10 durchlaufen
for (int i=0; i<=10;i +=1) { ... }
//oder
for (int i=10; i>=0;i -=1) { ... }

Hintergrund ist, wenn Du aus welchem Grund auch immer innerhalb der Schleife den Wert von i zusätzlich veränderst, kann es passieren, das Du den Wert "am Zielwert vorbei" schiebst und die Schleife "ewig" läuft.
Beispiel:

for(int i = 0; i!=9; i +=1) {
  i++;
}

In dieser Schleife wird "i" geschickt an der "9" vorbei gerechnet und die Schleife läuft länger als gewollt. Das ist zwar etwas gekünstelt, zeigt aber die Gefahr bei einem Vergleich auf einen konkreten Wert.

Das nächste was mit auffällt ist das "goto" in Deinem Code. Das ist ganz schlechter Stil. Das hat man früher evtl. bei BASIC gemacht, in C ist das nicht sinnvoll. Pack die einzelnen Steuerbefehle für die verschiedenen Modi in einzelne Funktionen wie

void vorwaerts() { ...}

Und rufe diese Funktionen dann an geeignert Stelle auf. Das macht auch das Programm deutlich übersichtlicher.

Dann werd ich das auch noch ändern, danke allerseits, :slight_smile:
-das goto ist tatsächlich noch ein Basic "Altbestand" :grin: