Hallo zusammen, ich bin gerade dabei, mich in Arduino einzuarbeiten und habe ein Verständnisproblem: Nachfolgend ist ein kleines Programm aus dem Internet um einen Servomotor anzusteuern. Der Motor dreht sich ständig hin und her. Grund hierfür ist die For-Schleife. Aber warum bricht diese nicht nach einer 180°-Drehung ab? Die Schleife prüft doch ständig, ob pos < 180 ist und erhöht anschließend den Wert von pos um 1. Irgendwann ist pos = 180 also nicht kleiner 180. Somit müsste die Schleife abbrechen! Tut sie aber nicht, sie fängt erneut von pos=0 an und zählt wieder hoch. // Festlegen des Servo Pins int servo = 7; // Festlegen des Servo Pins int servo = 7; // Weitere Variablen für PWM und Drehwinkel (Position) int pwm; int pos; /* Funktion um das Servo zu bewegen. Hier wird die Position berechnet und der Wert der neuen Position an das Servo übergeben. */ void servoMove(int servo, int pos){ //Winkel in Mikrosekunden umrechnen pwm = (pos * 11) + 500; digitalWrite(servo, HIGH); delayMicroseconds(pwm); digitalWrite(servo, LOW); delay(20); } // Initialisieren des Servo Pins void setup() { pinMode(servo, OUTPUT); } // Hauptprogramm void loop() { for(pos=0; pos<180; pos++) { servoMove(servo, pos); } }
Das Programm tut aber genau das. Es zählt hoch bis 180, dann ist die for-Schleife beendet und beginnt dann in der Hauptschleife mit der for-Schleife von neuem.
OK, Danke. Das heißt quasi allgemein, wenn bei einer For-Schleife das Ende erreicht ist, (also Bedingung nicht mehr erfüllt), fängt sie von vorn an?
Nein! Heißt es nicht. Bei Dir sind nur zwei Schleifen verschachtelt. Die For-Schleife und die Loop des Hauptprogramms, die läuft immer.
Weil der Puls 500-2500 µs lang sein muss für 180° Drehwinkel. Pos ist 0-180, das macht dann (0*11)+500 = 500 bis (180*11)+500=2480µs. Passt. Obwohl man normal eher 1000-2000 oder sogar nur 1100-1900 nutzt, manche Servos mögen nicht mehr und schlagen an. Und nach allden Jahren gibt's mittlerweile Servo-libraries die direkt den Winkel annehmen.
??? schrieb: > Wie entsteht die Formel pwm = (pos * 11) + 500; Geradengleichung (lineare Interpolation ?)
??? schrieb: > Wie entsteht die Formel pwm = (pos * 11) + 500; Ich würde da sagen: "ich habe sie durch empirische Evaluation ermittelt" und einer, der weiß was das ist, würde korrekt hören: "ich habs ausprobiert und irgendwie hingebastelt".
Jo sagt's amoi, lest's ihr des a' wos do g'schrieb'n is? Da wurde überlegt wie man 0-180° in 500-2500µs übersetzt. Also hat man erstmal die Spanne und den Offset getrennt und kommt auf 500 Offset und 2000 Spanne. Die will man auf 180 abbilden, also in ein "digit" 2000/180, was zufälligerweise 11,11... ist. Da man mit Integer rechnet, hat man das großzügig auf 11 gerundet und fertig. Impulslänge in µs ist (Gewünschter Winkel in ganzen Grad* 11) + 500. Kein Wunder, das hier so oft über Arduino gelästert wird: das ist euch zu einfach....
Jens M. schrieb: > Kein Wunder, das hier so oft über Arduino gelästert wird: das ist euch > zu einfach.... Irgendwie verwirrt heute? Was hat Arduino damit zu tun, wenn dem Anfänger Wissen fehlt? Bit du incl. der Geradengleichung auf die Welt gepresst worden?
Weiß nicht. Man sollte das hier ja auch nicht so rausposaunen, weil man dann gleich schief angekuckt wird.
Arduino Fanboy D. schrieb: > Was hat Arduino damit zu tun, wenn dem Anfänger Wissen fehlt? Weil der nicht mal eine void main() hat.
Jens M. schrieb: > Man sollte das hier ja auch nicht so rausposaunen, weil man dann gleich > schief angekuckt wird. Na logisch. Die alten Herren hier möchten ja weiterhin 3 Wochen an ihren diskret aufgebauten LED Blinkerschaltungen arbeiten und noch für ihre Effizienz gelobt werden.
Jens M. schrieb: > Man sollte das hier ja auch nicht so rausposaunen, ... Meine Namenswahl empfindest du als falsch? ----------- Jens M. schrieb: > Kein Wunder, das hier so oft über Arduino gelästert wird: das ist euch > zu einfach.... Alle Begründungen ausgegangen? Dann ist das wohl nur eine ganz miese Diskiminierungsmasche. Warum tust du das? Was versprichst du dir davon?
Nick M. schrieb: > Weil der nicht mal eine > void main() > hat. Wenn dann: int main() Oder? Und natürlich hat Arduino das. Auch das erstellen eigener main() ist kein Problem. Wahlweise in C++, C, oder auch Assembler.
Arduino Fanboy D. schrieb: > Meine Namenswahl empfindest du als falsch? Usernamen sind mir sowas von egal. Sieht man an meinem ;) Arduino Fanboy D. schrieb: > Alle Begründungen ausgegangen? Für was? Die Formel bzw. der Code oben ist so grandios einfach, und ich kann nu wirklich nicht gut C. Aber die Formel da ist was, 6. Klasse? Das wurde nicht empirisch ermittelt, nur wurde das Problem sehr einfach und pragmatisch gelöst: Zeit ausrechnen, Pin an, Busyloop, Pin aus, Busyloop. Arduino Fanboy D. schrieb: > Dann ist das wohl nur eine ganz miese Diskiminierungsmasche. w0t? Ich kann Arduino auch nutzen ohne mich drüber aufzuregen. Wenn es den Job tut, bau ichs ein. Gibts was anderes, bau ichs anders. Der Name auf der Schachtel ist mir ebenso egal wie der Username in Foren. Ich bin kein Rassist, aber... ;)
Arduino Fanboy D. schrieb: > Und natürlich hat Arduino das. Dann fehlt es im Ursprungsposting. Aber das strotzt ja sowieso vor "Qualität"
Nick M. schrieb: > Aber das strotzt ja sowieso vor "Qualität" War vor 6 Jahren auch alles anders... ;)
Nick M. schrieb: > Weil der nicht mal eine > void main() > hat. hat sich versteckt aber Andreas P. schrieb: > void setup() { > void loop() { hats ja verraten, nur nicht jedem!
Nick M. schrieb: > Dann fehlt es im Ursprungsposting. Nein. Nick M. schrieb: > Aber das strotzt ja sowieso vor "Qualität" 6 Jahre alt, es ist. Wenn er/sie/es dem Hobby noch frönt, wird er/sie/es sich (hoffentlich) weiter entwickelt haben. Jens M. schrieb: > Ich bin kein Rassist, aber... ;) Aber einer welcher mit Schaiße auf Arduino User wirft. Das Gruppieren von Personen, anhand einer ihrer Eigenschaften, und diese Gruppe dann als ganzes zu bewerten, ist für mich die Grundessenz rassistischer Denkmuster. Wie auch immer... Deine eigene, von dir hoch gelobte Kompetenz, ist sicherlich auch nicht vom Himmel gefallen. Gib ihnen die Zeit, welche du gebraucht hast. Und ein bisschen mehr, weil sie nicht alle so firm, wie du, sein können.
Arduino Fanboy D. schrieb: > Aber einer welcher mit Schaiße auf Arduino User wirft. eben genau gerade nicht. zumindest nicht das ich wüsste. Arduino Fanboy D. schrieb: > Und ein bisschen mehr, weil sie nicht alle so firm, wie du, sein können. Genau das isses ja. bin ich nicht, weiß ich auch. Herr jessas, geh in einen Lebensmittelmarkt deines Vertrauens, kauf eine Packung AA und mach die in deinen Ironiedetektor rein. Die da drin sind scheinen leer zu sein.
Nick M. schrieb: > Weil der nicht mal eine > void main() > hat. Wäre es schlimm, wenn es eine int main() wäre? Die main.cpp von Arduino sieht im wesentlichen so aus:
1 | int main(void) |
2 | {
|
3 | init(); |
4 | initVariant(); |
5 | setup(); |
6 | |
7 | for (;;) { |
8 | loop(); |
9 | if (serialEventRun) serialEventRun(); |
10 | }
|
11 | return 0; |
12 | }
|
Für den TO dürfte damit auch klar werden, warum seine for-Schleife nach dem Erreichen der 180 wieder von vorne anfängt.
Arduino Fanboy D. schrieb: > Was hat Arduino damit zu tun, wenn dem Anfänger Wissen fehlt? Weil eben Arduino verspricht, das auch Unwissende was gebacken bekommen. Es ist aber naturgemäß reiner Zufall, ob das dann tatsächlich klappt. Schuld ist aber nicht der Anfänger, sondern die falschen Propheten, dieses unselige, geldgierige, hassenswerte Drecks-Pack. > Bit du incl. der Geradengleichung auf die Welt gepresst worden? Naja, jeder hat das in der Schule gelernt. Schätzungsweise 4 oder 5 Klasse? Wer nichtmal das kann, ist als Programmierer einfach grundsätzlich vollkommen ungeeignet. Ende der Ansage!
c-hater schrieb: > hassenswerte Drecks-Pack Wers zuerst gerochen, dem ists aus der Hos gekrochen. c-hater schrieb: > Weil eben Arduino verspricht, das auch Unwissende was gebacken bekommen. Naja... Schnelle kleine Erfolge sind schon zu erreichen, trotz der doch arg komplexen C++ Welt. Andere Programmierumgebungen stellen sich da gerne etwas querer. Das Denken wird dennoch beansprucht, wenn es denn etwas weiter gehen soll. Arduino, hin oder her, wird sich das nicht vermeiden lassen. c-hater schrieb: > Ende der Ansage! Eigentlich bin ich recht froh, dass du nicht das Maß der Dinge bestimmen darfst. -- Das einzige, was ich dir zu gute halten könnte, wäre, wenn du mit dir selber noch gnadenloser umgehen würdest. Ist das so?
Moment mal, von c-hater hätte ich erwartet zeh-hater schrieb: > ...verspriht...auh...gebaken... > ...tatsählich... > Shuld...niht...falshen... > ...Dreks-Pak... > Shule...Shätzungsweise... > nihtmal...einfah... > grundsätzlih... scnr
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.