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 ) auf millis, potentiometer oder dergleichen.
Hier ist ein Ausschnitt aus meinem Code:
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...
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, 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...
Danke für die schnellen posts übrigens
So,das hab ich jetzt getestet-und alles funktioniert eigentlich in etwa so, wie ich es mir gedacht hab.
Aber: Einige Servos rasen jetzt von 0 bis 180 Grad über die mechanische Sperre und zerstören sich fast selbst, uiuiui :~
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...
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:
Edit:
Nachtrag: Hab mich verlesen, die 2Bedingung muss tatsächlich false sein, ich werde alle == also durch != ersetzten..
Danke für den Hinweis, Mario!
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?
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.